Pepper_47_C++_interfaces
graphics_2d.cc
Go to the documentation of this file.
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 
6 
7 #include "ppapi/c/pp_errors.h"
8 #include "ppapi/c/ppb_graphics_2d.h"
10 #include "ppapi/cpp/image_data.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 
32 }
33 
35  : Resource(other),
36  size_(other.size_) {
37 }
38 
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 
63 }
64 
66  Resource::operator=(other);
67  size_ = other.size_;
68  return *this;
69 }
70 
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 
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 
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 
131  if (has_interface<PPB_Graphics2D_1_1>()) {
132  return get_interface<PPB_Graphics2D_1_1>()->Flush(
134  } else if (has_interface<PPB_Graphics2D_1_0>()) {
135  return get_interface<PPB_Graphics2D_1_0>()->Flush(
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 
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
void PassRefFromConstructor(PP_Resource resource)
Definition: resource.cc:50
const Size & size() const
Definition: graphics_2d.h:78
const PP_Point & pp_point() const
Definition: point.h:58
const PP_Size & pp_size() const
Definition: size.h:64
A 2 dimensional point with 0,0 being the upper-left starting coordinate.
Definition: point.h:16
Definition: rect.h:19
int32_t MayForce(int32_t result) const
const PP_CompletionCallback & pp_completion_callback() const
A size of an object based on width and height.
Definition: size.h:18
void ReplaceContents(ImageData *image)
Definition: graphics_2d.cc:114
virtual ~Graphics2D()
Definition: graphics_2d.cc:62
PP_Resource pp_resource() const
Definition: resource.h:47
bool SetScale(float scale)
Definition: graphics_2d.cc:142
bool is_null() const
Definition: resource.h:45
void PaintImageData(const ImageData &image, const Point &top_left)
Definition: graphics_2d.cc:71
int32_t Flush(const CompletionCallback &cc)
Definition: graphics_2d.cc:130
PP_Instance pp_instance() const
A reference counted module resource.
Definition: resource.h:20
void Scroll(const Rect &clip, const Point &amount)
Definition: graphics_2d.cc:102
const PP_Rect & pp_rect() const
Definition: rect.h:110
float GetScale()
Definition: graphics_2d.cc:149
Resource & operator=(const Resource &other)
Definition: resource.cc:27
Graphics2D & operator=(const Graphics2D &other)
Definition: graphics_2d.cc:65