// Copyright 2017 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_RENDERER_RASTERIZER_EGL_DRAW_RECT_LINEAR_GRADIENT_H_
#define COBALT_RENDERER_RASTERIZER_EGL_DRAW_RECT_LINEAR_GRADIENT_H_

#include <vector>

#include "cobalt/math/matrix3_f.h"
#include "cobalt/math/rect_f.h"
#include "cobalt/render_tree/brush.h"
#include "cobalt/renderer/rasterizer/egl/draw_object.h"

namespace cobalt {
namespace renderer {
namespace rasterizer {
namespace egl {

// Handles drawing a rectangle with a linear color gradient. This may use
// transparency to mask out unwanted pixels, so it must be processed with other
// transparent draws.
class DrawRectLinearGradient : public DrawObject {
 public:
  DrawRectLinearGradient(GraphicsState* graphics_state,
                         const BaseState& base_state, const math::RectF& rect,
                         const render_tree::LinearGradientBrush& brush);

  void ExecuteUpdateVertexBuffer(
      GraphicsState* graphics_state,
      ShaderProgramManager* program_manager) override;
  void ExecuteRasterize(GraphicsState* graphics_state,
                        ShaderProgramManager* program_manager) override;
  base::TypeId GetTypeId() const override;

 private:
  void AddRectWithHorizontalGradient(
      const math::RectF& rect, const math::PointF& source,
      const math::PointF& dest, const render_tree::ColorStopList& color_stops);
  void AddRectWithVerticalGradient(
      const math::RectF& rect, const math::PointF& source,
      const math::PointF& dest, const render_tree::ColorStopList& color_stops);
  void AddRectWithAngledGradient(const math::RectF& rect,
                                 const render_tree::LinearGradientBrush& brush);
  uint32_t GetGLColor(const render_tree::ColorStop& color_stop);
  void AddVertex(float x, float y, uint32_t color);

  // For angled gradients, this is the rotation needed to transform a
  // horizontal gradient into the desired rect with angled gradient. The
  // include scissor will be used to ensure that only the desired pixels
  // are modified.
  math::Matrix3F transform_;
  math::RectF include_scissor_;

  struct VertexAttributes {
    float position[2];
    float offset[2];
    uint32_t color;
  };
  std::vector<VertexAttributes> attributes_;

  uint8_t* vertex_buffer_;
};

}  // namespace egl
}  // namespace rasterizer
}  // namespace renderer
}  // namespace cobalt

#endif  // COBALT_RENDERER_RASTERIZER_EGL_DRAW_RECT_LINEAR_GRADIENT_H_
