// Copyright 2017 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.

#include "ui/base/mojo/cursor_struct_traits.h"

#include "skia/public/interfaces/bitmap_skbitmap_struct_traits.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/base/mojo/cursor.mojom.h"
#include "ui/gfx/geometry/mojo/geometry_struct_traits.h"

namespace mojo {

// static
ui::mojom::CursorType
EnumTraits<ui::mojom::CursorType, ui::CursorType>::ToMojom(
    ui::CursorType input) {
  switch (input) {
    case ui::CursorType::kNull:
      return ui::mojom::CursorType::kNull;
    case ui::CursorType::kPointer:
      return ui::mojom::CursorType::kPointer;
    case ui::CursorType::kCross:
      return ui::mojom::CursorType::kCross;
    case ui::CursorType::kHand:
      return ui::mojom::CursorType::kHand;
    case ui::CursorType::kIBeam:
      return ui::mojom::CursorType::kIBeam;
    case ui::CursorType::kWait:
      return ui::mojom::CursorType::kWait;
    case ui::CursorType::kHelp:
      return ui::mojom::CursorType::kHelp;
    case ui::CursorType::kEastResize:
      return ui::mojom::CursorType::kEastResize;
    case ui::CursorType::kNorthResize:
      return ui::mojom::CursorType::kNorthResize;
    case ui::CursorType::kNorthEastResize:
      return ui::mojom::CursorType::kNorthEastResize;
    case ui::CursorType::kNorthWestResize:
      return ui::mojom::CursorType::kNorthWestResize;
    case ui::CursorType::kSouthResize:
      return ui::mojom::CursorType::kSouthResize;
    case ui::CursorType::kSouthEastResize:
      return ui::mojom::CursorType::kSouthEastResize;
    case ui::CursorType::kSouthWestResize:
      return ui::mojom::CursorType::kSouthWestResize;
    case ui::CursorType::kWestResize:
      return ui::mojom::CursorType::kWestResize;
    case ui::CursorType::kNorthSouthResize:
      return ui::mojom::CursorType::kNorthSouthResize;
    case ui::CursorType::kEastWestResize:
      return ui::mojom::CursorType::kEastWestResize;
    case ui::CursorType::kNorthEastSouthWestResize:
      return ui::mojom::CursorType::kNorthEastSouthWestResize;
    case ui::CursorType::kNorthWestSouthEastResize:
      return ui::mojom::CursorType::kNorthWestSouthEastResize;
    case ui::CursorType::kColumnResize:
      return ui::mojom::CursorType::kColumnResize;
    case ui::CursorType::kRowResize:
      return ui::mojom::CursorType::kRowResize;
    case ui::CursorType::kMiddlePanning:
      return ui::mojom::CursorType::kMiddlePanning;
    case ui::CursorType::kEastPanning:
      return ui::mojom::CursorType::kEastPanning;
    case ui::CursorType::kNorthPanning:
      return ui::mojom::CursorType::kNorthPanning;
    case ui::CursorType::kNorthEastPanning:
      return ui::mojom::CursorType::kNorthEastPanning;
    case ui::CursorType::kNorthWestPanning:
      return ui::mojom::CursorType::kNorthWestPanning;
    case ui::CursorType::kSouthPanning:
      return ui::mojom::CursorType::kSouthPanning;
    case ui::CursorType::kSouthEastPanning:
      return ui::mojom::CursorType::kSouthEastPanning;
    case ui::CursorType::kSouthWestPanning:
      return ui::mojom::CursorType::kSouthWestPanning;
    case ui::CursorType::kWestPanning:
      return ui::mojom::CursorType::kWestPanning;
    case ui::CursorType::kMove:
      return ui::mojom::CursorType::kMove;
    case ui::CursorType::kVerticalText:
      return ui::mojom::CursorType::kVerticalText;
    case ui::CursorType::kCell:
      return ui::mojom::CursorType::kCell;
    case ui::CursorType::kContextMenu:
      return ui::mojom::CursorType::kContextMenu;
    case ui::CursorType::kAlias:
      return ui::mojom::CursorType::kAlias;
    case ui::CursorType::kProgress:
      return ui::mojom::CursorType::kProgress;
    case ui::CursorType::kNoDrop:
      return ui::mojom::CursorType::kNoDrop;
    case ui::CursorType::kCopy:
      return ui::mojom::CursorType::kCopy;
    case ui::CursorType::kNone:
      return ui::mojom::CursorType::kNone;
    case ui::CursorType::kNotAllowed:
      return ui::mojom::CursorType::kNotAllowed;
    case ui::CursorType::kZoomIn:
      return ui::mojom::CursorType::kZoomIn;
    case ui::CursorType::kZoomOut:
      return ui::mojom::CursorType::kZoomOut;
    case ui::CursorType::kGrab:
      return ui::mojom::CursorType::kGrab;
    case ui::CursorType::kGrabbing:
      return ui::mojom::CursorType::kGrabbing;
    case ui::CursorType::kCustom:
      return ui::mojom::CursorType::kCustom;
    case ui::CursorType::kDndNone:
    case ui::CursorType::kDndMove:
    case ui::CursorType::kDndCopy:
    case ui::CursorType::kDndLink:
      // The mojom version is the same as the restricted Webcursor constants;
      // don't allow system cursors to be transmitted.
      NOTREACHED();
      return ui::mojom::CursorType::kNull;
  }
  NOTREACHED();
  return ui::mojom::CursorType::kNull;
}

// static
bool EnumTraits<ui::mojom::CursorType, ui::CursorType>::FromMojom(
    ui::mojom::CursorType input,
    ui::CursorType* out) {
  switch (input) {
    case ui::mojom::CursorType::kNull:
      *out = ui::CursorType::kNull;
      return true;
    case ui::mojom::CursorType::kPointer:
      *out = ui::CursorType::kPointer;
      return true;
    case ui::mojom::CursorType::kCross:
      *out = ui::CursorType::kCross;
      return true;
    case ui::mojom::CursorType::kHand:
      *out = ui::CursorType::kHand;
      return true;
    case ui::mojom::CursorType::kIBeam:
      *out = ui::CursorType::kIBeam;
      return true;
    case ui::mojom::CursorType::kWait:
      *out = ui::CursorType::kWait;
      return true;
    case ui::mojom::CursorType::kHelp:
      *out = ui::CursorType::kHelp;
      return true;
    case ui::mojom::CursorType::kEastResize:
      *out = ui::CursorType::kEastResize;
      return true;
    case ui::mojom::CursorType::kNorthResize:
      *out = ui::CursorType::kNorthResize;
      return true;
    case ui::mojom::CursorType::kNorthEastResize:
      *out = ui::CursorType::kNorthEastResize;
      return true;
    case ui::mojom::CursorType::kNorthWestResize:
      *out = ui::CursorType::kNorthWestResize;
      return true;
    case ui::mojom::CursorType::kSouthResize:
      *out = ui::CursorType::kSouthResize;
      return true;
    case ui::mojom::CursorType::kSouthEastResize:
      *out = ui::CursorType::kSouthEastResize;
      return true;
    case ui::mojom::CursorType::kSouthWestResize:
      *out = ui::CursorType::kSouthWestResize;
      return true;
    case ui::mojom::CursorType::kWestResize:
      *out = ui::CursorType::kWestResize;
      return true;
    case ui::mojom::CursorType::kNorthSouthResize:
      *out = ui::CursorType::kNorthSouthResize;
      return true;
    case ui::mojom::CursorType::kEastWestResize:
      *out = ui::CursorType::kEastWestResize;
      return true;
    case ui::mojom::CursorType::kNorthEastSouthWestResize:
      *out = ui::CursorType::kNorthEastSouthWestResize;
      return true;
    case ui::mojom::CursorType::kNorthWestSouthEastResize:
      *out = ui::CursorType::kNorthWestSouthEastResize;
      return true;
    case ui::mojom::CursorType::kColumnResize:
      *out = ui::CursorType::kColumnResize;
      return true;
    case ui::mojom::CursorType::kRowResize:
      *out = ui::CursorType::kRowResize;
      return true;
    case ui::mojom::CursorType::kMiddlePanning:
      *out = ui::CursorType::kMiddlePanning;
      return true;
    case ui::mojom::CursorType::kEastPanning:
      *out = ui::CursorType::kEastPanning;
      return true;
    case ui::mojom::CursorType::kNorthPanning:
      *out = ui::CursorType::kNorthPanning;
      return true;
    case ui::mojom::CursorType::kNorthEastPanning:
      *out = ui::CursorType::kNorthEastPanning;
      return true;
    case ui::mojom::CursorType::kNorthWestPanning:
      *out = ui::CursorType::kNorthWestPanning;
      return true;
    case ui::mojom::CursorType::kSouthPanning:
      *out = ui::CursorType::kSouthPanning;
      return true;
    case ui::mojom::CursorType::kSouthEastPanning:
      *out = ui::CursorType::kSouthEastPanning;
      return true;
    case ui::mojom::CursorType::kSouthWestPanning:
      *out = ui::CursorType::kSouthWestPanning;
      return true;
    case ui::mojom::CursorType::kWestPanning:
      *out = ui::CursorType::kWestPanning;
      return true;
    case ui::mojom::CursorType::kMove:
      *out = ui::CursorType::kMove;
      return true;
    case ui::mojom::CursorType::kVerticalText:
      *out = ui::CursorType::kVerticalText;
      return true;
    case ui::mojom::CursorType::kCell:
      *out = ui::CursorType::kCell;
      return true;
    case ui::mojom::CursorType::kContextMenu:
      *out = ui::CursorType::kContextMenu;
      return true;
    case ui::mojom::CursorType::kAlias:
      *out = ui::CursorType::kAlias;
      return true;
    case ui::mojom::CursorType::kProgress:
      *out = ui::CursorType::kProgress;
      return true;
    case ui::mojom::CursorType::kNoDrop:
      *out = ui::CursorType::kNoDrop;
      return true;
    case ui::mojom::CursorType::kCopy:
      *out = ui::CursorType::kCopy;
      return true;
    case ui::mojom::CursorType::kNone:
      *out = ui::CursorType::kNone;
      return true;
    case ui::mojom::CursorType::kNotAllowed:
      *out = ui::CursorType::kNotAllowed;
      return true;
    case ui::mojom::CursorType::kZoomIn:
      *out = ui::CursorType::kZoomIn;
      return true;
    case ui::mojom::CursorType::kZoomOut:
      *out = ui::CursorType::kZoomOut;
      return true;
    case ui::mojom::CursorType::kGrab:
      *out = ui::CursorType::kGrab;
      return true;
    case ui::mojom::CursorType::kGrabbing:
      *out = ui::CursorType::kGrabbing;
      return true;
    case ui::mojom::CursorType::kCustom:
      *out = ui::CursorType::kCustom;
      return true;
  }

  NOTREACHED();
  return false;
}

// static
ui::mojom::CursorSize
EnumTraits<ui::mojom::CursorSize, ui::CursorSize>::ToMojom(
    ui::CursorSize input) {
  switch (input) {
    case ui::CursorSize::kNormal:
      return ui::mojom::CursorSize::kNormal;
    case ui::CursorSize::kLarge:
      return ui::mojom::CursorSize::kLarge;
  }

  NOTREACHED();
  return ui::mojom::CursorSize::kNormal;
}

// static
bool EnumTraits<ui::mojom::CursorSize, ui::CursorSize>::FromMojom(
    ui::mojom::CursorSize input,
    ui::CursorSize* out) {
  switch (input) {
    case ui::mojom::CursorSize::kNormal:
      *out = ui::CursorSize::kNormal;
      return true;
    case ui::mojom::CursorSize::kLarge:
      *out = ui::CursorSize::kLarge;
      return true;
  }

  NOTREACHED();
  return false;
}

// static
gfx::Point StructTraits<ui::mojom::CursorDataView, ui::Cursor>::hotspot(
    const ui::Cursor& c) {
  return c.GetHotspot();
}

// static
SkBitmap StructTraits<ui::mojom::CursorDataView, ui::Cursor>::bitmap(
    const ui::Cursor& c) {
  return c.GetBitmap();
}

// static
bool StructTraits<ui::mojom::CursorDataView, ui::Cursor>::Read(
    ui::mojom::CursorDataView data,
    ui::Cursor* out) {
  ui::CursorType type;
  if (!data.ReadNativeType(&type))
    return false;

  if (type != ui::CursorType::kCustom) {
    *out = ui::Cursor(type);
    return true;
  }

  gfx::Point hotspot;
  SkBitmap bitmap;

  if (!data.ReadHotspot(&hotspot) || !data.ReadBitmap(&bitmap))
    return false;

  // Clamp the scale factor to a reasonable value. TODO(estade): do we even need
  // this field? It doesn't appear to be used anywhere and is a property of the
  // display, not the cursor.
  float device_scale_factor = data.device_scale_factor();
  if (device_scale_factor < 1.f || device_scale_factor > 3.f)
    return false;

  *out = ui::Cursor(type);
  out->set_custom_bitmap(bitmap);
  out->set_custom_hotspot(hotspot);
  out->set_device_scale_factor(device_scale_factor);
  return true;
}

}  // namespace mojo
