15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "content/common/cursors/webcursor.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include <X11/cursorfont.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <X11/Xcursor/Xcursor.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <X11/Xlib.h>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebCursorInfo.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/cursor/cursor.h"
142385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "ui/base/cursor/cursor_loader_x11.h"
15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/base/cursor/cursor_util.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/x/x11_util.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)namespace content {
1923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciui::PlatformCursor WebCursor::GetPlatformCursor() {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (platform_cursor_)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return platform_cursor_;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (custom_data_.size() == 0)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return 0;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkBitmap bitmap;
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bitmap.allocN32Pixels(custom_size_.width(), custom_size_.height());
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(bitmap.getAddr32(0, 0), custom_data_.data(), custom_data_.size());
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Point hotspot = hotspot_;
312385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  ui::ScaleAndRotateCursorBitmapAndHotpoint(
326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      device_scale_factor_, gfx::Display::ROTATE_0, &bitmap, &hotspot);
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  XcursorImage* image = ui::SkBitmapToXcursorImage(&bitmap, hotspot);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  platform_cursor_ = ui::CreateReffedCustomXCursor(image);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return platform_cursor_;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
392385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochvoid WebCursor::SetDisplayInfo(const gfx::Display& display) {
406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (device_scale_factor_ == display.device_scale_factor())
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
432385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  device_scale_factor_ = display.device_scale_factor();
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (platform_cursor_)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::UnrefCustomXCursor(platform_cursor_);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  platform_cursor_ = 0;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It is not necessary to recreate platform_cursor_ yet, since it will be
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // recreated on demand when GetPlatformCursor is called.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebCursor::InitPlatformData() {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  platform_cursor_ = 0;
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  device_scale_factor_ = 1.f;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebCursor::SerializePlatformData(Pickle* pickle) const {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebCursor::DeserializePlatformData(PickleIterator* iter) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebCursor::IsPlatformDataEqual(const WebCursor& other) const {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebCursor::CleanupPlatformData() {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (platform_cursor_) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::UnrefCustomXCursor(platform_cursor_);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    platform_cursor_ = 0;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebCursor::CopyPlatformData(const WebCursor& other) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (platform_cursor_)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::UnrefCustomXCursor(platform_cursor_);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  platform_cursor_ = other.platform_cursor_;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (platform_cursor_)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::RefCustomXCursor(platform_cursor_);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  device_scale_factor_ = other.device_scale_factor_;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
8523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}  // namespace content
86