diff -r 000000000000 -r 4f2f89ce4247 WebCore/platform/Cursor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WebCore/platform/Cursor.cpp Fri Sep 17 09:02:29 2010 +0300 @@ -0,0 +1,522 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#include "Cursor.h" + +#include "Image.h" + +namespace WebCore { + +IntPoint determineHotSpot(Image* image, const IntPoint& specifiedHotSpot) +{ + // Hot spot must be inside cursor rectangle. + IntRect imageRect = image->rect(); + if (imageRect.contains(specifiedHotSpot)) + return specifiedHotSpot; + + // If hot spot is not specified externally, it can be extracted from some image formats (e.g. .cur). + IntPoint intrinsicHotSpot; + bool imageHasIntrinsicHotSpot = image->getHotSpot(intrinsicHotSpot); + if (imageHasIntrinsicHotSpot && imageRect.contains(intrinsicHotSpot)) + return intrinsicHotSpot; + + return IntPoint(); +} + +const Cursor& Cursor::fromType(Cursor::Type type) +{ + switch (type) { + case Cursor::Pointer: + return pointerCursor(); + case Cursor::Cross: + return crossCursor(); + case Cursor::Hand: + return handCursor(); + case Cursor::IBeam: + return iBeamCursor(); + case Cursor::Wait: + return waitCursor(); + case Cursor::Help: + return helpCursor(); + case Cursor::EastResize: + return eastResizeCursor(); + case Cursor::NorthResize: + return northResizeCursor(); + case Cursor::NorthEastResize: + return northEastResizeCursor(); + case Cursor::NorthWestResize: + return northWestResizeCursor(); + case Cursor::SouthResize: + return southResizeCursor(); + case Cursor::SouthEastResize: + return southEastResizeCursor(); + case Cursor::SouthWestResize: + return southWestResizeCursor(); + case Cursor::WestResize: + return westResizeCursor(); + case Cursor::NorthSouthResize: + return northSouthResizeCursor(); + case Cursor::EastWestResize: + return eastWestResizeCursor(); + case Cursor::NorthEastSouthWestResize: + return northEastSouthWestResizeCursor(); + case Cursor::NorthWestSouthEastResize: + return northWestSouthEastResizeCursor(); + case Cursor::ColumnResize: + return columnResizeCursor(); + case Cursor::RowResize: + return rowResizeCursor(); + case Cursor::MiddlePanning: + return middlePanningCursor(); + case Cursor::EastPanning: + return eastPanningCursor(); + case Cursor::NorthPanning: + return northPanningCursor(); + case Cursor::NorthEastPanning: + return northEastPanningCursor(); + case Cursor::NorthWestPanning: + return northWestPanningCursor(); + case Cursor::SouthPanning: + return southPanningCursor(); + case Cursor::SouthEastPanning: + return southEastPanningCursor(); + case Cursor::SouthWestPanning: + return southWestPanningCursor(); + case Cursor::WestPanning: + return westPanningCursor(); + case Cursor::Move: + return moveCursor(); + case Cursor::VerticalText: + return verticalTextCursor(); + case Cursor::Cell: + return cellCursor(); + case Cursor::ContextMenu: + return contextMenuCursor(); + case Cursor::Alias: + return aliasCursor(); + case Cursor::Progress: + return progressCursor(); + case Cursor::NoDrop: + return noDropCursor(); + case Cursor::Copy: + return copyCursor(); + case Cursor::None: + return noneCursor(); + case Cursor::NotAllowed: + return notAllowedCursor(); + case Cursor::ZoomIn: + return zoomInCursor(); + case Cursor::ZoomOut: + return zoomOutCursor(); + case Cursor::Grab: + return grabCursor(); + case Cursor::Grabbing: + return grabbingCursor(); + case Cursor::Custom: + ASSERT_NOT_REACHED(); + } + return pointerCursor(); +} + +const char* nameForCursorType(Cursor::Type type) +{ + switch (type) { + case Cursor::Pointer: + return "Pointer"; + case Cursor::Cross: + return "Cross"; + case Cursor::Hand: + return "Hand"; + case Cursor::IBeam: + return "IBeam"; + case Cursor::Wait: + return "Wait"; + case Cursor::Help: + return "Help"; + case Cursor::EastResize: + return "EastResize"; + case Cursor::NorthResize: + return "NorthResize"; + case Cursor::NorthEastResize: + return "NorthEastResize"; + case Cursor::NorthWestResize: + return "NorthWestResize"; + case Cursor::SouthResize: + return "SouthResize"; + case Cursor::SouthEastResize: + return "SouthEastResize"; + case Cursor::SouthWestResize: + return "SouthWestResize"; + case Cursor::WestResize: + return "WestResize"; + case Cursor::NorthSouthResize: + return "NorthSouthResize"; + case Cursor::EastWestResize: + return "EastWestResize"; + case Cursor::NorthEastSouthWestResize: + return "NorthEastSouthWestResize"; + case Cursor::NorthWestSouthEastResize: + return "NorthWestSouthEastResize"; + case Cursor::ColumnResize: + return "ColumnResize"; + case Cursor::RowResize: + return "RowResize"; + case Cursor::MiddlePanning: + return "MiddlePanning"; + case Cursor::EastPanning: + return "EastPanning"; + case Cursor::NorthPanning: + return "NorthPanning"; + case Cursor::NorthEastPanning: + return "NorthEastPanning"; + case Cursor::NorthWestPanning: + return "NorthWestPanning"; + case Cursor::SouthPanning: + return "SouthPanning"; + case Cursor::SouthEastPanning: + return "SouthEastPanning"; + case Cursor::SouthWestPanning: + return "SouthWestPanning"; + case Cursor::WestPanning: + return "WestPanning"; + case Cursor::Move: + return "Move"; + case Cursor::VerticalText: + return "VerticalText"; + case Cursor::Cell: + return "Cell"; + case Cursor::ContextMenu: + return "ContextMenu"; + case Cursor::Alias: + return "Alias"; + case Cursor::Progress: + return "Progress"; + case Cursor::NoDrop: + return "NoDrop"; + case Cursor::Copy: + return "Copy"; + case Cursor::None: + return "None"; + case Cursor::NotAllowed: + return "NotAllowed"; + case Cursor::ZoomIn: + return "ZoomIn"; + case Cursor::ZoomOut: + return "ZoomOut"; + case Cursor::Grab: + return "Grab"; + case Cursor::Grabbing: + return "Grabbing"; + case Cursor::Custom: + return "Custom"; + } + + return "ERROR"; +} + +#if USE(LAZY_NATIVE_CURSOR) + +Cursor::Cursor(Image* image, const IntPoint& hotSpot) + : m_type(Custom) + , m_image(image) + , m_hotSpot(determineHotSpot(image, hotSpot)) + , m_platformCursor(0) +{ +} + +Cursor::Cursor(Type type) + : m_type(type) + , m_platformCursor(0) +{ +} + +PlatformCursor Cursor::platformCursor() const +{ + ensurePlatformCursor(); + return m_platformCursor; +} + +const Cursor& pointerCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Pointer)); + return c; +} + +const Cursor& crossCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Cross)); + return c; +} + +const Cursor& handCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Hand)); + return c; +} + +const Cursor& moveCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Move)); + return c; +} + +const Cursor& verticalTextCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::VerticalText)); + return c; +} + +const Cursor& cellCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Cell)); + return c; +} + +const Cursor& contextMenuCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::ContextMenu)); + return c; +} + +const Cursor& aliasCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Alias)); + return c; +} + +const Cursor& zoomInCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::ZoomIn)); + return c; +} + +const Cursor& zoomOutCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::ZoomOut)); + return c; +} + +const Cursor& copyCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Copy)); + return c; +} + +const Cursor& noneCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::None)); + return c; +} + +const Cursor& progressCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Progress)); + return c; +} + +const Cursor& noDropCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NoDrop)); + return c; +} + +const Cursor& notAllowedCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NotAllowed)); + return c; +} + +const Cursor& iBeamCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::IBeam)); + return c; +} + +const Cursor& waitCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Wait)); + return c; +} + +const Cursor& helpCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Help)); + return c; +} + +const Cursor& eastResizeCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::EastResize)); + return c; +} + +const Cursor& northResizeCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthResize)); + return c; +} + +const Cursor& northEastResizeCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthEastResize)); + return c; +} + +const Cursor& northWestResizeCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthWestResize)); + return c; +} + +const Cursor& southResizeCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthResize)); + return c; +} + +const Cursor& southEastResizeCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthEastResize)); + return c; +} + +const Cursor& southWestResizeCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthWestResize)); + return c; +} + +const Cursor& westResizeCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::WestResize)); + return c; +} + +const Cursor& northSouthResizeCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthSouthResize)); + return c; +} + +const Cursor& eastWestResizeCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::EastWestResize)); + return c; +} + +const Cursor& northEastSouthWestResizeCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthEastSouthWestResize)); + return c; +} + +const Cursor& northWestSouthEastResizeCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthWestSouthEastResize)); + return c; +} + +const Cursor& columnResizeCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::ColumnResize)); + return c; +} + +const Cursor& rowResizeCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::RowResize)); + return c; +} + +const Cursor& middlePanningCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::MiddlePanning)); + return c; +} + +const Cursor& eastPanningCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::EastPanning)); + return c; +} + +const Cursor& northPanningCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthPanning)); + return c; +} + +const Cursor& northEastPanningCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthEastPanning)); + return c; +} + +const Cursor& northWestPanningCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthWestPanning)); + return c; +} + +const Cursor& southPanningCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthPanning)); + return c; +} + +const Cursor& southEastPanningCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthEastPanning)); + return c; +} + +const Cursor& southWestPanningCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthWestPanning)); + return c; +} + +const Cursor& westPanningCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::WestPanning)); + return c; +} + +const Cursor& grabCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Grab)); + return c; +} + +const Cursor& grabbingCursor() +{ + DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Grabbing)); + return c; +} + +#endif + +} // namespace WebCore