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

Unified Diff: webkit/plugins/ppapi/ppb_image_data_impl.cc

Issue 10790063: PPAPI/NaCl: Make ImageData for NaCl just use shared memory (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: make PPB_ImageData_API base non-exported 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webkit/plugins/ppapi/ppb_image_data_impl.h ('k') | webkit/plugins/ppapi/resource_creation_impl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webkit/plugins/ppapi/ppb_image_data_impl.cc
diff --git a/webkit/plugins/ppapi/ppb_image_data_impl.cc b/webkit/plugins/ppapi/ppb_image_data_impl.cc
index ea5f2c663d540b299033f9916a06dc2e469d907f..c58846af0c1b4586c06d157afdc4a8a1920dae2e 100644
--- a/webkit/plugins/ppapi/ppb_image_data_impl.cc
+++ b/webkit/plugins/ppapi/ppb_image_data_impl.cc
@@ -25,36 +25,31 @@ using ::ppapi::thunk::PPB_ImageData_API;
namespace webkit {
namespace ppapi {
-PPB_ImageData_Impl::PPB_ImageData_Impl(PP_Instance instance)
+PPB_ImageData_Impl::PPB_ImageData_Impl(PP_Instance instance,
+ ImageDataType type)
: Resource(::ppapi::OBJECT_IS_IMPL, instance),
format_(PP_IMAGEDATAFORMAT_BGRA_PREMUL),
width_(0),
height_(0) {
+ switch (type) {
+ case PLATFORM:
+ backend_.reset(new ImageDataPlatformBackend);
+ return;
+ case NACL:
+ backend_.reset(new ImageDataNaClBackend);
+ return;
+ // No default: so that we get a compiler warning if any types are added.
+ }
+ NOTREACHED();
}
PPB_ImageData_Impl::~PPB_ImageData_Impl() {
}
-// static
-PP_Resource PPB_ImageData_Impl::Create(PP_Instance instance,
- PP_ImageDataFormat format,
- const PP_Size& size,
- PP_Bool init_to_zero) {
- scoped_refptr<PPB_ImageData_Impl> data(new PPB_ImageData_Impl(instance));
- if (!data->Init(format, size.width, size.height, !!init_to_zero))
- return 0;
- return data->GetReference();
-}
-
-PPB_ImageData_API* PPB_ImageData_Impl::AsPPB_ImageData_API() {
- return this;
-}
-
bool PPB_ImageData_Impl::Init(PP_ImageDataFormat format,
int width, int height,
bool init_to_zero) {
// TODO(brettw) this should be called only on the main thread!
- // TODO(brettw) use init_to_zero when we implement caching.
if (!IsImageDataFormatSupported(format))
return false; // Only support this one format for now.
if (width <= 0 || height <= 0)
@@ -63,15 +58,46 @@ bool PPB_ImageData_Impl::Init(PP_ImageDataFormat format,
std::numeric_limits<int32>::max())
return false; // Prevent overflow of signed 32-bit ints.
- PluginDelegate* plugin_delegate = ResourceHelper::GetPluginDelegate(this);
- if (!plugin_delegate)
- return false;
-
- platform_image_.reset(plugin_delegate->CreateImage2D(width, height));
format_ = format;
width_ = width;
height_ = height;
- return !!platform_image_.get();
+ return backend_->Init(this, format, width, height, init_to_zero);
+}
+
+// static
+PP_Resource PPB_ImageData_Impl::CreatePlatform(PP_Instance instance,
+ PP_ImageDataFormat format,
+ const PP_Size& size,
+ PP_Bool init_to_zero) {
+ scoped_refptr<PPB_ImageData_Impl>
+ data(new PPB_ImageData_Impl(instance, PLATFORM));
+ if (!data->Init(format, size.width, size.height, !!init_to_zero))
+ return 0;
+ return data->GetReference();
+}
+
+// static
+PP_Resource PPB_ImageData_Impl::CreateNaCl(PP_Instance instance,
+ PP_ImageDataFormat format,
+ const PP_Size& size,
+ PP_Bool init_to_zero) {
+ scoped_refptr<PPB_ImageData_Impl>
+ data(new PPB_ImageData_Impl(instance, NACL));
+ if (!data->Init(format, size.width, size.height, !!init_to_zero))
+ return 0;
+ return data->GetReference();
+}
+
+PPB_ImageData_API* PPB_ImageData_Impl::AsPPB_ImageData_API() {
+ return this;
+}
+
+bool PPB_ImageData_Impl::IsMapped() const {
+ return backend_->IsMapped();
+}
+
+PluginDelegate::PlatformImage2D* PPB_ImageData_Impl::PlatformImage() const {
+ return backend_->PlatformImage();
}
PP_Bool PPB_ImageData_Impl::Describe(PP_ImageDataDesc* desc) {
@@ -83,6 +109,67 @@ PP_Bool PPB_ImageData_Impl::Describe(PP_ImageDataDesc* desc) {
}
void* PPB_ImageData_Impl::Map() {
+ return backend_->Map();
+}
+
+void PPB_ImageData_Impl::Unmap() {
+ backend_->Unmap();
+}
+
+int32_t PPB_ImageData_Impl::GetSharedMemory(int* handle, uint32_t* byte_count) {
+ return backend_->GetSharedMemory(handle, byte_count);
+}
+
+skia::PlatformCanvas* PPB_ImageData_Impl::GetPlatformCanvas() {
+ return backend_->GetPlatformCanvas();
+}
+
+SkCanvas* PPB_ImageData_Impl::GetCanvas() {
+ return backend_->GetCanvas();
+}
+
+const SkBitmap* PPB_ImageData_Impl::GetMappedBitmap() const {
+ return backend_->GetMappedBitmap();
+}
+
+void PPB_ImageData_Impl::Swap(PPB_ImageData_Impl* other) {
+ backend_.swap(other->backend_);
+ std::swap(other->format_, format_);
+ std::swap(other->width_, width_);
+ std::swap(other->height_, height_);
+}
+
+// ImageDataPlatformBackend --------------------------------------------------
+
+ImageDataPlatformBackend::ImageDataPlatformBackend() {
+}
+
+ImageDataPlatformBackend::~ImageDataPlatformBackend() {
+}
+
+bool ImageDataPlatformBackend::Init(PPB_ImageData_Impl* impl,
+ PP_ImageDataFormat format,
+ int width, int height,
+ bool init_to_zero) {
+ PluginDelegate* plugin_delegate = ResourceHelper::GetPluginDelegate(impl);
+ if (!plugin_delegate)
+ return false;
+
+ // TODO(brettw) use init_to_zero when we implement caching.
+ platform_image_.reset(plugin_delegate->CreateImage2D(width, height));
+ return !!platform_image_.get();
+}
+
+bool ImageDataPlatformBackend::IsMapped() const {
+ return !!mapped_canvas_.get();
+}
+
+PluginDelegate::PlatformImage2D*
+ImageDataPlatformBackend::PlatformImage() const {
+ return platform_image_.get();
+}
+
+void* ImageDataPlatformBackend::Map() {
if (!mapped_canvas_.get()) {
mapped_canvas_.reset(platform_image_->Map());
if (!mapped_canvas_.get())
@@ -98,35 +185,109 @@ void* PPB_ImageData_Impl::Map() {
return bitmap.getAddr32(0, 0);
}
-void PPB_ImageData_Impl::Unmap() {
+void ImageDataPlatformBackend::Unmap() {
// This is currently unimplemented, which is OK. The data will just always
// be around once it's mapped. Chrome's TransportDIB isn't currently
// unmappable without freeing it, but this may be something we want to support
// in the future to save some memory.
}
-int32_t PPB_ImageData_Impl::GetSharedMemory(int* handle,
- uint32_t* byte_count) {
+int32_t ImageDataPlatformBackend::GetSharedMemory(int* handle,
+ uint32_t* byte_count) {
*handle = platform_image_->GetSharedMemoryHandle(byte_count);
return PP_OK;
}
-skia::PlatformCanvas* PPB_ImageData_Impl::GetPlatformCanvas() {
+skia::PlatformCanvas* ImageDataPlatformBackend::GetPlatformCanvas() {
return mapped_canvas_.get();
}
-const SkBitmap* PPB_ImageData_Impl::GetMappedBitmap() const {
+SkCanvas* ImageDataPlatformBackend::GetCanvas() {
+ return mapped_canvas_.get();
+}
+
+const SkBitmap* ImageDataPlatformBackend::GetMappedBitmap() const {
if (!mapped_canvas_.get())
return NULL;
return &skia::GetTopDevice(*mapped_canvas_)->accessBitmap(false);
}
-void PPB_ImageData_Impl::Swap(PPB_ImageData_Impl* other) {
- swap(other->platform_image_, platform_image_);
- swap(other->mapped_canvas_, mapped_canvas_);
- std::swap(other->format_, format_);
- std::swap(other->width_, width_);
- std::swap(other->height_, height_);
+// ImageDataNaClBackend ------------------------------------------------------
+
+ImageDataNaClBackend::ImageDataNaClBackend()
+ : map_count_(0) {
+}
+
+ImageDataNaClBackend::~ImageDataNaClBackend() {
+}
+
+bool ImageDataNaClBackend::Init(PPB_ImageData_Impl* impl,
+ PP_ImageDataFormat format,
+ int width, int height,
+ bool init_to_zero) {
+ skia_bitmap_.setConfig(SkBitmap::kARGB_8888_Config,
+ impl->width(), impl->height());
+ PluginDelegate* plugin_delegate = ResourceHelper::GetPluginDelegate(impl);
+ if (!plugin_delegate)
+ return false;
+ shared_memory_.reset(
+ plugin_delegate->CreateAnonymousSharedMemory(skia_bitmap_.getSize()));
+ return !!shared_memory_.get();
+}
+
+bool ImageDataNaClBackend::IsMapped() const {
+ return map_count_ > 0;
+}
+
+PluginDelegate::PlatformImage2D* ImageDataNaClBackend::PlatformImage() const {
+ return NULL;
+}
+
+void* ImageDataNaClBackend::Map() {
+ DCHECK(shared_memory_.get());
+ if (map_count_++ == 0) {
+ shared_memory_->Map(skia_bitmap_.getSize());
+ skia_bitmap_.setPixels(shared_memory_->memory());
+ // Our platform bitmaps are set to opaque by default, which we don't want.
+ skia_bitmap_.setIsOpaque(false);
+ skia_canvas_.setBitmapDevice(skia_bitmap_);
+ return skia_bitmap_.getAddr32(0, 0);
+ }
+ return shared_memory_->memory();
+}
+
+void ImageDataNaClBackend::Unmap() {
+ if (--map_count_ == 0)
+ shared_memory_->Unmap();
+}
+
+int32_t ImageDataNaClBackend::GetSharedMemory(int* handle,
+ uint32_t* byte_count) {
+ *byte_count = skia_bitmap_.getSize();
+#if defined(OS_POSIX)
+ *handle = shared_memory_->handle().fd;
+#elif defined(OS_WIN)
+ *handle = reinterpret_cast<int>(shared_memory_->handle());
+#else
+#error "Platform not supported."
+#endif
+ return PP_OK;
+}
+
+skia::PlatformCanvas* ImageDataNaClBackend::GetPlatformCanvas() {
+ return NULL;
+}
+
+SkCanvas* ImageDataNaClBackend::GetCanvas() {
+ if (!IsMapped())
+ return NULL;
+ return &skia_canvas_;
+}
+
+const SkBitmap* ImageDataNaClBackend::GetMappedBitmap() const {
+ if (!IsMapped())
+ return NULL;
+ return &skia_bitmap_;
}
} // namespace ppapi
« no previous file with comments | « webkit/plugins/ppapi/ppb_image_data_impl.h ('k') | webkit/plugins/ppapi/resource_creation_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698