| Index: webkit/glue/plugins/pepper_image_data.cc
|
| ===================================================================
|
| --- webkit/glue/plugins/pepper_image_data.cc (revision 0)
|
| +++ webkit/glue/plugins/pepper_image_data.cc (revision 0)
|
| @@ -0,0 +1,148 @@
|
| +// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "webkit/glue/plugins/pepper_image_data.h"
|
| +
|
| +#include "base/scoped_ptr.h"
|
| +#include "skia/ext/platform_canvas.h"
|
| +#include "third_party/ppapi/c/pp_instance.h"
|
| +#include "third_party/ppapi/c/pp_module.h"
|
| +#include "third_party/ppapi/c/pp_resource.h"
|
| +#include "third_party/ppapi/c/ppb_image_data.h"
|
| +#include "webkit/glue/plugins/pepper_plugin_instance.h"
|
| +#include "webkit/glue/plugins/pepper_plugin_module.h"
|
| +#include "webkit/glue/plugins/pepper_resource_tracker.h"
|
| +
|
| +namespace pepper {
|
| +
|
| +namespace {
|
| +
|
| +ImageData* ResourceAsImageData(PP_Resource resource) {
|
| + scoped_refptr<Resource> image_resource =
|
| + ResourceTracker::Get()->GetResource(resource);
|
| + if (!image_resource.get())
|
| + return NULL;
|
| + return image_resource->AsImageData();
|
| +}
|
| +
|
| +PP_Resource Create(PP_Module module_id,
|
| + PP_ImageDataFormat format,
|
| + int32_t width,
|
| + int32_t height) {
|
| + PluginModule* module = PluginModule::FromPPModule(module_id);
|
| + if (!module)
|
| + return NullPPResource();
|
| +
|
| + scoped_refptr<ImageData> data(new ImageData(module));
|
| + if (!data->Init(format, width, height))
|
| + return NullPPResource();
|
| + data->AddRef(); // AddRef for the caller.
|
| +
|
| + return data->GetResource();
|
| +}
|
| +
|
| +bool IsImageData(PP_Resource resource) {
|
| + scoped_refptr<Resource> image_resource =
|
| + ResourceTracker::Get()->GetResource(resource);
|
| + if (!image_resource.get())
|
| + return false;
|
| + return !!image_resource->AsImageData();
|
| +}
|
| +
|
| +bool Describe(PP_Resource resource,
|
| + PP_ImageDataDesc* desc) {
|
| + // Give predictable values on failure.
|
| + memset(desc, 0, sizeof(PP_ImageDataDesc));
|
| +
|
| + ImageData* image_data = ResourceAsImageData(resource);
|
| + if (!image_data)
|
| + return false;
|
| + image_data->Describe(desc);
|
| + return true;
|
| +}
|
| +
|
| +void* Map(PP_Resource resource) {
|
| + ImageData* image_data = ResourceAsImageData(resource);
|
| + if (!image_data)
|
| + return NULL;
|
| + return image_data->Map();
|
| +}
|
| +
|
| +void Unmap(PP_Resource resource) {
|
| + ImageData* image_data = ResourceAsImageData(resource);
|
| + if (!image_data)
|
| + return;
|
| + return image_data->Unmap();
|
| +}
|
| +
|
| +const PPB_ImageData ppb_imagedata = {
|
| + &Create,
|
| + &IsImageData,
|
| + &Describe,
|
| + &Map,
|
| + &Unmap,
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +ImageData::ImageData(PluginModule* module)
|
| + : Resource(module),
|
| + width_(0),
|
| + height_(0) {
|
| +}
|
| +
|
| +ImageData::~ImageData() {
|
| +}
|
| +
|
| +// static
|
| +const PPB_ImageData* ImageData::GetInterface() {
|
| + return &ppb_imagedata;
|
| +}
|
| +
|
| +bool ImageData::Init(PP_ImageDataFormat format,
|
| + int width,
|
| + int height) {
|
| + // TODO(brettw) this should be called only on the main thread!
|
| + platform_image_.reset(
|
| + module()->GetSomeInstance()->delegate()->CreateImage2D(width, height));
|
| + width_ = width;
|
| + height_ = height;
|
| + return !!platform_image_.get();
|
| +}
|
| +
|
| +void ImageData::Describe(PP_ImageDataDesc* desc) const {
|
| + desc->format = PP_IMAGEDATAFORMAT_BGRA_PREMUL;
|
| + desc->width = width_;
|
| + desc->height = height_;
|
| + desc->stride = width_ * 4;
|
| +}
|
| +
|
| +void* ImageData::Map() {
|
| + if (!mapped_canvas_.get()) {
|
| + mapped_canvas_.reset(platform_image_->Map());
|
| + if (!mapped_canvas_.get())
|
| + return NULL;
|
| + }
|
| + const SkBitmap& bitmap =
|
| + mapped_canvas_->getTopPlatformDevice().accessBitmap(true);
|
| +
|
| + // Our platform bitmaps are set to opaque by default, which we don't want.
|
| + const_cast<SkBitmap&>(bitmap).setIsOpaque(false);
|
| +
|
| + bitmap.lockPixels();
|
| + return bitmap.getAddr32(0, 0);
|
| +}
|
| +
|
| +void ImageData::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.
|
| +}
|
| +
|
| +const SkBitmap& ImageData::GetMappedBitmap() const {
|
| + return mapped_canvas_->getTopPlatformDevice().accessBitmap(false);
|
| +}
|
| +
|
| +} // namespace pepper
|
|
|
| Property changes on: webkit/glue/plugins/pepper_image_data.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|