| 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 | drawText (const std::shared_ptr< flutter::DlText > &text, 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 311 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 966 of file dl_dispatcher.cc.

969 : renderer_(renderer), matrix_(initial_matrix) {
970 cull_rect_state_.push_back(cull_rect);
971 }

## ◆ ~FirstPassDispatcher()

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

Definition at line 973 of file dl_dispatcher.cc.

973 {
974 FML_DCHECK(cull_rect_state_.size() == 1);
975 }

## Member Function Documentation

## ◆ drawDisplayList()

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

Definition at line 1120 of file dl_dispatcher.cc.

1122 {
1123 [[maybe_unused]] size_t stack_depth = stack_.size();
1124 save();
1125 Paint old_paint = paint_;
1126 paint_ = Paint{};
1127 bool old_has_image_filter = has_image_filter_;
1128 has_image_filter_ = false;
1129
1130 if (matrix_.HasPerspective()) {
1131 display_list->Dispatch(*this);
1132 } else {
1133 Rect local_cull_bounds = GetCurrentLocalCullingBounds();
1134 if (local_cull_bounds.IsMaximum()) {
1135 display_list->Dispatch(*this);
1136 } else if (!local_cull_bounds.IsEmpty()) {
1137 DlIRect cull_rect = DlIRect::RoundOut(local_cull_bounds);
1138 display_list->Dispatch(*this, cull_rect);
1139 }
1140 }
1141
1142 restore();
1143 paint_ = old_paint;
1144 has_image_filter_ = old_has_image_filter;
1145 FML_DCHECK(stack_depth == stack_.size());
1146 }
impeller::FirstPassDispatcher::save
void save() override
Definition: dl_dispatcher.cc:977
impeller::FirstPassDispatcher::restore
void restore() override
Definition: dl_dispatcher.cc:1023
impeller::DlIRect
flutter::DlIRect DlIRect
Definition: dl_dispatcher.h:26
impeller::Rect
TRect< Scalar > Rect
Definition: rect.h:792
impeller::Matrix::HasPerspective
constexpr bool HasPerspective() const
Definition: matrix.h:418

References impeller::Matrix::HasPerspective(), impeller::TRect< T >::IsEmpty(), impeller::TRect< T >::IsMaximum(), restore(), and save().

## ◆ drawText()

void impeller::FirstPassDispatcher::drawText | ( | const std::shared_ptr< flutter::DlText > & | text,
|  | DlScalar | x,
|  | DlScalar | y
| ) |  |
| override

Definition at line 1079 of file dl_dispatcher.cc.

1081 {
1082 GlyphProperties properties;
1083 auto text_frame = text->GetTextFrame();
1084 if (text_frame == nullptr) {
1085 return;
1086 }
1087
1088 if (paint_.style == Paint::Style::kStroke) {
1089 properties.stroke = paint_.stroke;
1090 }
1091
1092 if (text_frame->HasColor()) {
1093 // Alpha is always applied when rendering, remove it here so
1094 // we do not double-apply the alpha.
1095 properties.color = paint_.color.WithAlpha(1.0);
1096 }
1097 auto scale = TextFrame::RoundScaledFontSize(
1098 (matrix_ * Matrix::MakeTranslation(Point(x, y))).GetMaxBasisLengthXY());
1099
1100 renderer_.GetLazyGlyphAtlas()->AddTextFrame(
1101 text_frame, //
1102 scale, //
1103 Point(x, y), //
1104 matrix_,
1105 (properties.stroke.has_value() || text_frame->HasColor()) //
1106 ? std::optional<GlyphProperties>(properties) //
1107 : std::nullopt //
1108 );
1109 }
impeller::ContentContext::GetLazyGlyphAtlas
const std::shared_ptr< LazyGlyphAtlas > & GetLazyGlyphAtlas() const
Definition: content_context.h:265
impeller::FirstPassDispatcher::scale
void scale(DlScalar sx, DlScalar sy) override
Definition: dl_dispatcher.cc:1033
impeller::TextFrame::RoundScaledFontSize
static Rational RoundScaledFontSize(Scalar scale)
Definition: text_frame.cc:55
x
int32_t x
Definition: dl_golden_unittests.cc:458
impeller::Point
TPoint< Scalar > Point
Definition: point.h:327
impeller::Color::WithAlpha
constexpr Color WithAlpha(Scalar new_alpha) const
Definition: color.h:278
impeller::Matrix::MakeTranslation
static constexpr Matrix MakeTranslation(const Vector3 &t)
Definition: matrix.h:95
impeller::Paint::Style::kStroke
@ kStroke
impeller::Paint::style
Style style
Definition: paint.h:81
impeller::Paint::color
Color color
Definition: paint.h:75
impeller::Paint::stroke
StrokeParameters stroke
Definition: paint.h:80

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

## ◆ restore()

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

Definition at line 1023 of file dl_dispatcher.cc.

1023 {
1024 matrix_ = stack_.back();
1025 stack_.pop_back();
1026 cull_rect_state_.pop_back();
1027 }

Referenced by drawDisplayList().

## ◆ rotate()

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

Definition at line 1037 of file dl_dispatcher.cc.

1037 {
1038 matrix_ = matrix_ * Matrix::MakeRotationZ(Degrees(degrees));
1039 }
impeller::Matrix::MakeRotationZ
static Matrix MakeRotationZ(Radians r)
Definition: matrix.h:223

References impeller::Matrix::MakeRotationZ().

## ◆ save()

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

Definition at line 977 of file dl_dispatcher.cc.

977 {
978 stack_.emplace_back(matrix_);
979 cull_rect_state_.push_back(cull_rect_state_.back());
980 }

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 982 of file dl_dispatcher.cc.

985 {
986 save();
987
988 backdrop_count_ += (backdrop == nullptr ? 0 : 1);
989 if (backdrop != nullptr && backdrop_id.has_value()) {
990 std::shared_ptr<flutter::DlImageFilter> shared_backdrop =
991 backdrop->shared();
992 std::unordered_map<int64_t, BackdropData>::iterator existing =
993 backdrop_data_.find(backdrop_id.value());
994 if (existing == backdrop_data_.end()) {
995 backdrop_data_[backdrop_id.value()] =
996 BackdropData{.backdrop_count = 1, .last_backdrop = shared_backdrop};
997 } else {
998 BackdropData& data = existing->second;
999 data.backdrop_count++;
1000 if (data.all_filters_equal) {
1001 data.all_filters_equal = (*data.last_backdrop == *shared_backdrop);
1002 data.last_backdrop = shared_backdrop;
1003 }
1004 }
1005 }
1006
1007 // This dispatcher does not track enough state to accurately compute
1008 // cull rects with image filters.
1009 auto global_cull_rect = cull_rect_state_.back();
1010 if (has_image_filter_ || global_cull_rect.IsMaximum()) {
1011 cull_rect_state_.back() = Rect::MakeMaximum();
1012 } else {
1013 auto global_save_bounds = bounds.TransformBounds(matrix_);
1014 auto new_cull_rect = global_cull_rect.Intersection(global_save_bounds);
1015 if (new_cull_rect.has_value()) {
1016 cull_rect_state_.back() = new_cull_rect.value();
1017 } else {
1018 cull_rect_state_.back() = Rect::MakeLTRB(0, 0, 0, 0);
1019 }
1020 }
1021 }
impeller::TRect< Scalar >::MakeLTRB
constexpr static TRect MakeLTRB(Type left, Type top, Type right, Type bottom)
Definition: rect.h:129
impeller::TRect< Scalar >::MakeMaximum
constexpr static TRect MakeMaximum()
Definition: rect.h:188
data
std::shared_ptr< const fml::Mapping > data
Definition: texture_gles.cc:68

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 1033 of file dl_dispatcher.cc.

1033 {
1034 matrix_ = matrix_.Scale({sx, sy, 1.0f});
1035 }
impeller::Matrix::Scale
constexpr Matrix Scale(const Vector3 &s) const
Definition: matrix.h:275

References impeller::Matrix::Scale().

Referenced by drawText().

## ◆ setColor()

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

Definition at line 1154 of file dl_dispatcher.cc.

1154 {
1155 paint_.color = skia_conversions::ToColor(color);
1156 }
impeller::skia_conversions::ToColor
Color ToColor(const flutter::DlColor &color)
Definition: skia_conversions.cc:13

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

## ◆ setDrawStyle()

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

Definition at line 1149 of file dl_dispatcher.cc.

1149 {
1150 paint_.style = ToStyle(style);
1151 }
impeller::ToStyle
static Paint::Style ToStyle(flutter::DlDrawStyle style)
Definition: dl_dispatcher.cc:154

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

## ◆ setImageFilter()

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

Definition at line 1199 of file dl_dispatcher.cc.

1199 {
1200 if (filter == nullptr) {
1201 has_image_filter_ = false;
1202 } else {
1203 has_image_filter_ = true;
1204 }
1205 }

## ◆ setStrokeCap()

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

Definition at line 1169 of file dl_dispatcher.cc.

1169 {
1170 switch (cap) {
1171 case flutter::DlStrokeCap::kButt:
1172 paint_.stroke.cap = Cap::kButt;
1173 break;
1174 case flutter::DlStrokeCap::kRound:
1175 paint_.stroke.cap = Cap::kRound;
1176 break;
1177 case flutter::DlStrokeCap::kSquare:
1178 paint_.stroke.cap = Cap::kSquare;
1179 break;
1180 }
1181 }
impeller::Cap::kRound
@ kRound
impeller::Cap::kButt
@ kButt
impeller::Cap::kSquare
@ kSquare
impeller::StrokeParameters::cap
Cap cap
Definition: stroke_parameters.h:30

References impeller::StrokeParameters::cap, impeller::kButt, impeller::kRound, impeller::kSquare, and impeller::Paint::stroke.

## ◆ setStrokeJoin()

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

Definition at line 1184 of file dl_dispatcher.cc.

1184 {
1185 switch (join) {
1186 case flutter::DlStrokeJoin::kMiter:
1187 paint_.stroke.join = Join::kMiter;
1188 break;
1189 case flutter::DlStrokeJoin::kRound:
1190 paint_.stroke.join = Join::kRound;
1191 break;
1192 case flutter::DlStrokeJoin::kBevel:
1193 paint_.stroke.join = Join::kBevel;
1194 break;
1195 }
1196 }
impeller::Join::kRound
@ kRound
impeller::Join::kMiter
@ kMiter
impeller::Join::kBevel
@ kBevel
impeller::StrokeParameters::join
Join join
Definition: stroke_parameters.h:31

References impeller::StrokeParameters::join, impeller::kBevel, impeller::kMiter, impeller::kRound, and impeller::Paint::stroke.

## ◆ setStrokeMiter()

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

Definition at line 1164 of file dl_dispatcher.cc.

1164 {
1165 paint_.stroke.miter_limit = limit;
1166 }
impeller::StrokeParameters::miter_limit
Scalar miter_limit
Definition: stroke_parameters.h:32

References impeller::StrokeParameters::miter_limit, and impeller::Paint::stroke.

## ◆ setStrokeWidth()

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

Definition at line 1159 of file dl_dispatcher.cc.

1159 {
1160 paint_.stroke.width = width;
1161 }
impeller::StrokeParameters::width
Scalar width
Definition: stroke_parameters.h:29

References impeller::Paint::stroke, and impeller::StrokeParameters::width.

## ◆ skew()

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

Definition at line 1041 of file dl_dispatcher.cc.

1041 {
1042 matrix_ = matrix_ * Matrix::MakeSkew(sx, sy);
1043 }
impeller::Matrix::MakeSkew
static constexpr Matrix MakeSkew(Scalar sx, Scalar sy)
Definition: matrix.h:127

References impeller::Matrix::MakeSkew().

## ◆ TakeBackdropData()

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

Definition at line 1208 of file dl_dispatcher.cc.

1208 {
1209 std::unordered_map<int64_t, BackdropData> temp;
1210 std::swap(temp, backdrop_data_);
1211 return std::make_pair(temp, backdrop_count_);
1212 }

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 1047 of file dl_dispatcher.cc.

1049 {
1050 matrix_ = matrix_ * Matrix::MakeColumn(
1051 mxx, myx, 0.0f, 0.0f,
1052 mxy, myy, 0.0f, 0.0f,
1053 0.0f, 0.0f, 1.0f, 0.0f,
1054 mxt, myt, 0.0f, 1.0f
1055 );
1056 }
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

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 1061 of file dl_dispatcher.cc.

1065 {
1066 matrix_ = matrix_ * Matrix::MakeColumn(
1067 mxx, myx, mzx, mwx,
1068 mxy, myy, mzy, mwy,
1069 mxz, myz, mzz, mwz,
1070 mxt, myt, mzt, mwt
1071 );
1072 }

References impeller::Matrix::MakeColumn().

## ◆ transformReset()

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

Definition at line 1075 of file dl_dispatcher.cc.

1075 {
1076 matrix_ = Matrix();
1077 }

## ◆ translate()

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

Definition at line 1029 of file dl_dispatcher.cc.

1029 {
1030 matrix_ = matrix_.Translate({tx, ty});
1031 }
impeller::Matrix::Translate
constexpr Matrix Translate(const Vector3 &t) const
Definition: matrix.h:263

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