Flutter Impeller
formats.h
Go to the documentation of this file.
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef FLUTTER_IMPELLER_TOOLKIT_INTEROP_FORMATS_H_
6 #define FLUTTER_IMPELLER_TOOLKIT_INTEROP_FORMATS_H_
7 
8 #include <vector>
9 
10 #include "flutter/display_list/dl_builder.h"
11 #include "flutter/display_list/dl_color.h"
12 #include "flutter/txt/src/txt/font_style.h"
13 #include "flutter/txt/src/txt/font_weight.h"
14 #include "flutter/txt/src/txt/paragraph_style.h"
15 #include "impeller/entity/entity.h"
20 #include "impeller/geometry/rect.h"
21 #include "impeller/geometry/size.h"
23 
24 namespace impeller::interop {
25 
26 constexpr std::optional<SkRect> ToSkiaType(const ImpellerRect* rect) {
27  if (!rect) {
28  return std::nullopt;
29  }
30  return SkRect::MakeXYWH(rect->x, rect->y, rect->width, rect->height);
31 }
32 
33 constexpr SkPoint ToSkiaType(const Point& point) {
34  return SkPoint::Make(point.x, point.y);
35 }
36 
37 constexpr SkVector ToSkiaVector(const Size& point) {
38  return SkVector::Make(point.width, point.height);
39 }
40 
41 constexpr SkRect ToSkiaType(const Rect& rect) {
42  return SkRect::MakeXYWH(rect.GetX(), //
43  rect.GetY(), //
44  rect.GetWidth(), //
45  rect.GetHeight() //
46  );
47 }
48 
49 constexpr SkPathFillType ToSkiaType(FillType type) {
50  switch (type) {
51  case FillType::kNonZero:
52  return SkPathFillType::kWinding;
53  case FillType::kOdd:
54  return SkPathFillType::kEvenOdd;
55  }
56  return SkPathFillType::kWinding;
57 }
58 
59 constexpr SkIRect ToSkiaType(IRect rect) {
60  return SkIRect::MakeXYWH(rect.GetX(), //
61  rect.GetY(), //
62  rect.GetWidth(), //
63  rect.GetHeight() //
64  );
65 }
66 
67 template <class SkiaType, class OtherType>
68 std::vector<SkiaType> ToSkiaType(const std::vector<OtherType>& other_vec) {
69  std::vector<SkiaType> skia_vec;
70  skia_vec.reserve(other_vec.size());
71  for (const auto& other : other_vec) {
72  skia_vec.emplace_back(ToSkiaType(other));
73  }
74  return skia_vec;
75 }
76 
77 constexpr flutter::DlColor ToDisplayListType(Color color) {
78  return flutter::DlColor::RGBA(color.red, //
79  color.green, //
80  color.blue, //
81  color.alpha //
82  );
83 }
84 
85 constexpr SkMatrix ToSkMatrix(const Matrix& matrix) {
86  return SkM44::ColMajor(matrix.m).asM33();
87 }
88 
89 template <class DlType, class OtherType>
90 std::vector<DlType> ToDisplayListType(const std::vector<OtherType>& other_vec) {
91  std::vector<DlType> dl_vec;
92  dl_vec.reserve(other_vec.size());
93  for (const auto& other : other_vec) {
94  dl_vec.emplace_back(ToDisplayListType(other));
95  }
96  return dl_vec;
97 }
98 
99 constexpr flutter::DlImageSampling ToDisplayListType(
100  ImpellerTextureSampling sampling) {
101  switch (sampling) {
103  return flutter::DlImageSampling::kNearestNeighbor;
105  return flutter::DlImageSampling::kLinear;
106  }
107  return flutter::DlImageSampling::kLinear;
108 }
109 
110 constexpr flutter::DlBlurStyle ToDisplayListType(ImpellerBlurStyle style) {
111  switch (style) {
113  return flutter::DlBlurStyle::kNormal;
115  return flutter::DlBlurStyle::kSolid;
117  return flutter::DlBlurStyle::kOuter;
119  return flutter::DlBlurStyle::kInner;
120  }
121  return flutter::DlBlurStyle::kNormal;
122 }
123 
124 constexpr flutter::DlBlendMode ToDisplayListType(BlendMode mode) {
125  using Mode = flutter::DlBlendMode;
126  switch (mode) {
127  case BlendMode::kClear:
128  return Mode::kClear;
129  case BlendMode::kSrc:
130  return Mode::kSrc;
131  case BlendMode::kDst:
132  return Mode::kDst;
133  case BlendMode::kSrcOver:
134  return Mode::kSrcOver;
135  case BlendMode::kDstOver:
136  return Mode::kDstOver;
137  case BlendMode::kSrcIn:
138  return Mode::kSrcIn;
139  case BlendMode::kDstIn:
140  return Mode::kDstIn;
141  case BlendMode::kSrcOut:
142  return Mode::kSrcOut;
143  case BlendMode::kDstOut:
144  return Mode::kDstOut;
145  case BlendMode::kSrcATop:
146  return Mode::kSrcATop;
147  case BlendMode::kDstATop:
148  return Mode::kDstATop;
149  case BlendMode::kXor:
150  return Mode::kXor;
151  case BlendMode::kPlus:
152  return Mode::kPlus;
154  return Mode::kModulate;
155  case BlendMode::kScreen:
156  return Mode::kScreen;
157  case BlendMode::kOverlay:
158  return Mode::kOverlay;
159  case BlendMode::kDarken:
160  return Mode::kDarken;
161  case BlendMode::kLighten:
162  return Mode::kLighten;
164  return Mode::kColorDodge;
166  return Mode::kColorBurn;
168  return Mode::kHardLight;
170  return Mode::kSoftLight;
172  return Mode::kDifference;
174  return Mode::kExclusion;
176  return Mode::kMultiply;
177  case BlendMode::kHue:
178  return Mode::kHue;
180  return Mode::kSaturation;
181  case BlendMode::kColor:
182  return Mode::kColor;
184  return Mode::kLuminosity;
185  }
186  return Mode::kSrcOver;
187 }
188 
189 inline SkRRect ToSkiaType(const Rect& rect, const RoundingRadii& radii) {
190  using Corner = SkRRect::Corner;
191  SkVector sk_radii[4];
192  sk_radii[Corner::kUpperLeft_Corner] = ToSkiaVector(radii.top_left);
193  sk_radii[Corner::kUpperRight_Corner] = ToSkiaVector(radii.top_right);
194  sk_radii[Corner::kLowerRight_Corner] = ToSkiaVector(radii.bottom_right);
195  sk_radii[Corner::kLowerLeft_Corner] = ToSkiaVector(radii.bottom_left);
196  SkRRect result;
197  result.setRectRadii(ToSkiaType(rect), sk_radii);
198  return result;
199 }
200 
201 constexpr Matrix ToImpellerType(const ImpellerMatrix& m) {
202  return Matrix(m.m[0], m.m[1], m.m[2], m.m[3], //
203  m.m[4], m.m[5], m.m[6], m.m[7], //
204  m.m[8], m.m[9], m.m[10], m.m[11], //
205  m.m[12], m.m[13], m.m[14], m.m[15] //
206  );
207 }
208 
209 constexpr void FromImpellerType(const Matrix& from, ImpellerMatrix& to) {
210  to.m[0] = from.m[0];
211  to.m[1] = from.m[1];
212  to.m[2] = from.m[2];
213  to.m[3] = from.m[3];
214  to.m[4] = from.m[4];
215  to.m[5] = from.m[5];
216  to.m[6] = from.m[6];
217  to.m[7] = from.m[7];
218  to.m[8] = from.m[8];
219  to.m[9] = from.m[9];
220  to.m[10] = from.m[10];
221  to.m[11] = from.m[11];
222  to.m[12] = from.m[12];
223  to.m[13] = from.m[13];
224  to.m[14] = from.m[14];
225  to.m[15] = from.m[15];
226 }
227 
228 constexpr Size ToImpellerType(const ImpellerSize& size) {
229  return Size{size.width, size.height};
230 }
231 
232 constexpr Point ToImpellerType(const ImpellerPoint& point) {
233  return Point{point.x, point.y};
234 }
235 
236 constexpr Size ToImpellerSize(const ImpellerPoint& point) {
237  return Size{point.x, point.y};
238 }
239 
240 constexpr Rect ToImpellerType(const ImpellerRect& rect) {
241  return Rect::MakeXYWH(rect.x, rect.y, rect.width, rect.height);
242 }
243 
244 constexpr flutter::DlTileMode ToDisplayListType(ImpellerTileMode mode) {
245  switch (mode) {
247  return flutter::DlTileMode::kClamp;
249  return flutter::DlTileMode::kRepeat;
251  return flutter::DlTileMode::kMirror;
253  return flutter::DlTileMode::kDecal;
254  }
255  return flutter::DlTileMode::kClamp;
256 }
257 
259  auto result = RoundingRadii{};
260  result.top_left = ToImpellerSize(radii.top_left);
261  result.bottom_left = ToImpellerSize(radii.bottom_left);
262  result.top_right = ToImpellerSize(radii.top_right);
263  result.bottom_right = ToImpellerSize(radii.bottom_right);
264  return result;
265 }
266 
268  switch (type) {
270  return FillType::kNonZero;
272  return FillType::kOdd;
273  }
274  return FillType::kNonZero;
275 }
276 
277 constexpr flutter::DlClipOp ToImpellerType(ImpellerClipOperation op) {
278  switch (op) {
280  return flutter::DlClipOp::kDifference;
282  return flutter::DlClipOp::kIntersect;
283  }
284  return flutter::DlClipOp::kDifference;
285 }
286 
287 constexpr Color ToImpellerType(const ImpellerColor& color) {
288  Color result;
289  result.red = color.red;
290  result.green = color.green;
291  result.blue = color.blue;
292  result.alpha = color.alpha;
293  return result;
294 }
295 
297  switch (mode) {
299  return BlendMode::kClear;
301  return BlendMode::kSrc;
303  return BlendMode::kDst;
305  return BlendMode::kSrcOver;
307  return BlendMode::kDstOver;
309  return BlendMode::kSrcIn;
311  return BlendMode::kDstIn;
313  return BlendMode::kSrcOut;
315  return BlendMode::kDstOut;
317  return BlendMode::kSrcATop;
319  return BlendMode::kDstATop;
321  return BlendMode::kXor;
323  return BlendMode::kPlus;
325  return BlendMode::kModulate;
327  return BlendMode::kScreen;
329  return BlendMode::kOverlay;
331  return BlendMode::kDarken;
333  return BlendMode::kLighten;
335  return BlendMode::kColorDodge;
337  return BlendMode::kColorBurn;
339  return BlendMode::kHardLight;
341  return BlendMode::kSoftLight;
343  return BlendMode::kDifference;
345  return BlendMode::kExclusion;
347  return BlendMode::kMultiply;
349  return BlendMode::kHue;
351  return BlendMode::kSaturation;
353  return BlendMode::kColor;
355  return BlendMode::kLuminosity;
356  }
357  return BlendMode::kSrcOver;
358 }
359 
360 constexpr flutter::DlDrawStyle ToDisplayListType(ImpellerDrawStyle style) {
361  switch (style) {
363  return flutter::DlDrawStyle::kFill;
365  return flutter::DlDrawStyle::kStroke;
367  return flutter::DlDrawStyle::kStrokeAndFill;
368  }
369  return flutter::DlDrawStyle::kFill;
370 }
371 
372 constexpr flutter::DlStrokeCap ToDisplayListType(ImpellerStrokeCap cap) {
373  switch (cap) {
375  return flutter::DlStrokeCap::kButt;
377  return flutter::DlStrokeCap::kRound;
379  return flutter::DlStrokeCap::kSquare;
380  }
381  return flutter::DlStrokeCap::kButt;
382 }
383 
384 constexpr flutter::DlStrokeJoin ToDisplayListType(ImpellerStrokeJoin join) {
385  switch (join) {
387  return flutter::DlStrokeJoin::kMiter;
389  return flutter::DlStrokeJoin::kRound;
391  return flutter::DlStrokeJoin::kBevel;
392  }
393  return flutter::DlStrokeJoin::kMiter;
394 }
395 
397  switch (format) {
400  }
402 }
403 
404 constexpr ISize ToImpellerType(const ImpellerISize& size) {
405  return ISize::MakeWH(size.width, size.height);
406 }
407 
408 constexpr flutter::DlColorSpace ToDisplayListType(
409  ImpellerColorSpace color_space) {
410  switch (color_space) {
412  return flutter::DlColorSpace::kSRGB;
414  return flutter::DlColorSpace::kExtendedSRGB;
416  return flutter::DlColorSpace::kDisplayP3;
417  }
418  return flutter::DlColorSpace::kSRGB;
419 }
420 
421 constexpr flutter::DlColor ToDisplayListType(ImpellerColor color) {
422  return flutter::DlColor(color.alpha, //
423  color.red, //
424  color.green, //
425  color.blue, //
427  );
428 }
429 
430 constexpr txt::FontWeight ToTxtType(ImpellerFontWeight weight) {
431  switch (weight) {
433  return txt::FontWeight::w100;
435  return txt::FontWeight::w200;
437  return txt::FontWeight::w300;
439  return txt::FontWeight::w400;
441  return txt::FontWeight::w500;
443  return txt::FontWeight::w600;
445  return txt::FontWeight::w700;
447  return txt::FontWeight::w800;
449  return txt::FontWeight::w900;
450  }
451  return txt::FontWeight::w400;
452 }
453 
454 constexpr txt::FontStyle ToTxtType(ImpellerFontStyle style) {
455  switch (style) {
457  return txt::FontStyle::normal;
459  return txt::FontStyle::italic;
460  }
461  return txt::FontStyle::normal;
462 }
463 
464 constexpr txt::TextAlign ToTxtType(ImpellerTextAlignment align) {
465  switch (align) {
467  return txt::TextAlign::left;
469  return txt::TextAlign::right;
471  return txt::TextAlign::center;
473  return txt::TextAlign::justify;
475  return txt::TextAlign::start;
477  return txt::TextAlign::end;
478  }
479  return txt::TextAlign::left;
480 }
481 
482 constexpr txt::TextDirection ToTxtType(ImpellerTextDirection direction) {
483  switch (direction) {
485  return txt::TextDirection::rtl;
487  return txt::TextDirection::ltr;
488  }
489  return txt::TextDirection::ltr;
490 }
491 
492 } // namespace impeller::interop
493 
494 #endif // FLUTTER_IMPELLER_TOOLKIT_INTEROP_FORMATS_H_
GLenum type
ImpellerFillType
Definition: impeller.h:355
@ kImpellerFillTypeOdd
Definition: impeller.h:357
@ kImpellerFillTypeNonZero
Definition: impeller.h:356
ImpellerTextDirection
Definition: impeller.h:470
@ kImpellerTextDirectionLTR
Definition: impeller.h:472
@ kImpellerTextDirectionRTL
Definition: impeller.h:471
ImpellerTextureSampling
Definition: impeller.h:419
@ kImpellerTextureSamplingNearestNeighbor
Definition: impeller.h:420
@ kImpellerTextureSamplingLinear
Definition: impeller.h:421
ImpellerStrokeJoin
Definition: impeller.h:409
@ kImpellerStrokeJoinRound
Definition: impeller.h:411
@ kImpellerStrokeJoinBevel
Definition: impeller.h:412
@ kImpellerStrokeJoinMiter
Definition: impeller.h:410
ImpellerBlendMode
Definition: impeller.h:365
@ kImpellerBlendModeSaturation
Definition: impeller.h:392
@ kImpellerBlendModeSoftLight
Definition: impeller.h:387
@ kImpellerBlendModeHardLight
Definition: impeller.h:386
@ kImpellerBlendModeLuminosity
Definition: impeller.h:394
@ kImpellerBlendModeLighten
Definition: impeller.h:383
@ kImpellerBlendModeModulate
Definition: impeller.h:379
@ kImpellerBlendModeSourceIn
Definition: impeller.h:371
@ kImpellerBlendModeDifference
Definition: impeller.h:388
@ kImpellerBlendModeClear
Definition: impeller.h:366
@ kImpellerBlendModeColor
Definition: impeller.h:393
@ kImpellerBlendModeMultiply
Definition: impeller.h:390
@ kImpellerBlendModeSourceATop
Definition: impeller.h:375
@ kImpellerBlendModeDestinationOut
Definition: impeller.h:374
@ kImpellerBlendModeScreen
Definition: impeller.h:380
@ kImpellerBlendModeExclusion
Definition: impeller.h:389
@ kImpellerBlendModeColorBurn
Definition: impeller.h:385
@ kImpellerBlendModeDarken
Definition: impeller.h:382
@ kImpellerBlendModePlus
Definition: impeller.h:378
@ kImpellerBlendModeOverlay
Definition: impeller.h:381
@ kImpellerBlendModeDestinationIn
Definition: impeller.h:372
@ kImpellerBlendModeDestinationATop
Definition: impeller.h:376
@ kImpellerBlendModeDestination
Definition: impeller.h:368
@ kImpellerBlendModeSourceOver
Definition: impeller.h:369
@ kImpellerBlendModeXor
Definition: impeller.h:377
@ kImpellerBlendModeColorDodge
Definition: impeller.h:384
@ kImpellerBlendModeDestinationOver
Definition: impeller.h:370
@ kImpellerBlendModeSource
Definition: impeller.h:367
@ kImpellerBlendModeSourceOut
Definition: impeller.h:373
@ kImpellerBlendModeHue
Definition: impeller.h:391
ImpellerFontWeight
Definition: impeller.h:444
@ kImpellerFontWeight400
Definition: impeller.h:448
@ kImpellerFontWeight500
Definition: impeller.h:449
@ kImpellerFontWeight700
Definition: impeller.h:451
@ kImpellerFontWeight200
Definition: impeller.h:446
@ kImpellerFontWeight300
Definition: impeller.h:447
@ kImpellerFontWeight900
Definition: impeller.h:453
@ kImpellerFontWeight800
Definition: impeller.h:452
@ kImpellerFontWeight600
Definition: impeller.h:450
@ kImpellerFontWeight100
Definition: impeller.h:445
ImpellerStrokeCap
Definition: impeller.h:403
@ kImpellerStrokeCapButt
Definition: impeller.h:404
@ kImpellerStrokeCapRound
Definition: impeller.h:405
@ kImpellerStrokeCapSquare
Definition: impeller.h:406
ImpellerDrawStyle
Definition: impeller.h:397
@ kImpellerDrawStyleStroke
Definition: impeller.h:399
@ kImpellerDrawStyleFill
Definition: impeller.h:398
@ kImpellerDrawStyleStrokeAndFill
Definition: impeller.h:400
ImpellerColorSpace
Definition: impeller.h:438
@ kImpellerColorSpaceExtendedSRGB
Definition: impeller.h:440
@ kImpellerColorSpaceSRGB
Definition: impeller.h:439
@ kImpellerColorSpaceDisplayP3
Definition: impeller.h:441
ImpellerTileMode
Definition: impeller.h:424
@ kImpellerTileModeMirror
Definition: impeller.h:427
@ kImpellerTileModeClamp
Definition: impeller.h:425
@ kImpellerTileModeRepeat
Definition: impeller.h:426
@ kImpellerTileModeDecal
Definition: impeller.h:428
ImpellerTextAlignment
Definition: impeller.h:461
@ kImpellerTextAlignmentJustify
Definition: impeller.h:465
@ kImpellerTextAlignmentLeft
Definition: impeller.h:462
@ kImpellerTextAlignmentCenter
Definition: impeller.h:464
@ kImpellerTextAlignmentRight
Definition: impeller.h:463
@ kImpellerTextAlignmentStart
Definition: impeller.h:466
@ kImpellerTextAlignmentEnd
Definition: impeller.h:467
ImpellerFontStyle
Definition: impeller.h:456
@ kImpellerFontStyleItalic
Definition: impeller.h:458
@ kImpellerFontStyleNormal
Definition: impeller.h:457
ImpellerClipOperation
Definition: impeller.h:360
@ kImpellerClipOperationIntersect
Definition: impeller.h:362
@ kImpellerClipOperationDifference
Definition: impeller.h:361
ImpellerBlurStyle
Definition: impeller.h:431
@ kImpellerBlurStyleNormal
Definition: impeller.h:432
@ kImpellerBlurStyleOuter
Definition: impeller.h:434
@ kImpellerBlurStyleInner
Definition: impeller.h:435
@ kImpellerBlurStyleSolid
Definition: impeller.h:433
ImpellerPixelFormat
Definition: impeller.h:415
@ kImpellerPixelFormatRGBA8888
Definition: impeller.h:416
constexpr SkVector ToSkiaVector(const Size &point)
Definition: formats.h:37
constexpr SkMatrix ToSkMatrix(const Matrix &matrix)
Definition: formats.h:85
constexpr Matrix ToImpellerType(const ImpellerMatrix &m)
Definition: formats.h:201
constexpr Size ToImpellerSize(const ImpellerPoint &point)
Definition: formats.h:236
constexpr txt::FontWeight ToTxtType(ImpellerFontWeight weight)
Definition: formats.h:430
constexpr void FromImpellerType(const Matrix &from, ImpellerMatrix &to)
Definition: formats.h:209
constexpr flutter::DlColor ToDisplayListType(Color color)
Definition: formats.h:77
constexpr std::optional< SkRect > ToSkiaType(const ImpellerRect *rect)
Definition: formats.h:26
FillType
Definition: path.h:32
PixelFormat
The Pixel formats supported by Impeller. The naming convention denotes the usage of the component,...
Definition: formats.h:99
BlendMode
Definition: color.h:58
float blue
Definition: impeller.h:591
float alpha
Definition: impeller.h:592
float green
Definition: impeller.h:590
ImpellerColorSpace color_space
Definition: impeller.h:593
int64_t height
Definition: impeller.h:497
int64_t width
Definition: impeller.h:496
float m[16]
Definition: impeller.h:516
float width
Definition: impeller.h:481
float height
Definition: impeller.h:482
ImpellerPoint top_left
Definition: impeller.h:582
ImpellerPoint top_right
Definition: impeller.h:584
ImpellerPoint bottom_left
Definition: impeller.h:583
ImpellerPoint bottom_right
Definition: impeller.h:585
float height
Definition: impeller.h:492
float width
Definition: impeller.h:491
Scalar blue
Definition: color.h:138
Scalar alpha
Definition: color.h:143
Scalar red
Definition: color.h:128
Scalar green
Definition: color.h:133
A 4x4 matrix using column-major storage.
Definition: matrix.h:37
Scalar m[16]
Definition: matrix.h:39
constexpr Type GetY() const
Returns the Y coordinate of the upper left corner, equivalent to |GetOrigin().y|.
Definition: rect.h:341
constexpr Type GetHeight() const
Returns the height of the rectangle, equivalent to |GetSize().height|.
Definition: rect.h:351
constexpr Type GetX() const
Returns the X coordinate of the upper left corner, equivalent to |GetOrigin().x|.
Definition: rect.h:337
constexpr static TRect MakeXYWH(Type x, Type y, Type width, Type height)
Definition: rect.h:136
constexpr Type GetWidth() const
Returns the width of the rectangle, equivalent to |GetSize().width|.
Definition: rect.h:345
Type height
Definition: size.h:29
Type width
Definition: size.h:28
static constexpr TSize MakeWH(Type width, Type height)
Definition: size.h:43