// Copyright 2020 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_MOJOM_DELEGATED_INK_METADATA_MOJOM_TRAITS_H_
#define UI_GFX_MOJOM_DELEGATED_INK_METADATA_MOJOM_TRAITS_H_

#include <memory>

#include "mojo/public/cpp/base/time_mojom_traits.h"
#include "skia/public/mojom/skcolor_mojom_traits.h"
#include "ui/gfx/delegated_ink_metadata.h"
#include "ui/gfx/mojom/delegated_ink_metadata.mojom-shared.h"
#include "ui/gfx/mojom/rrect_f_mojom_traits.h"

namespace mojo {

template <>
struct StructTraits<gfx::mojom::DelegatedInkMetadataDataView,
                    std::unique_ptr<gfx::DelegatedInkMetadata>> {
  static bool IsNull(const std::unique_ptr<gfx::DelegatedInkMetadata>& input) {
    return !input;
  }

  static void SetToNull(std::unique_ptr<gfx::DelegatedInkMetadata>* input) {
    input->reset();
  }

  static const gfx::PointF& point(
      const std::unique_ptr<gfx::DelegatedInkMetadata>& input) {
    return input->point();
  }

  static double diameter(
      const std::unique_ptr<gfx::DelegatedInkMetadata>& input) {
    return input->diameter();
  }

  static SkColor color(
      const std::unique_ptr<gfx::DelegatedInkMetadata>& input) {
    return input->color();
  }

  static base::TimeTicks timestamp(
      const std::unique_ptr<gfx::DelegatedInkMetadata>& input) {
    return input->timestamp();
  }

  static const gfx::RectF& presentation_area(
      const std::unique_ptr<gfx::DelegatedInkMetadata>& input) {
    return input->presentation_area();
  }

  static base::TimeTicks frame_time(
      const std::unique_ptr<gfx::DelegatedInkMetadata>& input) {
    return input->frame_time();
  }

  static bool is_hovering(
      const std::unique_ptr<gfx::DelegatedInkMetadata>& input) {
    return input->is_hovering();
  }

  static bool Read(gfx::mojom::DelegatedInkMetadataDataView data,
                   std::unique_ptr<gfx::DelegatedInkMetadata>* out);
};

}  // namespace mojo

#endif  // UI_GFX_MOJOM_DELEGATED_INK_METADATA_MOJOM_TRAITS_H_
