PPB_CursorControl_Dev.SetCursor: Add support for custom cursor.
BUG=none TEST=none Review URL: http://codereview.chromium.org/6720001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@79168 0039d316-1c4b-4281-b951-d872f2087c98
This commit is contained in:
ppapi/example
webkit/plugins/ppapi
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
@@ -12,6 +12,7 @@
|
|||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
#include "ppapi/c/dev/ppb_console_dev.h"
|
#include "ppapi/c/dev/ppb_console_dev.h"
|
||||||
|
#include "ppapi/c/dev/ppb_cursor_control_dev.h"
|
||||||
#include "ppapi/c/dev/ppp_printing_dev.h"
|
#include "ppapi/c/dev/ppp_printing_dev.h"
|
||||||
#include "ppapi/c/pp_errors.h"
|
#include "ppapi/c/pp_errors.h"
|
||||||
#include "ppapi/c/pp_input_event.h"
|
#include "ppapi/c/pp_input_event.h"
|
||||||
@@ -163,7 +164,8 @@ class MyInstance : public pp::Instance, public MyFetcherClient {
|
|||||||
width_(0),
|
width_(0),
|
||||||
height_(0),
|
height_(0),
|
||||||
animation_counter_(0),
|
animation_counter_(0),
|
||||||
print_settings_valid_(false) {}
|
print_settings_valid_(false),
|
||||||
|
showing_custom_cursor_(false) {}
|
||||||
|
|
||||||
virtual ~MyInstance() {
|
virtual ~MyInstance() {
|
||||||
if (fetcher_) {
|
if (fetcher_) {
|
||||||
@@ -194,6 +196,7 @@ class MyInstance : public pp::Instance, public MyFetcherClient {
|
|||||||
switch (event.type) {
|
switch (event.type) {
|
||||||
case PP_INPUTEVENT_TYPE_MOUSEDOWN:
|
case PP_INPUTEVENT_TYPE_MOUSEDOWN:
|
||||||
SayHello();
|
SayHello();
|
||||||
|
ToggleCursor();
|
||||||
return true;
|
return true;
|
||||||
case PP_INPUTEVENT_TYPE_MOUSEMOVE:
|
case PP_INPUTEVENT_TYPE_MOUSEMOVE:
|
||||||
return true;
|
return true;
|
||||||
@@ -395,6 +398,30 @@ class MyInstance : public pp::Instance, public MyFetcherClient {
|
|||||||
fetcher_ = NULL;
|
fetcher_ = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ToggleCursor() {
|
||||||
|
const PPB_CursorControl_Dev* cursor_control =
|
||||||
|
reinterpret_cast<const PPB_CursorControl_Dev*>(
|
||||||
|
pp::Module::Get()->GetBrowserInterface(
|
||||||
|
PPB_CURSOR_CONTROL_DEV_INTERFACE));
|
||||||
|
if (!cursor_control)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (showing_custom_cursor_) {
|
||||||
|
cursor_control->SetCursor(pp_instance(), PP_CURSORTYPE_POINTER, 0, NULL);
|
||||||
|
} else {
|
||||||
|
pp::ImageData image_data(this, pp::ImageData::GetNativeImageDataFormat(),
|
||||||
|
pp::Size(50, 50), false);
|
||||||
|
FillRect(&image_data, 0, 0, 50, 50,
|
||||||
|
image_data.format() == PP_IMAGEDATAFORMAT_BGRA_PREMUL ?
|
||||||
|
0x80800000 : 0x80000080);
|
||||||
|
pp::Point hot_spot(0, 0);
|
||||||
|
cursor_control->SetCursor(pp_instance(), PP_CURSORTYPE_CUSTOM,
|
||||||
|
image_data.pp_resource(), &hot_spot.pp_point());
|
||||||
|
}
|
||||||
|
|
||||||
|
showing_custom_cursor_ = !showing_custom_cursor_;
|
||||||
|
}
|
||||||
|
|
||||||
pp::Var console_;
|
pp::Var console_;
|
||||||
pp::Graphics2D device_context_;
|
pp::Graphics2D device_context_;
|
||||||
|
|
||||||
@@ -409,6 +436,8 @@ class MyInstance : public pp::Instance, public MyFetcherClient {
|
|||||||
int animation_counter_;
|
int animation_counter_;
|
||||||
bool print_settings_valid_;
|
bool print_settings_valid_;
|
||||||
PP_PrintSettings_Dev print_settings_;
|
PP_PrintSettings_Dev print_settings_;
|
||||||
|
|
||||||
|
bool showing_custom_cursor_;
|
||||||
};
|
};
|
||||||
|
|
||||||
void FlushCallback(void* data, int32_t result) {
|
void FlushCallback(void* data, int32_t result) {
|
||||||
|
@@ -555,14 +555,53 @@ bool PluginInstance::BindGraphics(PP_Resource graphics_id) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PluginInstance::SetCursor(PP_CursorType_Dev type) {
|
bool PluginInstance::SetCursor(PP_CursorType_Dev type,
|
||||||
if (type == PP_CURSORTYPE_CUSTOM) {
|
PP_Resource custom_image,
|
||||||
// TODO(neb): implement custom cursors.
|
const PP_Point* hot_spot) {
|
||||||
// (Remember that PP_CURSORTYPE_CUSTOM != WebCursorInfo::TypeCustom.)
|
if (type != PP_CURSORTYPE_CUSTOM) {
|
||||||
|
cursor_.reset(new WebCursorInfo(static_cast<WebCursorInfo::Type>(type)));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hot_spot)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
scoped_refptr<PPB_ImageData_Impl> image_data(
|
||||||
|
Resource::GetAs<PPB_ImageData_Impl>(custom_image));
|
||||||
|
if (!image_data.get())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (image_data->format() != PPB_ImageData_Impl::GetNativeImageDataFormat()) {
|
||||||
|
// TODO(yzshen): Handle the case that the image format is different from the
|
||||||
|
// native format.
|
||||||
NOTIMPLEMENTED();
|
NOTIMPLEMENTED();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
cursor_.reset(new WebCursorInfo(static_cast<WebCursorInfo::Type>(type)));
|
|
||||||
|
ImageDataAutoMapper auto_mapper(image_data);
|
||||||
|
if (!auto_mapper.is_valid())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
scoped_ptr<WebCursorInfo> custom_cursor(
|
||||||
|
new WebCursorInfo(WebCursorInfo::TypeCustom));
|
||||||
|
custom_cursor->hotSpot.x = hot_spot->x;
|
||||||
|
custom_cursor->hotSpot.y = hot_spot->y;
|
||||||
|
|
||||||
|
#if WEBKIT_USING_SKIA
|
||||||
|
const SkBitmap* bitmap = image_data->GetMappedBitmap();
|
||||||
|
// Make a deep copy, so that the cursor remains valid even after the original
|
||||||
|
// image data gets freed.
|
||||||
|
if (!bitmap->copyTo(&custom_cursor->customImage.getSkBitmap(),
|
||||||
|
bitmap->config())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#elif WEBKIT_USING_CG
|
||||||
|
// TODO(yzshen): Implement it.
|
||||||
|
NOTIMPLEMENTED();
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
cursor_.reset(custom_cursor.release());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -130,7 +130,11 @@ class PluginInstance : public base::RefCounted<PluginInstance> {
|
|||||||
PP_Var GetOwnerElementObject();
|
PP_Var GetOwnerElementObject();
|
||||||
bool BindGraphics(PP_Resource graphics_id);
|
bool BindGraphics(PP_Resource graphics_id);
|
||||||
bool full_frame() const { return full_frame_; }
|
bool full_frame() const { return full_frame_; }
|
||||||
bool SetCursor(PP_CursorType_Dev type);
|
// If |type| is not PP_CURSORTYPE_CUSTOM, |custom_image| and |hot_spot| are
|
||||||
|
// ignored.
|
||||||
|
bool SetCursor(PP_CursorType_Dev type,
|
||||||
|
PP_Resource custom_image,
|
||||||
|
const PP_Point* hot_spot);
|
||||||
PP_Var ExecuteScript(PP_Var script, PP_Var* exception);
|
PP_Var ExecuteScript(PP_Var script, PP_Var* exception);
|
||||||
|
|
||||||
// PPP_Instance pass-through.
|
// PPP_Instance pass-through.
|
||||||
|
@@ -28,16 +28,7 @@ PP_Bool SetCursor(PP_Instance instance_id,
|
|||||||
if (!instance)
|
if (!instance)
|
||||||
return PP_FALSE;
|
return PP_FALSE;
|
||||||
|
|
||||||
scoped_refptr<PPB_ImageData_Impl> custom_image(
|
return BoolToPPBool(instance->SetCursor(type, custom_image_id, hot_spot));
|
||||||
Resource::GetAs<PPB_ImageData_Impl>(custom_image_id));
|
|
||||||
if (custom_image.get()) {
|
|
||||||
// TODO(neb): implement custom cursors.
|
|
||||||
// (Remember that PP_CURSORTYPE_CUSTOM != WebCursorInfo::TypeCustom.)
|
|
||||||
NOTIMPLEMENTED();
|
|
||||||
return PP_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return BoolToPPBool(instance->SetCursor(type));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PP_Bool LockCursor(PP_Instance instance_id) {
|
PP_Bool LockCursor(PP_Instance instance_id) {
|
||||||
@@ -92,4 +83,3 @@ const PPB_CursorControl_Dev* GetCursorControlInterface() {
|
|||||||
|
|
||||||
} // namespace ppapi
|
} // namespace ppapi
|
||||||
} // namespace webkit
|
} // namespace webkit
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user