// 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_RADIAL_GRADIENT_H_
#define COBALT_RENDERER_RASTERIZER_EGL_DRAW_RECT_RADIAL_GRADIENT_H_

#include <vector>

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

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

// Handles drawing a rectangle with a radial color gradient.
class DrawRectRadialGradient : public DrawObject {
 public:
  DrawRectRadialGradient(GraphicsState* graphics_state,
                         const BaseState& base_state,
                         const math::RectF& rect,
                         const render_tree::RadialGradientBrush& brush,
                         const GetScratchTextureFunction& get_scratch_texture);

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

  bool IsValid() const { return lookup_texture_ != nullptr; }

 private:
  struct VertexAttributes {
    float position[2];
    float offset[2];
  };

  void InitializeLookupTexture(const render_tree::RadialGradientBrush& brush);
  void AddVertex(float x, float y, const math::PointF& offset_center,
      const math::PointF& offset_scale);

  std::vector<VertexAttributes> attributes_;
  const backend::TextureEGL* lookup_texture_;
  math::RectF lookup_region_;
  uint8_t* vertex_buffer_;
};

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

#endif  // COBALT_RENDERER_RASTERIZER_EGL_DRAW_RECT_RADIAL_GRADIENT_H_
