| Index: ppapi/proxy/ppb_image_data_proxy.cc
|
| ===================================================================
|
| --- ppapi/proxy/ppb_image_data_proxy.cc (revision 84713)
|
| +++ ppapi/proxy/ppb_image_data_proxy.cc (working copy)
|
| @@ -18,16 +18,9 @@
|
| #include "ppapi/proxy/plugin_resource_tracker.h"
|
| #include "ppapi/proxy/ppapi_messages.h"
|
| #include "ppapi/thunk/thunk.h"
|
| +#include "skia/ext/platform_canvas.h"
|
| +#include "ui/gfx/surface/transport_dib.h"
|
|
|
| -#if defined(OS_LINUX)
|
| -#include <sys/shm.h>
|
| -#elif defined(OS_MACOSX)
|
| -#include <sys/stat.h>
|
| -#include <sys/mman.h>
|
| -#elif defined(OS_WIN)
|
| -#include <windows.h>
|
| -#endif
|
| -
|
| namespace pp {
|
| namespace proxy {
|
|
|
| @@ -72,13 +65,15 @@
|
| const PP_ImageDataDesc& desc,
|
| ImageHandle handle)
|
| : PluginResource(resource),
|
| - desc_(desc),
|
| - handle_(handle),
|
| - mapped_data_(NULL) {
|
| + desc_(desc) {
|
| +#if defined(OS_WIN)
|
| + transport_dib_.reset(TransportDIB::CreateWithHandle(handle));
|
| +#else
|
| + transport_dib_.reset(TransportDIB::Map(handle));
|
| +#endif
|
| }
|
|
|
| ImageData::~ImageData() {
|
| - Unmap();
|
| }
|
|
|
| ::ppapi::thunk::PPB_ImageData_API* ImageData::AsImageData_API() {
|
| @@ -95,47 +90,23 @@
|
| }
|
|
|
| void* ImageData::Map() {
|
| -#if defined(OS_WIN)
|
| - mapped_data_ = ::MapViewOfFile(handle_, FILE_MAP_READ | FILE_MAP_WRITE,
|
| - 0, 0, 0);
|
| - return mapped_data_;
|
| -#elif defined(OS_MACOSX)
|
| - struct stat st;
|
| - if (fstat(handle_.fd, &st) != 0)
|
| - return NULL;
|
| - void* memory = mmap(NULL, st.st_size, PROT_READ | PROT_WRITE,
|
| - MAP_SHARED, handle_.fd, 0);
|
| - if (memory == MAP_FAILED)
|
| - return NULL;
|
| - mapped_data_ = memory;
|
| - return mapped_data_;
|
| -#else
|
| - int shmkey = handle_;
|
| - void* address = shmat(shmkey, NULL, 0);
|
| - // Mark for deletion in case we crash so the kernel will clean it up.
|
| - shmctl(shmkey, IPC_RMID, 0);
|
| - if (address == (void*)-1)
|
| - return NULL;
|
| - mapped_data_ = address;
|
| - return address;
|
| -#endif
|
| + if (!mapped_canvas_.get()) {
|
| + mapped_canvas_.reset(transport_dib_->GetPlatformCanvas(desc_.size.width,
|
| + desc_.size.height));
|
| + if (!mapped_canvas_.get())
|
| + return NULL;
|
| + }
|
| + const SkBitmap& bitmap =
|
| + mapped_canvas_->getTopPlatformDevice().accessBitmap(true);
|
| +
|
| + bitmap.lockPixels();
|
| + return bitmap.getAddr(0, 0);
|
| }
|
|
|
| void ImageData::Unmap() {
|
| -#if defined(OS_WIN)
|
| - if (mapped_data_)
|
| - ::UnmapViewOfFile(mapped_data_);
|
| -#elif defined(OS_MACOSX)
|
| - if (mapped_data_) {
|
| - struct stat st;
|
| - if (fstat(handle_.fd, &st) == 0)
|
| - munmap(mapped_data_, st.st_size);
|
| - }
|
| -#else
|
| - if (mapped_data_)
|
| - shmdt(mapped_data_);
|
| -#endif
|
| - mapped_data_ = NULL;
|
| + // TODO(brettw) have a way to unmap a TransportDIB. Currently this isn't
|
| + // possible since deleting the TransportDIB also frees all the handles.
|
| + // We need to add a method to TransportDIB to release the handles.
|
| }
|
|
|
| #if defined(OS_WIN)
|
|
|