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

987 : renderer_(renderer), matrix_(initial_matrix) {
988 cull_rect_state_.push_back(cull_rect);
989 }

## ◆ ~FirstPassDispatcher()

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

Definition at line 991 of file dl_dispatcher.cc.

991 {
992 FML_DCHECK(cull_rect_state_.size() == 1);
993 }

## Member Function Documentation

## ◆ drawDisplayList()

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

Definition at line 1130 of file dl_dispatcher.cc.

1132 {
1133 [[maybe_unused]] size_t stack_depth = stack_.size();
1134 save();
1135 Paint old_paint = paint_;
1136 paint_ = Paint{};
1137 bool old_has_image_filter = has_image_filter_;
1138 has_image_filter_ = false;
1139
1140 if (matrix_.HasPerspective()) {
1141 display_list->Dispatch(*this);
1142 } else {
1143 Rect local_cull_bounds = GetCurrentLocalCullingBounds();
1144 if (local_cull_bounds.IsMaximum()) {
1145 display_list->Dispatch(*this);
1146 } else if (!local_cull_bounds.IsEmpty()) {
1147 DlIRect cull_rect = DlIRect::RoundOut(local_cull_bounds);
1148 display_list->Dispatch(*this, cull_rect);
1149 }
1150 }
1151
1152 restore();
1153 paint_ = old_paint;
1154 has_image_filter_ = old_has_image_filter;
1155 FML_DCHECK(stack_depth == stack_.size());
1156 }
impeller::FirstPassDispatcher::save
void save() override
Definition: dl_dispatcher.cc:995
impeller::FirstPassDispatcher::restore
void restore() override
Definition: dl_dispatcher.cc:1041
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().

## ◆ drawTextFrame()

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

Definition at line 1094 of file dl_dispatcher.cc.

1097 {
1098 GlyphProperties properties;
1099 if (paint_.style == Paint::Style::kStroke) {
1100 properties.stroke = paint_.stroke;
1101 }
1102 if (text_frame->HasColor()) {
1103 // Alpha is always applied when rendering, remove it here so
1104 // we do not double-apply the alpha.
1105 properties.color = paint_.color.WithAlpha(1.0);
1106 }
1107 auto scale = TextFrame::RoundScaledFontSize(
1108 (matrix_ * Matrix::MakeTranslation(Point(x, y))).GetMaxBasisLengthXY());
1109
1110 renderer_.GetLazyGlyphAtlas()->AddTextFrame(
1111 text_frame, //
1112 scale, //
1113 Point(x, y), //
1114 matrix_,
1115 (properties.stroke.has_value() || text_frame->HasColor()) //
1116 ? std::optional<GlyphProperties>(properties) //
1117 : std::nullopt //
1118 );
1119 }
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:1051
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 1041 of file dl_dispatcher.cc.

1041 {
1042 matrix_ = stack_.back();
1043 stack_.pop_back();
1044 cull_rect_state_.pop_back();
1045 }

Referenced by drawDisplayList().

## ◆ rotate()

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

Definition at line 1055 of file dl_dispatcher.cc.

1055 {
1056 matrix_ = matrix_ * Matrix::MakeRotationZ(Degrees(degrees));
1057 }
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 995 of file dl_dispatcher.cc.

995 {
996 stack_.emplace_back(matrix_);
997 cull_rect_state_.push_back(cull_rect_state_.back());
998 }

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

1003 {
1004 save();
1005
1006 backdrop_count_ += (backdrop == nullptr ? 0 : 1);
1007 if (backdrop != nullptr && backdrop_id.has_value()) {
1008 std::shared_ptr<flutter::DlImageFilter> shared_backdrop =
1009 backdrop->shared();
1010 std::unordered_map<int64_t, BackdropData>::iterator existing =
1011 backdrop_data_.find(backdrop_id.value());
1012 if (existing == backdrop_data_.end()) {
1013 backdrop_data_[backdrop_id.value()] =
1014 BackdropData{.backdrop_count = 1, .last_backdrop = shared_backdrop};
1015 } else {
1016 BackdropData& data = existing->second;
1017 data.backdrop_count++;
1018 if (data.all_filters_equal) {
1019 data.all_filters_equal = (*data.last_backdrop == *shared_backdrop);
1020 data.last_backdrop = shared_backdrop;
1021 }
1022 }
1023 }
1024
1025 // This dispatcher does not track enough state to accurately compute
1026 // cull rects with image filters.
1027 auto global_cull_rect = cull_rect_state_.back();
1028 if (has_image_filter_ || global_cull_rect.IsMaximum()) {
1029 cull_rect_state_.back() = Rect::MakeMaximum();
1030 } else {
1031 auto global_save_bounds = bounds.TransformBounds(matrix_);
1032 auto new_cull_rect = global_cull_rect.Intersection(global_save_bounds);
1033 if (new_cull_rect.has_value()) {
1034 cull_rect_state_.back() = new_cull_rect.value();
1035 } else {
1036 cull_rect_state_.back() = Rect::MakeLTRB(0, 0, 0, 0);
1037 }
1038 }
1039 }
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 1051 of file dl_dispatcher.cc.

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

References impeller::Matrix::Scale().

Referenced by drawTextFrame().

## ◆ setColor()

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

Definition at line 1164 of file dl_dispatcher.cc.

1164 {
1165 paint_.color = skia_conversions::ToColor(color);
1166 }
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 1159 of file dl_dispatcher.cc.

1159 {
1160 paint_.style = ToStyle(style);
1161 }
impeller::ToStyle
static Paint::Style ToStyle(flutter::DlDrawStyle style)
Definition: dl_dispatcher.cc:153

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

## ◆ setImageFilter()

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

Definition at line 1209 of file dl_dispatcher.cc.

1209 {
1210 if (filter == nullptr) {
1211 has_image_filter_ = false;
1212 } else {
1213 has_image_filter_ = true;
1214 }
1215 }

## ◆ setStrokeCap()

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

Definition at line 1179 of file dl_dispatcher.cc.

1179 {
1180 switch (cap) {
1181 case flutter::DlStrokeCap::kButt:
1182 paint_.stroke.cap = Cap::kButt;
1183 break;
1184 case flutter::DlStrokeCap::kRound:
1185 paint_.stroke.cap = Cap::kRound;
1186 break;
1187 case flutter::DlStrokeCap::kSquare:
1188 paint_.stroke.cap = Cap::kSquare;
1189 break;
1190 }
1191 }
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 1194 of file dl_dispatcher.cc.

1194 {
1195 switch (join) {
1196 case flutter::DlStrokeJoin::kMiter:
1197 paint_.stroke.join = Join::kMiter;
1198 break;
1199 case flutter::DlStrokeJoin::kRound:
1200 paint_.stroke.join = Join::kRound;
1201 break;
1202 case flutter::DlStrokeJoin::kBevel:
1203 paint_.stroke.join = Join::kBevel;
1204 break;
1205 }
1206 }
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 1174 of file dl_dispatcher.cc.

1174 {
1175 paint_.stroke.miter_limit = limit;
1176 }
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 1169 of file dl_dispatcher.cc.

1169 {
1170 paint_.stroke.width = width;
1171 }
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 1059 of file dl_dispatcher.cc.

1059 {
1060 matrix_ = matrix_ * Matrix::MakeSkew(sx, sy);
1061 }
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 1218 of file dl_dispatcher.cc.

1218 {
1219 std::unordered_map<int64_t, BackdropData> temp;
1220 std::swap(temp, backdrop_data_);
1221 return std::make_pair(temp, backdrop_count_);
1222 }

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

1066 {
1067 matrix_ = matrix_ * Matrix::MakeColumn(
1068 mxx, myx, 0.0f, 0.0f,
1069 mxy, myy, 0.0f, 0.0f,
1070 0.0f, 0.0f, 1.0f, 0.0f,
1071 mxt, myt, 0.0f, 1.0f
1072 );
1073 }
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 1076 of file dl_dispatcher.cc.

1080 {
1081 matrix_ = matrix_ * Matrix::MakeColumn(
1082 mxx, myx, mzx, mwx,
1083 mxy, myy, mzy, mwy,
1084 mxz, myz, mzz, mwz,
1085 mxt, myt, mzt, mwt
1086 );
1087 }

References impeller::Matrix::MakeColumn().

## ◆ transformReset()

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

Definition at line 1090 of file dl_dispatcher.cc.

1090 {
1091 matrix_ = Matrix();
1092 }

## ◆ translate()

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

Definition at line 1047 of file dl_dispatcher.cc.

1047 {
1048 matrix_ = matrix_.Translate({tx, ty});
1049 }
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