diff options
-rw-r--r-- | ash/drag_drop/drag_drop_controller.cc | 2 | ||||
-rw-r--r-- | ui/aura/aura.gyp | 2 | ||||
-rw-r--r-- | ui/aura/root_window_host_linux.cc | 55 | ||||
-rw-r--r-- | ui/aura/root_window_host_linux.h | 3 | ||||
-rw-r--r-- | ui/base/x/x11_util.cc | 21 | ||||
-rw-r--r-- | ui/base/x/x11_util.h | 7 | ||||
-rw-r--r-- | ui/gfx/codec/png_codec.cc | 21 | ||||
-rw-r--r-- | ui/gfx/skia_util.cc | 25 | ||||
-rw-r--r-- | ui/gfx/skia_util.h | 7 | ||||
-rw-r--r-- | ui/resources/aura/left_ptr_copy.png | bin | 0 -> 761 bytes | |||
-rw-r--r-- | ui/resources/aura/left_ptr_copy_2x.png | bin | 0 -> 1552 bytes | |||
-rw-r--r-- | ui/resources/aura/left_ptr_nodrop.png | bin | 0 -> 829 bytes | |||
-rw-r--r-- | ui/resources/aura/left_ptr_nodrop_2x.png | bin | 0 -> 1582 bytes | |||
-rw-r--r-- | ui/resources/ui_resources_2x.grd | 2 | ||||
-rw-r--r-- | ui/resources/ui_resources_standard.grd | 2 | ||||
-rw-r--r-- | ui/resources/ui_resources_touch.grd | 2 | ||||
-rw-r--r-- | webkit/glue/webcursor_aurax11.cc | 35 |
17 files changed, 133 insertions, 51 deletions
diff --git a/ash/drag_drop/drag_drop_controller.cc b/ash/drag_drop/drag_drop_controller.cc index 8bc0b67..7a76eca 100644 --- a/ash/drag_drop/drag_drop_controller.cc +++ b/ash/drag_drop/drag_drop_controller.cc @@ -114,7 +114,7 @@ void DragDropController::DragUpdate(aura::Window* target, drag_operation_); int op = delegate->OnDragUpdated(e); gfx::NativeCursor cursor = (op == ui::DragDropTypes::DRAG_NONE)? - ui::kCursorMove : ui::kCursorHand; + ui::kCursorNoDrop : ui::kCursorCopy; Shell::GetRootWindow()->SetCursor(cursor); } } diff --git a/ui/aura/aura.gyp b/ui/aura/aura.gyp index f168d06..d3cc00b 100644 --- a/ui/aura/aura.gyp +++ b/ui/aura/aura.gyp @@ -19,6 +19,8 @@ '../ui.gyp:gfx_resources', '../ui.gyp:ui', '../ui.gyp:ui_resources', + '../ui.gyp:ui_resources_2x', + '../ui.gyp:ui_resources_standard', ], 'defines': [ 'AURA_IMPLEMENTATION', diff --git a/ui/aura/root_window_host_linux.cc b/ui/aura/root_window_host_linux.cc index 51d1013..f69b914 100644 --- a/ui/aura/root_window_host_linux.cc +++ b/ui/aura/root_window_host_linux.cc @@ -5,6 +5,7 @@ #include "ui/aura/root_window_host_linux.h" #include <X11/Xatom.h> +#include <X11/Xcursor/Xcursor.h> #include <X11/cursorfont.h> #include <X11/extensions/XInput2.h> #include <X11/extensions/Xfixes.h> @@ -14,6 +15,8 @@ #include "base/message_pump_x.h" #include "base/stl_util.h" #include "base/stringprintf.h" +#include "grit/ui_resources_standard.h" +#include "third_party/skia/include/core/SkBitmap.h" #include "ui/aura/client/user_gesture_client.h" #include "ui/aura/dispatcher_linux.h" #include "ui/aura/env.h" @@ -21,10 +24,12 @@ #include "ui/aura/root_window.h" #include "ui/base/cursor/cursor.h" #include "ui/base/keycodes/keyboard_codes.h" +#include "ui/base/resource/resource_bundle.h" #include "ui/base/touch/touch_factory.h" #include "ui/base/x/x11_util.h" #include "ui/base/view_prop.h" #include "ui/gfx/compositor/layer.h" +#include "ui/gfx/image/image.h" using std::max; using std::min; @@ -292,6 +297,51 @@ const char* kAtomList[] = { } // namespace +// A utility class that provides X Cursor for NativeCursors for which we have +// image resources. +class RootWindowHostLinux::ImageCursors { + public: + ImageCursors() { + LoadImageCursor(ui::kCursorNoDrop, IDR_AURA_CURSOR_NO_DROP); + LoadImageCursor(ui::kCursorCopy, IDR_AURA_CURSOR_COPY); + // TODO (varunjain): add more cursors once we have assets. + } + + ~ImageCursors() { + std::map<int, Cursor>::const_iterator it; + for (it = cursors_.begin(); it != cursors_.end(); ++it) + ui::UnrefCustomXCursor(it->second); + } + + // Returns true if we have an image resource loaded for the |native_cursor|. + bool IsImageCursor(gfx::NativeCursor native_cursor) { + return cursors_.find(native_cursor.native_type()) != cursors_.end(); + } + + // Gets the X Cursor corresponding to the |native_cursor|. + ::Cursor ImageCursorFromNative(gfx::NativeCursor native_cursor) { + DCHECK(cursors_.find(native_cursor.native_type()) != cursors_.end()); + return cursors_[native_cursor.native_type()]; + } + + private: + // Creates an X Cursor from an image resource and puts it in the cursor map. + void LoadImageCursor(int id, int resource_id) { + const SkBitmap* bitmap = + ui::ResourceBundle::GetSharedInstance().GetImageNamed( + resource_id).ToSkBitmap(); + + XcursorImage* image = ui::SkBitmapToXcursorImage(bitmap, gfx::Point(0, 0)); + cursors_[id] = ui::CreateReffedCustomXCursor(image); + // |bitmap| is owned by the resource bundle. So we do not need to free it. + } + + // A map to hold all image cursors. It maps the cursor ID to the X Cursor. + std::map<int, Cursor> cursors_; + + DISALLOW_COPY_AND_ASSIGN(ImageCursors); +}; + RootWindowHostLinux::RootWindowHostLinux(const gfx::Rect& bounds) : root_window_(NULL), xdisplay_(base::MessagePumpX::GetDefaultXDisplay()), @@ -301,7 +351,8 @@ RootWindowHostLinux::RootWindowHostLinux(const gfx::Rect& bounds) cursor_shown_(true), bounds_(bounds), focus_when_shown_(false), - pointer_barriers_(NULL) { + pointer_barriers_(NULL), + image_cursors_(new ImageCursors) { XSetWindowAttributes swa; memset(&swa, 0, sizeof(swa)); swa.background_pixmap = None; @@ -795,6 +846,8 @@ bool RootWindowHostLinux::IsWindowManagerPresent() { void RootWindowHostLinux::SetCursorInternal(gfx::NativeCursor cursor) { ::Cursor xcursor = + image_cursors_->IsImageCursor(cursor) ? + image_cursors_->ImageCursorFromNative(cursor) : cursor == ui::kCursorNone ? invisible_cursor_ : cursor == ui::kCursorCustom ? diff --git a/ui/aura/root_window_host_linux.h b/ui/aura/root_window_host_linux.h index ae435e9..34484e4 100644 --- a/ui/aura/root_window_host_linux.h +++ b/ui/aura/root_window_host_linux.h @@ -101,6 +101,9 @@ class RootWindowHostLinux : public RootWindowHost, scoped_ptr<ui::ViewProp> prop_; + class ImageCursors; + scoped_ptr<ImageCursors> image_cursors_; + DISALLOW_COPY_AND_ASSIGN(RootWindowHostLinux); }; diff --git a/ui/base/x/x11_util.cc b/ui/base/x/x11_util.cc index 5df42c0..a7b1bc3 100644 --- a/ui/base/x/x11_util.cc +++ b/ui/base/x/x11_util.cc @@ -37,6 +37,8 @@ #if defined(USE_AURA) #include <X11/Xcursor/Xcursor.h> +#include "third_party/skia/include/core/SkBitmap.h" +#include "ui/gfx/skia_util.h" #endif #if defined(TOOLKIT_GTK) @@ -411,6 +413,25 @@ void RefCustomXCursor(::Cursor cursor) { void UnrefCustomXCursor(::Cursor cursor) { XCustomCursorCache::GetInstance()->Unref(cursor); } + +XcursorImage* SkBitmapToXcursorImage(const SkBitmap* bitmap, + const gfx::Point& hotspot) { + DCHECK(bitmap->config() == SkBitmap::kARGB_8888_Config); + XcursorImage* image = XcursorImageCreate(bitmap->width(), bitmap->height()); + image->xhot = hotspot.x(); + image->yhot = hotspot.y(); + + if (bitmap->width() && bitmap->height()) { + bitmap->lockPixels(); + gfx::ConvertSkiaToRGBA( + static_cast<const unsigned char*>(bitmap->getPixels()), + bitmap->width() * bitmap->height(), + reinterpret_cast<unsigned char*>(image->pixels)); + bitmap->unlockPixels(); + } + + return image; +} #endif XID GetX11RootWindow() { diff --git a/ui/base/x/x11_util.h b/ui/base/x/x11_util.h index 771e8ef..bf89c3b 100644 --- a/ui/base/x/x11_util.h +++ b/ui/base/x/x11_util.h @@ -18,6 +18,7 @@ #include "base/basictypes.h" #include "ui/base/events.h" #include "ui/base/ui_export.h" +#include "ui/gfx/point.h" typedef unsigned long Atom; typedef unsigned long XID; @@ -35,6 +36,7 @@ typedef struct _GtkWindow GtkWindow; namespace gfx { class Rect; } +class SkBitmap; namespace ui { @@ -89,6 +91,11 @@ UI_EXPORT void RefCustomXCursor(::Cursor cursor); // Decreases the refcount of the custom cursor, and destroys it if it reaches 0. UI_EXPORT void UnrefCustomXCursor(::Cursor cursor); + +// Creates a XcursorImage and copies the SkBitmap |bitmap| on it. |bitmap| +// should be non-null. Caller owns the returned object. +UI_EXPORT XcursorImage* SkBitmapToXcursorImage(const SkBitmap* bitmap, + const gfx::Point& hotspot); #endif // These functions do not cache their results -------------------------- diff --git a/ui/gfx/codec/png_codec.cc b/ui/gfx/codec/png_codec.cc index 1ca139d..da73928 100644 --- a/ui/gfx/codec/png_codec.cc +++ b/ui/gfx/codec/png_codec.cc @@ -8,6 +8,7 @@ #include "base/memory/scoped_ptr.h" #include "base/string_util.h" #include "ui/gfx/size.h" +#include "ui/gfx/skia_util.h" #include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkUnPreMultiply.h" #include "third_party/skia/include/core/SkColorPriv.h" @@ -76,25 +77,7 @@ void ConvertSkiatoRGB(const unsigned char* skia, int pixel_width, void ConvertSkiatoRGBA(const unsigned char* skia, int pixel_width, unsigned char* rgba, bool* is_opaque) { - int total_length = pixel_width * 4; - for (int i = 0; i < total_length; i += 4) { - const uint32_t pixel_in = *reinterpret_cast<const uint32_t*>(&skia[i]); - - // Pack the components here. - int alpha = SkGetPackedA32(pixel_in); - if (alpha != 0 && alpha != 255) { - SkColor unmultiplied = SkUnPreMultiply::PMColorToColor(pixel_in); - rgba[i + 0] = SkColorGetR(unmultiplied); - rgba[i + 1] = SkColorGetG(unmultiplied); - rgba[i + 2] = SkColorGetB(unmultiplied); - rgba[i + 3] = alpha; - } else { - rgba[i + 0] = SkGetPackedR32(pixel_in); - rgba[i + 1] = SkGetPackedG32(pixel_in); - rgba[i + 2] = SkGetPackedB32(pixel_in); - rgba[i + 3] = alpha; - } - } + gfx::ConvertSkiaToRGBA(skia, pixel_width, rgba); } } // namespace diff --git a/ui/gfx/skia_util.cc b/ui/gfx/skia_util.cc index bfee378..a459cdd 100644 --- a/ui/gfx/skia_util.cc +++ b/ui/gfx/skia_util.cc @@ -8,6 +8,7 @@ #include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkColorPriv.h" #include "third_party/skia/include/core/SkShader.h" +#include "third_party/skia/include/core/SkUnPreMultiply.h" #include "third_party/skia/include/effects/SkGradientShader.h" #include "ui/gfx/rect.h" @@ -101,4 +102,28 @@ string16 RemoveAcceleratorChar(const string16& s, return accelerator_removed; } +void ConvertSkiaToRGBA(const unsigned char* skia, + int pixel_width, + unsigned char* rgba) { + int total_length = pixel_width * 4; + for (int i = 0; i < total_length; i += 4) { + const uint32_t pixel_in = *reinterpret_cast<const uint32_t*>(&skia[i]); + + // Pack the components here. + int alpha = SkGetPackedA32(pixel_in); + if (alpha != 0 && alpha != 255) { + SkColor unmultiplied = SkUnPreMultiply::PMColorToColor(pixel_in); + rgba[i + 0] = SkColorGetR(unmultiplied); + rgba[i + 1] = SkColorGetG(unmultiplied); + rgba[i + 2] = SkColorGetB(unmultiplied); + rgba[i + 3] = alpha; + } else { + rgba[i + 0] = SkGetPackedR32(pixel_in); + rgba[i + 1] = SkGetPackedG32(pixel_in); + rgba[i + 2] = SkGetPackedB32(pixel_in); + rgba[i + 3] = alpha; + } + } +} + } // namespace gfx diff --git a/ui/gfx/skia_util.h b/ui/gfx/skia_util.h index de7b8f4..152b731 100644 --- a/ui/gfx/skia_util.h +++ b/ui/gfx/skia_util.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 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. @@ -50,6 +50,11 @@ UI_EXPORT string16 RemoveAcceleratorChar(const string16& s, int* accelerated_char_pos, int* accelerated_char_span); +// Converts Skia ARGB format pixels in |skia| to RGBA. +UI_EXPORT void ConvertSkiaToRGBA(const unsigned char* skia, + int pixel_width, + unsigned char* rgba); + } // namespace gfx #endif // UI_GFX_SKIA_UTIL_H_ diff --git a/ui/resources/aura/left_ptr_copy.png b/ui/resources/aura/left_ptr_copy.png Binary files differnew file mode 100644 index 0000000..c3af464 --- /dev/null +++ b/ui/resources/aura/left_ptr_copy.png diff --git a/ui/resources/aura/left_ptr_copy_2x.png b/ui/resources/aura/left_ptr_copy_2x.png Binary files differnew file mode 100644 index 0000000..7591cdb --- /dev/null +++ b/ui/resources/aura/left_ptr_copy_2x.png diff --git a/ui/resources/aura/left_ptr_nodrop.png b/ui/resources/aura/left_ptr_nodrop.png Binary files differnew file mode 100644 index 0000000..cf99adb --- /dev/null +++ b/ui/resources/aura/left_ptr_nodrop.png diff --git a/ui/resources/aura/left_ptr_nodrop_2x.png b/ui/resources/aura/left_ptr_nodrop_2x.png Binary files differnew file mode 100644 index 0000000..294680d --- /dev/null +++ b/ui/resources/aura/left_ptr_nodrop_2x.png diff --git a/ui/resources/ui_resources_2x.grd b/ui/resources/ui_resources_2x.grd index fc13cd6..f5674d8 100644 --- a/ui/resources/ui_resources_2x.grd +++ b/ui/resources/ui_resources_2x.grd @@ -78,6 +78,8 @@ <include name="IDR_AURA_WINDOW_SNAP_MINIMIZE_P" file="aura/window_snap_minimize_p.png" type="BINDATA" /> <include name="IDR_AURA_WINDOW_SNAP_P" file="aura/window_snap_p.png" type="BINDATA" /> <include name="IDR_AURA_WINDOW_SNAP_RIGHT_P" file="aura/window_snap_right_p.png" type="BINDATA" /> + <include name="IDR_AURA_CURSOR_NO_DROP" file="aura/left_ptr_nodrop_2x.png" type="BINDATA" /> + <include name="IDR_AURA_CURSOR_COPY" file="aura/left_ptr_copy_2x.png" type="BINDATA" /> </if> </includes> </release> diff --git a/ui/resources/ui_resources_standard.grd b/ui/resources/ui_resources_standard.grd index 926779e..d63dc98 100644 --- a/ui/resources/ui_resources_standard.grd +++ b/ui/resources/ui_resources_standard.grd @@ -75,6 +75,8 @@ <include name="IDR_AURA_WINDOW_SNAP_MINIMIZE_P" file="aura/window_snap_minimize_p.png" type="BINDATA" /> <include name="IDR_AURA_WINDOW_SNAP_P" file="aura/window_snap_p.png" type="BINDATA" /> <include name="IDR_AURA_WINDOW_SNAP_RIGHT_P" file="aura/window_snap_right_p.png" type="BINDATA" /> + <include name="IDR_AURA_CURSOR_NO_DROP" file="aura/left_ptr_nodrop.png" type="BINDATA" /> + <include name="IDR_AURA_CURSOR_COPY" file="aura/left_ptr_copy.png" type="BINDATA" /> </if> </includes> </release> diff --git a/ui/resources/ui_resources_touch.grd b/ui/resources/ui_resources_touch.grd index 59eb2a2c..a21b0ce 100644 --- a/ui/resources/ui_resources_touch.grd +++ b/ui/resources/ui_resources_touch.grd @@ -75,6 +75,8 @@ <include name="IDR_AURA_WINDOW_SNAP_MINIMIZE_P" file="aura/window_snap_minimize_touch_p.png" type="BINDATA" /> <include name="IDR_AURA_WINDOW_SNAP_P" file="aura/window_snap_touch_p.png" type="BINDATA" /> <include name="IDR_AURA_WINDOW_SNAP_RIGHT_P" file="aura/window_snap_right_touch_p.png" type="BINDATA" /> + <include name="IDR_AURA_CURSOR_NO_DROP" file="aura/left_ptr_nodrop.png" type="BINDATA" /> + <include name="IDR_AURA_CURSOR_COPY" file="aura/left_ptr_copy.png" type="BINDATA" /> </if> </includes> </release> diff --git a/webkit/glue/webcursor_aurax11.cc b/webkit/glue/webcursor_aurax11.cc index fe221e2..b3f6989 100644 --- a/webkit/glue/webcursor_aurax11.cc +++ b/webkit/glue/webcursor_aurax11.cc @@ -10,7 +10,6 @@ #include "base/logging.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebCursorInfo.h" -#include "third_party/skia/include/core/SkUnPreMultiply.h" #include "ui/base/cursor/cursor.h" #include "ui/base/x/x11_util.h" @@ -18,35 +17,13 @@ const ui::PlatformCursor WebCursor::GetPlatformCursor() { if (platform_cursor_) return platform_cursor_; - XcursorImage* image = - XcursorImageCreate(custom_size_.width(), custom_size_.height()); - image->xhot = hotspot_.x(); - image->yhot = hotspot_.y(); - uint32* pixels = image->pixels; - - if (custom_size_.width() && custom_size_.height()) { - SkBitmap bitmap; - bitmap.setConfig(SkBitmap::kARGB_8888_Config, - custom_size_.width(), custom_size_.height()); - bitmap.allocPixels(); - memcpy(bitmap.getAddr32(0, 0), custom_data_.data(), custom_data_.size()); - - bitmap.lockPixels(); - int height = bitmap.height(), width = bitmap.width(); - for (int y = 0, i = 0; y < height; y++) { - for (int x = 0; x < width; x++) { - uint32 pixel = bitmap.getAddr32(0, y)[x]; - int alpha = SkColorGetA(pixel); - if (alpha != 0 && alpha != 255) - pixels[i] = SkUnPreMultiply::PMColorToColor(pixel); - else - pixels[i] = pixel; - ++i; - } - } - bitmap.unlockPixels(); - } + SkBitmap bitmap; + bitmap.setConfig(SkBitmap::kARGB_8888_Config, + custom_size_.width(), custom_size_.height()); + bitmap.allocPixels(); + memcpy(bitmap.getAddr32(0, 0), custom_data_.data(), custom_data_.size()); + XcursorImage* image = ui::SkBitmapToXcursorImage(&bitmap, hotspot_); platform_cursor_ = ui::CreateReffedCustomXCursor(image); return platform_cursor_; } |