Index: webkit/glue/webcursor_mac.mm |
=================================================================== |
--- webkit/glue/webcursor_mac.mm (revision 20148) |
+++ webkit/glue/webcursor_mac.mm (working copy) |
@@ -6,14 +6,15 @@ |
#import <AppKit/AppKit.h> |
-#include "config.h" |
-#include "PlatformCursor.h" |
-#include "RetainPtr.h" |
- |
-#undef LOG |
#include "base/logging.h" |
+#include "base/scoped_cftyperef.h" |
+#include "webkit/api/public/WebCursorInfo.h" |
+#include "webkit/api/public/WebImage.h" |
+#include "webkit/api/public/WebSize.h" |
-using WebCore::PlatformCursor; |
+using WebKit::WebCursorInfo; |
+using WebKit::WebImage; |
+using WebKit::WebSize; |
namespace { |
@@ -27,151 +28,171 @@ |
hotSpot:NSMakePoint(x, y)] autorelease]; |
} |
+CGImageRef CreateCGImageFromCustomData(const std::vector<char>& custom_data, |
+ const gfx::Size& custom_size) { |
+ scoped_cftyperef<CGColorSpaceRef> cg_color(CGColorSpaceCreateDeviceRGB()); |
+ // this is safe since we're not going to draw into the context we're creating |
+ void* data = const_cast<char*>(&custom_data[0]); |
+ // settings here match SetCustomData() below; keep in sync |
+ scoped_cftyperef<CGContextRef> context( |
+ CGBitmapContextCreate(data, |
+ custom_size.width(), |
+ custom_size.height(), |
+ 8, |
+ custom_size.width()*4, |
+ cg_color.get(), |
+ kCGImageAlphaPremultipliedLast | |
+ kCGBitmapByteOrder32Big)); |
+ return CGBitmapContextCreateImage(context.get()); |
+} |
+ |
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())); |
+ scoped_cftyperef<CGImageRef> cg_image( |
+ CreateCGImageFromCustomData(custom_data, custom_size)); |
- 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()]; |
+ NSBitmapImageRep* ns_bitmap = |
+ [[NSBitmapImageRep alloc] initWithCGImage:cg_image.get()]; |
+ NSImage* cursor_image = [[NSImage alloc] init]; |
DCHECK(cursor_image); |
- return [[[NSCursor alloc] initWithImage:cursor_image.get() |
- hotSpot:NSMakePoint(hotspot.x(), |
- hotspot.y())] |
- autorelease]; |
-} |
+ [cursor_image addRepresentation:ns_bitmap]; |
+ [ns_bitmap release]; |
+ NSCursor* cursor = [[NSCursor alloc] initWithImage:cursor_image |
+ hotSpot:NSMakePoint(hotspot.x(), |
+ hotspot.y())]; |
+ [cursor_image release]; |
+ |
+ return [cursor autorelease]; |
} |
+} // namespace |
+ |
// We're matching Safari's cursor choices; see platform/mac/CursorMac.mm |
NSCursor* WebCursor::GetCursor() const { |
switch (type_) { |
- case PlatformCursor::TypePointer: |
+ case WebCursorInfo::TypePointer: |
return [NSCursor arrowCursor]; |
- case PlatformCursor::TypeCross: |
+ case WebCursorInfo::TypeCross: |
return LoadCursor("crossHairCursor", 11, 11); |
- case PlatformCursor::TypeHand: |
+ case WebCursorInfo::TypeHand: |
return LoadCursor("linkCursor", 6, 1); |
- case PlatformCursor::TypeIBeam: |
+ case WebCursorInfo::TypeIBeam: |
return [NSCursor IBeamCursor]; |
- case PlatformCursor::TypeWait: |
+ case WebCursorInfo::TypeWait: |
return LoadCursor("waitCursor", 7, 7); |
- case PlatformCursor::TypeHelp: |
+ case WebCursorInfo::TypeHelp: |
return LoadCursor("helpCursor", 8, 8); |
- case PlatformCursor::TypeEastResize: |
- case PlatformCursor::TypeEastPanning: |
+ case WebCursorInfo::TypeEastResize: |
+ case WebCursorInfo::TypeEastPanning: |
return LoadCursor("eastResizeCursor", 14, 7); |
- case PlatformCursor::TypeNorthResize: |
- case PlatformCursor::TypeNorthPanning: |
+ case WebCursorInfo::TypeNorthResize: |
+ case WebCursorInfo::TypeNorthPanning: |
return LoadCursor("northResizeCursor", 7, 1); |
- case PlatformCursor::TypeNorthEastResize: |
- case PlatformCursor::TypeNorthEastPanning: |
+ case WebCursorInfo::TypeNorthEastResize: |
+ case WebCursorInfo::TypeNorthEastPanning: |
return LoadCursor("northEastResizeCursor", 14, 1); |
- case PlatformCursor::TypeNorthWestResize: |
- case PlatformCursor::TypeNorthWestPanning: |
+ case WebCursorInfo::TypeNorthWestResize: |
+ case WebCursorInfo::TypeNorthWestPanning: |
return LoadCursor("northWestResizeCursor", 0, 0); |
- case PlatformCursor::TypeSouthResize: |
- case PlatformCursor::TypeSouthPanning: |
+ case WebCursorInfo::TypeSouthResize: |
+ case WebCursorInfo::TypeSouthPanning: |
return LoadCursor("southResizeCursor", 7, 14); |
- case PlatformCursor::TypeSouthEastResize: |
- case PlatformCursor::TypeSouthEastPanning: |
+ case WebCursorInfo::TypeSouthEastResize: |
+ case WebCursorInfo::TypeSouthEastPanning: |
return LoadCursor("southEastResizeCursor", 14, 14); |
- case PlatformCursor::TypeSouthWestResize: |
- case PlatformCursor::TypeSouthWestPanning: |
+ case WebCursorInfo::TypeSouthWestResize: |
+ case WebCursorInfo::TypeSouthWestPanning: |
return LoadCursor("southWestResizeCursor", 1, 14); |
- case PlatformCursor::TypeWestResize: |
- case PlatformCursor::TypeWestPanning: |
+ case WebCursorInfo::TypeWestResize: |
+ case WebCursorInfo::TypeWestPanning: |
return LoadCursor("westResizeCursor", 1, 7); |
- case PlatformCursor::TypeNorthSouthResize: |
+ case WebCursorInfo::TypeNorthSouthResize: |
return LoadCursor("northSouthResizeCursor", 7, 7); |
- case PlatformCursor::TypeEastWestResize: |
+ case WebCursorInfo::TypeEastWestResize: |
return LoadCursor("eastWestResizeCursor", 7, 7); |
- case PlatformCursor::TypeNorthEastSouthWestResize: |
+ case WebCursorInfo::TypeNorthEastSouthWestResize: |
return LoadCursor("northEastSouthWestResizeCursor", 7, 7); |
- case PlatformCursor::TypeNorthWestSouthEastResize: |
+ case WebCursorInfo::TypeNorthWestSouthEastResize: |
return LoadCursor("northWestSouthEastResizeCursor", 7, 7); |
- case PlatformCursor::TypeColumnResize: |
+ case WebCursorInfo::TypeColumnResize: |
return [NSCursor resizeLeftRightCursor]; |
- case PlatformCursor::TypeRowResize: |
+ case WebCursorInfo::TypeRowResize: |
return [NSCursor resizeUpDownCursor]; |
- case PlatformCursor::TypeMiddlePanning: |
- case PlatformCursor::TypeMove: |
+ case WebCursorInfo::TypeMiddlePanning: |
+ case WebCursorInfo::TypeMove: |
return LoadCursor("moveCursor", 7, 7); |
- case PlatformCursor::TypeVerticalText: |
+ case WebCursorInfo::TypeVerticalText: |
return LoadCursor("verticalTextCursor", 7, 7); |
- case PlatformCursor::TypeCell: |
+ case WebCursorInfo::TypeCell: |
return LoadCursor("cellCursor", 7, 7); |
- case PlatformCursor::TypeContextMenu: |
+ case WebCursorInfo::TypeContextMenu: |
return LoadCursor("contextMenuCursor", 3, 2); |
- case PlatformCursor::TypeAlias: |
+ case WebCursorInfo::TypeAlias: |
return LoadCursor("aliasCursor", 11, 3); |
- case PlatformCursor::TypeProgress: |
+ case WebCursorInfo::TypeProgress: |
return LoadCursor("progressCursor", 3, 2); |
- case PlatformCursor::TypeNoDrop: |
+ case WebCursorInfo::TypeNoDrop: |
return LoadCursor("noDropCursor", 3, 1); |
- case PlatformCursor::TypeCopy: |
+ case WebCursorInfo::TypeCopy: |
return LoadCursor("copyCursor", 3, 2); |
- case PlatformCursor::TypeNone: |
+ case WebCursorInfo::TypeNone: |
return LoadCursor("noneCursor", 7, 7); |
- case PlatformCursor::TypeNotAllowed: |
+ case WebCursorInfo::TypeNotAllowed: |
return LoadCursor("notAllowedCursor", 11, 11); |
- case PlatformCursor::TypeZoomIn: |
+ case WebCursorInfo::TypeZoomIn: |
return LoadCursor("zoomInCursor", 7, 7); |
- case PlatformCursor::TypeZoomOut: |
+ case WebCursorInfo::TypeZoomOut: |
return LoadCursor("zoomOutCursor", 7, 7); |
- case PlatformCursor::TypeCustom: |
+ case WebCursorInfo::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) |
+void WebCursor::SetCustomData(const WebImage& image) { |
+ if (image.isNull()) |
return; |
- RetainPtr<CGColorSpace> cg_color(AdoptCF, CGColorSpaceCreateDeviceRGB()); |
+ scoped_cftyperef<CGColorSpaceRef> cg_color( |
+ CGColorSpaceCreateDeviceRGB()); |
- size_t size = CGImageGetHeight(image_ptr)*CGImageGetWidth(image_ptr)*4; |
+ const WebSize& image_dimensions = image.size(); |
+ int image_width = image_dimensions.width; |
+ int image_height = image_dimensions.height; |
+ |
+ size_t size = image_height * image_width * 4; |
custom_data_.resize(size); |
- custom_size_.set_width(CGImageGetWidth(image_ptr)); |
- custom_size_.set_height(CGImageGetHeight(image_ptr)); |
+ custom_size_.set_width(image_width); |
+ custom_size_.set_height(image_height); |
// 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); |
+ scoped_cftyperef<CGContextRef> context( |
+ CGBitmapContextCreate(&custom_data_[0], |
+ image_width, |
+ image_height, |
+ 8, |
+ image_width * 4, |
+ cg_color.get(), |
+ kCGImageAlphaPremultipliedLast | |
+ kCGBitmapByteOrder32Big)); |
+ CGRect rect = CGRectMake(0, 0, image_width, image_height); |
+ CGContextDrawImage(context.get(), rect, image.getCGImageRef()); |
} |
+void WebCursor::ImageFromCustomData(WebImage* image) const { |
+ if (custom_data_.empty()) |
+ return; |
+ |
+ scoped_cftyperef<CGImageRef> cg_image( |
+ CreateCGImageFromCustomData(custom_data_, custom_size_)); |
+ *image = cg_image.get(); |
+} |
+ |
void WebCursor::InitPlatformData() { |
return; |
} |