Index: ppapi/proxy/ppb_graphics_2d_proxy.cc |
=================================================================== |
--- ppapi/proxy/ppb_graphics_2d_proxy.cc (revision 0) |
+++ ppapi/proxy/ppb_graphics_2d_proxy.cc (revision 0) |
@@ -0,0 +1,202 @@ |
+// 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 "ppapi/proxy/ppb_graphics_2d_proxy.h" |
+ |
+#include <string.h> // For memcpy |
piman
2010/11/03 22:53:49
// For memset ?
|
+ |
+#include "base/logging.h" |
+#include "ppapi/c/pp_completion_callback.h" |
+#include "ppapi/c/pp_errors.h" |
+#include "ppapi/c/pp_resource.h" |
+#include "ppapi/c/ppb_graphics_2d.h" |
+#include "ppapi/proxy/plugin_dispatcher.h" |
+#include "ppapi/proxy/plugin_resource.h" |
+#include "ppapi/proxy/ppapi_messages.h" |
+ |
+namespace pp { |
+namespace proxy { |
+ |
+class Graphics2D : public PluginResource { |
+ public: |
+ Graphics2D(const PP_Size& size, bool is_always_opaque) |
+ : size_(size), is_always_opaque_(is_always_opaque) { |
+ } |
+ |
+ // Resource overrides. |
+ virtual Graphics2D* AsGraphics2D() { return this; } |
+ |
+ const PP_Size& size() const { return size_; } |
+ bool is_always_opaque() const { return is_always_opaque_; } |
+ |
+ private: |
+ PP_Size size_; |
+ bool is_always_opaque_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(Graphics2D); |
+}; |
+ |
+namespace { |
+ |
+PP_Resource Create(PP_Module module_id, |
+ const PP_Size* size, |
+ bool is_always_opaque) { |
+ PluginDispatcher* dispatcher = PluginDispatcher::Get(); |
+ PP_Resource result = 0; |
+ dispatcher->Send(new PpapiHostMsg_PPBGraphics2D_Create( |
+ INTERFACE_ID_PPB_GRAPHICS_2D, module_id, *size, is_always_opaque, |
+ &result)); |
+ if (result) { |
+ linked_ptr<Graphics2D> graphics_2d(new Graphics2D(*size, is_always_opaque)); |
+ dispatcher->plugin_resource_tracker()->AddResource(result, graphics_2d); |
+ } |
+ return result; |
+} |
+ |
+bool IsGraphics2D(PP_Resource resource) { |
+ Graphics2D* object = PluginResource::GetAs<Graphics2D>(resource); |
+ return !!object; |
+} |
+ |
+bool Describe(PP_Resource graphics_2d, |
+ PP_Size* size, |
+ bool* is_always_opaque) { |
+ Graphics2D* object = PluginResource::GetAs<Graphics2D>(graphics_2d); |
+ if (!object) { |
+ size->width = 0; |
+ size->height = 0; |
+ *is_always_opaque = false; |
+ return false; |
+ } |
+ |
+ *size = object->size(); |
+ *is_always_opaque = object->is_always_opaque(); |
+ return true; |
+} |
+ |
+void PaintImageData(PP_Resource graphics_2d, |
+ PP_Resource image_data, |
+ const PP_Point* top_left, |
+ const PP_Rect* src_rect) { |
+ PP_Rect dummy; |
+ memset(&dummy, 0, sizeof(PP_Rect)); |
+ PluginDispatcher::Get()->Send(new PpapiHostMsg_PPBGraphics2D_PaintImageData( |
+ INTERFACE_ID_PPB_GRAPHICS_2D, graphics_2d, image_data, *top_left, |
+ !!src_rect, src_rect ? *src_rect : dummy)); |
+} |
+ |
+void Scroll(PP_Resource graphics_2d, |
+ const PP_Rect* clip_rect, |
+ const PP_Point* amount) { |
+ PP_Rect dummy; |
+ memset(&dummy, 0, sizeof(PP_Rect)); |
+ PluginDispatcher::Get()->Send(new PpapiHostMsg_PPBGraphics2D_Scroll( |
+ INTERFACE_ID_PPB_GRAPHICS_2D, graphics_2d, !!clip_rect, |
+ clip_rect ? *clip_rect : dummy, *amount)); |
+} |
+ |
+void ReplaceContents(PP_Resource graphics_2d, PP_Resource image_data) { |
+ PluginDispatcher::Get()->Send(new PpapiHostMsg_PPBGraphics2D_ReplaceContents( |
+ INTERFACE_ID_PPB_GRAPHICS_2D, graphics_2d, image_data)); |
+} |
+ |
+int32_t Flush(PP_Resource graphics_2d, |
+ PP_CompletionCallback callback) { |
+ PluginDispatcher* dispatcher = PluginDispatcher::Get(); |
+ int32_t result = PP_ERROR_FAILED; |
+ dispatcher->Send(new PpapiHostMsg_PPBGraphics2D_Flush( |
+ INTERFACE_ID_PPB_GRAPHICS_2D, graphics_2d, |
+ dispatcher->callback_tracker().SendCallback(callback), |
+ &result)); |
+ return result; |
+} |
+ |
+const PPB_Graphics2D ppb_graphics_2d = { |
+ &Create, |
+ &IsGraphics2D, |
+ &Describe, |
+ &PaintImageData, |
+ &Scroll, |
+ &ReplaceContents, |
+ &Flush |
+}; |
+ |
+} // namespace |
+ |
+PPB_Graphics2D_Proxy::PPB_Graphics2D_Proxy(Dispatcher* dispatcher, |
+ const void* target_interface) |
+ : InterfaceProxy(dispatcher, target_interface) { |
+} |
+ |
+PPB_Graphics2D_Proxy::~PPB_Graphics2D_Proxy() { |
+} |
+ |
+const void* PPB_Graphics2D_Proxy::GetSourceInterface() const { |
+ return &ppb_graphics_2d; |
+} |
+ |
+InterfaceID PPB_Graphics2D_Proxy::GetInterfaceId() const { |
+ return INTERFACE_ID_PPB_GRAPHICS_2D; |
+} |
+ |
+void PPB_Graphics2D_Proxy::OnMessageReceived(const IPC::Message& msg) { |
+ IPC_BEGIN_MESSAGE_MAP(PPB_Graphics2D_Proxy, msg) |
+ IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics2D_Create, |
+ OnMsgCreate) |
+ IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics2D_PaintImageData, |
+ OnMsgPaintImageData) |
+ IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics2D_Scroll, |
+ OnMsgScroll) |
+ IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics2D_ReplaceContents, |
+ OnMsgReplaceContents) |
+ IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics2D_Flush, |
+ OnMsgFlush) |
+ IPC_END_MESSAGE_MAP() |
+ // FIXME(brettw) handle bad messages! |
+} |
+ |
+void PPB_Graphics2D_Proxy::OnMsgCreate(PP_Module module, |
+ const PP_Size& size, |
+ bool is_always_opaque, |
+ PP_Resource* result) { |
+ *result = ppb_graphics_2d_target()->Create( |
+ module, &size, is_always_opaque); |
+} |
+ |
+void PPB_Graphics2D_Proxy::OnMsgPaintImageData(PP_Resource graphics_2d, |
+ PP_Resource image_data, |
+ const PP_Point& top_left, |
+ bool src_rect_specified, |
+ const PP_Rect& src_rect) { |
+ ppb_graphics_2d_target()->PaintImageData( |
+ graphics_2d, image_data, &top_left, |
+ src_rect_specified ? &src_rect : NULL); |
+} |
+ |
+void PPB_Graphics2D_Proxy::OnMsgScroll(PP_Resource graphics_2d, |
+ bool clip_specified, |
+ const PP_Rect& clip, |
+ const PP_Point& amount) { |
+ ppb_graphics_2d_target()->Scroll( |
+ graphics_2d, |
+ clip_specified ? &clip : NULL, &amount); |
+} |
+ |
+void PPB_Graphics2D_Proxy::OnMsgReplaceContents(PP_Resource graphics_2d, |
+ PP_Resource image_data) { |
+ ppb_graphics_2d_target()->ReplaceContents(graphics_2d, image_data); |
+} |
+ |
+void PPB_Graphics2D_Proxy::OnMsgFlush(PP_Resource graphics_2d, |
+ uint32_t serialized_callback, |
+ int32_t* result) { |
+ // TODO(brettw) this should be a non-sync function. Ideally it would call |
+ // the callback with a failure code from here if you weren't allowed to |
+ // call Flush there. |
+ *result = ppb_graphics_2d_target()->Flush( |
+ graphics_2d, ReceiveCallback(serialized_callback)); |
+} |
+ |
+} // namespace proxy |
+} // namespace pp |
Property changes on: ppapi/proxy/ppb_graphics_2d_proxy.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |