// Copyright 2019 The Fuchsia 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 SRC_LIB_FOSTR_FIDL_FUCHSIA_UI_GFX_AMENDMENTS_H_
#define SRC_LIB_FOSTR_FIDL_FUCHSIA_UI_GFX_AMENDMENTS_H_

#include <fuchsia/ui/gfx/cpp/fidl.h>

#include <iosfwd>

namespace fuchsia {
namespace ui {
namespace gfx {

// NOTE:
// //src/lib/fostr/fidl/fuchsia.ui.gfx generates ostream formatters
// for this library *except* those formatters that are listed here. The code
// generator knows which formatters to exclude from the generated code by
// consulting the 'amendments.json' file in that directory.
//
// If you add or remove formatters from this file, please be sure that the
// amendments.json file is updated accordingly.

// NOTE: fostr doesn't generate operator<< for union tags, so we explicitly add
// our own where desired.

std::ostream& operator<<(std::ostream& stream, const fuchsia::ui::gfx::Value::Tag& tag);

inline vec2 operator-(const vec2& v) { return {.x = -v.x, .y = -v.y}; }

inline vec2& operator+=(vec2& a, const vec2& b) {
  a.x += b.x;
  a.y += b.y;
  return a;
}

// Return a vec2 consisting of the component-wise sum of the two arguments.
inline vec2 operator+(const vec2& a, const vec2& b) { return {.x = a.x + b.x, .y = a.y + b.y}; }

// Return a vec2 consisting of the component-wise difference of the two args.
inline vec2 operator-(const vec2& a, const vec2& b) { return {.x = a.x - b.x, .y = a.y - b.y}; }

inline vec2 operator*(const vec2& v, float s) { return {.x = v.x * s, .y = v.y * s}; }

inline vec2& operator/=(vec2& v, float s) {
  v.x /= s;
  v.y /= s;
  return v;
}

inline vec2 operator/(const vec2& v, float s) { return {.x = v.x / s, .y = v.y / s}; }

// Return a vec3 consisting of the component-wise sum of the two arguments.
inline vec3 operator+(const vec3& a, const vec3& b) {
  return {.x = a.x + b.x, .y = a.y + b.y, .z = a.z + b.z};
}

// Return a vec3 consisting of the component-wise difference of the two args.
inline vec3 operator-(const vec3& a, const vec3& b) {
  return {.x = a.x - b.x, .y = a.y - b.y, .z = a.z - b.z};
}

// Return a vec4 consisting of the component-wise sum of the two arguments.
inline vec4 operator+(const vec4& a, const vec4& b) {
  return {.x = a.x + b.x, .y = a.y + b.y, .z = a.z + b.z, .w = a.w + b.w};
}

// Return a vec4 consisting of the component-wise difference of the two args.
inline vec4 operator-(const vec4& a, const vec4& b) {
  return {.x = a.x - b.x, .y = a.y - b.y, .z = a.z - b.z, .w = a.w - b.w};
}

}  // namespace gfx
}  // namespace ui
}  // namespace fuchsia

#endif  // SRC_LIB_FOSTR_FIDL_FUCHSIA_UI_GFX_AMENDMENTS_H_
