diff options
author | brettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-04 23:29:06 +0000 |
---|---|---|
committer | brettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-04 23:29:06 +0000 |
commit | 2a1d6d91c755f42a4b15f4c64f7ffeddb38e8fdf (patch) | |
tree | 76f2667611cd906a5eda052d8c59ec5979bc387e /ppapi/proxy/ppb_image_data_proxy.cc | |
parent | 1098044ebaddc4b637b043e7e6654f33969fef67 (diff) | |
download | chromium_src-2a1d6d91c755f42a4b15f4c64f7ffeddb38e8fdf.zip chromium_src-2a1d6d91c755f42a4b15f4c64f7ffeddb38e8fdf.tar.gz chromium_src-2a1d6d91c755f42a4b15f4c64f7ffeddb38e8fdf.tar.bz2 |
Regularize how ImageData and Graphics2D are created.
These objects were created differently than any other resoures. This cleans
them up to behave like the other resources.
BUG=
TEST=
Review URL: http://codereview.chromium.org/8790009
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@112946 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ppapi/proxy/ppb_image_data_proxy.cc')
-rw-r--r-- | ppapi/proxy/ppb_image_data_proxy.cc | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/ppapi/proxy/ppb_image_data_proxy.cc b/ppapi/proxy/ppb_image_data_proxy.cc index 32c24a9..20f8f62 100644 --- a/ppapi/proxy/ppb_image_data_proxy.cc +++ b/ppapi/proxy/ppb_image_data_proxy.cc @@ -18,6 +18,7 @@ #include "ppapi/proxy/ppapi_messages.h" #include "ppapi/shared_impl/host_resource.h" #include "ppapi/shared_impl/resource.h" +#include "ppapi/thunk/enter.h" #include "ppapi/thunk/thunk.h" #include "skia/ext/platform_canvas.h" #include "ui/gfx/surface/transport_dib.h" @@ -94,5 +95,88 @@ ImageHandle ImageData::HandleFromInt(int32_t i) { #endif } +PPB_ImageData_Proxy::PPB_ImageData_Proxy(Dispatcher* dispatcher) + : InterfaceProxy(dispatcher) { +} + +PPB_ImageData_Proxy::~PPB_ImageData_Proxy() { +} + +// static +PP_Resource PPB_ImageData_Proxy::CreateProxyResource(PP_Instance instance, + PP_ImageDataFormat format, + const PP_Size& size, + PP_Bool init_to_zero) { + PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); + if (!dispatcher) + return 0; + + HostResource result; + std::string image_data_desc; + ImageHandle image_handle = ImageData::NullHandle; + dispatcher->Send(new PpapiHostMsg_PPBImageData_Create( + kApiID, instance, format, size, init_to_zero, + &result, &image_data_desc, &image_handle)); + + if (result.is_null() || image_data_desc.size() != sizeof(PP_ImageDataDesc)) + return 0; + + // We serialize the PP_ImageDataDesc just by copying to a string. + PP_ImageDataDesc desc; + memcpy(&desc, image_data_desc.data(), sizeof(PP_ImageDataDesc)); + + return (new ImageData(result, desc, image_handle))->GetReference(); +} + +bool PPB_ImageData_Proxy::OnMessageReceived(const IPC::Message& msg) { + bool handled = true; + IPC_BEGIN_MESSAGE_MAP(PPB_ImageData_Proxy, msg) + IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBImageData_Create, OnHostMsgCreate) + IPC_MESSAGE_UNHANDLED(handled = false) + IPC_END_MESSAGE_MAP() + return handled; +} + +void PPB_ImageData_Proxy::OnHostMsgCreate(PP_Instance instance, + int32_t format, + const PP_Size& size, + PP_Bool init_to_zero, + HostResource* result, + std::string* image_data_desc, + ImageHandle* result_image_handle) { + *result_image_handle = ImageData::NullHandle; + + thunk::EnterResourceCreation enter(instance); + if (enter.failed()) + return; + + PP_Resource resource = enter.functions()->CreateImageData( + instance, static_cast<PP_ImageDataFormat>(format), size, init_to_zero); + if (!resource) + return; + result->SetHostResource(instance, resource); + + // Get the description, it's just serialized as a string. + thunk::EnterResourceNoLock<thunk::PPB_ImageData_API> enter_resource( + resource, false); + PP_ImageDataDesc desc; + if (enter_resource.object()->Describe(&desc) == PP_TRUE) { + image_data_desc->resize(sizeof(PP_ImageDataDesc)); + memcpy(&(*image_data_desc)[0], &desc, sizeof(PP_ImageDataDesc)); + } + + // Get the shared memory handle. + uint32_t byte_count = 0; + int32_t handle = 0; + if (enter_resource.object()->GetSharedMemory(&handle, &byte_count) == PP_OK) { +#if defined(OS_WIN) + ImageHandle ih = ImageData::HandleFromInt(handle); + *result_image_handle = dispatcher()->ShareHandleWithRemote(ih, false); +#else + *result_image_handle = ImageData::HandleFromInt(handle); +#endif + } +} + } // namespace proxy } // namespace ppapi |