// Copyright 2018 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 GARNET_BIN_DISPLAY_CAPTURE_TEST_LAYER_H_
#define GARNET_BIN_DISPLAY_CAPTURE_TEST_LAYER_H_

#include <fuchsia/hardware/display/cpp/fidl.h>
#include <inttypes.h>

#include "image.h"

namespace display_test {

namespace internal {

class Runner;

class LayerImpl {
 public:
  LayerImpl(Runner* runner);
  virtual ~LayerImpl() {}

  virtual const void* ApplyState() = 0;
  virtual void SendState(const void* state) const = 0;
  virtual void DeleteState(const void* state) const = 0;
  virtual bool GetPixel(const void* state, uint32_t x, uint32_t y,
                        uint32_t* value_out, bool* skip) const = 0;
  uint64_t id() const { return id_; }

  virtual uint64_t image_id(const void* state) const = 0;

 protected:
  fuchsia::hardware::display::ControllerPtr& controller() const;
  const ImageImpl* get_image_impl(const Image* image) const;

 private:
  Runner* runner_;
  uint64_t id_ = 0;
};

}  // namespace internal

class Context;
class PrimaryLayer;
class CursorLayer;
class ColorLayer;

class Layer : internal::LayerImpl {
 private:
  Layer(internal::Runner* runner) : internal::LayerImpl(runner) {}
  virtual ~Layer() {}

  friend Context;
  friend PrimaryLayer;
  friend CursorLayer;
  friend ColorLayer;
};

class PrimaryLayer : public Layer {
 public:
  ~PrimaryLayer() {}

  void SetPosition(fuchsia::hardware::display::Transform transform,
                   fuchsia::hardware::display::Frame src,
                   fuchsia::hardware::display::Frame dest);
  void SetAlpha(fuchsia::hardware::display::AlphaMode mode, float val);
  void SetImage(const Image* image);

 private:
  PrimaryLayer(internal::Runner* runner, uint32_t width, uint32_t height);

  // Gets the alpha multiplied color of the pixel. If the color is uncertain
  // due to scaling, skip_out will be true.
  bool GetPixel(const void* state, uint32_t x, uint32_t y, uint32_t* value_out,
                bool* skip_out) const override;
  const void* ApplyState() override;
  void SendState(const void* state) const override;
  void DeleteState(const void* state) const override;
  uint64_t image_id(const void* state) const override;

  fuchsia::hardware::display::ImageConfig config_;

  struct state {
    bool set_config = true;
    bool set_position;
    fuchsia::hardware::display::Transform transform;
    fuchsia::hardware::display::Frame src;
    fuchsia::hardware::display::Frame dest;
    bool set_alpha;
    fuchsia::hardware::display::AlphaMode alpha_mode;
    float alpha_val;
    bool flip_image;
    const internal::ImageImpl* image;
  };

  state pending_state_;

  friend Context;
};

// TODO(stevensd): Add CursorLayer and ColorLayer

}  // namespace display_test

#endif  // GARNET_BIN_DISPLAY_CAPTURE_TEST_LAYER_H_
