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 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 information that will be useful in a second pass by the CanvasDlDispatcher. This class collects things like text frames and backdrop filters.

Definition at line 345 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 1117 of file dl_dispatcher.cc.

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

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 
1098  renderer_.GetLazyGlyphAtlas()->AddTextFrame(
1099  text_frame, //
1100  Point(x, y), //
1101  matrix_,
1102  (properties.stroke.has_value() || text_frame->HasColor()) //
1103  ? std::optional<GlyphProperties>(properties) //
1104  : std::nullopt //
1105  );
1106 }
const std::shared_ptr< LazyGlyphAtlas > & GetLazyGlyphAtlas() const
int32_t x
TPoint< Scalar > Point
Definition: point.h:426
constexpr Color WithAlpha(Scalar new_alpha) const
Definition: color.h:278
Style style
Definition: paint.h:82
Color color
Definition: paint.h:76
StrokeParameters stroke
Definition: paint.h:81

References impeller::Paint::color, impeller::GlyphProperties::color, impeller::ContentContext::GetLazyGlyphAtlas(), impeller::Paint::kStroke, 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 }
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 }
constexpr static TRect MakeLTRB(Type left, Type top, Type right, Type bottom)
Definition: rect.h:129
constexpr static TRect MakeMaximum()
Definition: rect.h:188

References impeller::BackdropData::all_filters_equal, impeller::BackdropData::backdrop_count, impeller::BackdropData::last_backdrop, 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 }
constexpr Matrix Scale(const Vector3 &s) const
Definition: matrix.h:275

References impeller::Matrix::Scale().

◆ setColor()

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

Definition at line 1151 of file dl_dispatcher.cc.

1151  {
1152  paint_.color = skia_conversions::ToColor(color);
1153 }
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 1146 of file dl_dispatcher.cc.

1146  {
1147  paint_.style = ToStyle(style);
1148 }
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 1196 of file dl_dispatcher.cc.

1196  {
1197  if (filter == nullptr) {
1198  has_image_filter_ = false;
1199  } else {
1200  has_image_filter_ = true;
1201  }
1202 }

◆ setStrokeCap()

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

Definition at line 1166 of file dl_dispatcher.cc.

1166  {
1167  switch (cap) {
1168  case flutter::DlStrokeCap::kButt:
1169  paint_.stroke.cap = Cap::kButt;
1170  break;
1171  case flutter::DlStrokeCap::kRound:
1172  paint_.stroke.cap = Cap::kRound;
1173  break;
1174  case flutter::DlStrokeCap::kSquare:
1175  paint_.stroke.cap = Cap::kSquare;
1176  break;
1177  }
1178 }

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

1181  {
1182  switch (join) {
1183  case flutter::DlStrokeJoin::kMiter:
1184  paint_.stroke.join = Join::kMiter;
1185  break;
1186  case flutter::DlStrokeJoin::kRound:
1187  paint_.stroke.join = Join::kRound;
1188  break;
1189  case flutter::DlStrokeJoin::kBevel:
1190  paint_.stroke.join = Join::kBevel;
1191  break;
1192  }
1193 }

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

1161  {
1162  paint_.stroke.miter_limit = limit;
1163 }

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

◆ setStrokeWidth()

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

Definition at line 1156 of file dl_dispatcher.cc.

1156  {
1157  paint_.stroke.width = width;
1158 }

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

1211  {
1212  std::unordered_map<int64_t, BackdropData> temp;
1213  std::swap(temp, backdrop_data_);
1214  return std::make_pair(temp, backdrop_count_);
1215 }

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