// Copyright 2019 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_GPU_EXTRA_INFO_MOJOM_TRAITS_H_
#define UI_GFX_MOJOM_GPU_EXTRA_INFO_MOJOM_TRAITS_H_

#include "base/component_export.h"
#include "ui/gfx/gpu_extra_info.h"
#include "ui/gfx/mojom/buffer_types_mojom_traits.h"
#include "ui/gfx/mojom/gpu_extra_info.mojom-shared.h"

#if defined(USE_OZONE)
#include "ui/ozone/buildflags.h"
#if BUILDFLAG(OZONE_PLATFORM_X11)
#define USE_OZONE_PLATFORM_X11
#endif
#endif

namespace mojo {

template <>
struct COMPONENT_EXPORT(GFX_SHARED_MOJOM_TRAITS)
    StructTraits<gfx::mojom::ANGLEFeatureDataView, gfx::ANGLEFeature> {
  static bool Read(gfx::mojom::ANGLEFeatureDataView data,
                   gfx::ANGLEFeature* out);

  static const std::string& name(const gfx::ANGLEFeature& input) {
    return input.name;
  }

  static const std::string& category(const gfx::ANGLEFeature& input) {
    return input.category;
  }

  static const std::string& description(const gfx::ANGLEFeature& input) {
    return input.description;
  }

  static const std::string& bug(const gfx::ANGLEFeature& input) {
    return input.bug;
  }

  static const std::string& status(const gfx::ANGLEFeature& input) {
    return input.status;
  }

  static const std::string& condition(const gfx::ANGLEFeature& input) {
    return input.condition;
  }
};

template <>
struct COMPONENT_EXPORT(GFX_SHARED_MOJOM_TRAITS)
    StructTraits<gfx::mojom::GpuExtraInfoDataView, gfx::GpuExtraInfo> {
  static bool Read(gfx::mojom::GpuExtraInfoDataView data,
                   gfx::GpuExtraInfo* out);

  static const std::vector<gfx::ANGLEFeature>& angle_features(
      const gfx::GpuExtraInfo& input) {
    return input.angle_features;
  }

#if defined(USE_OZONE_PLATFORM_X11) || defined(USE_X11)
  static const std::vector<gfx::BufferUsageAndFormat>&
  gpu_memory_buffer_support_x11(const gfx::GpuExtraInfo& input) {
    return input.gpu_memory_buffer_support_x11;
  }
#endif
};

}  // namespace mojo

#endif  // UI_GFX_MOJOM_GPU_EXTRA_INFO_MOJOM_TRAITS_H_
