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 
6 
10 #include "impeller/entity/porter_duff_blend.vert.h"
11 #include "impeller/entity/texture_fill.vert.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 
36 
38  return colors_ != nullptr && mode_ != BlendMode::kSource;
39 }
40 
42  return atlas_ == nullptr || (ShouldUseBlend() && mode_ == BlendMode::kClear);
43 }
44 
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 
63  return sampling_;
64 }
65 
67  return mode_;
68 }
69 
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{
97  .index_buffer = {},
98  .vertex_count = count_ * 6,
99  .index_type = IndexType::kNone,
100  };
101 }
102 
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 =
125  offset += 1;
126  }
127  }
128  });
129 
130  return VertexBuffer{
132  .index_buffer = {},
133  .vertex_count = count_ * 6,
134  .index_type = IndexType::kNone,
135  };
136 }
137 
138 } // namespace impeller
BufferView buffer_view
std::shared_ptr< Texture > GetAtlas() const override
BlendMode GetBlendMode() const override
VertexBuffer CreateBlendVertexBuffer(HostBuffer &host_buffer) const override
const SamplerDescriptor & GetSamplerDescriptor() const override
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)
bool ShouldUseBlend() const override
Whether the blend shader should be used.
bool ShouldSkip() const override
Rect ComputeBoundingBox() const override
VertexBuffer CreateSimpleVertexBuffer(HostBuffer &host_buffer) const override
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
Color ToColor(const flutter::DlColor &color)
@ kNone
Does not use the index buffer.
flutter::DlRect DlRect
Definition: dl_dispatcher.h:25
GlyphAtlasPipeline::VertexShader VS
BlendMode
Definition: color.h:58
SeparatedVector2 offset
constexpr Color Premultiply() const
Definition: color.h:211
std::optional< Rect > GetBounds(Scalar width, Scalar height) const
Definition: rstransform.cc:49
void GetQuad(Scalar width, Scalar height, Quad &quad) const
Definition: rstransform.cc:24
constexpr TRect Union(const TRect &o) const
Definition: rect.h:517
std::shared_ptr< const fml::Mapping > data
Definition: texture_gles.cc:64