--- /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