Index: webkit/plugins/ppapi/ppb_image_data_impl.h |
diff --git a/webkit/plugins/ppapi/ppb_image_data_impl.h b/webkit/plugins/ppapi/ppb_image_data_impl.h |
index 817b238fcca0b38ff0869b22e0c9a4bfc4c768e6..d84ce9384cb5b3dc1dd3b2b798506c336d4b00a4 100644 |
--- a/webkit/plugins/ppapi/ppb_image_data_impl.h |
+++ b/webkit/plugins/ppapi/ppb_image_data_impl.h |
@@ -11,6 +11,7 @@ |
#include "ppapi/shared_impl/ppb_image_data_shared.h" |
#include "ppapi/shared_impl/resource.h" |
#include "ppapi/thunk/ppb_image_data_api.h" |
+#include "third_party/skia/include/core/SkCanvas.h" |
#include "webkit/plugins/ppapi/plugin_delegate.h" |
#include "webkit/plugins/webkit_plugins_export.h" |
@@ -30,33 +31,42 @@ class PPB_ImageData_Impl : public ::ppapi::Resource, |
// If you call this constructor, you must also call Init before use. Normally |
// you should use the static Create function, but this constructor is needed |
// for some internal uses of ImageData (like Graphics2D). |
- WEBKIT_PLUGINS_EXPORT explicit PPB_ImageData_Impl(PP_Instance instance); |
+ enum ImageDataType { PLATFORM, NACL }; |
+ WEBKIT_PLUGINS_EXPORT PPB_ImageData_Impl(PP_Instance instance, |
+ ImageDataType type); |
virtual ~PPB_ImageData_Impl(); |
- static PP_Resource Create(PP_Instance pp_instance, |
- PP_ImageDataFormat format, |
- const PP_Size& size, |
- PP_Bool init_to_zero); |
- |
WEBKIT_PLUGINS_EXPORT bool Init(PP_ImageDataFormat format, |
int width, int height, |
bool init_to_zero); |
+ // Create an ImageData backed by a PlatformCanvas. You must use this if you |
+ // intend the ImageData to be usable in platform-specific APIs (like font |
+ // rendering or rendering widgets like scrollbars). |
+ static PP_Resource CreatePlatform(PP_Instance pp_instance, |
+ PP_ImageDataFormat format, |
+ const PP_Size& size, |
+ PP_Bool init_to_zero); |
+ // Use this to create an ImageData for use with NaCl. This is backed by a |
+ // simple shared memory buffer. |
+ static PP_Resource CreateNaCl(PP_Instance pp_instance, |
+ PP_ImageDataFormat format, |
+ const PP_Size& size, |
+ PP_Bool init_to_zero); |
+ |
int width() const { return width_; } |
int height() const { return height_; } |
// Returns the image format. |
PP_ImageDataFormat format() const { return format_; } |
+ // Resource override. |
+ virtual ::ppapi::thunk::PPB_ImageData_API* AsPPB_ImageData_API() OVERRIDE; |
+ |
// Returns true if this image is mapped. False means that the image is either |
// invalid or not mapped. See ImageDataAutoMapper below. |
- bool is_mapped() const { return !!mapped_canvas_.get(); } |
- |
- PluginDelegate::PlatformImage2D* platform_image() const { |
- return platform_image_.get(); |
- } |
- |
- virtual ::ppapi::thunk::PPB_ImageData_API* AsPPB_ImageData_API() OVERRIDE; |
+ WEBKIT_PLUGINS_EXPORT bool IsMapped() const; |
+ PluginDelegate::PlatformImage2D* PlatformImage() const; |
// PPB_ImageData_API implementation. |
virtual PP_Bool Describe(PP_ImageDataDesc* desc) OVERRIDE; |
@@ -64,12 +74,57 @@ class PPB_ImageData_Impl : public ::ppapi::Resource, |
virtual void Unmap() OVERRIDE; |
virtual int32_t GetSharedMemory(int* handle, uint32_t* byte_count) OVERRIDE; |
virtual skia::PlatformCanvas* GetPlatformCanvas() OVERRIDE; |
+ virtual SkCanvas* GetCanvas() OVERRIDE; |
const SkBitmap* GetMappedBitmap() const; |
// Swaps the guts of this image data with another. |
void Swap(PPB_ImageData_Impl* other); |
+ // We delegate most of our implementation to a class that either uses a |
+ // PlatformCanvas (for most trusted stuff) or bare shared memory (for use by |
+ // NaCl). This makes it cheap & easy to implement Swap. |
+ class Delegate { |
+ public: |
+ virtual ~Delegate() {}; |
+ virtual bool Init(PPB_ImageData_Impl* impl, PP_ImageDataFormat format, |
+ int width, int height, bool init_to_zero) = 0; |
+ virtual bool IsMapped() const = 0; |
+ virtual PluginDelegate::PlatformImage2D* PlatformImage() const = 0; |
+ virtual void* Map() = 0; |
+ virtual void Unmap() = 0; |
+ virtual int32_t GetSharedMemory(int* handle, uint32_t* byte_count) = 0; |
+ virtual skia::PlatformCanvas* GetPlatformCanvas() = 0; |
+ virtual SkCanvas* GetCanvas() = 0; |
+ virtual const SkBitmap* GetMappedBitmap() const = 0; |
+ }; |
+ |
+ private: |
+ PP_ImageDataFormat format_; |
+ int width_; |
+ int height_; |
+ scoped_ptr<Delegate> delegate_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(PPB_ImageData_Impl); |
+}; |
+ |
+class ImageDataPlatformDelegate : public PPB_ImageData_Impl::Delegate { |
+ public: |
+ ImageDataPlatformDelegate(); |
+ virtual ~ImageDataPlatformDelegate(); |
+ |
+ // PPB_ImageData_Impl::Delegate implementation. |
+ virtual bool Init(PPB_ImageData_Impl* impl, PP_ImageDataFormat format, |
+ int width, int height, bool init_to_zero) OVERRIDE; |
+ virtual bool IsMapped() const OVERRIDE; |
+ virtual PluginDelegate::PlatformImage2D* PlatformImage() const OVERRIDE; |
+ virtual void* Map() OVERRIDE; |
+ virtual void Unmap() OVERRIDE; |
+ virtual int32_t GetSharedMemory(int* handle, uint32_t* byte_count) OVERRIDE; |
+ virtual skia::PlatformCanvas* GetPlatformCanvas() OVERRIDE; |
+ virtual SkCanvas* GetCanvas() OVERRIDE; |
+ virtual const SkBitmap* GetMappedBitmap() const OVERRIDE; |
+ |
private: |
// This will be NULL before initialization, and if this PPB_ImageData_Impl is |
// swapped with another. |
@@ -78,11 +133,34 @@ class PPB_ImageData_Impl : public ::ppapi::Resource, |
// When the device is mapped, this is the image. Null when umapped. |
scoped_ptr<skia::PlatformCanvas> mapped_canvas_; |
- PP_ImageDataFormat format_; |
- int width_; |
- int height_; |
+ DISALLOW_COPY_AND_ASSIGN(ImageDataPlatformDelegate); |
+}; |
- DISALLOW_COPY_AND_ASSIGN(PPB_ImageData_Impl); |
+class ImageDataNaClDelegate : public PPB_ImageData_Impl::Delegate { |
+ public: |
+ ImageDataNaClDelegate(); |
+ virtual ~ImageDataNaClDelegate(); |
+ |
+ // PPB_ImageData_Impl::Delegate implementation. |
+ bool Init(PPB_ImageData_Impl* impl, PP_ImageDataFormat format, |
+ int width, int height, bool init_to_zero) OVERRIDE; |
+ virtual bool IsMapped() const OVERRIDE; |
+ PluginDelegate::PlatformImage2D* PlatformImage() const OVERRIDE; |
+ virtual void* Map() OVERRIDE; |
+ virtual void Unmap() OVERRIDE; |
+ virtual int32_t GetSharedMemory(int* handle, uint32_t* byte_count) OVERRIDE; |
+ virtual skia::PlatformCanvas* GetPlatformCanvas() OVERRIDE; |
+ virtual SkCanvas* GetCanvas() OVERRIDE; |
+ virtual const SkBitmap* GetMappedBitmap() const OVERRIDE; |
+ |
+ private: |
+ scoped_ptr<base::SharedMemory> shared_memory_; |
+ // skia_bitmap_ is backed by shared_memory_. |
+ SkBitmap skia_bitmap_; |
+ SkCanvas skia_canvas_; |
+ uint32 map_count_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ImageDataNaClDelegate); |
}; |
// Manages mapping an image resource if necessary. Use this to ensure the |
@@ -99,7 +177,7 @@ class ImageDataAutoMapper { |
public: |
explicit ImageDataAutoMapper(PPB_ImageData_Impl* image_data) |
: image_data_(image_data) { |
- if (image_data_->is_mapped()) { |
+ if (image_data_->IsMapped()) { |
is_valid_ = true; |
needs_unmap_ = false; |
} else { |