Home | History | Annotate | Download | only in pepper
      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