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 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 }
flutter::DlIRect DlIRect
Definition: dl_dispatcher.h:26
TRect< Scalar > Rect
Definition: rect.h:792
constexpr bool HasPerspective() const
Definition: matrix.h:365

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  }
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 }
const std::shared_ptr< LazyGlyphAtlas > & GetLazyGlyphAtlas() const
void scale(DlScalar sx, DlScalar sy) override
static Rational RoundScaledFontSize(Scalar scale)
Definition: text_frame.cc:55
int32_t x
TPoint< Scalar > Point
Definition: point.h:327
constexpr Color WithAlpha(Scalar new_alpha) const
Definition: color.h:278
static constexpr Matrix MakeTranslation(const Vector3 &t)
Definition: matrix.h:95
Style style
Definition: paint.h:81
Color color
Definition: paint.h:75
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 }
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 }
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: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 }
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 }
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 1159 of file dl_dispatcher.cc.

1159  {
1160  paint_.style = ToStyle(style);
1161 }
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 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 }

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 }

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 }

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 }

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 }
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  }
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 }
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: