Get rid of the unused function nameForCursorType()
[WebKit-https.git] / Source / WebCore / platform / Cursor.cpp
1 /*
2  * Copyright (C) 2010 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
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.
12  *
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. 
24  */
25
26 #include "config.h"
27 #include "Cursor.h"
28
29 #include "Image.h"
30
31 namespace WebCore {
32
33 IntPoint determineHotSpot(Image* image, const IntPoint& specifiedHotSpot)
34 {
35     if (image->isNull())
36         return IntPoint();
37
38     // Hot spot must be inside cursor rectangle.
39     IntRect imageRect = image->rect();
40     if (imageRect.contains(specifiedHotSpot))
41         return specifiedHotSpot;
42
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;
48
49     return IntPoint();
50 }
51
52 const Cursor& Cursor::fromType(Cursor::Type type)
53 {
54     switch (type) {
55     case Cursor::Pointer:
56         return pointerCursor();
57     case Cursor::Cross:
58         return crossCursor();
59     case Cursor::Hand:
60         return handCursor();
61     case Cursor::IBeam:
62         return iBeamCursor();
63     case Cursor::Wait:
64         return waitCursor();
65     case Cursor::Help:
66         return helpCursor();
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();
113     case Cursor::Move:
114         return moveCursor();
115     case Cursor::VerticalText:
116         return verticalTextCursor();
117     case Cursor::Cell:
118         return cellCursor();
119     case Cursor::ContextMenu:
120         return contextMenuCursor();
121     case Cursor::Alias:
122         return aliasCursor();
123     case Cursor::Progress:
124         return progressCursor();
125     case Cursor::NoDrop:
126         return noDropCursor();
127     case Cursor::Copy:
128         return copyCursor();
129     case Cursor::None:
130         return noneCursor();
131     case Cursor::NotAllowed:
132         return notAllowedCursor();
133     case Cursor::ZoomIn:
134         return zoomInCursor();
135     case Cursor::ZoomOut:
136         return zoomOutCursor();
137     case Cursor::Grab:
138         return grabCursor();
139     case Cursor::Grabbing:
140         return grabbingCursor();
141     case Cursor::Custom:
142         ASSERT_NOT_REACHED();
143     }
144     return pointerCursor();
145 }
146
147 #if USE(LAZY_NATIVE_CURSOR)
148
149 Cursor::Cursor(Image* image, const IntPoint& hotSpot)
150     : m_type(Custom)
151     , m_image(image)
152     , m_hotSpot(determineHotSpot(image, hotSpot))
153     , m_platformCursor(0)
154 {
155 }
156
157 Cursor::Cursor(Type type)
158     : m_type(type)
159     , m_platformCursor(0)
160 {
161 }
162
163 #if !PLATFORM(MAC)
164
165 PlatformCursor Cursor::platformCursor() const
166 {
167     ensurePlatformCursor();
168     return m_platformCursor;
169 }
170
171 #endif
172
173 const Cursor& pointerCursor()
174 {
175     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Pointer));
176     return c;
177 }
178
179 const Cursor& crossCursor()
180 {
181     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Cross));
182     return c;
183 }
184
185 const Cursor& handCursor()
186 {
187     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Hand));
188     return c;
189 }
190
191 const Cursor& moveCursor()
192 {
193     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Move));
194     return c;
195 }
196
197 const Cursor& verticalTextCursor()
198 {
199     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::VerticalText));
200     return c;
201 }
202
203 const Cursor& cellCursor()
204 {
205     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Cell));
206     return c;
207 }
208
209 const Cursor& contextMenuCursor()
210 {
211     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::ContextMenu));
212     return c;
213 }
214
215 const Cursor& aliasCursor()
216 {
217     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Alias));
218     return c;
219 }
220
221 const Cursor& zoomInCursor()
222 {
223     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::ZoomIn));
224     return c;
225 }
226
227 const Cursor& zoomOutCursor()
228 {
229     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::ZoomOut));
230     return c;
231 }
232
233 const Cursor& copyCursor()
234 {
235     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Copy));
236     return c;
237 }
238
239 const Cursor& noneCursor()
240 {
241     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::None));
242     return c;
243 }
244
245 const Cursor& progressCursor()
246 {
247     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Progress));
248     return c;
249 }
250
251 const Cursor& noDropCursor()
252 {
253     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NoDrop));
254     return c;
255 }
256
257 const Cursor& notAllowedCursor()
258 {
259     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NotAllowed));
260     return c;
261 }
262
263 const Cursor& iBeamCursor()
264 {
265     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::IBeam));
266     return c;
267 }
268
269 const Cursor& waitCursor()
270 {
271     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Wait));
272     return c;
273 }
274
275 const Cursor& helpCursor()
276 {
277     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Help));
278     return c;
279 }
280
281 const Cursor& eastResizeCursor()
282 {
283     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::EastResize));
284     return c;
285 }
286
287 const Cursor& northResizeCursor()
288 {
289     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthResize));
290     return c;
291 }
292
293 const Cursor& northEastResizeCursor()
294 {
295     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthEastResize));
296     return c;
297 }
298
299 const Cursor& northWestResizeCursor()
300 {
301     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthWestResize));
302     return c;
303 }
304
305 const Cursor& southResizeCursor()
306 {
307     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthResize));
308     return c;
309 }
310
311 const Cursor& southEastResizeCursor()
312 {
313     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthEastResize));
314     return c;
315 }
316
317 const Cursor& southWestResizeCursor()
318 {
319     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthWestResize));
320     return c;
321 }
322
323 const Cursor& westResizeCursor()
324 {
325     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::WestResize));
326     return c;
327 }
328
329 const Cursor& northSouthResizeCursor()
330 {
331     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthSouthResize));
332     return c;
333 }
334
335 const Cursor& eastWestResizeCursor()
336 {
337     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::EastWestResize));
338     return c;
339 }
340
341 const Cursor& northEastSouthWestResizeCursor()
342 {
343     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthEastSouthWestResize));
344     return c;
345 }
346
347 const Cursor& northWestSouthEastResizeCursor()
348 {
349     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthWestSouthEastResize));
350     return c;
351 }
352
353 const Cursor& columnResizeCursor()
354 {
355     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::ColumnResize));
356     return c;
357 }
358
359 const Cursor& rowResizeCursor()
360 {
361     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::RowResize));
362     return c;
363 }
364
365 const Cursor& middlePanningCursor()
366 {
367     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::MiddlePanning));
368     return c;
369 }
370     
371 const Cursor& eastPanningCursor()
372 {
373     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::EastPanning));
374     return c;
375 }
376     
377 const Cursor& northPanningCursor()
378 {
379     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthPanning));
380     return c;
381 }
382     
383 const Cursor& northEastPanningCursor()
384 {
385     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthEastPanning));
386     return c;
387 }
388     
389 const Cursor& northWestPanningCursor()
390 {
391     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthWestPanning));
392     return c;
393 }
394     
395 const Cursor& southPanningCursor()
396 {
397     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthPanning));
398     return c;
399 }
400     
401 const Cursor& southEastPanningCursor()
402 {
403     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthEastPanning));
404     return c;
405 }
406     
407 const Cursor& southWestPanningCursor()
408 {
409     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthWestPanning));
410     return c;
411 }
412     
413 const Cursor& westPanningCursor()
414 {
415     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::WestPanning));
416     return c;
417 }
418
419 const Cursor& grabCursor()
420 {
421     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Grab));
422     return c;
423 }
424
425 const Cursor& grabbingCursor()
426 {
427     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Grabbing));
428     return c;
429 }
430
431 #endif
432
433 } // namespace WebCore