Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Unified Diff: webkit/glue/webcursor_mac.mm

Issue 11427: Cursor support including custom cursors (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 12 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webkit/glue/webcursor_mac.mm
===================================================================
--- webkit/glue/webcursor_mac.mm (revision 0)
+++ webkit/glue/webcursor_mac.mm (revision 0)
@@ -0,0 +1,172 @@
+// Copyright (c) 2008 The Chromium Authors. All rights reserved. Use of this
+// source code is governed by a BSD-style license that can be found in the
+// LICENSE file.
+
+#include "webkit/glue/webcursor.h"
+
+#include "config.h"
+#include "PlatformCursor.h"
+#include "RetainPtr.h"
+
+#undef LOG
+#include "base/logging.h"
+
+using WebCore::PlatformCursor;
+
+namespace {
+
+// TODO(avi): Is loading resources what we want to do here?
+NSCursor* LoadCursor(const char* name, int x, int y) {
+ NSString* file_name = [NSString stringWithUTF8String:name];
+ DCHECK(file_name);
+ NSImage* cursor_image = [NSImage imageNamed:file_name];
+ DCHECK(cursor_image);
+ return [[[NSCursor alloc] initWithImage:cursor_image
+ hotSpot:NSMakePoint(x, y)] autorelease];
+}
+
+NSCursor* CreateCustomCursor(const std::vector<char>& custom_data,
+ const gfx::Size& custom_size,
+ const gfx::Point& hotspot) {
+ RetainPtr<CGColorSpace> cg_color(AdoptCF, CGColorSpaceCreateDeviceRGB());
+ // this is safe since we're not going to draw into the context we're creating
+ void* data = const_cast<void *>(static_cast<const void*>(&custom_data[0]));
+ // settings here match SetCustomData() below; keep in sync
+ RetainPtr<CGContextRef> context(AdoptCF, CGBitmapContextCreate(
+ data,
+ custom_size.width(),
+ custom_size.height(),
+ 8,
+ custom_size.width()*4,
+ cg_color.get(),
+ kCGImageAlphaPremultipliedLast |
+ kCGBitmapByteOrder32Big));
+ RetainPtr<CGImage> cg_image(AdoptCF,
+ CGBitmapContextCreateImage(context.get()));
+
+ RetainPtr<NSBitmapImageRep> ns_bitmap(
+ AdoptNS, [[NSBitmapImageRep alloc] initWithCGImage:cg_image.get()]);
+ RetainPtr<NSImage> cursor_image([[NSImage alloc] init]);
+ [cursor_image.get() addRepresentation:ns_bitmap.get()];
+ DCHECK(cursor_image);
+ return [[[NSCursor alloc] initWithImage:cursor_image.get()
+ hotSpot:NSMakePoint(hotspot.x(),
+ hotspot.y())]
+ autorelease];
+}
+
+}
+
+// We're matching Safari's cursor choices; see platform/mac/CursorMac.mm
+NSCursor* WebCursor::GetCursor() const {
+ switch (type_) {
+ case PlatformCursor::typePointer:
+ return [NSCursor arrowCursor];
+ case PlatformCursor::typeCross:
+ return LoadCursor("crossHairCursor", 11, 11);
pink (ping after 24hrs) 2008/11/18 18:45:56 are these hotspot points documented anywhere, or a
Avi (use Gerrit) 2008/11/18 18:59:38 See platform/mac/CursorMac.mm, as noted in the com
+ case PlatformCursor::typeHand:
+ return LoadCursor("linkCursor", 6, 1);
+ case PlatformCursor::typeIBeam:
+ return [NSCursor IBeamCursor];
+ case PlatformCursor::typeWait:
+ return LoadCursor("waitCursor", 7, 7);
+ case PlatformCursor::typeHelp:
+ return LoadCursor("helpCursor", 8, 8);
+ case PlatformCursor::typeEastResize:
+ case PlatformCursor::typeEastPanning:
+ return LoadCursor("eastResizeCursor", 14, 7);
+ case PlatformCursor::typeNorthResize:
+ case PlatformCursor::typeNorthPanning:
+ return LoadCursor("northResizeCursor", 7, 1);
+ case PlatformCursor::typeNorthEastResize:
+ case PlatformCursor::typeNorthEastPanning:
+ return LoadCursor("northEastResizeCursor", 14, 1);
+ case PlatformCursor::typeNorthWestResize:
+ case PlatformCursor::typeNorthWestPanning:
+ return LoadCursor("northWestResizeCursor", 0, 0);
+ case PlatformCursor::typeSouthResize:
+ case PlatformCursor::typeSouthPanning:
+ return LoadCursor("southResizeCursor", 7, 14);
+ case PlatformCursor::typeSouthEastResize:
+ case PlatformCursor::typeSouthEastPanning:
+ return LoadCursor("southEastResizeCursor", 14, 14);
+ case PlatformCursor::typeSouthWestResize:
+ case PlatformCursor::typeSouthWestPanning:
+ return LoadCursor("southWestResizeCursor", 1, 14);
+ case PlatformCursor::typeWestResize:
+ case PlatformCursor::typeWestPanning:
+ return LoadCursor("westResizeCursor", 1, 7);
+ case PlatformCursor::typeNorthSouthResize:
+ return LoadCursor("northSouthResizeCursor", 7, 7);
+ case PlatformCursor::typeEastWestResize:
+ return LoadCursor("eastWestResizeCursor", 7, 7);
+ case PlatformCursor::typeNorthEastSouthWestResize:
+ return LoadCursor("northEastSouthWestResizeCursor", 7, 7);
+ case PlatformCursor::typeNorthWestSouthEastResize:
+ return LoadCursor("northWestSouthEastResizeCursor", 7, 7);
+ case PlatformCursor::typeColumnResize:
+ return [NSCursor resizeLeftRightCursor];
+ case PlatformCursor::typeRowResize:
+ return [NSCursor resizeUpDownCursor];
+ case PlatformCursor::typeMiddlePanning:
+ case PlatformCursor::typeMove:
+ return LoadCursor("moveCursor", 7, 7);
+ case PlatformCursor::typeVerticalText:
+ return LoadCursor("verticalTextCursor", 7, 7);
+ case PlatformCursor::typeCell:
+ return LoadCursor("cellCursor", 7, 7);
+ case PlatformCursor::typeContextMenu:
+ return LoadCursor("contextMenuCursor", 3, 2);
+ case PlatformCursor::typeAlias:
+ return LoadCursor("aliasCursor", 11, 3);
+ case PlatformCursor::typeProgress:
+ return LoadCursor("progressCursor", 3, 2);
+ case PlatformCursor::typeNoDrop:
+ return LoadCursor("noDropCursor", 3, 1);
+ case PlatformCursor::typeCopy:
+ return LoadCursor("copyCursor", 3, 2);
+ case PlatformCursor::typeNone:
+ return LoadCursor("noneCursor", 7, 7);
+ case PlatformCursor::typeNotAllowed:
+ return LoadCursor("notAllowedCursor", 11, 11);
+ case PlatformCursor::typeZoomIn:
+ return LoadCursor("zoomInCursor", 7, 7);
+ case PlatformCursor::typeZoomOut:
+ return LoadCursor("zoomOutCursor", 7, 7);
+ case PlatformCursor::typeCustom:
+ return CreateCustomCursor(custom_data_, custom_size_, hotspot_);
+ }
+ NOTREACHED();
+ return nil;
+}
+
+void WebCursor::SetCustomData(WebCore::Image* image) {
+ WebCore::NativeImagePtr image_ptr = image->nativeImageForCurrentFrame();
+ if (!image_ptr)
+ return;
+
+ RetainPtr<CGColorSpace> cg_color(AdoptCF, CGColorSpaceCreateDeviceRGB());
+
+ size_t size = CGImageGetHeight(image_ptr)*CGImageGetWidth(image_ptr)*4;
+ custom_data_.resize(size);
+ custom_size_.set_width(CGImageGetWidth(image_ptr));
+ custom_size_.set_height(CGImageGetHeight(image_ptr));
+
+ // These settings match up with the code in CreateCustomCursor() above; keep
+ // them in sync.
+ // TODO(avi): test to ensure that the flags here are correct for RGBA
+ RetainPtr<CGContextRef> context(AdoptCF, CGBitmapContextCreate(
+ &custom_data_[0],
+ CGImageGetWidth(image_ptr),
+ CGImageGetHeight(image_ptr),
+ 8,
+ CGImageGetWidth(image_ptr)*4,
+ cg_color.get(),
+ kCGImageAlphaPremultipliedLast |
+ kCGBitmapByteOrder32Big));
+ CGRect rect = CGRectMake(0, 0,
+ CGImageGetWidth(image_ptr),
+ CGImageGetHeight(image_ptr));
+ CGContextDrawImage(context.get(), rect, image_ptr);
+}
+
Property changes on: webkit/glue/webcursor_mac.mm
___________________________________________________________________
Name: svn:eol-style
+ LF

Powered by Google App Engine
This is Rietveld 408576698