| Index: components/exo/pointer.cc
|
| diff --git a/components/exo/pointer.cc b/components/exo/pointer.cc
|
| index f739bb32b1c4bd6986f5dcfeca253fa215f35518..ef486a26c4e603171f8c7f6f613ee4543712c327 100644
|
| --- a/components/exo/pointer.cc
|
| +++ b/components/exo/pointer.cc
|
| @@ -6,13 +6,51 @@
|
|
|
| #include "ash/shell.h"
|
| #include "ash/shell_window_ids.h"
|
| +#include "components/exo/buffer.h"
|
| #include "components/exo/pointer_delegate.h"
|
| #include "components/exo/surface.h"
|
| +#include "gpu/command_buffer/client/gpu_memory_buffer_manager.h"
|
| +#include "third_party/skia/include/core/SkBitmap.h"
|
| +#include "ui/aura/env.h"
|
| #include "ui/aura/window.h"
|
| +#include "ui/base/cursor/cursors_aura.h"
|
| +#include "ui/compositor/compositor.h"
|
| #include "ui/events/event.h"
|
| #include "ui/views/widget/widget.h"
|
|
|
| namespace exo {
|
| +namespace {
|
| +
|
| +scoped_ptr<Buffer> CreateDefaultCursor(gfx::Point* hotspot) {
|
| + ui::Cursor cursor(ui::kCursorPointer);
|
| + cursor.set_device_scale_factor(1.0f);
|
| +
|
| + SkBitmap bitmap;
|
| + if (!ui::GetCursorBitmap(cursor, &bitmap, hotspot)) {
|
| + LOG(ERROR) << "Failed to load default cursor bitmap";
|
| + return nullptr;
|
| + }
|
| +
|
| + DCHECK_EQ(bitmap.colorType(), kBGRA_8888_SkColorType);
|
| + scoped_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer =
|
| + aura::Env::GetInstance()
|
| + ->context_factory()
|
| + ->GetGpuMemoryBufferManager()
|
| + ->AllocateGpuMemoryBuffer(gfx::SkISizeToSize(bitmap.dimensions()),
|
| + gfx::BufferFormat::BGRA_8888,
|
| + gfx::BufferUsage::GPU_READ_CPU_READ_WRITE);
|
| + bool rv = gpu_memory_buffer->Map();
|
| + DCHECK(rv);
|
| + int stride = gpu_memory_buffer->stride(0 /* plane */);
|
| + DCHECK_GT(stride, 0);
|
| + bitmap.copyPixelsTo(gpu_memory_buffer->memory(0 /* plane */),
|
| + stride * bitmap.height(), stride);
|
| + gpu_memory_buffer->Unmap();
|
| +
|
| + return make_scoped_ptr(new Buffer(std::move(gpu_memory_buffer)));
|
| +}
|
| +
|
| +} // namespace
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // Pointer, public:
|
| @@ -140,8 +178,21 @@ void Pointer::OnMouseEvent(ui::MouseEvent* event) {
|
|
|
| // Update cursor widget to reflect current focus and pointer location.
|
| if (focus_) {
|
| - if (!widget_)
|
| + if (!widget_) {
|
| CreatePointerWidget();
|
| +
|
| + // Create default pointer surface. This will be used until a different
|
| + // pointer surface is set using SetCursor().
|
| + default_cursor_ = CreateDefaultCursor(&hotspot_);
|
| + default_surface_.reset(new Surface);
|
| + surface_ = default_surface_.get();
|
| + surface_->SetSurfaceDelegate(this);
|
| + surface_->AddSurfaceObserver(this);
|
| + widget_->GetNativeWindow()->AddChild(surface_);
|
| + surface_->Attach(default_cursor_.get());
|
| + surface_->Commit();
|
| + surface_->Show();
|
| + }
|
| widget_->SetBounds(gfx::Rect(
|
| focus_->GetBoundsInScreen().origin() + location_.OffsetFromOrigin(),
|
| gfx::Size(1, 1)));
|
|
|