| Index: chrome/renderer/pepper_plugin_delegate_impl.cc
|
| ===================================================================
|
| --- chrome/renderer/pepper_plugin_delegate_impl.cc (revision 0)
|
| +++ chrome/renderer/pepper_plugin_delegate_impl.cc (revision 0)
|
| @@ -0,0 +1,78 @@
|
| +// 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 "chrome/renderer/pepper_plugin_delegate_impl.h"
|
| +
|
| +#include "app/surface/transport_dib.h"
|
| +#include "base/scoped_ptr.h"
|
| +
|
| +namespace {
|
| +
|
| +// Implements the Image2D using a TransportDIB.
|
| +class PlatformImage2DImpl : public pepper::PluginDelegate::PlatformImage2D {
|
| + public:
|
| + // This constructor will take ownership of the dib pointer.
|
| + PlatformImage2DImpl(int width, int height, TransportDIB* dib)
|
| + : width_(width),
|
| + height_(height),
|
| + dib_(dib) {
|
| + }
|
| +
|
| + virtual skia::PlatformCanvas* Map() {
|
| + return dib_->GetPlatformCanvas(width_, height_);
|
| + }
|
| +
|
| + virtual intptr_t GetSharedMemoryHandle() const {
|
| + return dib_->handle();
|
| + }
|
| +
|
| + private:
|
| + int width_;
|
| + int height_;
|
| + scoped_ptr<TransportDIB> dib_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(PlatformImage2DImpl);
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +PepperPluginDelegateImpl::PepperPluginDelegateImpl(RenderView* render_view)
|
| + : render_view_(render_view) {
|
| +}
|
| +
|
| +pepper::PluginDelegate::PlatformImage2D*
|
| +PepperPluginDelegateImpl::CreateImage2D(int width, int height) {
|
| + uint32 buffer_size = width * height * 4;
|
| +
|
| + // Allocate the transport DIB and the PlatformCanvas pointing to it.
|
| +#if defined(OS_MACOSX)
|
| + // On the Mac, shared memory has to be created in the browser in order to
|
| + // work in the sandbox. Do this by sending a message to the browser
|
| + // requesting a TransportDIB (see also
|
| + // chrome/renderer/webplugin_delegate_proxy.cc, method
|
| + // WebPluginDelegateProxy::CreateBitmap() for similar code). Note that the
|
| + // TransportDIB is _not_ cached in the browser; this is because this memory
|
| + // gets flushed by the renderer into another TransportDIB that represents the
|
| + // page, which is then in turn flushed to the screen by the browser process.
|
| + // When |transport_dib_| goes out of scope in the dtor, all of its shared
|
| + // memory gets reclaimed.
|
| + TransportDIB::Handle dib_handle;
|
| + IPC::Message* msg = new ViewHostMsg_AllocTransportDIB(buffer_size,
|
| + false,
|
| + &dib_handle);
|
| + if (!RenderThread::current()->Send(msg))
|
| + return NULL;
|
| + if (!TransportDIB::is_valid(dib_handle))
|
| + return NULL;
|
| +
|
| + TransportDIB* dib = TransportDIB::Map(dib_handle);
|
| +#else
|
| + static int next_dib_id = 0;
|
| + TransportDIB* dib = TransportDIB::Create(buffer_size, next_dib_id++);
|
| + if (!dib)
|
| + return NULL;
|
| +#endif
|
| +
|
| + return new PlatformImage2DImpl(width, height, dib);
|
| +}
|
|
|
| Property changes on: chrome/renderer/pepper_plugin_delegate_impl.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|