| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "impeller/entity/contents/checkerboard_contents.h" |
| |
| #include <memory> |
| |
| #include "impeller/core/formats.h" |
| #include "impeller/entity/contents/content_context.h" |
| #include "impeller/renderer/command.h" |
| #include "impeller/renderer/render_pass.h" |
| |
| namespace impeller { |
| |
| CheckerboardContents::CheckerboardContents() = default; |
| |
| CheckerboardContents::~CheckerboardContents() = default; |
| |
| bool CheckerboardContents::Render(const ContentContext& renderer, |
| const Entity& entity, |
| RenderPass& pass) const { |
| auto& host_buffer = pass.GetTransientsBuffer(); |
| |
| using VS = CheckerboardPipeline::VertexShader; |
| using FS = CheckerboardPipeline::FragmentShader; |
| |
| Command cmd; |
| cmd.label = "Checkerboard"; |
| |
| auto options = OptionsFromPass(pass); |
| options.blend_mode = BlendMode::kSourceOver; |
| options.stencil_compare = CompareFunction::kAlways; // Ignore all clips. |
| options.stencil_operation = StencilOperation::kKeep; |
| options.primitive_type = PrimitiveType::kTriangleStrip; |
| cmd.pipeline = renderer.GetCheckerboardPipeline(options); |
| |
| VertexBufferBuilder<typename VS::PerVertexData> vtx_builder; |
| vtx_builder.AddVertices({ |
| {Point(-1, -1)}, |
| {Point(1, -1)}, |
| {Point(-1, 1)}, |
| {Point(1, 1)}, |
| }); |
| cmd.BindVertices(vtx_builder.CreateVertexBuffer(host_buffer)); |
| |
| FS::FragInfo frag_info; |
| frag_info.color = color_; |
| frag_info.square_size = square_size_; |
| FS::BindFragInfo(cmd, host_buffer.EmplaceUniform(frag_info)); |
| |
| pass.AddCommand(cmd); |
| |
| return true; |
| } |
| |
| std::optional<Rect> CheckerboardContents::GetCoverage( |
| const Entity& entity) const { |
| return std::nullopt; |
| } |
| |
| void CheckerboardContents::SetColor(Color color) { |
| color_ = color; |
| } |
| |
| void CheckerboardContents::SetSquareSize(Scalar square_size) { |
| square_size_ = square_size; |
| } |
| |
| } // namespace impeller |