15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "content/common/cursors/webcursor.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/pickle.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebImage.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebCursorInfo; 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kMaxCursorDimension = 1024; 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)namespace content { 1623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebCursor::WebCursor() 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : type_(WebCursorInfo::TypePointer), 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) custom_scale_(1) { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) external_cursor_ = NULL; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitPlatformData(); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)WebCursor::WebCursor(const CursorInfo& cursor_info) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : type_(WebCursorInfo::TypePointer) { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) external_cursor_ = NULL; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitPlatformData(); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitFromCursorInfo(cursor_info); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebCursor::~WebCursor() { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Clear(); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebCursor::WebCursor(const WebCursor& other) { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitPlatformData(); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Copy(other); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const WebCursor& WebCursor::operator=(const WebCursor& other) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (this == &other) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Clear(); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Copy(other); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebCursor::InitFromCursorInfo(const CursorInfo& cursor_info) { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Clear(); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (cursor_info.external_handle) { 5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InitFromExternalCursor(cursor_info.external_handle); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type_ = cursor_info.type; 6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) hotspot_ = cursor_info.hotspot; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsCustom()) 6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetCustomData(cursor_info.custom_image); 6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) custom_scale_ = cursor_info.image_scale_factor; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(custom_scale_ > 0); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClampHotspot(); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebCursor::GetCursorInfo(CursorInfo* cursor_info) const { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cursor_info->type = static_cast<WebCursorInfo::Type>(type_); 7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cursor_info->hotspot = hotspot_; 7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ImageFromCustomData(&cursor_info->custom_image); 7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cursor_info->image_scale_factor = custom_scale_; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cursor_info->external_handle = external_cursor_; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebCursor::Deserialize(PickleIterator* iter) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type, hotspot_x, hotspot_y, size_x, size_y, data_len; 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float scale; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* data; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Leave |this| unmodified unless we are going to return success. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!iter->ReadInt(&type) || 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !iter->ReadInt(&hotspot_x) || 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !iter->ReadInt(&hotspot_y) || 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !iter->ReadLength(&size_x) || 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !iter->ReadLength(&size_y) || 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !iter->ReadFloat(&scale) || 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !iter->ReadData(&data, &data_len)) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure the size is sane, and there is enough data. 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (size_x > kMaxCursorDimension || 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_y > kMaxCursorDimension) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ensure scale isn't ridiculous, and the scaled image size is still sane. 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (scale < 0.01 || scale > 100 || 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_x / scale > kMaxCursorDimension || 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_y / scale > kMaxCursorDimension) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type_ = type; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type == WebCursorInfo::TypeCustom) { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (size_x > 0 && size_y > 0) { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The * 4 is because the expected format is an array of RGBA pixel 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // values. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (size_x * size_y * 4 > data_len) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hotspot_.set_x(hotspot_x); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hotspot_.set_y(hotspot_y); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) custom_size_.set_width(size_x); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) custom_size_.set_height(size_y); 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) custom_scale_ = scale; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClampHotspot(); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) custom_data_.clear(); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (data_len > 0) { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) custom_data_.resize(data_len); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(&custom_data_[0], data, data_len); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return DeserializePlatformData(iter); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebCursor::Serialize(Pickle* pickle) const { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pickle->WriteInt(type_) || 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !pickle->WriteInt(hotspot_.x()) || 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !pickle->WriteInt(hotspot_.y()) || 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !pickle->WriteInt(custom_size_.width()) || 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !pickle->WriteInt(custom_size_.height()) || 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !pickle->WriteFloat(custom_scale_)) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* data = NULL; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!custom_data_.empty()) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data = &custom_data_[0]; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pickle->WriteData(data, custom_data_.size())) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SerializePlatformData(pickle); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebCursor::IsCustom() const { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return type_ == WebCursorInfo::TypeCustom; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebCursor::IsEqual(const WebCursor& other) const { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type_ != other.type_) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsPlatformDataEqual(other)) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hotspot_ == other.hotspot_ && 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) custom_size_ == other.custom_size_ && 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) custom_scale_ == other.custom_scale_ && 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) custom_data_ == other.custom_data_; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WebCursorInfo::Type ToCursorType(HCURSOR cursor) { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static struct { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HCURSOR cursor; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebCursorInfo::Type type; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } kStandardCursors[] = { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { LoadCursor(NULL, IDC_ARROW), WebCursorInfo::TypePointer }, 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { LoadCursor(NULL, IDC_CROSS), WebCursorInfo::TypeCross }, 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { LoadCursor(NULL, IDC_HAND), WebCursorInfo::TypeHand }, 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { LoadCursor(NULL, IDC_IBEAM), WebCursorInfo::TypeIBeam }, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { LoadCursor(NULL, IDC_WAIT), WebCursorInfo::TypeWait }, 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { LoadCursor(NULL, IDC_HELP), WebCursorInfo::TypeHelp }, 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { LoadCursor(NULL, IDC_SIZENESW), WebCursorInfo::TypeNorthEastResize }, 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { LoadCursor(NULL, IDC_SIZENWSE), WebCursorInfo::TypeNorthWestResize }, 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { LoadCursor(NULL, IDC_SIZENS), WebCursorInfo::TypeNorthSouthResize }, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { LoadCursor(NULL, IDC_SIZEWE), WebCursorInfo::TypeEastWestResize }, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { LoadCursor(NULL, IDC_SIZEALL), WebCursorInfo::TypeMove }, 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { LoadCursor(NULL, IDC_APPSTARTING), WebCursorInfo::TypeProgress }, 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { LoadCursor(NULL, IDC_NO), WebCursorInfo::TypeNotAllowed }, 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < arraysize(kStandardCursors); ++i) { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cursor == kStandardCursors[i].cursor) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kStandardCursors[i].type; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebCursorInfo::TypeCustom; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebCursor::InitFromExternalCursor(HCURSOR cursor) { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebCursorInfo::Type cursor_type = ToCursorType(cursor); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InitFromCursorInfo(CursorInfo(cursor_type)); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cursor_type == WebCursorInfo::TypeCustom) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) external_cursor_ = cursor; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebCursor::Clear() { 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type_ = WebCursorInfo::TypePointer; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hotspot_.set_x(0); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hotspot_.set_y(0); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) custom_size_.set_width(0); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) custom_size_.set_height(0); 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) custom_scale_ = 1; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) custom_data_.clear(); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CleanupPlatformData(); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebCursor::Copy(const WebCursor& other) { 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type_ = other.type_; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hotspot_ = other.hotspot_; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) custom_size_ = other.custom_size_; 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) custom_scale_ = other.custom_scale_; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) custom_data_ = other.custom_data_; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CopyPlatformData(other); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebCursor::SetCustomData(const SkBitmap& bitmap) { 23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (bitmap.empty()) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fill custom_data_ directly with the NativeImage pixels. 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkAutoLockPixels bitmap_lock(bitmap); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) custom_data_.resize(bitmap.getSize()); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!custom_data_.empty()) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(&custom_data_[0], bitmap.getPixels(), bitmap.getSize()); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) custom_size_.set_width(bitmap.width()); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) custom_size_.set_height(bitmap.height()); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebCursor::ImageFromCustomData(SkBitmap* image) const { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (custom_data_.empty()) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) image->setConfig(SkBitmap::kARGB_8888_Config, 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) custom_size_.width(), 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) custom_size_.height()); 24990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!image->allocPixels()) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 25190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) memcpy(image->getPixels(), &custom_data_[0], custom_data_.size()); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebCursor::ClampHotspot() { 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsCustom()) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clamp the hotspot to the custom image's dimensions. 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hotspot_.set_x(std::max(0, 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::min(custom_size_.width() - 1, hotspot_.x()))); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hotspot_.set_y(std::max(0, 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::min(custom_size_.height() - 1, hotspot_.y()))); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 26523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} // namespace content 266