Flutter Engine
 
Loading...
Searching...
No Matches
impeller::DrawImageRectAtlasGeometry Class Reference

An atlas geometry that adapts for drawImageRect. More...

#include <atlas_contents.h>

Inheritance diagram for impeller::DrawImageRectAtlasGeometry:
impeller::AtlasGeometry

Public Member Functions

 DrawImageRectAtlasGeometry (std::shared_ptr< Texture > texture, const Rect &source, const Rect &destination, const Color &color, BlendMode blend_mode, const SamplerDescriptor &desc, bool use_strict_src_rect=false)
 
 ~DrawImageRectAtlasGeometry ()
 
bool ShouldUseBlend () const override
 
bool ShouldSkip () const override
 
VertexBuffer CreateSimpleVertexBuffer (HostBuffer &host_buffer) const override
 
VertexBuffer CreateBlendVertexBuffer (HostBuffer &host_buffer) const override
 
Rect ComputeBoundingBox () const override
 
const std::shared_ptr< Texture > & GetAtlas () const override
 
const SamplerDescriptorGetSamplerDescriptor () const override
 
BlendMode GetBlendMode () const override
 
bool ShouldInvertBlendMode () const override
 
std::optional< RectGetStrictSrcRect () const override
 The source rect of the draw in texture coordinates if a strict source rect should be applied, or nullopt.
 

Detailed Description

An atlas geometry that adapts for drawImageRect.

Definition at line 51 of file atlas_contents.h.

Constructor & Destructor Documentation

◆ DrawImageRectAtlasGeometry()

impeller::DrawImageRectAtlasGeometry::DrawImageRectAtlasGeometry ( std::shared_ptr< Texture texture,
const Rect source,
const Rect destination,
const Color color,
BlendMode  blend_mode,
const SamplerDescriptor desc,
bool  use_strict_src_rect = false 
)

Definition at line 20 of file atlas_contents.cc.

28 : texture_(std::move(texture)),
29 source_(source),
30 destination_(destination),
31 color_(color),
32 blend_mode_(blend_mode),
33 desc_(desc),
34 use_strict_src_rect_(use_strict_src_rect) {}
FlTexture * texture

◆ ~DrawImageRectAtlasGeometry()

impeller::DrawImageRectAtlasGeometry::~DrawImageRectAtlasGeometry ( )
default

Member Function Documentation

◆ ComputeBoundingBox()

Rect impeller::DrawImageRectAtlasGeometry::ComputeBoundingBox ( ) const
overridevirtual

Implements impeller::AtlasGeometry.

Definition at line 107 of file atlas_contents.cc.

107 {
108 return destination_;
109}

◆ CreateBlendVertexBuffer()

VertexBuffer impeller::DrawImageRectAtlasGeometry::CreateBlendVertexBuffer ( HostBuffer host_buffer) const
overridevirtual

Implements impeller::AtlasGeometry.

Definition at line 76 of file atlas_contents.cc.

77 {
78 using VS = PorterDuffBlendVertexShader;
79 constexpr size_t indices[6] = {0, 1, 2, 1, 2, 3};
80
81 BufferView buffer_view = data_host_buffer.Emplace(
82 sizeof(VS::PerVertexData) * 6, alignof(VS::PerVertexData),
83 [&](uint8_t* raw_data) {
84 VS::PerVertexData* data =
85 reinterpret_cast<VS::PerVertexData*>(raw_data);
86 int offset = 0;
87 std::array<TPoint<float>, 4> texture_coords =
88 Rect::MakeSize(texture_->GetSize()).Project(source_).GetPoints();
89 std::array<TPoint<float>, 4> destination_points =
90 destination_.GetPoints();
91 for (size_t j = 0; j < 6; j++) {
92 data[offset].vertices = destination_points[indices[j]];
93 data[offset].texture_coords = texture_coords[indices[j]];
94 data[offset].color = color_.Premultiply();
95 offset++;
96 }
97 });
98
99 return VertexBuffer{
100 .vertex_buffer = buffer_view,
101 .index_buffer = {},
102 .vertex_count = 6,
103 .index_type = IndexType::kNone,
104 };
105}
BufferView buffer_view
@ kNone
Does not use the index buffer.
LinePipeline::VertexShader VS
constexpr Color Premultiply() const
Definition color.h:212
constexpr std::array< TPoint< T >, 4 > GetPoints() const
Get the points that represent the 4 corners of this rectangle in a Z order that is compatible with tr...
Definition rect.h:414
constexpr TRect< T > Project(TRect< T > source) const
Returns a new rectangle that represents the projection of the source rectangle onto this rectangle....
Definition rect.h:669
static constexpr TRect MakeSize(const TSize< U > &size)
Definition rect.h:150
std::shared_ptr< const fml::Mapping > data

References buffer_view, data, impeller::HostBuffer::Emplace(), impeller::TRect< T >::GetPoints(), impeller::kNone, impeller::TRect< Scalar >::MakeSize(), impeller::Color::Premultiply(), impeller::TRect< T >::Project(), and impeller::VertexBuffer::vertex_buffer.

◆ CreateSimpleVertexBuffer()

VertexBuffer impeller::DrawImageRectAtlasGeometry::CreateSimpleVertexBuffer ( HostBuffer host_buffer) const
overridevirtual

Implements impeller::AtlasGeometry.

Definition at line 46 of file atlas_contents.cc.

47 {
48 using VS = TextureFillVertexShader;
49 constexpr size_t indices[6] = {0, 1, 2, 1, 2, 3};
50
51 BufferView buffer_view = data_host_buffer.Emplace(
52 sizeof(VS::PerVertexData) * 6, alignof(VS::PerVertexData),
53 [&](uint8_t* raw_data) {
54 VS::PerVertexData* data =
55 reinterpret_cast<VS::PerVertexData*>(raw_data);
56 int offset = 0;
57 std::array<TPoint<float>, 4> destination_points =
58 destination_.GetPoints();
59 std::array<TPoint<float>, 4> texture_coords =
60 Rect::MakeSize(texture_->GetSize()).Project(source_).GetPoints();
61 for (size_t j = 0; j < 6; j++) {
62 data[offset].position = destination_points[indices[j]];
63 data[offset].texture_coords = texture_coords[indices[j]];
64 offset++;
65 }
66 });
67
68 return VertexBuffer{
69 .vertex_buffer = buffer_view,
70 .index_buffer = {},
71 .vertex_count = 6,
72 .index_type = IndexType::kNone,
73 };
74}

References buffer_view, data, impeller::HostBuffer::Emplace(), impeller::TRect< T >::GetPoints(), impeller::kNone, impeller::TRect< Scalar >::MakeSize(), impeller::TRect< T >::Project(), and impeller::VertexBuffer::vertex_buffer.

◆ GetAtlas()

const std::shared_ptr< Texture > & impeller::DrawImageRectAtlasGeometry::GetAtlas ( ) const
overridevirtual

Implements impeller::AtlasGeometry.

Definition at line 111 of file atlas_contents.cc.

111 {
112 return texture_;
113}

◆ GetBlendMode()

BlendMode impeller::DrawImageRectAtlasGeometry::GetBlendMode ( ) const
overridevirtual

Implements impeller::AtlasGeometry.

Definition at line 120 of file atlas_contents.cc.

120 {
121 return blend_mode_;
122}

◆ GetSamplerDescriptor()

const SamplerDescriptor & impeller::DrawImageRectAtlasGeometry::GetSamplerDescriptor ( ) const
overridevirtual

Implements impeller::AtlasGeometry.

Definition at line 115 of file atlas_contents.cc.

116 {
117 return desc_;
118}

◆ GetStrictSrcRect()

std::optional< Rect > impeller::DrawImageRectAtlasGeometry::GetStrictSrcRect ( ) const
overridevirtual

The source rect of the draw in texture coordinates if a strict source rect should be applied, or nullopt.

See also Canvas::AttemptColorFilterOptimization

Reimplemented from impeller::AtlasGeometry.

Definition at line 128 of file atlas_contents.cc.

128 {
129 if (use_strict_src_rect_) {
130 // For a strict source rect, shrink the texture coordinate range by half a
131 // texel to ensure that linear filtering does not sample anything outside
132 // the source rect bounds.
133 return Rect::MakeSize(texture_->GetSize()).Project(source_.Expand(-0.5));
134 }
135 return std::nullopt;
136}
constexpr TRect< T > Expand(T left, T top, T right, T bottom) const
Returns a rectangle with expanded edges. Negative expansion results in shrinking.
Definition rect.h:618

References impeller::TRect< T >::Expand(), impeller::TRect< Scalar >::MakeSize(), and impeller::TRect< T >::Project().

◆ ShouldInvertBlendMode()

bool impeller::DrawImageRectAtlasGeometry::ShouldInvertBlendMode ( ) const
overridevirtual

Reimplemented from impeller::AtlasGeometry.

Definition at line 124 of file atlas_contents.cc.

124 {
125 return false;
126}

◆ ShouldSkip()

bool impeller::DrawImageRectAtlasGeometry::ShouldSkip ( ) const
overridevirtual

Implements impeller::AtlasGeometry.

Definition at line 42 of file atlas_contents.cc.

42 {
43 return false;
44}

◆ ShouldUseBlend()

bool impeller::DrawImageRectAtlasGeometry::ShouldUseBlend ( ) const
overridevirtual

Implements impeller::AtlasGeometry.

Definition at line 38 of file atlas_contents.cc.

38 {
39 return true;
40}

The documentation for this class was generated from the following files: