6 #include "display_list/dl_color.h"
7 #include "third_party/skia/modules/skparagraph/include/Paragraph.h"
10 namespace skia_conversions {
13 auto [a,
b] = rr.radii(SkRRect::kUpperLeft_Corner);
14 auto [c, d] = rr.radii(SkRRect::kLowerLeft_Corner);
15 auto [e, f] = rr.radii(SkRRect::kUpperRight_Corner);
16 auto [g, h] = rr.radii(SkRRect::kLowerRight_Corner);
27 return Rect::MakeLTRB(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
30 std::optional<Rect>
ToRect(
const SkRect* rect) {
31 if (rect ==
nullptr) {
34 return Rect::MakeLTRB(rect->fLeft, rect->fTop, rect->fRight, rect->fBottom);
37 std::vector<Rect>
ToRects(
const SkRect tex[],
int count) {
38 auto result = std::vector<Rect>();
39 for (
int i = 0; i < count; i++) {
40 result.push_back(
ToRect(tex[i]));
45 std::vector<Point>
ToPoints(
const SkPoint points[],
int count) {
46 std::vector<Point> result(count);
47 for (
auto i = 0; i < count; i++) {
54 using Corner = SkRRect::Corner;
64 auto iterator = SkPath::Iter(path,
false);
75 builder.
Reserve(path.countPoints() + 8, path.countVerbs() + 8);
76 auto verb = SkPath::Verb::kDone_Verb;
78 verb = iterator.next(
data.points);
80 case SkPath::kMove_Verb:
83 case SkPath::kLine_Verb:
86 case SkPath::kQuad_Verb:
90 case SkPath::kConic_Verb: {
91 constexpr
auto kPow2 = 1;
92 constexpr
auto kQuadCount = 1 + (2 * (1 << kPow2));
93 SkPoint points[kQuadCount];
94 const auto curve_count =
95 SkPath::ConvertConicToQuads(
data.points[0],
98 iterator.conicWeight(),
103 for (
int curve_index = 0, point_index = 0;
104 curve_index < curve_count;
105 curve_index++, point_index += 2
108 ToPoint(points[point_index + 2]));
111 case SkPath::kCubic_Verb:
115 case SkPath::kClose_Verb:
118 case SkPath::kDone_Verb:
121 }
while (verb != SkPath::Verb::kDone_Verb);
124 switch (path.getFillType()) {
125 case SkPathFillType::kWinding:
128 case SkPathFillType::kEvenOdd:
131 case SkPathFillType::kInverseWinding:
132 case SkPathFillType::kInverseEvenOdd:
140 builder.
Shift(shift);
141 auto sk_bounds = path.getBounds().makeOutset(shift.
x, shift.
y);
159 return Size(point.fX, point.fY);
171 std::vector<Matrix>
ToRSXForms(
const SkRSXform xform[],
int count) {
172 auto result = std::vector<Matrix>();
173 for (
int i = 0; i < count; i++) {
174 auto form = xform[i];
177 form.fSCos, form.fSSin, 0, 0,
178 -form.fSSin, form.fSCos, 0, 0,
180 form.fTx, form.fTy, 0, 1
183 result.push_back(matrix);
193 return ToPath(skia::textlayout::Paragraph::GetPath(blob.get()), shift);
198 case kRGBA_8888_SkColorType:
200 case kBGRA_8888_SkColorType:
202 case kRGBA_F16_SkColorType:
204 case kBGR_101010x_XR_SkColorType:
213 std::vector<Color>& colors,
214 std::vector<float>& stops) {
215 FML_DCHECK(gradient->stop_count() >= 2);
217 auto* dl_colors = gradient->colors();
218 auto* dl_stops = gradient->stops();
219 if (dl_stops[0] != 0.0) {
221 stops.emplace_back(0);
223 for (
auto i = 0; i < gradient->stop_count(); i++) {
225 stops.emplace_back(std::clamp(dl_stops[i], 0.0f, 1.0f));
227 if (dl_stops[gradient->stop_count() - 1] != 1.0) {
228 colors.emplace_back(colors.back());
229 stops.emplace_back(1.0);
231 for (
auto i = 1; i < gradient->stop_count(); i++) {
232 stops[i] = std::clamp(stops[i], stops[i - 1], stops[i]);