Add missing OWNERS for chrome_android.gypi
[chromium-blink-merge.git] / webkit / common / cursors / webcursor.h
blob24e806845ab64459a856c4a2c152cddf1a75fbb0
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.
5 #ifndef WEBKIT_COMMON_CURSORS_WEBCURSOR_H_
6 #define WEBKIT_COMMON_CURSORS_WEBCURSOR_H_
8 #include "base/basictypes.h"
9 #include "third_party/WebKit/public/web/WebCursorInfo.h"
10 #include "ui/gfx/display.h"
11 #include "ui/gfx/native_widget_types.h"
12 #include "ui/gfx/point.h"
13 #include "ui/gfx/size.h"
14 #include "webkit/common/webkit_common_export.h"
16 #include <vector>
18 #if defined(OS_WIN)
19 typedef struct HINSTANCE__* HINSTANCE;
20 typedef struct HICON__* HICON;
21 typedef HICON HCURSOR;
22 #elif defined(TOOLKIT_GTK)
23 typedef struct _GdkCursor GdkCursor;
24 #elif defined(OS_MACOSX)
25 #ifdef __OBJC__
26 @class NSCursor;
27 #else
28 class NSCursor;
29 #endif
30 #endif
32 class Pickle;
33 class PickleIterator;
35 // This class encapsulates a cross-platform description of a cursor. Platform
36 // specific methods are provided to translate the cross-platform cursor into a
37 // platform specific cursor. It is also possible to serialize / de-serialize a
38 // WebCursor.
39 class WEBKIT_COMMON_EXPORT WebCursor {
40 public:
41 struct CursorInfo {
42 explicit CursorInfo(WebKit::WebCursorInfo::Type cursor_type)
43 : type(cursor_type),
44 image_scale_factor(1) {
45 #if defined(OS_WIN)
46 external_handle = NULL;
47 #endif
50 CursorInfo()
51 : type(WebKit::WebCursorInfo::TypePointer),
52 image_scale_factor(1) {
53 #if defined(OS_WIN)
54 external_handle = NULL;
55 #endif
58 WebKit::WebCursorInfo::Type type;
59 gfx::Point hotspot;
60 float image_scale_factor;
61 SkBitmap custom_image;
62 #if defined(OS_WIN)
63 HCURSOR external_handle;
64 #endif
67 WebCursor();
68 explicit WebCursor(const CursorInfo& cursor_info);
69 ~WebCursor();
71 // Copy constructor/assignment operator combine.
72 WebCursor(const WebCursor& other);
73 const WebCursor& operator=(const WebCursor& other);
75 // Conversion from/to CursorInfo.
76 void InitFromCursorInfo(const CursorInfo& cursor_info);
77 void GetCursorInfo(CursorInfo* cursor_info) const;
79 // Serialization / De-serialization
80 bool Deserialize(PickleIterator* iter);
81 bool Serialize(Pickle* pickle) const;
83 // Returns true if GetCustomCursor should be used to allocate a platform
84 // specific cursor object. Otherwise GetCursor should be used.
85 bool IsCustom() const;
87 // Returns true if the current cursor object contains the same cursor as the
88 // cursor object passed in. If the current cursor is a custom cursor, we also
89 // compare the bitmaps to verify whether they are equal.
90 bool IsEqual(const WebCursor& other) const;
92 // Returns a native cursor representing the current WebCursor instance.
93 gfx::NativeCursor GetNativeCursor();
95 #if defined(OS_WIN)
96 // Initialize this from the given Windows cursor. The caller must ensure that
97 // the HCURSOR remains valid by not invoking the DestroyCursor/DestroyIcon
98 // APIs on it.
99 void InitFromExternalCursor(HCURSOR handle);
100 #endif
102 #if defined(USE_AURA)
103 const ui::PlatformCursor GetPlatformCursor();
105 // Updates |device_scale_factor_| and |rotation_| based on |display|.
106 void SetDisplayInfo(const gfx::Display& display);
108 #elif defined(OS_WIN)
109 // Returns a HCURSOR representing the current WebCursor instance.
110 // The ownership of the HCURSOR (does not apply to external cursors) remains
111 // with the WebCursor instance.
112 HCURSOR GetCursor(HINSTANCE module_handle);
114 #elif defined(TOOLKIT_GTK)
115 // Return the stock GdkCursorType for this cursor, or GDK_CURSOR_IS_PIXMAP
116 // if it's a custom cursor. Return GDK_LAST_CURSOR to indicate that the cursor
117 // should be set to the system default.
118 // Returns an int so we don't need to include GDK headers in this header file.
119 int GetCursorType() const;
121 // Return a new GdkCursor* for this cursor. Only valid if GetCursorType
122 // returns GDK_CURSOR_IS_PIXMAP.
123 GdkCursor* GetCustomCursor();
124 #elif defined(OS_MACOSX)
125 // Initialize this from the given Cocoa NSCursor.
126 void InitFromNSCursor(NSCursor* cursor);
127 #endif
129 private:
130 // Copies the contents of the WebCursor instance passed in.
131 void Copy(const WebCursor& other);
133 // Cleans up the WebCursor instance.
134 void Clear();
136 // Platform specific initialization goes here.
137 void InitPlatformData();
139 // Platform specific Serialization / De-serialization
140 bool SerializePlatformData(Pickle* pickle) const;
141 bool DeserializePlatformData(PickleIterator* iter);
143 // Returns true if the platform data in the current cursor object
144 // matches that of the cursor passed in.
145 bool IsPlatformDataEqual(const WebCursor& other) const ;
147 // Copies platform specific data from the WebCursor instance passed in.
148 void CopyPlatformData(const WebCursor& other);
150 // Platform specific cleanup.
151 void CleanupPlatformData();
153 void SetCustomData(const SkBitmap& image);
154 void ImageFromCustomData(SkBitmap* image) const;
156 // Clamp the hotspot to the custom image's bounds, if this is a custom cursor.
157 void ClampHotspot();
159 // WebCore::PlatformCursor type.
160 int type_;
162 // Hotspot in cursor image in pixels.
163 gfx::Point hotspot_;
165 // Custom cursor data, as 32-bit RGBA.
166 // Platform-inspecific because it can be serialized.
167 gfx::Size custom_size_; // In pixels.
168 float custom_scale_;
169 std::vector<char> custom_data_;
171 #if defined(OS_WIN)
172 // An externally generated HCURSOR. We assume that it remains valid, i.e we
173 // don't attempt to copy the HCURSOR.
174 HCURSOR external_cursor_;
175 #endif
177 #if defined(USE_AURA) && defined(USE_X11)
178 // Only used for custom cursors.
179 ui::PlatformCursor platform_cursor_;
180 float device_scale_factor_;
181 gfx::Display::Rotation rotation_;
182 #elif defined(OS_WIN)
183 // A custom cursor created from custom bitmap data by Webkit.
184 HCURSOR custom_cursor_;
185 #elif defined(TOOLKIT_GTK)
186 // A custom cursor created that should be unref'ed from the destructor.
187 GdkCursor* unref_;
188 #endif
191 #endif // WEBKIT_COMMON_CURSORS_WEBCURSOR_H_