| Flutter Impeller |

dl_atlas_geometry.cc
Go to the documentation of this file.
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "impeller/display_list/dl_atlas_geometry.h"
6
7 #include "impeller/core/formats.h"
8 #include "impeller/core/vertex_buffer.h"
9 #include "impeller/display_list/skia_conversions.h"
10 #include "impeller/entity/porter_duff_blend.vert.h"
11 #include "impeller/entity/texture_fill.vert.h"
12 #include "impeller/geometry/color.h"
13 #include "impeller/geometry/point.h"
14 #include "third_party/skia/include/core/SkPoint.h"
15
16 namespace impeller {
17
18 DlAtlasGeometry::DlAtlasGeometry(const std::shared_ptr<Texture>& atlas,
19 const RSTransform* xform,
20 const flutter::DlRect* tex,
21 const flutter::DlColor* colors,
22 size_t count,
23 BlendMode mode,
24 const SamplerDescriptor& sampling,
25 std::optional<Rect> cull_rect)
26 : atlas_(atlas),
27 xform_(xform),
28 tex_(tex),
29 colors_(colors),
30 count_(count),
31 mode_(mode),
32 sampling_(sampling),
33 cull_rect_(cull_rect) {}
34
35 DlAtlasGeometry::~DlAtlasGeometry() = default;
36
37 bool DlAtlasGeometry::ShouldUseBlend() const {
38 return colors_ != nullptr && mode_ != BlendMode::kSource;
39 }
40
41 bool DlAtlasGeometry::ShouldSkip() const {
42 return atlas_ == nullptr || (ShouldUseBlend() && mode_ == BlendMode::kClear);
43 }
44
45 Rect DlAtlasGeometry::ComputeBoundingBox() const {
46 if (cull_rect_.has_value()) {
47 return cull_rect_.value();
48 }
49 Rect bounding_box;
50 for (size_t i = 0; i < count_; i++) {
51 auto bounds = xform_[i].GetBounds(tex_[i].GetSize());
52 bounding_box = Rect::Union(bounding_box, bounds);
53 }
54 cull_rect_ = bounding_box;
55 return bounding_box;
56 }
57
58 std::shared_ptr<Texture> DlAtlasGeometry::GetAtlas() const {
59 return atlas_;
60 }
61
62 const SamplerDescriptor& DlAtlasGeometry::GetSamplerDescriptor() const {
63 return sampling_;
64 }
65
66 BlendMode DlAtlasGeometry::GetBlendMode() const {
67 return mode_;
68 }
69
70 VertexBuffer DlAtlasGeometry::CreateSimpleVertexBuffer(
71 HostBuffer& host_buffer) const {
72 using VS = TextureFillVertexShader;
73
74 constexpr size_t indices[6] = {0, 1, 2, 1, 2, 3};
75
76 auto buffer_view = host_buffer.Emplace(
77 sizeof(VS::PerVertexData) * count_ * 6, alignof(VS::PerVertexData),
78 [&](uint8_t* raw_data) {
79 VS::PerVertexData* data =
80 reinterpret_cast<VS::PerVertexData*>(raw_data);
81 int offset = 0;
82 auto texture_size = atlas_->GetSize();
83 for (auto i = 0u; i < count_; i++) {
84 flutter::DlRect sample_rect = tex_[i];
85 auto points = sample_rect.GetPoints();
86 auto transformed_points = xform_[i].GetQuad(sample_rect.GetSize());
87 for (size_t j = 0; j < 6; j++) {
88 data[offset].position = transformed_points[indices[j]];
89 data[offset].texture_coords = points[indices[j]] / texture_size;
90 offset += 1;
91 }
92 }
93 });
94
95 return VertexBuffer{
96 .vertex_buffer = buffer_view,
97 .index_buffer = {},
98 .vertex_count = count_ * 6,
99 .index_type = IndexType::kNone,
100 };
101 }
102
103 VertexBuffer DlAtlasGeometry::CreateBlendVertexBuffer(
104 HostBuffer& host_buffer) const {
105 using VS = PorterDuffBlendVertexShader;
106
107 constexpr size_t indices[6] = {0, 1, 2, 1, 2, 3};
108
109 auto buffer_view = host_buffer.Emplace(
110 sizeof(VS::PerVertexData) * count_ * 6, alignof(VS::PerVertexData),
111 [&](uint8_t* raw_data) {
112 VS::PerVertexData* data =
113 reinterpret_cast<VS::PerVertexData*>(raw_data);
114 int offset = 0;
115 auto texture_size = atlas_->GetSize();
116 for (auto i = 0u; i < count_; i++) {
117 flutter::DlRect sample_rect = tex_[i];
118 auto points = sample_rect.GetPoints();
119 auto transformed_points = xform_[i].GetQuad(sample_rect.GetSize());
120 for (size_t j = 0; j < 6; j++) {
121 data[offset].vertices = transformed_points[indices[j]];
122 data[offset].texture_coords = points[indices[j]] / texture_size;
123 data[offset].color =
124 skia_conversions::ToColor(colors_[i]).Premultiply();
125 offset += 1;
126 }
127 }
128 });
129
130 return VertexBuffer{
131 .vertex_buffer = buffer_view,
132 .index_buffer = {},
133 .vertex_count = count_ * 6,
134 .index_type = IndexType::kNone,
135 };
136 }
137
138 } // namespace impeller
impeller::HostBuffer::Emplace
BufferView Emplace(const BufferType &buffer, size_t alignment=0)
Emplace non-uniform data (like contiguous vertices) onto the host buffer.
Definition: host_buffer.h:93
impeller::DlAtlasGeometry::CreateSimpleVertexBuffer
VertexBuffer CreateSimpleVertexBuffer(HostBuffer &host_buffer) const override
Definition: dl_atlas_geometry.cc:70
point.h
impeller::DlAtlasGeometry::GetBlendMode
BlendMode GetBlendMode() const override
Definition: dl_atlas_geometry.cc:66
vertex_buffer.h
impeller::DlAtlasGeometry::CreateBlendVertexBuffer
VertexBuffer CreateBlendVertexBuffer(HostBuffer &host_buffer) const override
Definition: dl_atlas_geometry.cc:103
impeller::BlendMode
BlendMode
Definition: color.h:58
impeller::HostBuffer
Definition: host_buffer.h:28
data
std::shared_ptr< const fml::Mapping > data
Definition: texture_gles.cc:64
impeller::BlendMode::kSource
@ kSource
impeller::VS
GlyphAtlasPipeline::VertexShader VS
Definition: text_contents.cc:25
impeller::VertexBuffer
Definition: vertex_buffer.h:15
formats.h
impeller::skia_conversions::ToColor
Color ToColor(const flutter::DlColor &color)
Definition: skia_conversions.cc:89
impeller::RSTransform::GetQuad
void GetQuad(Scalar width, Scalar height, Quad &quad) const
Definition: rstransform.cc:24
buffer_view
BufferView buffer_view
Definition: blit_command_gles.cc:152
impeller::VertexBuffer::vertex_buffer
BufferView vertex_buffer
Definition: vertex_buffer.h:16
offset
SeparatedVector2 offset
Definition: stroke_path_geometry.cc:319
impeller::SamplerDescriptor
Definition: sampler_descriptor.h:14
impeller::DlAtlasGeometry::DlAtlasGeometry
DlAtlasGeometry(const std::shared_ptr< Texture > &atlas, const RSTransform *xform, const flutter::DlRect *tex, const flutter::DlColor *colors, size_t count, BlendMode mode, const SamplerDescriptor &sampling, std::optional< Rect > cull_rect)
Definition: dl_atlas_geometry.cc:18
skia_conversions.h
impeller::BlendMode::kClear
@ kClear
impeller::DlAtlasGeometry::GetAtlas
std::shared_ptr< Texture > GetAtlas() const override
Definition: dl_atlas_geometry.cc:58
impeller::RSTransform
Definition: rstransform.h:20
impeller::DlRect
flutter::DlRect DlRect
Definition: dl_dispatcher.h:25
impeller::IndexType::kNone
@ kNone
Does not use the index buffer.
dl_atlas_geometry.h
impeller::DlAtlasGeometry::ComputeBoundingBox
Rect ComputeBoundingBox() const override
Definition: dl_atlas_geometry.cc:45
impeller::DlAtlasGeometry::ShouldSkip
bool ShouldSkip() const override
Definition: dl_atlas_geometry.cc:41
impeller::DlAtlasGeometry::ShouldUseBlend
bool ShouldUseBlend() const override
Whether the blend shader should be used.
Definition: dl_atlas_geometry.cc:37
impeller::TRect< Scalar >::Union
constexpr TRect Union(const TRect &o) const
Definition: rect.h:517
color.h
impeller::DlAtlasGeometry::GetSamplerDescriptor
const SamplerDescriptor & GetSamplerDescriptor() const override
Definition: dl_atlas_geometry.cc:62
impeller::DlAtlasGeometry::~DlAtlasGeometry
~DlAtlasGeometry()
impeller
Definition: allocation.cc:12
impeller::Color::Premultiply
constexpr Color Premultiply() const
Definition: color.h:211
impeller::TRect
Definition: rect.h:122
impeller::RSTransform::GetBounds
std::optional< Rect > GetBounds(Scalar width, Scalar height) const
Definition: rstransform.cc:49