OLD | NEW |
---|---|
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef WEBKIT_PLUGINS_PPAPI_PPB_IMAGE_DATA_IMPL_H_ | 5 #ifndef WEBKIT_PLUGINS_PPAPI_PPB_IMAGE_DATA_IMPL_H_ |
6 #define WEBKIT_PLUGINS_PPAPI_PPB_IMAGE_DATA_IMPL_H_ | 6 #define WEBKIT_PLUGINS_PPAPI_PPB_IMAGE_DATA_IMPL_H_ |
7 | 7 |
8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "ppapi/c/ppb_image_data.h" | 10 #include "ppapi/c/ppb_image_data.h" |
11 #include "ppapi/shared_impl/ppb_image_data_shared.h" | 11 #include "ppapi/shared_impl/ppb_image_data_shared.h" |
12 #include "ppapi/shared_impl/resource.h" | 12 #include "ppapi/shared_impl/resource.h" |
13 #include "ppapi/thunk/ppb_image_data_api.h" | 13 #include "ppapi/thunk/ppb_image_data_api.h" |
14 #include "third_party/skia/include/core/SkCanvas.h" | |
14 #include "webkit/plugins/ppapi/plugin_delegate.h" | 15 #include "webkit/plugins/ppapi/plugin_delegate.h" |
15 #include "webkit/plugins/webkit_plugins_export.h" | 16 #include "webkit/plugins/webkit_plugins_export.h" |
16 | 17 |
17 namespace skia { | 18 namespace skia { |
18 class PlatformCanvas; | 19 class PlatformCanvas; |
19 } | 20 } |
20 | 21 |
21 class SkBitmap; | 22 class SkBitmap; |
22 | 23 |
23 namespace webkit { | 24 namespace webkit { |
24 namespace ppapi { | 25 namespace ppapi { |
25 | 26 |
26 class PPB_ImageData_Impl : public ::ppapi::Resource, | 27 class PPB_ImageData_Impl : public ::ppapi::Resource, |
27 public ::ppapi::PPB_ImageData_Shared, | 28 public ::ppapi::PPB_ImageData_Shared, |
28 public ::ppapi::thunk::PPB_ImageData_API { | 29 public ::ppapi::thunk::PPB_ImageData_API { |
29 public: | 30 public: |
30 // If you call this constructor, you must also call Init before use. Normally | 31 // If you call this constructor, you must also call Init before use. Normally |
31 // you should use the static Create function, but this constructor is needed | 32 // you should use the static Create function, but this constructor is needed |
32 // for some internal uses of ImageData (like Graphics2D). | 33 // for some internal uses of ImageData (like Graphics2D). |
33 WEBKIT_PLUGINS_EXPORT explicit PPB_ImageData_Impl(PP_Instance instance); | 34 enum ImageDataType { PLATFORM, NACL }; |
35 WEBKIT_PLUGINS_EXPORT PPB_ImageData_Impl(PP_Instance instance, | |
36 ImageDataType type); | |
34 virtual ~PPB_ImageData_Impl(); | 37 virtual ~PPB_ImageData_Impl(); |
35 | 38 |
36 static PP_Resource Create(PP_Instance pp_instance, | |
37 PP_ImageDataFormat format, | |
38 const PP_Size& size, | |
39 PP_Bool init_to_zero); | |
40 | |
41 WEBKIT_PLUGINS_EXPORT bool Init(PP_ImageDataFormat format, | 39 WEBKIT_PLUGINS_EXPORT bool Init(PP_ImageDataFormat format, |
42 int width, int height, | 40 int width, int height, |
43 bool init_to_zero); | 41 bool init_to_zero); |
44 | 42 |
43 // Create an ImageData backed by a PlatformCanvas. You must use this if you | |
44 // intend the ImageData to be usable in platform-specific APIs (like font | |
45 // rendering or rendering widgets like scrollbars). | |
46 static PP_Resource CreatePlatform(PP_Instance pp_instance, | |
47 PP_ImageDataFormat format, | |
48 const PP_Size& size, | |
49 PP_Bool init_to_zero); | |
50 // Use this to create an ImageData for use with NaCl. This is backed by a | |
brettw
2012/07/20 21:57:04
I'd probably put a blank line here.
| |
51 // simple shared memory buffer. | |
52 static PP_Resource CreateNaCl(PP_Instance pp_instance, | |
53 PP_ImageDataFormat format, | |
54 const PP_Size& size, | |
55 PP_Bool init_to_zero); | |
56 | |
45 int width() const { return width_; } | 57 int width() const { return width_; } |
46 int height() const { return height_; } | 58 int height() const { return height_; } |
47 | 59 |
48 // Returns the image format. | 60 // Returns the image format. |
49 PP_ImageDataFormat format() const { return format_; } | 61 PP_ImageDataFormat format() const { return format_; } |
50 | 62 |
63 // Resource override. | |
brettw
2012/07/20 21:57:04
I'm not sure why you moved this.
dmichael (off chromium)
2012/07/20 22:32:40
Just a casualty of lots of churn in the file. Move
| |
64 virtual ::ppapi::thunk::PPB_ImageData_API* AsPPB_ImageData_API() OVERRIDE; | |
65 | |
51 // Returns true if this image is mapped. False means that the image is either | 66 // Returns true if this image is mapped. False means that the image is either |
52 // invalid or not mapped. See ImageDataAutoMapper below. | 67 // invalid or not mapped. See ImageDataAutoMapper below. |
53 bool is_mapped() const { return !!mapped_canvas_.get(); } | 68 WEBKIT_PLUGINS_EXPORT bool IsMapped() const; |
brettw
2012/07/20 21:57:04
I'd probably just annotate this whole class as exp
dmichael (off chromium)
2012/07/20 22:32:40
Done.
| |
54 | 69 PluginDelegate::PlatformImage2D* PlatformImage() const; |
55 PluginDelegate::PlatformImage2D* platform_image() const { | |
56 return platform_image_.get(); | |
57 } | |
58 | |
59 virtual ::ppapi::thunk::PPB_ImageData_API* AsPPB_ImageData_API() OVERRIDE; | |
60 | 70 |
61 // PPB_ImageData_API implementation. | 71 // PPB_ImageData_API implementation. |
62 virtual PP_Bool Describe(PP_ImageDataDesc* desc) OVERRIDE; | 72 virtual PP_Bool Describe(PP_ImageDataDesc* desc) OVERRIDE; |
63 virtual void* Map() OVERRIDE; | 73 virtual void* Map() OVERRIDE; |
64 virtual void Unmap() OVERRIDE; | 74 virtual void Unmap() OVERRIDE; |
65 virtual int32_t GetSharedMemory(int* handle, uint32_t* byte_count) OVERRIDE; | 75 virtual int32_t GetSharedMemory(int* handle, uint32_t* byte_count) OVERRIDE; |
66 virtual skia::PlatformCanvas* GetPlatformCanvas() OVERRIDE; | 76 virtual skia::PlatformCanvas* GetPlatformCanvas() OVERRIDE; |
77 virtual SkCanvas* GetCanvas() OVERRIDE; | |
67 | 78 |
68 const SkBitmap* GetMappedBitmap() const; | 79 const SkBitmap* GetMappedBitmap() const; |
69 | 80 |
70 // Swaps the guts of this image data with another. | 81 // Swaps the guts of this image data with another. |
71 void Swap(PPB_ImageData_Impl* other); | 82 void Swap(PPB_ImageData_Impl* other); |
72 | 83 |
84 // We delegate most of our implementation to a class that either uses a | |
brettw
2012/07/20 21:57:04
Since this is a typedef it should be first (before
| |
85 // PlatformCanvas (for most trusted stuff) or bare shared memory (for use by | |
86 // NaCl). This makes it cheap & easy to implement Swap. | |
87 class Delegate { | |
brettw
2012/07/20 21:57:04
I don't really feel like this is a "delegate" the
dmichael (off chromium)
2012/07/20 22:32:40
Yeah... I was thinking of it as "pImpl" pattern,
| |
88 public: | |
89 virtual ~Delegate() {}; | |
90 virtual bool Init(PPB_ImageData_Impl* impl, PP_ImageDataFormat format, | |
91 int width, int height, bool init_to_zero) = 0; | |
92 virtual bool IsMapped() const = 0; | |
93 virtual PluginDelegate::PlatformImage2D* PlatformImage() const = 0; | |
94 virtual void* Map() = 0; | |
95 virtual void Unmap() = 0; | |
96 virtual int32_t GetSharedMemory(int* handle, uint32_t* byte_count) = 0; | |
97 virtual skia::PlatformCanvas* GetPlatformCanvas() = 0; | |
98 virtual SkCanvas* GetCanvas() = 0; | |
99 virtual const SkBitmap* GetMappedBitmap() const = 0; | |
100 }; | |
101 | |
102 private: | |
103 PP_ImageDataFormat format_; | |
104 int width_; | |
105 int height_; | |
106 scoped_ptr<Delegate> delegate_; | |
107 | |
108 DISALLOW_COPY_AND_ASSIGN(PPB_ImageData_Impl); | |
109 }; | |
110 | |
111 class ImageDataPlatformDelegate : public PPB_ImageData_Impl::Delegate { | |
112 public: | |
113 ImageDataPlatformDelegate(); | |
114 virtual ~ImageDataPlatformDelegate(); | |
115 | |
116 // PPB_ImageData_Impl::Delegate implementation. | |
117 virtual bool Init(PPB_ImageData_Impl* impl, PP_ImageDataFormat format, | |
118 int width, int height, bool init_to_zero) OVERRIDE; | |
119 virtual bool IsMapped() const OVERRIDE; | |
120 virtual PluginDelegate::PlatformImage2D* PlatformImage() const OVERRIDE; | |
121 virtual void* Map() OVERRIDE; | |
122 virtual void Unmap() OVERRIDE; | |
123 virtual int32_t GetSharedMemory(int* handle, uint32_t* byte_count) OVERRIDE; | |
124 virtual skia::PlatformCanvas* GetPlatformCanvas() OVERRIDE; | |
125 virtual SkCanvas* GetCanvas() OVERRIDE; | |
126 virtual const SkBitmap* GetMappedBitmap() const OVERRIDE; | |
127 | |
73 private: | 128 private: |
74 // This will be NULL before initialization, and if this PPB_ImageData_Impl is | 129 // This will be NULL before initialization, and if this PPB_ImageData_Impl is |
75 // swapped with another. | 130 // swapped with another. |
76 scoped_ptr<PluginDelegate::PlatformImage2D> platform_image_; | 131 scoped_ptr<PluginDelegate::PlatformImage2D> platform_image_; |
77 | 132 |
78 // When the device is mapped, this is the image. Null when umapped. | 133 // When the device is mapped, this is the image. Null when umapped. |
79 scoped_ptr<skia::PlatformCanvas> mapped_canvas_; | 134 scoped_ptr<skia::PlatformCanvas> mapped_canvas_; |
80 | 135 |
81 PP_ImageDataFormat format_; | 136 DISALLOW_COPY_AND_ASSIGN(ImageDataPlatformDelegate); |
82 int width_; | 137 }; |
83 int height_; | |
84 | 138 |
85 DISALLOW_COPY_AND_ASSIGN(PPB_ImageData_Impl); | 139 class ImageDataNaClDelegate : public PPB_ImageData_Impl::Delegate { |
140 public: | |
141 ImageDataNaClDelegate(); | |
142 virtual ~ImageDataNaClDelegate(); | |
143 | |
144 // PPB_ImageData_Impl::Delegate implementation. | |
145 bool Init(PPB_ImageData_Impl* impl, PP_ImageDataFormat format, | |
146 int width, int height, bool init_to_zero) OVERRIDE; | |
147 virtual bool IsMapped() const OVERRIDE; | |
148 PluginDelegate::PlatformImage2D* PlatformImage() const OVERRIDE; | |
149 virtual void* Map() OVERRIDE; | |
150 virtual void Unmap() OVERRIDE; | |
151 virtual int32_t GetSharedMemory(int* handle, uint32_t* byte_count) OVERRIDE; | |
152 virtual skia::PlatformCanvas* GetPlatformCanvas() OVERRIDE; | |
153 virtual SkCanvas* GetCanvas() OVERRIDE; | |
154 virtual const SkBitmap* GetMappedBitmap() const OVERRIDE; | |
155 | |
156 private: | |
157 scoped_ptr<base::SharedMemory> shared_memory_; | |
158 // skia_bitmap_ is backed by shared_memory_. | |
159 SkBitmap skia_bitmap_; | |
160 SkCanvas skia_canvas_; | |
161 uint32 map_count_; | |
162 | |
163 DISALLOW_COPY_AND_ASSIGN(ImageDataNaClDelegate); | |
86 }; | 164 }; |
87 | 165 |
88 // Manages mapping an image resource if necessary. Use this to ensure the | 166 // Manages mapping an image resource if necessary. Use this to ensure the |
89 // image is mapped. The destructor will put the image back into the previous | 167 // image is mapped. The destructor will put the image back into the previous |
90 // state. You must check is_valid() to make sure the image was successfully | 168 // state. You must check is_valid() to make sure the image was successfully |
91 // mapped before using it. | 169 // mapped before using it. |
92 // | 170 // |
93 // Example: | 171 // Example: |
94 // ImageDataAutoMapper mapper(image_data); | 172 // ImageDataAutoMapper mapper(image_data); |
95 // if (!mapper.is_valid()) | 173 // if (!mapper.is_valid()) |
96 // return utter_failure; | 174 // return utter_failure; |
97 // image_data->mapped_canvas()->blah(); // Guaranteed valid. | 175 // image_data->mapped_canvas()->blah(); // Guaranteed valid. |
98 class ImageDataAutoMapper { | 176 class ImageDataAutoMapper { |
99 public: | 177 public: |
100 explicit ImageDataAutoMapper(PPB_ImageData_Impl* image_data) | 178 explicit ImageDataAutoMapper(PPB_ImageData_Impl* image_data) |
101 : image_data_(image_data) { | 179 : image_data_(image_data) { |
102 if (image_data_->is_mapped()) { | 180 if (image_data_->IsMapped()) { |
103 is_valid_ = true; | 181 is_valid_ = true; |
104 needs_unmap_ = false; | 182 needs_unmap_ = false; |
105 } else { | 183 } else { |
106 is_valid_ = needs_unmap_ = !!image_data_->Map(); | 184 is_valid_ = needs_unmap_ = !!image_data_->Map(); |
107 } | 185 } |
108 } | 186 } |
109 | 187 |
110 ~ImageDataAutoMapper() { | 188 ~ImageDataAutoMapper() { |
111 if (needs_unmap_) | 189 if (needs_unmap_) |
112 image_data_->Unmap(); | 190 image_data_->Unmap(); |
113 } | 191 } |
114 | 192 |
115 // Check this to see if the image was successfully mapped. If this is false, | 193 // Check this to see if the image was successfully mapped. If this is false, |
116 // the image could not be mapped and is unusable. | 194 // the image could not be mapped and is unusable. |
117 bool is_valid() const { return is_valid_; } | 195 bool is_valid() const { return is_valid_; } |
118 | 196 |
119 private: | 197 private: |
120 PPB_ImageData_Impl* image_data_; | 198 PPB_ImageData_Impl* image_data_; |
121 bool is_valid_; | 199 bool is_valid_; |
122 bool needs_unmap_; | 200 bool needs_unmap_; |
123 | 201 |
124 DISALLOW_COPY_AND_ASSIGN(ImageDataAutoMapper); | 202 DISALLOW_COPY_AND_ASSIGN(ImageDataAutoMapper); |
125 }; | 203 }; |
126 | 204 |
127 } // namespace ppapi | 205 } // namespace ppapi |
128 } // namespace webkit | 206 } // namespace webkit |
129 | 207 |
130 #endif // WEBKIT_PLUGINS_PPAPI_PPB_IMAGE_DATA_IMPL_H_ | 208 #endif // WEBKIT_PLUGINS_PPAPI_PPB_IMAGE_DATA_IMPL_H_ |
OLD | NEW |