Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1164)

Side by Side Diff: webkit/plugins/ppapi/ppb_image_data_impl.h

Issue 10790063: PPAPI/NaCl: Make ImageData for NaCl just use shared memory (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix component build, minor style fixes Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698