Flutter Impeller
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 }
TRect< Scalar > Rect
Definition: rect.h:792
IRect64 IRect
Definition: rect.h:795
constexpr bool HasPerspective() const
Definition: matrix.h:352
RoundOut(const TRect< U > &r)
Definition: rect.h:683

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  }
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 }
const std::shared_ptr< LazyGlyphAtlas > & GetLazyGlyphAtlas() const
void scale(DlScalar sx, DlScalar sy) override
static Scalar RoundScaledFontSize(Scalar scale)
Definition: text_frame.cc:41
int32_t x
TPoint< Scalar > Point
Definition: point.h:327
constexpr Color WithAlpha(Scalar new_alpha) const
Definition: color.h:277
static constexpr Matrix MakeTranslation(const Vector3 &t)
Definition: matrix.h:95
Cap stroke_cap
Definition: paint.h:80
Join stroke_join
Definition: paint.h:81
Scalar stroke_miter
Definition: paint.h:82
Style style
Definition: paint.h:83
Color color
Definition: paint.h:74
Scalar stroke_width
Definition: paint.h:79

References impeller::Paint::color, impeller::GlyphProperties::color, impeller::ContentContext::GetLazyGlyphAtlas(), impeller::Paint::kStroke, impeller::Matrix::MakeTranslation(), impeller::TextFrame::RoundScaledFontSize(), scale(), impeller::GlyphProperties::stroke, impeller::Paint::stroke_cap, impeller::GlyphProperties::stroke_cap, impeller::Paint::stroke_join, impeller::GlyphProperties::stroke_join, impeller::Paint::stroke_miter, impeller::GlyphProperties::stroke_miter, impeller::Paint::stroke_width, impeller::GlyphProperties::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 }
static Matrix MakeRotationZ(Radians r)
Definition: matrix.h:223

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 }
constexpr static TRect MakeLTRB(Type left, Type top, Type right, Type bottom)
Definition: rect.h:129
constexpr static TRect MakeMaximum()
Definition: rect.h:188
std::shared_ptr< const fml::Mapping > data
Definition: texture_gles.cc:64

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 }
constexpr Matrix Scale(const Vector3 &s) const
Definition: matrix.h:262

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 }
Color ToColor(const flutter::DlColor &color)

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 }
static Paint::Style ToStyle(flutter::DlDrawStyle style)

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 }
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 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  }
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 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 }
constexpr Matrix Translate(const Vector3 &t) const
Definition: matrix.h:250

References impeller::Matrix::Translate().


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