• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
interface_name()21 template <> const char* interface_name<PPB_Graphics2D_1_0>() {
22   return PPB_GRAPHICS_2D_INTERFACE_1_0;
23 }
24 
interface_name()25 template <> const char* interface_name<PPB_Graphics2D_1_1>() {
26   return PPB_GRAPHICS_2D_INTERFACE_1_1;
27 }
28 
29 }  // namespace
30 
Graphics2D()31 Graphics2D::Graphics2D() : Resource() {
32 }
33 
Graphics2D(const Graphics2D & other)34 Graphics2D::Graphics2D(const Graphics2D& other)
35     : Resource(other),
36       size_(other.size_) {
37 }
38 
Graphics2D(const InstanceHandle & instance,const Size & size,bool is_always_opaque)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 
~Graphics2D()62 Graphics2D::~Graphics2D() {
63 }
64 
operator =(const Graphics2D & other)65 Graphics2D& Graphics2D::operator=(const Graphics2D& other) {
66   Resource::operator=(other);
67   size_ = other.size_;
68   return *this;
69 }
70 
PaintImageData(const ImageData & image,const Point & top_left)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 
PaintImageData(const ImageData & image,const Point & top_left,const Rect & src_rect)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 
Scroll(const Rect & clip,const Point & amount)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 
ReplaceContents(ImageData * image)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 
Flush(const CompletionCallback & cc)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 
SetScale(float scale)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 
GetScale()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