Home | History | Annotate | Download | only in platform
      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 "platform/Cursor.h"
     28 
     29 namespace WebCore {
     30 
     31 IntPoint determineHotSpot(Image* image, const IntPoint& specifiedHotSpot)
     32 {
     33     if (image->isNull())
     34         return IntPoint();
     35 
     36     // Hot spot must be inside cursor rectangle.
     37     IntRect imageRect = image->rect();
     38     if (imageRect.contains(specifiedHotSpot))
     39         return specifiedHotSpot;
     40 
     41     // If hot spot is not specified externally, it can be extracted from some image formats (e.g. .cur).
     42     IntPoint intrinsicHotSpot;
     43     bool imageHasIntrinsicHotSpot = image->getHotSpot(intrinsicHotSpot);
     44     if (imageHasIntrinsicHotSpot && imageRect.contains(intrinsicHotSpot))
     45         return intrinsicHotSpot;
     46 
     47     return IntPoint();
     48 }
     49 
     50 const Cursor& Cursor::fromType(Cursor::Type type)
     51 {
     52     switch (type) {
     53     case Cursor::Pointer:
     54         return pointerCursor();
     55     case Cursor::Cross:
     56         return crossCursor();
     57     case Cursor::Hand:
     58         return handCursor();
     59     case Cursor::IBeam:
     60         return iBeamCursor();
     61     case Cursor::Wait:
     62         return waitCursor();
     63     case Cursor::Help:
     64         return helpCursor();
     65     case Cursor::EastResize:
     66         return eastResizeCursor();
     67     case Cursor::NorthResize:
     68         return northResizeCursor();
     69     case Cursor::NorthEastResize:
     70         return northEastResizeCursor();
     71     case Cursor::NorthWestResize:
     72         return northWestResizeCursor();
     73     case Cursor::SouthResize:
     74         return southResizeCursor();
     75     case Cursor::SouthEastResize:
     76         return southEastResizeCursor();
     77     case Cursor::SouthWestResize:
     78         return southWestResizeCursor();
     79     case Cursor::WestResize:
     80         return westResizeCursor();
     81     case Cursor::NorthSouthResize:
     82         return northSouthResizeCursor();
     83     case Cursor::EastWestResize:
     84         return eastWestResizeCursor();
     85     case Cursor::NorthEastSouthWestResize:
     86         return northEastSouthWestResizeCursor();
     87     case Cursor::NorthWestSouthEastResize:
     88         return northWestSouthEastResizeCursor();
     89     case Cursor::ColumnResize:
     90         return columnResizeCursor();
     91     case Cursor::RowResize:
     92         return rowResizeCursor();
     93     case Cursor::MiddlePanning:
     94         return middlePanningCursor();
     95     case Cursor::EastPanning:
     96         return eastPanningCursor();
     97     case Cursor::NorthPanning:
     98         return northPanningCursor();
     99     case Cursor::NorthEastPanning:
    100         return northEastPanningCursor();
    101     case Cursor::NorthWestPanning:
    102         return northWestPanningCursor();
    103     case Cursor::SouthPanning:
    104         return southPanningCursor();
    105     case Cursor::SouthEastPanning:
    106         return southEastPanningCursor();
    107     case Cursor::SouthWestPanning:
    108         return southWestPanningCursor();
    109     case Cursor::WestPanning:
    110         return westPanningCursor();
    111     case Cursor::Move:
    112         return moveCursor();
    113     case Cursor::VerticalText:
    114         return verticalTextCursor();
    115     case Cursor::Cell:
    116         return cellCursor();
    117     case Cursor::ContextMenu:
    118         return contextMenuCursor();
    119     case Cursor::Alias:
    120         return aliasCursor();
    121     case Cursor::Progress:
    122         return progressCursor();
    123     case Cursor::NoDrop:
    124         return noDropCursor();
    125     case Cursor::Copy:
    126         return copyCursor();
    127     case Cursor::None:
    128         return noneCursor();
    129     case Cursor::NotAllowed:
    130         return notAllowedCursor();
    131     case Cursor::ZoomIn:
    132         return zoomInCursor();
    133     case Cursor::ZoomOut:
    134         return zoomOutCursor();
    135     case Cursor::Grab:
    136         return grabCursor();
    137     case Cursor::Grabbing:
    138         return grabbingCursor();
    139     case Cursor::Custom:
    140         ASSERT_NOT_REACHED();
    141     }
    142     return pointerCursor();
    143 }
    144 
    145 Cursor::Cursor(Image* image, const IntPoint& hotSpot)
    146     : m_type(Custom)
    147     , m_image(image)
    148     , m_hotSpot(determineHotSpot(image, hotSpot))
    149     , m_imageScaleFactor(1)
    150 {
    151 }
    152 
    153 Cursor::Cursor(Image* image, const IntPoint& hotSpot, float scale)
    154     : m_type(Custom)
    155     , m_image(image)
    156     , m_hotSpot(determineHotSpot(image, hotSpot))
    157     , m_imageScaleFactor(scale)
    158 {
    159 }
    160 
    161 Cursor::Cursor(Type type)
    162     : m_type(type)
    163     , m_imageScaleFactor(1)
    164 {
    165 }
    166 
    167 Cursor::Cursor(const Cursor& other)
    168     : m_type(other.m_type)
    169     , m_image(other.m_image)
    170     , m_hotSpot(other.m_hotSpot)
    171     , m_imageScaleFactor(other.m_imageScaleFactor)
    172 {
    173 }
    174 
    175 Cursor& Cursor::operator=(const Cursor& other)
    176 {
    177     m_type = other.m_type;
    178     m_image = other.m_image;
    179     m_hotSpot = other.m_hotSpot;
    180     m_imageScaleFactor = other.m_imageScaleFactor;
    181     return *this;
    182 }
    183 
    184 Cursor::~Cursor()
    185 {
    186 }
    187 
    188 const Cursor& pointerCursor()
    189 {
    190     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Pointer));
    191     return c;
    192 }
    193 
    194 const Cursor& crossCursor()
    195 {
    196     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Cross));
    197     return c;
    198 }
    199 
    200 const Cursor& handCursor()
    201 {
    202     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Hand));
    203     return c;
    204 }
    205 
    206 const Cursor& moveCursor()
    207 {
    208     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Move));
    209     return c;
    210 }
    211 
    212 const Cursor& verticalTextCursor()
    213 {
    214     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::VerticalText));
    215     return c;
    216 }
    217 
    218 const Cursor& cellCursor()
    219 {
    220     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Cell));
    221     return c;
    222 }
    223 
    224 const Cursor& contextMenuCursor()
    225 {
    226     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::ContextMenu));
    227     return c;
    228 }
    229 
    230 const Cursor& aliasCursor()
    231 {
    232     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Alias));
    233     return c;
    234 }
    235 
    236 const Cursor& zoomInCursor()
    237 {
    238     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::ZoomIn));
    239     return c;
    240 }
    241 
    242 const Cursor& zoomOutCursor()
    243 {
    244     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::ZoomOut));
    245     return c;
    246 }
    247 
    248 const Cursor& copyCursor()
    249 {
    250     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Copy));
    251     return c;
    252 }
    253 
    254 const Cursor& noneCursor()
    255 {
    256     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::None));
    257     return c;
    258 }
    259 
    260 const Cursor& progressCursor()
    261 {
    262     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Progress));
    263     return c;
    264 }
    265 
    266 const Cursor& noDropCursor()
    267 {
    268     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NoDrop));
    269     return c;
    270 }
    271 
    272 const Cursor& notAllowedCursor()
    273 {
    274     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NotAllowed));
    275     return c;
    276 }
    277 
    278 const Cursor& iBeamCursor()
    279 {
    280     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::IBeam));
    281     return c;
    282 }
    283 
    284 const Cursor& waitCursor()
    285 {
    286     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Wait));
    287     return c;
    288 }
    289 
    290 const Cursor& helpCursor()
    291 {
    292     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Help));
    293     return c;
    294 }
    295 
    296 const Cursor& eastResizeCursor()
    297 {
    298     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::EastResize));
    299     return c;
    300 }
    301 
    302 const Cursor& northResizeCursor()
    303 {
    304     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthResize));
    305     return c;
    306 }
    307 
    308 const Cursor& northEastResizeCursor()
    309 {
    310     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthEastResize));
    311     return c;
    312 }
    313 
    314 const Cursor& northWestResizeCursor()
    315 {
    316     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthWestResize));
    317     return c;
    318 }
    319 
    320 const Cursor& southResizeCursor()
    321 {
    322     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthResize));
    323     return c;
    324 }
    325 
    326 const Cursor& southEastResizeCursor()
    327 {
    328     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthEastResize));
    329     return c;
    330 }
    331 
    332 const Cursor& southWestResizeCursor()
    333 {
    334     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthWestResize));
    335     return c;
    336 }
    337 
    338 const Cursor& westResizeCursor()
    339 {
    340     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::WestResize));
    341     return c;
    342 }
    343 
    344 const Cursor& northSouthResizeCursor()
    345 {
    346     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthSouthResize));
    347     return c;
    348 }
    349 
    350 const Cursor& eastWestResizeCursor()
    351 {
    352     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::EastWestResize));
    353     return c;
    354 }
    355 
    356 const Cursor& northEastSouthWestResizeCursor()
    357 {
    358     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthEastSouthWestResize));
    359     return c;
    360 }
    361 
    362 const Cursor& northWestSouthEastResizeCursor()
    363 {
    364     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthWestSouthEastResize));
    365     return c;
    366 }
    367 
    368 const Cursor& columnResizeCursor()
    369 {
    370     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::ColumnResize));
    371     return c;
    372 }
    373 
    374 const Cursor& rowResizeCursor()
    375 {
    376     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::RowResize));
    377     return c;
    378 }
    379 
    380 const Cursor& middlePanningCursor()
    381 {
    382     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::MiddlePanning));
    383     return c;
    384 }
    385 
    386 const Cursor& eastPanningCursor()
    387 {
    388     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::EastPanning));
    389     return c;
    390 }
    391 
    392 const Cursor& northPanningCursor()
    393 {
    394     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthPanning));
    395     return c;
    396 }
    397 
    398 const Cursor& northEastPanningCursor()
    399 {
    400     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthEastPanning));
    401     return c;
    402 }
    403 
    404 const Cursor& northWestPanningCursor()
    405 {
    406     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthWestPanning));
    407     return c;
    408 }
    409 
    410 const Cursor& southPanningCursor()
    411 {
    412     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthPanning));
    413     return c;
    414 }
    415 
    416 const Cursor& southEastPanningCursor()
    417 {
    418     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthEastPanning));
    419     return c;
    420 }
    421 
    422 const Cursor& southWestPanningCursor()
    423 {
    424     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthWestPanning));
    425     return c;
    426 }
    427 
    428 const Cursor& westPanningCursor()
    429 {
    430     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::WestPanning));
    431     return c;
    432 }
    433 
    434 const Cursor& grabCursor()
    435 {
    436     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Grab));
    437     return c;
    438 }
    439 
    440 const Cursor& grabbingCursor()
    441 {
    442     DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Grabbing));
    443     return c;
    444 }
    445 
    446 } // namespace WebCore
    447