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

#ifndef UI_GFX_VECTOR_ICON_TYPES_H_
#define UI_GFX_VECTOR_ICON_TYPES_H_

#include "base/macros.h"
#include "third_party/skia/include/core/SkScalar.h"
#include "ui/gfx/animation/tween.h"

namespace gfx {

// This macro allows defining the list of commands in this file, then pulling
// them each in to the template files via using-declarations.  Files which want
// to do this should do the following:
//   #define DECLARE_VECTOR_COMMAND(x) using gfx::x;
//   DECLARE_VECTOR_COMMANDS
// The alternative would be to have the template files pull in the whole gfx
// namespace via using-directives, which is banned by the style guide.
#define DECLARE_VECTOR_COMMANDS                                                \
  /* A new <path> element. For the first path, this is assumed. */             \
  DECLARE_VECTOR_COMMAND(NEW_PATH)                                             \
  /* Sets the alpha for the current path. */                                   \
  DECLARE_VECTOR_COMMAND(PATH_COLOR_ALPHA)                                     \
  /* Sets the color for the current path. */                                   \
  DECLARE_VECTOR_COMMAND(PATH_COLOR_ARGB)                                      \
  /* Sets the path to clear mode (Skia's kClear_Mode). */                      \
  DECLARE_VECTOR_COMMAND(PATH_MODE_CLEAR)                                      \
  /* By default, the path will be filled. This changes the paint action to */  \
  /* stroke at the given width. */                                             \
  DECLARE_VECTOR_COMMAND(STROKE)                                               \
  /* By default, a stroke has a round cap. This sets it to square. */          \
  DECLARE_VECTOR_COMMAND(CAP_SQUARE)                                           \
  /* These correspond to pathing commands. */                                  \
  DECLARE_VECTOR_COMMAND(MOVE_TO)                                              \
  DECLARE_VECTOR_COMMAND(R_MOVE_TO)                                            \
  DECLARE_VECTOR_COMMAND(ARC_TO)                                               \
  DECLARE_VECTOR_COMMAND(R_ARC_TO)                                             \
  DECLARE_VECTOR_COMMAND(LINE_TO)                                              \
  DECLARE_VECTOR_COMMAND(R_LINE_TO)                                            \
  DECLARE_VECTOR_COMMAND(H_LINE_TO)                                            \
  DECLARE_VECTOR_COMMAND(R_H_LINE_TO)                                          \
  DECLARE_VECTOR_COMMAND(V_LINE_TO)                                            \
  DECLARE_VECTOR_COMMAND(R_V_LINE_TO)                                          \
  DECLARE_VECTOR_COMMAND(CUBIC_TO)                                             \
  DECLARE_VECTOR_COMMAND(R_CUBIC_TO)                                           \
  DECLARE_VECTOR_COMMAND(CUBIC_TO_SHORTHAND)                                   \
  DECLARE_VECTOR_COMMAND(QUADRATIC_TO)                                         \
  DECLARE_VECTOR_COMMAND(R_QUADRATIC_TO)                                       \
  DECLARE_VECTOR_COMMAND(QUADRATIC_TO_SHORTHAND)                               \
  DECLARE_VECTOR_COMMAND(R_QUADRATIC_TO_SHORTHAND)                             \
  DECLARE_VECTOR_COMMAND(CIRCLE)                                               \
  DECLARE_VECTOR_COMMAND(OVAL)                                                 \
  DECLARE_VECTOR_COMMAND(ROUND_RECT)                                           \
  DECLARE_VECTOR_COMMAND(CLOSE)                                                \
  /* Sets the dimensions of the canvas in dip. */                              \
  DECLARE_VECTOR_COMMAND(CANVAS_DIMENSIONS)                                    \
  /* Sets a bounding rect for the path. This allows fine adjustment because */ \
  /* it can tweak edge anti-aliasing. Args are x, y, w, h. */                  \
  DECLARE_VECTOR_COMMAND(CLIP)                                                 \
  /* Disables anti-aliasing for this path. */                                  \
  DECLARE_VECTOR_COMMAND(DISABLE_AA)                                           \
  /* Flips the x-axis in RTL locales. Default is false, this command sets */   \
  /* it to true. */                                                            \
  DECLARE_VECTOR_COMMAND(FLIPS_IN_RTL)

#define DECLARE_VECTOR_COMMAND(x) x,

// A command to Skia.
enum CommandType { DECLARE_VECTOR_COMMANDS };

#undef DECLARE_VECTOR_COMMAND

// A POD that describes either a path command or an argument for it.
struct PathElement {
  constexpr PathElement(CommandType value) : command(value) {}
  constexpr PathElement(SkScalar value) : arg(value) {}

  union {
    CommandType command;
    SkScalar arg;
  };
};

// Describes the drawing commands for a single vector icon at a particular pixel
// size or range of sizes.
struct VectorIconRep {
  VectorIconRep() = default;

  VectorIconRep(const VectorIconRep&) = delete;
  VectorIconRep& operator=(const VectorIconRep&) = delete;

  const PathElement* path = nullptr;

  // The length of |path|.
  size_t path_size = 0u;
};

// A vector icon that stores one or more representations to be used for various
// scale factors and pixel dimensions.
struct VectorIcon {
  VectorIcon() = default;

  VectorIcon(const VectorIcon&) = delete;
  VectorIcon& operator=(const VectorIcon&) = delete;

  bool is_empty() const { return !reps; }

  const VectorIconRep* const reps = nullptr;
  size_t reps_size = 0u;

  // A human-readable name, useful for debugging, derived from the name of the
  // icon file. This can also be used as an identifier, but vector icon targets
  // should be careful to ensure this is unique.
  const char* name = nullptr;

  bool operator<(const VectorIcon& other) const;
};

}  // namespace gfx

#endif  // UI_GFX_VECTOR_ICON_TYPES_H_
