6 #include "flutter/display_list/dl_blend_mode.h"
7 #include "flutter/display_list/dl_color.h"
8 #include "third_party/skia/modules/skparagraph/include/Paragraph.h"
11 namespace skia_conversions {
23 auto [xa, ya] = rr.radii(SkRRect::kUpperLeft_Corner);
24 auto [xb, yb] = rr.radii(SkRRect::kLowerLeft_Corner);
25 auto [xc, yc] = rr.radii(SkRRect::kUpperRight_Corner);
26 auto [xd, yd] = rr.radii(SkRRect::kLowerRight_Corner);
32 return Rect::MakeLTRB(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
35 std::optional<Rect>
ToRect(
const SkRect* rect) {
36 if (rect ==
nullptr) {
39 return Rect::MakeLTRB(rect->fLeft, rect->fTop, rect->fRight, rect->fBottom);
43 if (rect ==
nullptr) {
49 std::vector<Rect>
ToRects(
const SkRect tex[],
int count) {
50 auto result = std::vector<Rect>();
51 for (
int i = 0; i < count; i++) {
52 result.push_back(
ToRect(tex[i]));
58 auto result = std::vector<Rect>();
59 for (
int i = 0; i < count; i++) {
60 result.push_back(tex[i]);
65 std::vector<Point>
ToPoints(
const SkPoint points[],
int count) {
66 std::vector<Point> result(count);
67 for (
auto i = 0; i < count; i++) {
74 std::vector<Point> result(count);
75 for (
auto i = 0; i < count; i++) {
76 result[i] = points[i];
86 return Size(point.fX, point.fY);
90 FML_DCHECK(color.getColorSpace() == flutter::DlColorSpace::kExtendedSRGB ||
91 color.getColorSpace() == flutter::DlColorSpace::kSRGB);
93 static_cast<Scalar>(color.getRedF()),
94 static_cast<Scalar>(color.getGreenF()),
95 static_cast<Scalar>(color.getBlueF()),
96 static_cast<Scalar>(color.getAlphaF())
102 case kRGBA_8888_SkColorType:
104 case kBGRA_8888_SkColorType:
106 case kRGBA_F16_SkColorType:
108 case kBGR_101010x_XR_SkColorType:
117 std::vector<Color>& colors,
118 std::vector<float>& stops) {
119 FML_DCHECK(gradient->stop_count() >= 2)
120 <<
"stop_count:" << gradient->stop_count();
122 auto* dl_colors = gradient->colors();
123 auto* dl_stops = gradient->stops();
124 if (dl_stops[0] != 0.0) {
126 stops.emplace_back(0);
128 for (
auto i = 0; i < gradient->stop_count(); i++) {
130 stops.emplace_back(std::clamp(dl_stops[i], 0.0f, 1.0f));
132 if (dl_stops[gradient->stop_count() - 1] != 1.0) {
133 colors.emplace_back(colors.back());
134 stops.emplace_back(1.0);
136 for (
auto i = 1; i < gradient->stop_count(); i++) {
137 stops[i] = std::clamp(stops[i], stops[i - 1], stops[i]);
142 const flutter::DlImageSampling options) {
145 case flutter::DlImageSampling::kNearestNeighbor:
148 desc.
label =
"Nearest Sampler";
150 case flutter::DlImageSampling::kLinear:
153 desc.
label =
"Linear Sampler";
155 case flutter::DlImageSampling::kCubic:
156 case flutter::DlImageSampling::kMipmapLinear:
159 desc.
label =
"Mipmap Linear Sampler";
178 case flutter::DlBlendMode::kClear:
180 case flutter::DlBlendMode::kSrc:
182 case flutter::DlBlendMode::kDst:
184 case flutter::DlBlendMode::kSrcOver:
186 case flutter::DlBlendMode::kDstOver:
188 case flutter::DlBlendMode::kSrcIn:
190 case flutter::DlBlendMode::kDstIn:
192 case flutter::DlBlendMode::kSrcOut:
194 case flutter::DlBlendMode::kDstOut:
196 case flutter::DlBlendMode::kSrcATop:
198 case flutter::DlBlendMode::kDstATop:
200 case flutter::DlBlendMode::kXor:
202 case flutter::DlBlendMode::kPlus:
204 case flutter::DlBlendMode::kModulate:
206 case flutter::DlBlendMode::kScreen:
208 case flutter::DlBlendMode::kOverlay:
210 case flutter::DlBlendMode::kDarken:
212 case flutter::DlBlendMode::kLighten:
214 case flutter::DlBlendMode::kColorDodge:
216 case flutter::DlBlendMode::kColorBurn:
218 case flutter::DlBlendMode::kHardLight:
220 case flutter::DlBlendMode::kSoftLight:
222 case flutter::DlBlendMode::kDifference:
224 case flutter::DlBlendMode::kExclusion:
226 case flutter::DlBlendMode::kMultiply:
228 case flutter::DlBlendMode::kHue:
230 case flutter::DlBlendMode::kSaturation:
232 case flutter::DlBlendMode::kColor:
234 case flutter::DlBlendMode::kLuminosity:
Matrix ToMatrix(const SkMatrix &m)
BlendMode ToBlendMode(flutter::DlBlendMode mode)
std::optional< impeller::PixelFormat > ToPixelFormat(SkColorType type)
static bool SkScalarsNearlyEqual(SkScalar a, SkScalar b, SkScalar c, SkScalar d)
std::vector< Point > ToPoints(const SkPoint points[], int count)
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 st...
Point ToPoint(const SkPoint &point)
Size ToSize(const SkPoint &point)
std::vector< Rect > ToRects(const SkRect tex[], int count)
impeller::SamplerDescriptor ToSamplerDescriptor(const flutter::DlImageSampling options)
bool IsNearlySimpleRRect(const SkRRect &rr)
Like SkRRect.isSimple, but allows the corners to differ by kEhCloseEnough.
Rect ToRect(const SkRect &rect)
Color ToColor(const flutter::DlColor &color)
constexpr float kEhCloseEnough
@ kLinear
Sample from the two nearest mip levels and linearly interpolate.
@ kBase
The texture is sampled as if it only had a single mipmap level.
@ kNearest
Select nearest to the sample point. Most widely supported.
A 4x4 matrix using column-major storage.
static constexpr TPoint< Type > MakeXY(Type x, Type y)
constexpr static TRect MakeLTRB(Type left, Type top, Type right, Type bottom)