summaryrefslogtreecommitdiffstats
path: root/webkit/glue
diff options
context:
space:
mode:
Diffstat (limited to 'webkit/glue')
-rw-r--r--webkit/glue/webcursor.cc34
-rw-r--r--webkit/glue/webcursor.h53
-rw-r--r--webkit/glue/webkit_glue.h21
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.