diff options
Diffstat (limited to 'webkit/glue')
-rw-r--r-- | webkit/glue/webcursor.cc | 34 | ||||
-rw-r--r-- | webkit/glue/webcursor.h | 53 | ||||
-rw-r--r-- | webkit/glue/webkit_glue.h | 21 |
3 files changed, 83 insertions, 25 deletions
diff --git a/webkit/glue/webcursor.cc b/webkit/glue/webcursor.cc index 52496a4..80a5e8b 100644 --- a/webkit/glue/webcursor.cc +++ b/webkit/glue/webcursor.cc @@ -12,18 +12,20 @@ WebCursor::WebCursor() : type_(ARROW), hotspot_x_(0), - hotspot_y_(0) { - memset(&bitmap_, 0, sizeof(bitmap_)); + hotspot_y_(0), + bitmap_() { } WebCursor::WebCursor(Type cursor_type) : type_(cursor_type), hotspot_x_(0), - hotspot_y_(0) { - memset(&bitmap_, 0, sizeof(bitmap_)); + hotspot_y_(0), + bitmap_() { } -WebCursor::WebCursor(const SkBitmap* bitmap, int hotspot_x, int hotspot_y) +WebCursor::WebCursor(const WebCursorBitmapPtr bitmap, + int hotspot_x, + int hotspot_y) : type_(ARROW), hotspot_x_(0), hotspot_y_(0) { @@ -31,20 +33,31 @@ WebCursor::WebCursor(const SkBitmap* bitmap, int hotspot_x, int hotspot_y) type_ = CUSTOM; hotspot_x_ = hotspot_x; hotspot_y_ = hotspot_y; +#if defined(OS_MACOSX) + CGImageRetain(bitmap_ = bitmap); +#else bitmap_ = *bitmap; +#endif } else { +#if defined(OS_MACOSX) + bitmap_ = NULL; +#else memset(&bitmap_, 0, sizeof(bitmap_)); +#endif } } WebCursor::~WebCursor() { +#if defined(OS_MACOSX) + CGImageRelease(bitmap_); +#endif } WebCursor::WebCursor(const WebCursor& other) { type_ = other.type_; hotspot_x_ = other.hotspot_x_; hotspot_y_ = other.hotspot_y_; - bitmap_ = other.bitmap_; + set_bitmap(other.bitmap_); } WebCursor& WebCursor::operator=(const WebCursor& other) { @@ -52,10 +65,11 @@ WebCursor& WebCursor::operator=(const WebCursor& other) { type_ = other.type_; hotspot_x_ = other.hotspot_x_; hotspot_y_ = other.hotspot_y_; - bitmap_ = other.bitmap_; + set_bitmap(other.bitmap_); } return *this; } + #if defined(OS_WIN) HCURSOR WebCursor::GetCursor(HINSTANCE module_handle) const { if (type_ == CUSTOM) @@ -136,7 +150,9 @@ HCURSOR WebCursor::GetCustomCursor() const { return cursor_handle; } #endif -bool WebCursor::IsSameBitmap(const SkBitmap& bitmap) const { + +#if !defined(OS_MACOSX) +bool WebCursor::IsSameBitmap(const WebCursorBitmap& bitmap) const { SkAutoLockPixels new_bitmap_lock(bitmap); SkAutoLockPixels bitmap_lock(bitmap_); return (memcmp(bitmap_.getPixels(), bitmap.getPixels(), @@ -151,4 +167,4 @@ bool WebCursor::IsEqual(const WebCursor& other) const { return IsSameBitmap(other.bitmap_); return true; } - +#endif diff --git a/webkit/glue/webcursor.h b/webkit/glue/webcursor.h index a80d39c..55281db 100644 --- a/webkit/glue/webcursor.h +++ b/webkit/glue/webcursor.h @@ -5,9 +5,28 @@ #ifndef WEBCURSOR_H__ #define WEBCURSOR_H__ -#include "skia/include/SkBitmap.h" #include "build/build_config.h" +#if defined(OS_MACOSX) +#include <CoreGraphics/CoreGraphics.h> +#else +#include "skia/include/SkBitmap.h" +#endif + +// Use CGImage on the Mac and SkBitmap on other platforms. WebCursorBitmapPtr +// is a corresponding pointer type: because CGImageRef is already a pointer +// type, we can just use that directly in the constructor, but we need an +// SkBitmap* in the Skia case. +// +// TODO(port): We should use a bitmap abstraction container. +#if defined(OS_MACOSX) +typedef CGImageRef WebCursorBitmap; +typedef WebCursorBitmap WebCursorBitmapPtr; +#else +typedef SkBitmap WebCursorBitmap; +typedef SkBitmap* WebCursorBitmapPtr; +#endif + // This class provides the functionality of a generic cursor type. The intent // is to stay away from platform specific code here. We do have win32 specific // functionality to retreive a HCURSOR from a cursor type. @@ -47,7 +66,7 @@ public: WebCursor(); WebCursor(Type cursor_type); - WebCursor(const SkBitmap* bitmap, int hotspot_x, int hotspot_y); + WebCursor(const WebCursorBitmapPtr bitmap, int hotspot_x, int hotspot_y); ~WebCursor(); WebCursor(const WebCursor& other); @@ -56,47 +75,59 @@ public: Type type() const { return type_; }; int hotspot_x() const { return hotspot_x_; } int hotspot_y() const { return hotspot_y_; } - const SkBitmap& bitmap() const { return bitmap_; } + const WebCursorBitmap& bitmap() const { return bitmap_; } void set_type(Type cursor_type) { type_ = cursor_type; } - void set_bitmap(const SkBitmap& bitmap) { + void set_bitmap(const WebCursorBitmap& bitmap) { +#if defined(OS_MACOSX) + WebCursorBitmap old_bitmap = bitmap_; + CGImageRetain(bitmap_ = bitmap); + CGImageRelease(old_bitmap); +#else bitmap_ = bitmap; +#endif } void set_hotspot(int hotspot_x, int hotspot_y) { hotspot_x_ = hotspot_x; hotspot_y_ = hotspot_x; } + #if defined(OS_WIN) // Returns the cursor handle. If the cursor type is a win32 or safari // cursor, we use LoadCursor to load the cursor. // Returns NULL on error. HCURSOR GetCursor(HINSTANCE module_handle) const; // If the underlying cursor type is a custom cursor, this function converts - // the SkBitmap to a cursor and returns the same. The responsiblity of + // the WebCursorBitmap to a cursor and returns the same. The responsiblity of // freeing the cursor handle lies with the caller. // Returns NULL on error. HCURSOR GetCustomCursor() const; #endif - // Returns true if the passed in SkBitmap is the same as the the - // current SkBitmap. We use memcmp to compare the two bitmaps. - bool IsSameBitmap(const SkBitmap& bitmap) const; + +// TODO(port): Comparing CGImageRefs can be a heavyweight operation on the +// Mac. Don't do it if it's not needed. Maybe we can avoid this type of +// comparison on other platforms too. +#if !defined(OS_MACOSX) + // Returns true if the passed in WebCursorBitmap is the same as the the + // current WebCursorBitmap. We use memcmp to compare the two bitmaps. + bool IsSameBitmap(const WebCursorBitmap& bitmap) const; // Returns true if the current cursor object contains the same // cursor as the cursor object passed in. If the current cursor // is a custom cursor, we also compare the bitmaps to verify // whether they are equal. bool IsEqual(const WebCursor& other) const; - +#endif + protected: Type type_; int hotspot_x_; int hotspot_y_; - SkBitmap bitmap_; + WebCursorBitmap bitmap_; }; #endif // WEBCURSOR_H__ - diff --git a/webkit/glue/webkit_glue.h b/webkit/glue/webkit_glue.h index f44649b..71b1c68 100644 --- a/webkit/glue/webkit_glue.h +++ b/webkit/glue/webkit_glue.h @@ -5,11 +5,15 @@ #ifndef WEBKIT_GLUE_H__ #define WEBKIT_GLUE_H__ -#include <string> -#include <vector> -#ifdef _WIN32 +#include "base/basictypes.h" + +#if defined(OS_WIN) #include <windows.h> #endif + +#include <string> +#include <vector> + #include "base/string16.h" #include "webkit/glue/webplugin.h" @@ -38,6 +42,13 @@ class Frame; class SkBitmap; +#if defined(OS_MACOSX) +typedef struct CGImage* CGImageRef; +typedef CGImageRef GlueBitmap; +#else +typedef SkBitmap* GlueBitmap; +#endif + namespace webkit_glue { //----------------------------------------------------------------------------- @@ -171,9 +182,9 @@ std::wstring GetLocalizedString(int message_id); // specified as BINDATA in the relevant .rc file. std::string GetDataResource(int resource_id); -// Returns an SkBitmap for a resource. This resource must have been +// Returns a GlueBitmap for a resource. This resource must have been // specified as BINDATA in the relevant .rc file. -SkBitmap* GetBitmapResource(int resource_id); +GlueBitmap GetBitmapResource(int resource_id); #ifdef _WIN32 // Loads and returns a cursor. |