Flutter Impeller
impeller::skia_conversions Namespace Reference

Functions

Rect ToRect (const SkRect &rect)
 
std::optional< RectToRect (const SkRect *rect)
 
std::vector< RectToRects (const SkRect tex[], int count)
 
std::vector< PointToPoints (const SkPoint points[], int count)
 
PathBuilder::RoundingRadii ToRoundingRadii (const SkRRect &rrect)
 
Path ToPath (const SkPath &path, Point shift)
 
Path ToPath (const SkRRect &rrect)
 
Point ToPoint (const SkPoint &point)
 
Size ToSize (const SkPoint &point)
 
Color ToColor (const flutter::DlColor &color)
 
std::vector< MatrixToRSXForms (const SkRSXform xform[], int count)
 
Path PathDataFromTextBlob (const sk_sp< SkTextBlob > &blob, Point shift)
 
std::optional< impeller::PixelFormatToPixelFormat (SkColorType type)
 
void ConvertStops (const flutter::DlGradientColorSourceBase *gradient, std::vector< Color > &colors, std::vector< float > &stops)
 Convert display list colors + stops into impeller colors and stops, taking care to ensure that the stops monotonically increase from 0.0 to 1.0. More...
 

Function Documentation

◆ ConvertStops()

void impeller::skia_conversions::ConvertStops ( const flutter::DlGradientColorSourceBase *  gradient,
std::vector< Color > &  colors,
std::vector< float > &  stops 
)

Convert display list colors + stops into impeller colors and stops, taking care to ensure that the stops monotonically increase from 0.0 to 1.0.

The general process is:

  • Ensure that the first gradient stop value is 0.0. If not, insert a new stop with a value of 0.0 and use the first gradient color as this new stops color.
  • Ensure the last gradient stop value is 1.0. If not, insert a new stop with a value of 1.0 and use the last gradient color as this stops color.
  • Clamp all gradient values between the values of 0.0 and 1.0.
  • For all stop values, ensure that the values are monotonically increasing by clamping each value to a minimum of the previous stop value and itself. For example, with stop values of 0.0, 0.5, 0.4, 1.0, we would clamp such that the values were 0.0, 0.5, 0.5, 1.0.

Definition at line 198 of file skia_conversions.cc.

200  {
201  FML_DCHECK(gradient->stop_count() >= 2);
202 
203  auto* dl_colors = gradient->colors();
204  auto* dl_stops = gradient->stops();
205  if (dl_stops[0] != 0.0) {
206  colors.emplace_back(skia_conversions::ToColor(dl_colors[0]));
207  stops.emplace_back(0);
208  }
209  for (auto i = 0; i < gradient->stop_count(); i++) {
210  colors.emplace_back(skia_conversions::ToColor(dl_colors[i]));
211  stops.emplace_back(std::clamp(dl_stops[i], 0.0f, 1.0f));
212  }
213  if (dl_stops[gradient->stop_count() - 1] != 1.0) {
214  colors.emplace_back(colors.back());
215  stops.emplace_back(1.0);
216  }
217  for (auto i = 1; i < gradient->stop_count(); i++) {
218  stops[i] = std::clamp(stops[i], stops[i - 1], stops[i]);
219  }
220 }

References ToColor().

Referenced by impeller::DlDispatcher::setColorSource(), and impeller::testing::TEST().

◆ PathDataFromTextBlob()

Path impeller::skia_conversions::PathDataFromTextBlob ( const sk_sp< SkTextBlob > &  blob,
Point  shift 
)

Definition at line 174 of file skia_conversions.cc.

174  {
175  if (!blob) {
176  return {};
177  }
178 
179  return ToPath(skia::textlayout::Paragraph::GetPath(blob.get()), shift);
180 }

References ToPath().

◆ ToColor()

Color impeller::skia_conversions::ToColor ( const flutter::DlColor &  color)

Definition at line 148 of file skia_conversions.cc.

148  {
149  return {
150  static_cast<Scalar>(color.getRedF()), //
151  static_cast<Scalar>(color.getGreenF()), //
152  static_cast<Scalar>(color.getBlueF()), //
153  static_cast<Scalar>(color.getAlphaF()) //
154  };
155 }

Referenced by ConvertStops(), impeller::DlDispatcher::drawColor(), impeller::DlDispatcher::drawShadow(), impeller::MakeVertices(), impeller::testing::TEST(), impeller::ToColorFilter(), and impeller::ToColors().

◆ ToPath() [1/2]

Path impeller::skia_conversions::ToPath ( const SkPath &  path,
Point  shift 
)

Definition at line 49 of file skia_conversions.cc.

49  {
50  auto iterator = SkPath::Iter(path, false);
51 
52  struct PathData {
53  union {
54  SkPoint points[4];
55  };
56  };
57 
58  PathBuilder builder;
59  PathData data;
60  // Reserve a path size with some arbitrarily additional padding.
61  builder.Reserve(path.countPoints() + 8, path.countVerbs() + 8);
62  auto verb = SkPath::Verb::kDone_Verb;
63  do {
64  verb = iterator.next(data.points);
65  switch (verb) {
66  case SkPath::kMove_Verb:
67  builder.MoveTo(ToPoint(data.points[0]));
68  break;
69  case SkPath::kLine_Verb:
70  builder.LineTo(ToPoint(data.points[1]));
71  break;
72  case SkPath::kQuad_Verb:
73  builder.QuadraticCurveTo(ToPoint(data.points[1]),
74  ToPoint(data.points[2]));
75  break;
76  case SkPath::kConic_Verb: {
77  constexpr auto kPow2 = 1; // Only works for sweeps up to 90 degrees.
78  constexpr auto kQuadCount = 1 + (2 * (1 << kPow2));
79  SkPoint points[kQuadCount];
80  const auto curve_count =
81  SkPath::ConvertConicToQuads(data.points[0], //
82  data.points[1], //
83  data.points[2], //
84  iterator.conicWeight(), //
85  points, //
86  kPow2 //
87  );
88 
89  for (int curve_index = 0, point_index = 0; //
90  curve_index < curve_count; //
91  curve_index++, point_index += 2 //
92  ) {
93  builder.QuadraticCurveTo(ToPoint(points[point_index + 1]),
94  ToPoint(points[point_index + 2]));
95  }
96  } break;
97  case SkPath::kCubic_Verb:
98  builder.CubicCurveTo(ToPoint(data.points[1]), ToPoint(data.points[2]),
99  ToPoint(data.points[3]));
100  break;
101  case SkPath::kClose_Verb:
102  builder.Close();
103  break;
104  case SkPath::kDone_Verb:
105  break;
106  }
107  } while (verb != SkPath::Verb::kDone_Verb);
108 
109  FillType fill_type;
110  switch (path.getFillType()) {
111  case SkPathFillType::kWinding:
112  fill_type = FillType::kNonZero;
113  break;
114  case SkPathFillType::kEvenOdd:
115  fill_type = FillType::kOdd;
116  break;
117  case SkPathFillType::kInverseWinding:
118  case SkPathFillType::kInverseEvenOdd:
119  // Flutter doesn't expose these path fill types. These are only visible
120  // via the receiver interface. We should never get here.
121  fill_type = FillType::kNonZero;
122  break;
123  }
124  builder.SetConvexity(path.isConvex() ? Convexity::kConvex
125  : Convexity::kUnknown);
126  builder.Shift(shift);
127  auto sk_bounds = path.getBounds().makeOutset(shift.x, shift.y);
128  builder.SetBounds(ToRect(sk_bounds));
129  return builder.TakePath(fill_type);
130 }

References impeller::PathBuilder::Close(), impeller::PathBuilder::CubicCurveTo(), impeller::kConvex, impeller::kNonZero, impeller::kOdd, impeller::kUnknown, impeller::PathBuilder::LineTo(), impeller::PathBuilder::MoveTo(), impeller::PathBuilder::QuadraticCurveTo(), impeller::PathBuilder::Reserve(), impeller::PathBuilder::SetBounds(), impeller::PathBuilder::SetConvexity(), impeller::PathBuilder::Shift(), impeller::PathBuilder::TakePath(), ToPoint(), ToRect(), impeller::TPoint< T >::x, and impeller::TPoint< T >::y.

Referenced by impeller::DlDispatcher::clipRRect(), impeller::DlDispatcher::drawDRRect(), impeller::DlDispatcher::drawRRect(), PathDataFromTextBlob(), and impeller::testing::TEST_P().

◆ ToPath() [2/2]

Path impeller::skia_conversions::ToPath ( const SkRRect &  rrect)

Definition at line 132 of file skia_conversions.cc.

132  {
133  return PathBuilder{}
134  .AddRoundedRect(ToRect(rrect.getBounds()), ToRoundingRadii(rrect))
135  .SetConvexity(Convexity::kConvex)
136  .SetBounds(ToRect(rrect.getBounds()))
137  .TakePath();
138 }

References impeller::PathBuilder::AddRoundedRect(), impeller::kConvex, impeller::PathBuilder::SetBounds(), impeller::PathBuilder::SetConvexity(), impeller::PathBuilder::TakePath(), ToRect(), and ToRoundingRadii().

◆ ToPixelFormat()

std::optional< impeller::PixelFormat > impeller::skia_conversions::ToPixelFormat ( SkColorType  type)

Definition at line 182 of file skia_conversions.cc.

182  {
183  switch (type) {
184  case kRGBA_8888_SkColorType:
186  case kBGRA_8888_SkColorType:
188  case kRGBA_F16_SkColorType:
190  case kBGR_101010x_XR_SkColorType:
192  default:
193  return std::nullopt;
194  }
195  return std::nullopt;
196 }

References impeller::kB10G10R10XR, impeller::kB8G8R8A8UNormInt, impeller::kR16G16B16A16Float, and impeller::kR8G8B8A8UNormInt.

◆ ToPoint()

Point impeller::skia_conversions::ToPoint ( const SkPoint &  point)

◆ ToPoints()

std::vector< Point > impeller::skia_conversions::ToPoints ( const SkPoint  points[],
int  count 
)

Definition at line 31 of file skia_conversions.cc.

31  {
32  std::vector<Point> result(count);
33  for (auto i = 0; i < count; i++) {
34  result[i] = ToPoint(points[i]);
35  }
36  return result;
37 }

References ToPoint().

Referenced by impeller::DlDispatcher::drawPoints().

◆ ToRect() [1/2]

◆ ToRect() [2/2]

std::optional< Rect > impeller::skia_conversions::ToRect ( const SkRect *  rect)

Definition at line 16 of file skia_conversions.cc.

16  {
17  if (rect == nullptr) {
18  return std::nullopt;
19  }
20  return Rect::MakeLTRB(rect->fLeft, rect->fTop, rect->fRight, rect->fBottom);
21 }

References impeller::TRect< Scalar >::MakeLTRB().

◆ ToRects()

std::vector< Rect > impeller::skia_conversions::ToRects ( const SkRect  tex[],
int  count 
)

Definition at line 23 of file skia_conversions.cc.

23  {
24  auto result = std::vector<Rect>();
25  for (int i = 0; i < count; i++) {
26  result.push_back(ToRect(tex[i]));
27  }
28  return result;
29 }

References ToRect().

Referenced by impeller::DlDispatcher::drawAtlas().

◆ ToRoundingRadii()

PathBuilder::RoundingRadii impeller::skia_conversions::ToRoundingRadii ( const SkRRect &  rrect)

Definition at line 39 of file skia_conversions.cc.

39  {
40  using Corner = SkRRect::Corner;
41  PathBuilder::RoundingRadii radii;
42  radii.bottom_left = ToPoint(rrect.radii(Corner::kLowerLeft_Corner));
43  radii.bottom_right = ToPoint(rrect.radii(Corner::kLowerRight_Corner));
44  radii.top_left = ToPoint(rrect.radii(Corner::kUpperLeft_Corner));
45  radii.top_right = ToPoint(rrect.radii(Corner::kUpperRight_Corner));
46  return radii;
47 }

References impeller::PathBuilder::RoundingRadii::bottom_left, impeller::PathBuilder::RoundingRadii::bottom_right, impeller::PathBuilder::RoundingRadii::top_left, impeller::PathBuilder::RoundingRadii::top_right, and ToPoint().

Referenced by ToPath().

◆ ToRSXForms()

std::vector< Matrix > impeller::skia_conversions::ToRSXForms ( const SkRSXform  xform[],
int  count 
)

Definition at line 157 of file skia_conversions.cc.

157  {
158  auto result = std::vector<Matrix>();
159  for (int i = 0; i < count; i++) {
160  auto form = xform[i];
161  // clang-format off
162  auto matrix = Matrix{
163  form.fSCos, form.fSSin, 0, 0,
164  -form.fSSin, form.fSCos, 0, 0,
165  0, 0, 1, 0,
166  form.fTx, form.fTy, 0, 1
167  };
168  // clang-format on
169  result.push_back(matrix);
170  }
171  return result;
172 }

Referenced by impeller::DlDispatcher::drawAtlas().

◆ ToSize()

Size impeller::skia_conversions::ToSize ( const SkPoint &  point)

Definition at line 144 of file skia_conversions.cc.

144  {
145  return Size(point.fX, point.fY);
146 }

Referenced by impeller::DlDispatcher::clipPath(), impeller::DlDispatcher::clipRRect(), impeller::DlDispatcher::drawRRect(), and impeller::testing::TEST().

impeller::Scalar
float Scalar
Definition: scalar.h:18
impeller::PixelFormat::kR8G8B8A8UNormInt
@ kR8G8B8A8UNormInt
impeller::skia_conversions::ToColor
Color ToColor(const flutter::DlColor &color)
Definition: skia_conversions.cc:148
impeller::Size
TSize< Scalar > Size
Definition: size.h:137
impeller::skia_conversions::ToRoundingRadii
PathBuilder::RoundingRadii ToRoundingRadii(const SkRRect &rrect)
Definition: skia_conversions.cc:39
impeller::PixelFormat::kB10G10R10XR
@ kB10G10R10XR
impeller::FillType
FillType
Definition: path.h:29
impeller::PixelFormat::kR16G16B16A16Float
@ kR16G16B16A16Float
impeller::skia_conversions::ToPoint
Point ToPoint(const SkPoint &point)
Definition: skia_conversions.cc:140
impeller::skia_conversions::ToRect
std::optional< Rect > ToRect(const SkRect *rect)
Definition: skia_conversions.cc:16
impeller::skia_conversions::ToPath
Path ToPath(const SkRRect &rrect)
Definition: skia_conversions.cc:132
impeller::PixelFormat::kB8G8R8A8UNormInt
@ kB8G8R8A8UNormInt