| Flutter Impeller |

entity.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/entity/entity.h"
6
7 #include <algorithm>
8 #include <optional>
9
10 #include "impeller/entity/contents/content_context.h"
11 #include "impeller/entity/contents/texture_contents.h"
12 #include "impeller/geometry/color.h"
13 #include "impeller/geometry/vector.h"
14 #include "impeller/renderer/render_pass.h"
15
16 namespace impeller {
17
18 Entity Entity::FromSnapshot(const Snapshot& snapshot, BlendMode blend_mode) {
19 auto texture_rect = Rect::MakeSize(snapshot.texture->GetSize());
20
21 auto contents = TextureContents::MakeRect(texture_rect);
22 contents->SetTexture(snapshot.texture);
23 contents->SetSamplerDescriptor(snapshot.sampler_descriptor);
24 contents->SetSourceRect(texture_rect);
25 contents->SetOpacity(snapshot.opacity);
26 contents->SetNeedsRasterizationForRuntimeEffects(
27 snapshot.needs_rasterization_for_runtime_effects);
28
29 Entity entity;
30 entity.SetBlendMode(blend_mode);
31 entity.SetTransform(snapshot.transform);
32 entity.SetContents(contents);
33 return entity;
34 }
35
36 Entity::Entity() = default;
37
38 Entity::~Entity() = default;
39
40 Entity::Entity(Entity&&) = default;
41
42 Entity::Entity(const Entity&) = default;
43
44 Entity& Entity::operator=(Entity&&) = default;
45
46 const Matrix& Entity::GetTransform() const {
47 return transform_;
48 }
49
50 Matrix Entity::GetShaderTransform(const RenderPass& pass) const {
51 return Entity::GetShaderTransform(GetShaderClipDepth(), pass, transform_);
52 }
53
54 Matrix Entity::GetShaderTransform(Scalar shader_clip_depth,
55 const RenderPass& pass,
56 const Matrix& transform) {
57 return Matrix::MakeTranslateScale({1, 1, Entity::kDepthEpsilon},
58 {0, 0, shader_clip_depth}) *
59 pass.GetOrthographicTransform() * transform;
60 }
61
62 void Entity::SetTransform(const Matrix& transform) {
63 transform_ = transform;
64 }
65
66 std::optional<Rect> Entity::GetCoverage() const {
67 if (!contents_) {
68 return std::nullopt;
69 }
70
71 return contents_->GetCoverage(*this);
72 }
73
74 void Entity::SetContents(std::shared_ptr<Contents> contents) {
75 contents_ = std::move(contents);
76 }
77
78 const std::shared_ptr<Contents>& Entity::GetContents() const {
79 return contents_;
80 }
81
82 void Entity::SetClipDepth(uint32_t clip_depth) {
83 clip_depth_ = clip_depth;
84 }
85
86 uint32_t Entity::GetClipDepth() const {
87 return clip_depth_;
88 }
89
90 Scalar Entity::GetShaderClipDepth() const {
91 return Entity::GetShaderClipDepth(clip_depth_);
92 }
93
94 Scalar Entity::GetShaderClipDepth(uint32_t clip_depth) {
95 return std::clamp(clip_depth * kDepthEpsilon, 0.0f, 1.0f - kDepthEpsilon);
96 }
97
98 void Entity::SetBlendMode(BlendMode blend_mode) {
99 blend_mode_ = blend_mode;
100 }
101
102 BlendMode Entity::GetBlendMode() const {
103 return blend_mode_;
104 }
105
106 bool Entity::SetInheritedOpacity(Scalar alpha) {
107 if (alpha >= 1.0) {
108 return true;
109 }
110 if (blend_mode_ == BlendMode::kSrc && contents_->IsOpaque(GetTransform())) {
111 blend_mode_ = BlendMode::kSrcOver;
112 }
113 contents_->SetInheritedOpacity(alpha);
114 return true;
115 }
116
117 std::optional<Color> Entity::AsBackgroundColor(ISize target_size) const {
118 return contents_->AsBackgroundColor(*this, target_size);
119 }
120
121 /// @brief Returns true if the blend mode is "destructive", meaning that even
122 /// fully transparent source colors would result in the destination
123 /// getting changed.
124 ///
125 /// This is useful for determining if EntityPass textures can be
126 /// shrinkwrapped to their Entities' coverage; they can be shrinkwrapped
127 /// if all of the contained Entities have non-destructive blends.
128 bool Entity::IsBlendModeDestructive(BlendMode blend_mode) {
129 switch (blend_mode) {
130 case BlendMode::kClear:
131 case BlendMode::kSrc:
132 case BlendMode::kSrcIn:
133 case BlendMode::kDstIn:
134 case BlendMode::kSrcOut:
135 case BlendMode::kDstOut:
136 case BlendMode::kDstATop:
137 case BlendMode::kXor:
138 case BlendMode::kModulate:
139 return true;
140 default:
141 return false;
142 }
143 }
144
145 bool Entity::Render(const ContentContext& renderer,
146 RenderPass& parent_pass) const {
147 if (!contents_) {
148 return true;
149 }
150
151 if (!contents_->GetCoverageHint().has_value()) {
152 contents_->SetCoverageHint(
153 Rect::MakeSize(parent_pass.GetRenderTargetSize()));
154 }
155
156 return contents_->Render(renderer, *this, parent_pass);
157 }
158
159 Entity Entity::Clone() const {
160 return Entity(*this);
161 }
162
163 } // namespace impeller
impeller::ContentContext
Definition: content_context.h:138
impeller::Entity
Definition: entity.h:26
impeller::Entity::SetTransform
void SetTransform(const Matrix &transform)
Set the global transform matrix for this Entity.
Definition: entity.cc:62
impeller::Entity::Entity
Entity()
impeller::Entity::GetCoverage
std::optional< Rect > GetCoverage() const
Definition: entity.cc:66
impeller::Entity::SetInheritedOpacity
bool SetInheritedOpacity(Scalar alpha)
Definition: entity.cc:106
impeller::Entity::GetContents
const std::shared_ptr< Contents > & GetContents() const
Definition: entity.cc:78
impeller::Entity::GetShaderTransform
Matrix GetShaderTransform(const RenderPass &pass) const
Definition: entity.cc:50
impeller::Entity::~Entity
~Entity()
impeller::Entity::SetClipDepth
void SetClipDepth(uint32_t clip_depth)
Definition: entity.cc:82
impeller::Entity::GetBlendMode
BlendMode GetBlendMode() const
Definition: entity.cc:102
impeller::Entity::SetContents
void SetContents(std::shared_ptr< Contents > contents)
Definition: entity.cc:74
impeller::Entity::SetBlendMode
void SetBlendMode(BlendMode blend_mode)
Definition: entity.cc:98
impeller::Entity::kDepthEpsilon
static constexpr Scalar kDepthEpsilon
Definition: entity.h:31
impeller::Entity::Render
bool Render(const ContentContext &renderer, RenderPass &parent_pass) const
Definition: entity.cc:145
impeller::Entity::Clone
Entity Clone() const
Definition: entity.cc:159
impeller::Entity::AsBackgroundColor
std::optional< Color > AsBackgroundColor(ISize target_size) const
Definition: entity.cc:117
impeller::Entity::GetTransform
const Matrix & GetTransform() const
Get the global transform matrix for this Entity.
Definition: entity.cc:46
impeller::Entity::GetClipDepth
uint32_t GetClipDepth() const
Definition: entity.cc:86
impeller::Entity::IsBlendModeDestructive
static bool IsBlendModeDestructive(BlendMode blend_mode)
Returns true if the blend mode is "destructive", meaning that even fully transparent source colors wo...
Definition: entity.cc:128
impeller::Entity::FromSnapshot
static Entity FromSnapshot(const Snapshot &snapshot, BlendMode blend_mode=BlendMode::kSrcOver)
Create an entity that can be used to render a given snapshot.
Definition: entity.cc:18
impeller::Entity::operator=
Entity & operator=(Entity &&)
impeller::Entity::GetShaderClipDepth
float GetShaderClipDepth() const
Definition: entity.cc:90
impeller::RenderPass
Render passes encode render commands directed as one specific render target into an underlying comman...
Definition: render_pass.h:30
impeller::RenderPass::GetOrthographicTransform
const Matrix & GetOrthographicTransform() const
Definition: render_pass.cc:51
impeller::RenderPass::GetRenderTargetSize
ISize GetRenderTargetSize() const
Definition: render_pass.cc:47
impeller::TextureContents::MakeRect
static std::shared_ptr< TextureContents > MakeRect(Rect destination)
Definition: texture_contents.cc:28
color.h
content_context.h
entity.h
transform
Matrix transform
Definition: gaussian_blur_filter_contents.cc:214
impeller
Definition: allocation.cc:12
impeller::Scalar
float Scalar
Definition: scalar.h:19
impeller::BlendMode
BlendMode
Definition: color.h:58
impeller::BlendMode::kSrcOut
@ kSrcOut
impeller::BlendMode::kDstIn
@ kDstIn
impeller::BlendMode::kModulate
@ kModulate
impeller::BlendMode::kSrcOver
@ kSrcOver
impeller::BlendMode::kXor
@ kXor
impeller::BlendMode::kSrc
@ kSrc
impeller::BlendMode::kDstATop
@ kDstATop
impeller::BlendMode::kDstOut
@ kDstOut
impeller::BlendMode::kSrcIn
@ kSrcIn
impeller::BlendMode::kClear
@ kClear
render_pass.h
impeller::Matrix
A 4x4 matrix using column-major storage.
Definition: matrix.h:37
impeller::Matrix::MakeTranslateScale
static constexpr Matrix MakeTranslateScale(const Vector3 &s, const Vector3 &t)
Definition: matrix.h:113
impeller::Snapshot
Represents a texture and its intended draw transform/sampler configuration.
Definition: snapshot.h:24
impeller::Snapshot::needs_rasterization_for_runtime_effects
bool needs_rasterization_for_runtime_effects
Whether this snapshot needs to be re-rasterized when used as an input to a runtime effect.
Definition: snapshot.h:46
impeller::Snapshot::transform
Matrix transform
The transform that should be applied to this texture for rendering.
Definition: snapshot.h:27
impeller::Snapshot::texture
std::shared_ptr< Texture > texture
Definition: snapshot.h:25
impeller::Snapshot::sampler_descriptor
SamplerDescriptor sampler_descriptor
Definition: snapshot.h:29
impeller::Snapshot::opacity
Scalar opacity
Definition: snapshot.h:35
impeller::TRect< Scalar >::MakeSize
constexpr static TRect MakeSize(const TSize< U > &size)
Definition: rect.h:150
impeller::TSize
Definition: size.h:25
texture_contents.h
vector.h