Home | History | Annotate | Download | only in cpp
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "ppapi/cpp/graphics_2d.h"
      6 
      7 #include "ppapi/c/pp_errors.h"
      8 #include "ppapi/c/ppb_graphics_2d.h"
      9 #include "ppapi/cpp/completion_callback.h"
     10 #include "ppapi/cpp/image_data.h"
     11 #include "ppapi/cpp/instance_handle.h"
     12 #include "ppapi/cpp/module.h"
     13 #include "ppapi/cpp/module_impl.h"
     14 #include "ppapi/cpp/point.h"
     15 #include "ppapi/cpp/rect.h"
     16 
     17 namespace pp {
     18 
     19 namespace {
     20 
     21 template <> const char* interface_name<PPB_Graphics2D_1_0>() {
     22   return PPB_GRAPHICS_2D_INTERFACE_1_0;
     23 }
     24 
     25 template <> const char* interface_name<PPB_Graphics2D_1_1>() {
     26   return PPB_GRAPHICS_2D_INTERFACE_1_1;
     27 }
     28 
     29 }  // namespace
     30 
     31 Graphics2D::Graphics2D() : Resource() {
     32 }
     33 
     34 Graphics2D::Graphics2D(const Graphics2D& other)
     35     : Resource(other),
     36       size_(other.size_) {
     37 }
     38 
     39 Graphics2D::Graphics2D(const InstanceHandle& instance,
     40                        const Size& size,
     41                        bool is_always_opaque)
     42     : Resource() {
     43   if (has_interface<PPB_Graphics2D_1_1>()) {
     44     PassRefFromConstructor(get_interface<PPB_Graphics2D_1_1>()->Create(
     45         instance.pp_instance(),
     46         &size.pp_size(),
     47         PP_FromBool(is_always_opaque)));
     48   } else if (has_interface<PPB_Graphics2D_1_0>()) {
     49     PassRefFromConstructor(get_interface<PPB_Graphics2D_1_0>()->Create(
     50         instance.pp_instance(),
     51         &size.pp_size(),
     52         PP_FromBool(is_always_opaque)));
     53   } else {
     54     return;
     55   }
     56   if (!is_null()) {
     57     // Only save the size if allocation succeeded.
     58     size_ = size;
     59   }
     60 }
     61 
     62 Graphics2D::~Graphics2D() {
     63 }
     64 
     65 Graphics2D& Graphics2D::operator=(const Graphics2D& other) {
     66   Resource::operator=(other);
     67   size_ = other.size_;
     68   return *this;
     69 }
     70 
     71 void Graphics2D::PaintImageData(const ImageData& image,
     72                                 const Point& top_left) {
     73   if (has_interface<PPB_Graphics2D_1_1>()) {
     74     get_interface<PPB_Graphics2D_1_1>()->PaintImageData(pp_resource(),
     75                                                         image.pp_resource(),
     76                                                         &top_left.pp_point(),
     77                                                         NULL);
     78   } else if (has_interface<PPB_Graphics2D_1_0>()) {
     79     get_interface<PPB_Graphics2D_1_0>()->PaintImageData(pp_resource(),
     80                                                         image.pp_resource(),
     81                                                         &top_left.pp_point(),
     82                                                         NULL);
     83   }
     84 }
     85 
     86 void Graphics2D::PaintImageData(const ImageData& image,
     87                                 const Point& top_left,
     88                                 const Rect& src_rect) {
     89   if (has_interface<PPB_Graphics2D_1_1>()) {
     90     get_interface<PPB_Graphics2D_1_1>()->PaintImageData(pp_resource(),
     91                                                         image.pp_resource(),
     92                                                         &top_left.pp_point(),
     93                                                         &src_rect.pp_rect());
     94   } else if (has_interface<PPB_Graphics2D_1_0>()) {
     95     get_interface<PPB_Graphics2D_1_0>()->PaintImageData(pp_resource(),
     96                                                         image.pp_resource(),
     97                                                         &top_left.pp_point(),
     98                                                         &src_rect.pp_rect());
     99   }
    100 }
    101 
    102 void Graphics2D::Scroll(const Rect& clip, const Point& amount) {
    103   if (has_interface<PPB_Graphics2D_1_1>()) {
    104     get_interface<PPB_Graphics2D_1_1>()->Scroll(pp_resource(),
    105                                                 &clip.pp_rect(),
    106                                                 &amount.pp_point());
    107   } else if (has_interface<PPB_Graphics2D_1_0>()) {
    108     get_interface<PPB_Graphics2D_1_0>()->Scroll(pp_resource(),
    109                                                 &clip.pp_rect(),
    110                                                 &amount.pp_point());
    111   }
    112 }
    113 
    114 void Graphics2D::ReplaceContents(ImageData* image) {
    115   if (has_interface<PPB_Graphics2D_1_1>()) {
    116     get_interface<PPB_Graphics2D_1_1>()->ReplaceContents(pp_resource(),
    117                                                          image->pp_resource());
    118   } else if (has_interface<PPB_Graphics2D_1_0>()) {
    119     get_interface<PPB_Graphics2D_1_0>()->ReplaceContents(pp_resource(),
    120                                                          image->pp_resource());
    121   } else {
    122     return;
    123   }
    124 
    125   // On success, reset the image data. This is to help prevent people
    126   // from continuing to use the resource which will result in artifacts.
    127   *image = ImageData();
    128 }
    129 
    130 int32_t Graphics2D::Flush(const CompletionCallback& cc) {
    131   if (has_interface<PPB_Graphics2D_1_1>()) {
    132     return get_interface<PPB_Graphics2D_1_1>()->Flush(
    133         pp_resource(), cc.pp_completion_callback());
    134   } else if (has_interface<PPB_Graphics2D_1_0>()) {
    135     return get_interface<PPB_Graphics2D_1_0>()->Flush(
    136         pp_resource(), cc.pp_completion_callback());
    137   } else {
    138     return cc.MayForce(PP_ERROR_NOINTERFACE);
    139   }
    140 }
    141 
    142 bool Graphics2D::SetScale(float scale) {
    143   if (!has_interface<PPB_Graphics2D_1_1>())
    144     return false;
    145   return PP_ToBool(get_interface<PPB_Graphics2D_1_1>()->SetScale(pp_resource(),
    146                                                                  scale));
    147 }
    148 
    149 float Graphics2D::GetScale() {
    150   if (!has_interface<PPB_Graphics2D_1_1>())
    151     return 1.0f;
    152   return get_interface<PPB_Graphics2D_1_1>()->GetScale(pp_resource());
    153 }
    154 
    155 }  // namespace pp
    156