1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "content/renderer/pepper/ppb_widget_impl.h" 6 7 #include "content/renderer/pepper/host_globals.h" 8 #include "content/renderer/pepper/pepper_plugin_instance_impl.h" 9 #include "content/renderer/pepper/ppb_image_data_impl.h" 10 #include "content/renderer/pepper/plugin_module.h" 11 #include "ppapi/c/dev/ppp_widget_dev.h" 12 #include "ppapi/thunk/enter.h" 13 #include "ppapi/thunk/ppb_input_event_api.h" 14 #include "ppapi/thunk/ppb_widget_api.h" 15 16 using ppapi::thunk::EnterResourceNoLock; 17 using ppapi::thunk::PPB_ImageData_API; 18 using ppapi::thunk::PPB_InputEvent_API; 19 using ppapi::thunk::PPB_Widget_API; 20 21 namespace content { 22 23 PPB_Widget_Impl::PPB_Widget_Impl(PP_Instance instance) 24 : Resource(ppapi::OBJECT_IS_IMPL, instance), 25 scale_(1.0f) { 26 memset(&location_, 0, sizeof(location_)); 27 } 28 29 PPB_Widget_Impl::~PPB_Widget_Impl() { 30 } 31 32 PPB_Widget_API* PPB_Widget_Impl::AsPPB_Widget_API() { 33 return this; 34 } 35 36 PP_Bool PPB_Widget_Impl::Paint(const PP_Rect* rect, PP_Resource image_id) { 37 EnterResourceNoLock<PPB_ImageData_API> enter(image_id, true); 38 if (enter.failed()) 39 return PP_FALSE; 40 return PaintInternal(gfx::Rect(rect->point.x, rect->point.y, 41 rect->size.width, rect->size.height), 42 static_cast<PPB_ImageData_Impl*>(enter.object())); 43 } 44 45 PP_Bool PPB_Widget_Impl::HandleEvent(PP_Resource pp_input_event) { 46 EnterResourceNoLock<PPB_InputEvent_API> enter(pp_input_event, true); 47 if (enter.failed()) 48 return PP_FALSE; 49 return HandleEventInternal(enter.object()->GetInputEventData()); 50 } 51 52 PP_Bool PPB_Widget_Impl::GetLocation(PP_Rect* location) { 53 *location = location_; 54 return PP_TRUE; 55 } 56 57 void PPB_Widget_Impl::SetLocation(const PP_Rect* location) { 58 location_ = *location; 59 SetLocationInternal(location); 60 } 61 62 void PPB_Widget_Impl::SetScale(float scale) { 63 scale_ = scale; 64 } 65 66 void PPB_Widget_Impl::Invalidate(const PP_Rect* dirty) { 67 PepperPluginInstanceImpl* plugin_instance = 68 HostGlobals::Get()->GetInstance(pp_instance()); 69 if (!plugin_instance) 70 return; 71 const PPP_Widget_Dev* widget = static_cast<const PPP_Widget_Dev*>( 72 plugin_instance->module()->GetPluginInterface(PPP_WIDGET_DEV_INTERFACE)); 73 if (!widget) 74 return; 75 widget->Invalidate(pp_instance(), pp_resource(), dirty); 76 } 77 78 } // namespace content 79 80