| Flutter Impeller |

Public Member Functions | List of all members
impeller::FirstPassDispatcher Class Reference

`#include <dl_dispatcher.h>`

Inheritance diagram for impeller::FirstPassDispatcher:

## Public Member Functions
| FirstPassDispatcher (const ContentContext &renderer, const Matrix &initial_matrix, const Rect cull_rect)
| ~FirstPassDispatcher ()
void | save () override
void | saveLayer (const DlRect &bounds, const flutter::SaveLayerOptions options, const flutter::DlImageFilter *backdrop, std::optional< int64_t > backdrop_id) override
void | restore () override
void | translate (DlScalar tx, DlScalar ty) override
void | scale (DlScalar sx, DlScalar sy) override
void | rotate (DlScalar degrees) override
void | skew (DlScalar sx, DlScalar sy) override
void | transform2DAffine (DlScalar mxx, DlScalar mxy, DlScalar mxt, DlScalar myx, DlScalar myy, DlScalar myt) override
void | transformFullPerspective (DlScalar mxx, DlScalar mxy, DlScalar mxz, DlScalar mxt, DlScalar myx, DlScalar myy, DlScalar myz, DlScalar myt, DlScalar mzx, DlScalar mzy, DlScalar mzz, DlScalar mzt, DlScalar mwx, DlScalar mwy, DlScalar mwz, DlScalar mwt) override
void | transformReset () override
void | drawTextFrame (const std::shared_ptr< impeller::TextFrame > &text_frame, DlScalar x, DlScalar y) override
void | drawDisplayList (const sk_sp< flutter::DisplayList > display_list, DlScalar opacity) override
void | setDrawStyle (flutter::DlDrawStyle style) override
void | setColor (flutter::DlColor color) override
void | setStrokeWidth (DlScalar width) override
void | setStrokeMiter (DlScalar limit) override
void | setStrokeCap (flutter::DlStrokeCap cap) override
void | setStrokeJoin (flutter::DlStrokeJoin join) override
void | setImageFilter (const flutter::DlImageFilter *filter) override
std::pair< std::unordered_map< int64_t, BackdropData >, size_t > | TakeBackdropData ()

## Detailed Description

Performs a first pass over the display list to collect infomation. Collects things like text frames and backdrop filters.

Definition at line 301 of file dl_dispatcher.h.

## Constructor & Destructor Documentation

## ◆ FirstPassDispatcher()

impeller::FirstPassDispatcher::FirstPassDispatcher | ( | const ContentContext & | renderer,
|  | const Matrix & | initial_matrix,
|  | const Rect | cull_rect
| ) |  |

Definition at line 1000 of file dl_dispatcher.cc.

1003 : renderer_(renderer), matrix_(initial_matrix) {
1004 cull_rect_state_.push_back(cull_rect);
1005 }

## ◆ ~FirstPassDispatcher()

impeller::FirstPassDispatcher::~FirstPassDispatcher | ( |  | ) |

Definition at line 1007 of file dl_dispatcher.cc.

1007 {
1008 FML_DCHECK(cull_rect_state_.size() == 1);
1009 }

## Member Function Documentation

## ◆ drawDisplayList()

void impeller::FirstPassDispatcher::drawDisplayList | ( | const sk_sp< flutter::DisplayList > | display_list,
|  | DlScalar | opacity
| ) |  |
| override

Definition at line 1150 of file dl_dispatcher.cc.

1152 {
1153 [[maybe_unused]] size_t stack_depth = stack_.size();
1154 save();
1155 Paint old_paint = paint_;
1156 paint_ = Paint{};
1157 bool old_has_image_filter = has_image_filter_;
1158 has_image_filter_ = false;
1159
1160 if (matrix_.HasPerspective()) {
1161 display_list->Dispatch(*this);
1162 } else {
1163 Rect local_cull_bounds = GetCurrentLocalCullingBounds();
1164 if (local_cull_bounds.IsMaximum()) {
1165 display_list->Dispatch(*this);
1166 } else if (!local_cull_bounds.IsEmpty()) {
1167 IRect cull_rect = IRect::RoundOut(local_cull_bounds);
1168 display_list->Dispatch(*this,
1169 SkIRect::MakeLTRB(cull_rect.GetLeft(), //
1170 cull_rect.GetTop(), //
1171 cull_rect.GetRight(), //
1172 cull_rect.GetBottom() //
1173 ));
1174 }
1175 }
1176
1177 restore();
1178 paint_ = old_paint;
1179 has_image_filter_ = old_has_image_filter;
1180 FML_DCHECK(stack_depth == stack_.size());
1181 }

References impeller::TRect< T >::GetBottom(), impeller::TRect< T >::GetLeft(), impeller::TRect< T >::GetRight(), impeller::TRect< T >::GetTop(), impeller::Matrix::HasPerspective(), impeller::TRect< T >::IsEmpty(), impeller::TRect< T >::IsMaximum(), restore(), impeller::TRect< T >::RoundOut(), and save().

## ◆ drawTextFrame()

void impeller::FirstPassDispatcher::drawTextFrame | ( | const std::shared_ptr< impeller::TextFrame > & | text_frame,
|  | DlScalar | x,
|  | DlScalar | y
| ) |  |
| override

Definition at line 1110 of file dl_dispatcher.cc.

1113 {
1114 GlyphProperties properties;
1115 if (paint_.style == Paint::Style::kStroke) {
1116 properties.stroke = true;
1117 properties.stroke_cap = paint_.stroke_cap;
1118 properties.stroke_join = paint_.stroke_join;
1119 properties.stroke_miter = paint_.stroke_miter;
1120 properties.stroke_width = paint_.stroke_width;
1121 }
1122 if (text_frame->HasColor()) {
1123 // Alpha is always applied when rendering, remove it here so
1124 // we do not double-apply the alpha.
1125 properties.color = paint_.color.WithAlpha(1.0);
1126 }
1127 auto scale = TextFrame::RoundScaledFontSize(
1128 (matrix_ * Matrix::MakeTranslation(Point(x, y))).GetMaxBasisLengthXY());
1129
1130 renderer_.GetLazyGlyphAtlas()->AddTextFrame(
1131 text_frame, //
1132 scale, //
1133 Point(x, y), //
1134 matrix_,
1135 (properties.stroke || text_frame->HasColor()) //
1136 ? std::optional<GlyphProperties>(properties) //
1137 : std::nullopt //
1138 );
1139 }

References impeller::GlyphProperties::color, impeller::Paint::color, impeller::ContentContext::GetLazyGlyphAtlas(), impeller::Paint::kStroke, impeller::Matrix::MakeTranslation(), impeller::TextFrame::RoundScaledFontSize(), scale(), impeller::GlyphProperties::stroke, impeller::GlyphProperties::stroke_cap, impeller::Paint::stroke_cap, impeller::GlyphProperties::stroke_join, impeller::Paint::stroke_join, impeller::GlyphProperties::stroke_miter, impeller::Paint::stroke_miter, impeller::GlyphProperties::stroke_width, impeller::Paint::stroke_width, impeller::Paint::style, impeller::Color::WithAlpha(), and x.

## ◆ restore()

void impeller::FirstPassDispatcher::restore | ( |  | ) |
| override

Definition at line 1057 of file dl_dispatcher.cc.

1057 {
1058 matrix_ = stack_.back();
1059 stack_.pop_back();
1060 cull_rect_state_.pop_back();
1061 }

Referenced by drawDisplayList().

## ◆ rotate()

void impeller::FirstPassDispatcher::rotate | ( | DlScalar | degrees | ) |
| override

Definition at line 1071 of file dl_dispatcher.cc.

1071 {
1072 matrix_ = matrix_ * Matrix::MakeRotationZ(Degrees(degrees));
1073 }

References impeller::Matrix::MakeRotationZ().

## ◆ save()

void impeller::FirstPassDispatcher::save | ( |  | ) |
| override

Definition at line 1011 of file dl_dispatcher.cc.

1011 {
1012 stack_.emplace_back(matrix_);
1013 cull_rect_state_.push_back(cull_rect_state_.back());
1014 }

Referenced by drawDisplayList(), and saveLayer().

## ◆ saveLayer()

void impeller::FirstPassDispatcher::saveLayer | ( | const DlRect & | bounds,
|  | const flutter::SaveLayerOptions | options,
|  | const flutter::DlImageFilter * | backdrop,
|  | std::optional< int64_t > | backdrop_id
| ) |  |
| override

Definition at line 1016 of file dl_dispatcher.cc.

1019 {
1020 save();
1021
1022 backdrop_count_ += (backdrop == nullptr ? 0 : 1);
1023 if (backdrop != nullptr && backdrop_id.has_value()) {
1024 std::shared_ptr<flutter::DlImageFilter> shared_backdrop =
1025 backdrop->shared();
1026 std::unordered_map<int64_t, BackdropData>::iterator existing =
1027 backdrop_data_.find(backdrop_id.value());
1028 if (existing == backdrop_data_.end()) {
1029 backdrop_data_[backdrop_id.value()] =
1030 BackdropData{.backdrop_count = 1, .last_backdrop = shared_backdrop};
1031 } else {
1032 BackdropData& data = existing->second;
1033 data.backdrop_count++;
1034 if (data.all_filters_equal) {
1035 data.all_filters_equal = (*data.last_backdrop == *shared_backdrop);
1036 data.last_backdrop = shared_backdrop;
1037 }
1038 }
1039 }
1040
1041 // This dispatcher does not track enough state to accurately compute
1042 // cull rects with image filters.
1043 auto global_cull_rect = cull_rect_state_.back();
1044 if (has_image_filter_ || global_cull_rect.IsMaximum()) {
1045 cull_rect_state_.back() = Rect::MakeMaximum();
1046 } else {
1047 auto global_save_bounds = bounds.TransformBounds(matrix_);
1048 auto new_cull_rect = global_cull_rect.Intersection(global_save_bounds);
1049 if (new_cull_rect.has_value()) {
1050 cull_rect_state_.back() = new_cull_rect.value();
1051 } else {
1052 cull_rect_state_.back() = Rect::MakeLTRB(0, 0, 0, 0);
1053 }
1054 }
1055 }

References impeller::BackdropData::backdrop_count, data, impeller::TRect< Scalar >::MakeLTRB(), impeller::TRect< Scalar >::MakeMaximum(), and save().

## ◆ scale()

void impeller::FirstPassDispatcher::scale | ( | DlScalar | sx,
|  | DlScalar | sy
| ) |  |
| override

Definition at line 1067 of file dl_dispatcher.cc.

1067 {
1068 matrix_ = matrix_.Scale({sx, sy, 1.0f});
1069 }

References impeller::Matrix::Scale().

Referenced by drawTextFrame().

## ◆ setColor()

void impeller::FirstPassDispatcher::setColor | ( | flutter::DlColor | color | ) |
| override

Definition at line 1189 of file dl_dispatcher.cc.

1189 {
1190 paint_.color = skia_conversions::ToColor(color);
1191 }

References impeller::Paint::color, and impeller::skia_conversions::ToColor().

## ◆ setDrawStyle()

void impeller::FirstPassDispatcher::setDrawStyle | ( | flutter::DlDrawStyle | style | ) |
| override

Definition at line 1184 of file dl_dispatcher.cc.

1184 {
1185 paint_.style = ToStyle(style);
1186 }

References impeller::Paint::style, and impeller::ToStyle().

## ◆ setImageFilter()

void impeller::FirstPassDispatcher::setImageFilter | ( | const flutter::DlImageFilter * | filter | ) |
| override

Definition at line 1234 of file dl_dispatcher.cc.

1234 {
1235 if (filter == nullptr) {
1236 has_image_filter_ = false;
1237 } else {
1238 has_image_filter_ = true;
1239 }
1240 }

## ◆ setStrokeCap()

void impeller::FirstPassDispatcher::setStrokeCap | ( | flutter::DlStrokeCap | cap | ) |
| override

Definition at line 1204 of file dl_dispatcher.cc.

1204 {
1205 switch (cap) {
1206 case flutter::DlStrokeCap::kButt:
1207 paint_.stroke_cap = Cap::kButt;
1208 break;
1209 case flutter::DlStrokeCap::kRound:
1210 paint_.stroke_cap = Cap::kRound;
1211 break;
1212 case flutter::DlStrokeCap::kSquare:
1213 paint_.stroke_cap = Cap::kSquare;
1214 break;
1215 }
1216 }

References impeller::kButt, impeller::kRound, impeller::kSquare, and impeller::Paint::stroke_cap.

## ◆ setStrokeJoin()

void impeller::FirstPassDispatcher::setStrokeJoin | ( | flutter::DlStrokeJoin | join | ) |
| override

Definition at line 1219 of file dl_dispatcher.cc.

1219 {
1220 switch (join) {
1221 case flutter::DlStrokeJoin::kMiter:
1222 paint_.stroke_join = Join::kMiter;
1223 break;
1224 case flutter::DlStrokeJoin::kRound:
1225 paint_.stroke_join = Join::kRound;
1226 break;
1227 case flutter::DlStrokeJoin::kBevel:
1228 paint_.stroke_join = Join::kBevel;
1229 break;
1230 }
1231 }

References impeller::kBevel, impeller::kMiter, impeller::kRound, and impeller::Paint::stroke_join.

## ◆ setStrokeMiter()

void impeller::FirstPassDispatcher::setStrokeMiter | ( | DlScalar | limit | ) |
| override

Definition at line 1199 of file dl_dispatcher.cc.

1199 {
1200 paint_.stroke_miter = limit;
1201 }

References impeller::Paint::stroke_miter.

## ◆ setStrokeWidth()

void impeller::FirstPassDispatcher::setStrokeWidth | ( | DlScalar | width | ) |
| override

Definition at line 1194 of file dl_dispatcher.cc.

1194 {
1195 paint_.stroke_width = width;
1196 }

References impeller::Paint::stroke_width.

## ◆ skew()

void impeller::FirstPassDispatcher::skew | ( | DlScalar | sx,
|  | DlScalar | sy
| ) |  |
| override

Definition at line 1075 of file dl_dispatcher.cc.

1075 {
1076 matrix_ = matrix_ * Matrix::MakeSkew(sx, sy);
1077 }

References impeller::Matrix::MakeSkew().

## ◆ TakeBackdropData()

std::pair< std::unordered_map< int64_t, BackdropData >, size_t > impeller::FirstPassDispatcher::TakeBackdropData | ( |  | ) |

Definition at line 1243 of file dl_dispatcher.cc.

1243 {
1244 std::unordered_map<int64_t, BackdropData> temp;
1245 std::swap(temp, backdrop_data_);
1246 return std::make_pair(temp, backdrop_count_);
1247 }

Referenced by impeller::DisplayListToTexture(), and impeller::RenderToTarget().

## ◆ transform2DAffine()

void impeller::FirstPassDispatcher::transform2DAffine | ( | DlScalar | mxx,
|  | DlScalar | mxy,
|  | DlScalar | mxt,
|  | DlScalar | myx,
|  | DlScalar | myy,
|  | DlScalar | myt
| ) |  |
| override

Definition at line 1081 of file dl_dispatcher.cc.

1082 {
1083 matrix_ = matrix_ * Matrix::MakeColumn(
1084 mxx, myx, 0.0f, 0.0f,
1085 mxy, myy, 0.0f, 0.0f,
1086 0.0f, 0.0f, 1.0f, 0.0f,
1087 mxt, myt, 0.0f, 1.0f
1088 );
1089 }

References impeller::Matrix::MakeColumn().

## ◆ transformFullPerspective()

void impeller::FirstPassDispatcher::transformFullPerspective | ( | DlScalar | mxx,
|  | DlScalar | mxy,
|  | DlScalar | mxz,
|  | DlScalar | mxt,
|  | DlScalar | myx,
|  | DlScalar | myy,
|  | DlScalar | myz,
|  | DlScalar | myt,
|  | DlScalar | mzx,
|  | DlScalar | mzy,
|  | DlScalar | mzz,
|  | DlScalar | mzt,
|  | DlScalar | mwx,
|  | DlScalar | mwy,
|  | DlScalar | mwz,
|  | DlScalar | mwt
| ) |  |
| override

Definition at line 1092 of file dl_dispatcher.cc.

1096 {
1097 matrix_ = matrix_ * Matrix::MakeColumn(
1098 mxx, myx, mzx, mwx,
1099 mxy, myy, mzy, mwy,
1100 mxz, myz, mzz, mwz,
1101 mxt, myt, mzt, mwt
1102 );
1103 }

References impeller::Matrix::MakeColumn().

## ◆ transformReset()

void impeller::FirstPassDispatcher::transformReset | ( |  | ) |
| override

Definition at line 1106 of file dl_dispatcher.cc.

1106 {
1107 matrix_ = Matrix();
1108 }

## ◆ translate()

void impeller::FirstPassDispatcher::translate | ( | DlScalar | tx,
|  | DlScalar | ty
| ) |  |
| override

Definition at line 1063 of file dl_dispatcher.cc.

1063 {
1064 matrix_ = matrix_.Translate({tx, ty});
1065 }

References impeller::Matrix::Translate().

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

- impeller/display_list/dl_dispatcher.h
- impeller/display_list/dl_dispatcher.cc

impeller::Matrix::MakeSkew
static constexpr Matrix MakeSkew(Scalar sx, Scalar sy)
Definition: matrix.h:127
impeller::Paint::stroke_cap
Cap stroke_cap
Definition: paint.h:80
impeller::Matrix::HasPerspective
constexpr bool HasPerspective() const
Definition: matrix.h:352
impeller::Cap::kRound
@ kRound
impeller::Cap::kSquare
@ kSquare
impeller::ContentContext::GetLazyGlyphAtlas
const std::shared_ptr< LazyGlyphAtlas > & GetLazyGlyphAtlas() const
Definition: content_context.h:834
impeller::Paint::Style::kStroke
@ kStroke
data
std::shared_ptr< const fml::Mapping > data
Definition: texture_gles.cc:64
impeller::Paint::color
Color color
Definition: paint.h:74
impeller::skia_conversions::ToColor
Color ToColor(const flutter::DlColor &color)
Definition: skia_conversions.cc:89
impeller::FirstPassDispatcher::scale
void scale(DlScalar sx, DlScalar sy) override
Definition: dl_dispatcher.cc:1067
impeller::Cap::kButt
@ kButt
impeller::Matrix::MakeTranslation
static constexpr Matrix MakeTranslation(const Vector3 &t)
Definition: matrix.h:95
x
int32_t x
Definition: dl_golden_unittests.cc:443
impeller::Join::kMiter
@ kMiter
impeller::Paint::stroke_miter
Scalar stroke_miter
Definition: paint.h:82
impeller::TRect::RoundOut
RoundOut(const TRect< U > &r)
Definition: rect.h:683
impeller::TextFrame::RoundScaledFontSize
static Scalar RoundScaledFontSize(Scalar scale)
Definition: text_frame.cc:54
impeller::Point
TPoint< Scalar > Point
Definition: point.h:327
impeller::Paint::style
Style style
Definition: paint.h:83
impeller::Color::WithAlpha
constexpr Color WithAlpha(Scalar new_alpha) const
Definition: color.h:277
impeller::ToStyle
static Paint::Style ToStyle(flutter::DlDrawStyle style)
Definition: dl_dispatcher.cc:146
impeller::Matrix::Translate
constexpr Matrix Translate(const Vector3 &t) const
Definition: matrix.h:250
impeller::Matrix::MakeColumn
static constexpr Matrix MakeColumn(Scalar m0, Scalar m1, Scalar m2, Scalar m3, Scalar m4, Scalar m5, Scalar m6, Scalar m7, Scalar m8, Scalar m9, Scalar m10, Scalar m11, Scalar m12, Scalar m13, Scalar m14, Scalar m15)
Definition: matrix.h:69
impeller::Rect
TRect< Scalar > Rect
Definition: rect.h:792
impeller::Join::kRound
@ kRound
impeller::Join::kBevel
@ kBevel
impeller::Matrix::MakeRotationZ
static Matrix MakeRotationZ(Radians r)
Definition: matrix.h:223
impeller::TRect< Scalar >::MakeMaximum
constexpr static TRect MakeMaximum()
Definition: rect.h:188
impeller::FirstPassDispatcher::restore
void restore() override
Definition: dl_dispatcher.cc:1057
impeller::IRect
IRect64 IRect
Definition: rect.h:795
impeller::TRect< Scalar >::MakeLTRB
constexpr static TRect MakeLTRB(Type left, Type top, Type right, Type bottom)
Definition: rect.h:129
impeller::Paint::stroke_width
Scalar stroke_width
Definition: paint.h:79
impeller::FirstPassDispatcher::save
void save() override
Definition: dl_dispatcher.cc:1011
impeller::Matrix::Scale
constexpr Matrix Scale(const Vector3 &s) const
Definition: matrix.h:262
impeller::Paint::stroke_join
Join stroke_join
Definition: paint.h:81