2 * Copyright (C) 2010 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 IntPoint determineHotSpot(Image* image, const IntPoint& specifiedHotSpot)
38 // Hot spot must be inside cursor rectangle.
39 IntRect imageRect = image->rect();
40 if (imageRect.contains(specifiedHotSpot))
41 return specifiedHotSpot;
43 // If hot spot is not specified externally, it can be extracted from some image formats (e.g. .cur).
44 IntPoint intrinsicHotSpot;
45 bool imageHasIntrinsicHotSpot = image->getHotSpot(intrinsicHotSpot);
46 if (imageHasIntrinsicHotSpot && imageRect.contains(intrinsicHotSpot))
47 return intrinsicHotSpot;
52 const Cursor& Cursor::fromType(Cursor::Type type)
56 return pointerCursor();
67 case Cursor::EastResize:
68 return eastResizeCursor();
69 case Cursor::NorthResize:
70 return northResizeCursor();
71 case Cursor::NorthEastResize:
72 return northEastResizeCursor();
73 case Cursor::NorthWestResize:
74 return northWestResizeCursor();
75 case Cursor::SouthResize:
76 return southResizeCursor();
77 case Cursor::SouthEastResize:
78 return southEastResizeCursor();
79 case Cursor::SouthWestResize:
80 return southWestResizeCursor();
81 case Cursor::WestResize:
82 return westResizeCursor();
83 case Cursor::NorthSouthResize:
84 return northSouthResizeCursor();
85 case Cursor::EastWestResize:
86 return eastWestResizeCursor();
87 case Cursor::NorthEastSouthWestResize:
88 return northEastSouthWestResizeCursor();
89 case Cursor::NorthWestSouthEastResize:
90 return northWestSouthEastResizeCursor();
91 case Cursor::ColumnResize:
92 return columnResizeCursor();
93 case Cursor::RowResize:
94 return rowResizeCursor();
95 case Cursor::MiddlePanning:
96 return middlePanningCursor();
97 case Cursor::EastPanning:
98 return eastPanningCursor();
99 case Cursor::NorthPanning:
100 return northPanningCursor();
101 case Cursor::NorthEastPanning:
102 return northEastPanningCursor();
103 case Cursor::NorthWestPanning:
104 return northWestPanningCursor();
105 case Cursor::SouthPanning:
106 return southPanningCursor();
107 case Cursor::SouthEastPanning:
108 return southEastPanningCursor();
109 case Cursor::SouthWestPanning:
110 return southWestPanningCursor();
111 case Cursor::WestPanning:
112 return westPanningCursor();
115 case Cursor::VerticalText:
116 return verticalTextCursor();
119 case Cursor::ContextMenu:
120 return contextMenuCursor();
122 return aliasCursor();
123 case Cursor::Progress:
124 return progressCursor();
126 return noDropCursor();
131 case Cursor::NotAllowed:
132 return notAllowedCursor();
134 return zoomInCursor();
135 case Cursor::ZoomOut:
136 return zoomOutCursor();
139 case Cursor::Grabbing:
140 return grabbingCursor();
142 ASSERT_NOT_REACHED();
144 return pointerCursor();
147 const char* nameForCursorType(Cursor::Type type)
150 case Cursor::Pointer:
162 case Cursor::EastResize:
164 case Cursor::NorthResize:
165 return "NorthResize";
166 case Cursor::NorthEastResize:
167 return "NorthEastResize";
168 case Cursor::NorthWestResize:
169 return "NorthWestResize";
170 case Cursor::SouthResize:
171 return "SouthResize";
172 case Cursor::SouthEastResize:
173 return "SouthEastResize";
174 case Cursor::SouthWestResize:
175 return "SouthWestResize";
176 case Cursor::WestResize:
178 case Cursor::NorthSouthResize:
179 return "NorthSouthResize";
180 case Cursor::EastWestResize:
181 return "EastWestResize";
182 case Cursor::NorthEastSouthWestResize:
183 return "NorthEastSouthWestResize";
184 case Cursor::NorthWestSouthEastResize:
185 return "NorthWestSouthEastResize";
186 case Cursor::ColumnResize:
187 return "ColumnResize";
188 case Cursor::RowResize:
190 case Cursor::MiddlePanning:
191 return "MiddlePanning";
192 case Cursor::EastPanning:
193 return "EastPanning";
194 case Cursor::NorthPanning:
195 return "NorthPanning";
196 case Cursor::NorthEastPanning:
197 return "NorthEastPanning";
198 case Cursor::NorthWestPanning:
199 return "NorthWestPanning";
200 case Cursor::SouthPanning:
201 return "SouthPanning";
202 case Cursor::SouthEastPanning:
203 return "SouthEastPanning";
204 case Cursor::SouthWestPanning:
205 return "SouthWestPanning";
206 case Cursor::WestPanning:
207 return "WestPanning";
210 case Cursor::VerticalText:
211 return "VerticalText";
214 case Cursor::ContextMenu:
215 return "ContextMenu";
218 case Cursor::Progress:
226 case Cursor::NotAllowed:
230 case Cursor::ZoomOut:
234 case Cursor::Grabbing:
243 #if USE(LAZY_NATIVE_CURSOR)
245 Cursor::Cursor(Image* image, const IntPoint& hotSpot)
248 , m_hotSpot(determineHotSpot(image, hotSpot))
249 , m_platformCursor(0)
253 Cursor::Cursor(Type type)
255 , m_platformCursor(0)
261 PlatformCursor Cursor::platformCursor() const
263 ensurePlatformCursor();
264 return m_platformCursor;
269 const Cursor& pointerCursor()
271 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Pointer));
275 const Cursor& crossCursor()
277 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Cross));
281 const Cursor& handCursor()
283 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Hand));
287 const Cursor& moveCursor()
289 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Move));
293 const Cursor& verticalTextCursor()
295 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::VerticalText));
299 const Cursor& cellCursor()
301 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Cell));
305 const Cursor& contextMenuCursor()
307 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::ContextMenu));
311 const Cursor& aliasCursor()
313 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Alias));
317 const Cursor& zoomInCursor()
319 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::ZoomIn));
323 const Cursor& zoomOutCursor()
325 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::ZoomOut));
329 const Cursor& copyCursor()
331 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Copy));
335 const Cursor& noneCursor()
337 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::None));
341 const Cursor& progressCursor()
343 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Progress));
347 const Cursor& noDropCursor()
349 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NoDrop));
353 const Cursor& notAllowedCursor()
355 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NotAllowed));
359 const Cursor& iBeamCursor()
361 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::IBeam));
365 const Cursor& waitCursor()
367 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Wait));
371 const Cursor& helpCursor()
373 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Help));
377 const Cursor& eastResizeCursor()
379 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::EastResize));
383 const Cursor& northResizeCursor()
385 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthResize));
389 const Cursor& northEastResizeCursor()
391 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthEastResize));
395 const Cursor& northWestResizeCursor()
397 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthWestResize));
401 const Cursor& southResizeCursor()
403 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthResize));
407 const Cursor& southEastResizeCursor()
409 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthEastResize));
413 const Cursor& southWestResizeCursor()
415 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthWestResize));
419 const Cursor& westResizeCursor()
421 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::WestResize));
425 const Cursor& northSouthResizeCursor()
427 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthSouthResize));
431 const Cursor& eastWestResizeCursor()
433 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::EastWestResize));
437 const Cursor& northEastSouthWestResizeCursor()
439 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthEastSouthWestResize));
443 const Cursor& northWestSouthEastResizeCursor()
445 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthWestSouthEastResize));
449 const Cursor& columnResizeCursor()
451 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::ColumnResize));
455 const Cursor& rowResizeCursor()
457 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::RowResize));
461 const Cursor& middlePanningCursor()
463 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::MiddlePanning));
467 const Cursor& eastPanningCursor()
469 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::EastPanning));
473 const Cursor& northPanningCursor()
475 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthPanning));
479 const Cursor& northEastPanningCursor()
481 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthEastPanning));
485 const Cursor& northWestPanningCursor()
487 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthWestPanning));
491 const Cursor& southPanningCursor()
493 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthPanning));
497 const Cursor& southEastPanningCursor()
499 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthEastPanning));
503 const Cursor& southWestPanningCursor()
505 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthWestPanning));
509 const Cursor& westPanningCursor()
511 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::WestPanning));
515 const Cursor& grabCursor()
517 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Grab));
521 const Cursor& grabbingCursor()
523 DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Grabbing));
529 } // namespace WebCore