// 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/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::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::display::Transform transform,
                   fuchsia::display::Frame src, fuchsia::display::Frame dest);
  void SetAlpha(fuchsia::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::display::ImageConfig config_;

  struct state {
    bool set_config = true;
    bool set_position;
    fuchsia::display::Transform transform;
    fuchsia::display::Frame src;
    fuchsia::display::Frame dest;
    bool set_alpha;
    fuchsia::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_
