Chromium Code Reviews| Index: remoting/client/plugin/chromoting_instance.cc |
| diff --git a/remoting/client/plugin/chromoting_instance.cc b/remoting/client/plugin/chromoting_instance.cc |
| index fec261e1798b874631f86002ad74df10a2ab56fc..7edca209354db5307a6b24a3da22e18ef2fa9d65 100644 |
| --- a/remoting/client/plugin/chromoting_instance.cc |
| +++ b/remoting/client/plugin/chromoting_instance.cc |
| @@ -23,6 +23,7 @@ |
| #include "media/base/media.h" |
| #include "ppapi/cpp/completion_callback.h" |
| #include "ppapi/cpp/input_event.h" |
| +#include "ppapi/cpp/mouse_cursor.h" |
| #include "ppapi/cpp/rect.h" |
| // TODO(wez): Remove this when crbug.com/86353 is complete. |
| #include "ppapi/cpp/private/var_private.h" |
| @@ -52,6 +53,9 @@ namespace remoting { |
| namespace { |
| +// 32-bit BGRA is 4 bytes per pixel. |
| +const int kBytesPerPixel = 4; |
| + |
| const int kPerfStatsIntervalMs = 1000; |
| std::string ConnectionStateToString(ChromotingInstance::ConnectionState state) { |
| @@ -593,6 +597,52 @@ void ChromotingInstance::InjectClipboardEvent( |
| PostChromotingMessage("injectClipboardItem", data.Pass()); |
| } |
| +void ChromotingInstance::SetCursorShape( |
| + const protocol::CursorShapeInfo& cursor_shape) { |
| + if (!cursor_shape.has_data() || |
| + !cursor_shape.has_width() || |
| + !cursor_shape.has_height() || |
| + !cursor_shape.has_hotspot_x() || |
| + !cursor_shape.has_hotspot_y()) { |
| + return; |
| + } |
| + |
| + if (pp::ImageData::GetNativeImageDataFormat() != |
| + PP_IMAGEDATAFORMAT_BGRA_PREMUL) { |
| + LOG(WARNING) << "Unable to set cursor shape - non-native image format"; |
|
Wez
2012/05/30 23:42:42
nit: Consider making this a VLOG, otherwise you'll
garykac
2012/05/31 00:29:41
Done.
|
| + return; |
| + } |
| + |
| + int width = cursor_shape.width(); |
| + int height = cursor_shape.height(); |
| + |
| + if (width > 32 || height > 32) { |
| + LOG(WARNING) << "Cursor too large for SetCursor: " |
| + << width << "x" << height << " > 32x32"; |
|
Wez
2012/05/30 23:42:42
nit: Consider using VLOG here, too.
garykac
2012/05/31 00:29:41
Done.
|
| + return; |
| + } |
| + |
| + int hotspot_x = cursor_shape.hotspot_x(); |
| + int hotspot_y = cursor_shape.hotspot_y(); |
| + |
| + pp::ImageData cursor_image(this, PP_IMAGEDATAFORMAT_BGRA_PREMUL, |
| + pp::Size(width, height), false); |
| + |
| + int bytes_per_row = width * kBytesPerPixel; |
| + const uint8* src_row_data = reinterpret_cast<const uint8*>( |
| + cursor_shape.data().data()); |
| + uint8* dst_row_data = reinterpret_cast<uint8*>(cursor_image.data()); |
| + for (int row = 0; row < height; row++) { |
| + memcpy(dst_row_data, src_row_data, bytes_per_row); |
| + src_row_data += bytes_per_row; |
| + dst_row_data += cursor_image.stride(); |
| + } |
| + |
| + pp::MouseCursor::SetCursor(this, PP_MOUSECURSOR_TYPE_CUSTOM, |
| + cursor_image, |
| + pp::Point(hotspot_x, hotspot_y)); |
| +} |
| + |
| // static |
| void ChromotingInstance::RegisterLogMessageHandler() { |
| base::AutoLock lock(g_logging_lock.Get()); |