Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
dl_sk_conversions.cc
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#include "flutter/display_list/skia/dl_sk_conversions.h"
6
10
11namespace flutter {
12
13// clang-format off
14constexpr float kInvertColorMatrix[20] = {
15 -1.0, 0, 0, 1.0, 0,
16 0, -1.0, 0, 1.0, 0,
17 0, 0, -1.0, 1.0, 0,
18 1.0, 1.0, 1.0, 1.0, 0
19};
20// clang-format on
21
23 SkPaint sk_paint;
24
25 sk_paint.setAntiAlias(paint.isAntiAlias());
26 sk_paint.setColor(ToSk(paint.getColor()));
27 sk_paint.setBlendMode(ToSk(paint.getBlendMode()));
28 sk_paint.setStyle(ToSk(paint.getDrawStyle()));
29 sk_paint.setStrokeWidth(paint.getStrokeWidth());
30 sk_paint.setStrokeMiter(paint.getStrokeMiter());
31 sk_paint.setStrokeCap(ToSk(paint.getStrokeCap()));
32 sk_paint.setStrokeJoin(ToSk(paint.getStrokeJoin()));
33 sk_paint.setImageFilter(ToSk(paint.getImageFilterPtr()));
34 auto color_filter = ToSk(paint.getColorFilterPtr());
35 if (paint.isInvertColors()) {
36 auto invert_filter = SkColorFilters::Matrix(kInvertColorMatrix);
37 if (color_filter) {
38 invert_filter = invert_filter->makeComposed(color_filter);
39 }
40 color_filter = invert_filter;
41 }
43
44 auto color_source = paint.getColorSourcePtr();
45 if (color_source) {
46 // Unconditionally set dither to true for gradient shaders.
47 sk_paint.setDither(color_source->isGradient());
48 sk_paint.setShader(ToSk(color_source));
49 }
50
51 sk_paint.setMaskFilter(ToSk(paint.getMaskFilterPtr()));
52 sk_paint.setPathEffect(ToSk(paint.getPathEffectPtr()));
53
54 return sk_paint;
55}
56
58 DlPaint stroked_paint = paint;
60 return ToSk(stroked_paint);
61}
62
64 DlPaint non_shader_paint = paint;
65 non_shader_paint.setColorSource(nullptr);
66 return ToSk(non_shader_paint);
67}
68
70 if (!source) {
71 return nullptr;
72 }
73 static auto ToSkColors = [](const DlGradientColorSourceBase* gradient) {
74 return reinterpret_cast<const SkColor*>(gradient->colors());
75 };
76 switch (source->type()) {
78 const DlColorColorSource* color_source = source->asColor();
79 FML_DCHECK(color_source != nullptr);
80 return SkShaders::Color(ToSk(color_source->color()));
81 }
83 const DlImageColorSource* image_source = source->asImage();
84 FML_DCHECK(image_source != nullptr);
85 auto image = image_source->image();
86 if (!image || !image->skia_image()) {
87 return nullptr;
88 }
89 return image->skia_image()->makeShader(
90 ToSk(image_source->horizontal_tile_mode()),
91 ToSk(image_source->vertical_tile_mode()),
92 ToSk(image_source->sampling()), image_source->matrix_ptr());
93 }
95 const DlLinearGradientColorSource* linear_source =
96 source->asLinearGradient();
97 FML_DCHECK(linear_source != nullptr);
98 SkPoint pts[] = {linear_source->start_point(),
99 linear_source->end_point()};
101 pts, ToSkColors(linear_source), linear_source->stops(),
102 linear_source->stop_count(), ToSk(linear_source->tile_mode()), 0,
103 linear_source->matrix_ptr());
104 }
106 const DlRadialGradientColorSource* radial_source =
107 source->asRadialGradient();
108 FML_DCHECK(radial_source != nullptr);
110 radial_source->center(), radial_source->radius(),
111 ToSkColors(radial_source), radial_source->stops(),
112 radial_source->stop_count(), ToSk(radial_source->tile_mode()), 0,
113 radial_source->matrix_ptr());
114 }
116 const DlConicalGradientColorSource* conical_source =
117 source->asConicalGradient();
118 FML_DCHECK(conical_source != nullptr);
120 conical_source->start_center(), conical_source->start_radius(),
121 conical_source->end_center(), conical_source->end_radius(),
122 ToSkColors(conical_source), conical_source->stops(),
123 conical_source->stop_count(), ToSk(conical_source->tile_mode()), 0,
124 conical_source->matrix_ptr());
125 }
127 const DlSweepGradientColorSource* sweep_source =
128 source->asSweepGradient();
129 FML_DCHECK(sweep_source != nullptr);
131 sweep_source->center().x(), sweep_source->center().y(),
132 ToSkColors(sweep_source), sweep_source->stops(),
133 sweep_source->stop_count(), ToSk(sweep_source->tile_mode()),
134 sweep_source->start(), sweep_source->end(), 0,
135 sweep_source->matrix_ptr());
136 }
138 const DlRuntimeEffectColorSource* runtime_source =
139 source->asRuntimeEffect();
140 FML_DCHECK(runtime_source != nullptr);
141 auto runtime_effect = runtime_source->runtime_effect();
142 if (!runtime_effect || !runtime_effect->skia_runtime_effect()) {
143 return nullptr;
144 }
145
146 auto samplers = runtime_source->samplers();
147 std::vector<sk_sp<SkShader>> sk_samplers(samplers.size());
148 for (size_t i = 0; i < samplers.size(); i++) {
149 auto sampler = samplers[i];
150 if (sampler == nullptr) {
151 return nullptr;
152 }
153 sk_samplers[i] = ToSk(sampler);
154 }
155
156 auto uniform_data = runtime_source->uniform_data();
157 auto ref = new std::shared_ptr<std::vector<uint8_t>>(uniform_data);
158 auto sk_uniform_data = SkData::MakeWithProc(
159 uniform_data->data(), uniform_data->size(),
160 [](const void* ptr, void* context) {
161 delete reinterpret_cast<std::shared_ptr<std::vector<uint8_t>>*>(
162 context);
163 },
164 ref);
165
166 return runtime_effect->skia_runtime_effect()->makeShader(
167 sk_uniform_data, sk_samplers.data(), sk_samplers.size());
168 }
169#ifdef IMPELLER_ENABLE_3D
170 case DlColorSourceType::kScene: {
171 return nullptr;
172 }
173#endif // IMPELLER_ENABLE_3D
174 }
175}
176
178 if (!filter) {
179 return nullptr;
180 }
181 switch (filter->type()) {
183 const DlBlurImageFilter* blur_filter = filter->asBlur();
184 FML_DCHECK(blur_filter != nullptr);
185 return SkImageFilters::Blur(blur_filter->sigma_x(),
186 blur_filter->sigma_y(),
187 ToSk(blur_filter->tile_mode()), nullptr);
188 }
190 const DlDilateImageFilter* dilate_filter = filter->asDilate();
191 FML_DCHECK(dilate_filter != nullptr);
192 return SkImageFilters::Dilate(dilate_filter->radius_x(),
193 dilate_filter->radius_y(), nullptr);
194 }
196 const DlErodeImageFilter* erode_filter = filter->asErode();
197 FML_DCHECK(erode_filter != nullptr);
198 return SkImageFilters::Erode(erode_filter->radius_x(),
199 erode_filter->radius_y(), nullptr);
200 }
202 const DlMatrixImageFilter* matrix_filter = filter->asMatrix();
203 FML_DCHECK(matrix_filter != nullptr);
205 matrix_filter->matrix(), ToSk(matrix_filter->sampling()), nullptr);
206 }
208 const DlComposeImageFilter* compose_filter = filter->asCompose();
209 FML_DCHECK(compose_filter != nullptr);
210 return SkImageFilters::Compose(ToSk(compose_filter->outer()),
211 ToSk(compose_filter->inner()));
212 }
214 const DlColorFilterImageFilter* cf_filter = filter->asColorFilter();
215 FML_DCHECK(cf_filter != nullptr);
216 return SkImageFilters::ColorFilter(ToSk(cf_filter->color_filter()),
217 nullptr);
218 }
220 const DlLocalMatrixImageFilter* lm_filter = filter->asLocalMatrix();
221 FML_DCHECK(lm_filter != nullptr);
222 sk_sp<SkImageFilter> skia_filter = ToSk(lm_filter->image_filter());
223 // The image_filter property itself might have been null, or the
224 // construction of the SkImageFilter might be optimized to null
225 // for any number of reasons. In any case, if the filter is null
226 // or optimizaed away, let's then optimize away this local matrix
227 // case by returning null.
228 if (!skia_filter) {
229 return nullptr;
230 }
231 return skia_filter->makeWithLocalMatrix(lm_filter->matrix());
232 }
233 }
234}
235
237 if (!filter) {
238 return nullptr;
239 }
240 switch (filter->type()) {
242 const DlBlendColorFilter* blend_filter = filter->asBlend();
243 FML_DCHECK(blend_filter != nullptr);
244 return SkColorFilters::Blend(ToSk(blend_filter->color()),
245 ToSk(blend_filter->mode()));
246 }
248 const DlMatrixColorFilter* matrix_filter = filter->asMatrix();
249 FML_DCHECK(matrix_filter != nullptr);
250 float matrix[20];
251 matrix_filter->get_matrix(matrix);
252 return SkColorFilters::Matrix(matrix);
253 }
256 }
259 }
260 }
261}
262
264 if (!filter) {
265 return nullptr;
266 }
267 switch (filter->type()) {
269 const DlBlurMaskFilter* blur_filter = filter->asBlur();
270 FML_DCHECK(blur_filter != nullptr);
271 return SkMaskFilter::MakeBlur(ToSk(blur_filter->style()),
272 blur_filter->sigma(),
273 blur_filter->respectCTM());
274 }
275 }
276}
277
279 if (!effect) {
280 return nullptr;
281 }
282 switch (effect->type()) {
284 const DlDashPathEffect* dash_effect = effect->asDash();
285 FML_DCHECK(dash_effect != nullptr);
286 return SkDashPathEffect::Make(dash_effect->intervals(),
287 dash_effect->count(), dash_effect->phase());
288 }
289 }
290}
291
293 const SkColor* sk_colors =
294 reinterpret_cast<const SkColor*>(vertices->colors());
295 return SkVertices::MakeCopy(ToSk(vertices->mode()), vertices->vertex_count(),
296 vertices->vertices(),
297 vertices->texture_coordinates(), sk_colors,
298 vertices->index_count(), vertices->indices());
299}
300
301} // namespace flutter
uint32_t SkColor
Definition SkColor.h:37
static sk_sp< SkImage > color_filter(const SkImage *image, SkColorFilter *colorFilter)
sk_sp< SkImage > asImage() const
Definition SkBitmap.cpp:645
static sk_sp< SkColorFilter > Blend(const SkColor4f &c, sk_sp< SkColorSpace >, SkBlendMode mode)
static sk_sp< SkColorFilter > Matrix(const SkColorMatrix &)
static sk_sp< SkColorFilter > SRGBToLinearGamma()
static sk_sp< SkColorFilter > LinearToSRGBGamma()
static sk_sp< SkPathEffect > Make(const SkScalar intervals[], int count, SkScalar phase)
static sk_sp< SkData > MakeWithProc(const void *ptr, size_t length, ReleaseProc proc, void *ctx)
Definition SkData.cpp:128
static sk_sp< SkShader > MakeTwoPointConical(const SkPoint &start, SkScalar startRadius, const SkPoint &end, SkScalar endRadius, const SkColor colors[], const SkScalar pos[], int count, SkTileMode mode, uint32_t flags=0, const SkMatrix *localMatrix=nullptr)
static sk_sp< SkShader > MakeSweep(SkScalar cx, SkScalar cy, const SkColor colors[], const SkScalar pos[], int count, SkTileMode mode, SkScalar startAngle, SkScalar endAngle, uint32_t flags, const SkMatrix *localMatrix)
static sk_sp< SkShader > MakeRadial(const SkPoint &center, SkScalar radius, const SkColor colors[], const SkScalar pos[], int count, SkTileMode mode, uint32_t flags=0, const SkMatrix *localMatrix=nullptr)
static sk_sp< SkShader > MakeLinear(const SkPoint pts[2], const SkColor colors[], const SkScalar pos[], int count, SkTileMode mode, uint32_t flags=0, const SkMatrix *localMatrix=nullptr)
static sk_sp< SkImageFilter > ColorFilter(sk_sp< SkColorFilter > cf, sk_sp< SkImageFilter > input, const CropRect &cropRect={})
static sk_sp< SkImageFilter > Erode(SkScalar radiusX, SkScalar radiusY, sk_sp< SkImageFilter > input, const CropRect &cropRect={})
static sk_sp< SkImageFilter > Blur(SkScalar sigmaX, SkScalar sigmaY, SkTileMode tileMode, sk_sp< SkImageFilter > input, const CropRect &cropRect={})
static sk_sp< SkImageFilter > Compose(sk_sp< SkImageFilter > outer, sk_sp< SkImageFilter > inner)
static sk_sp< SkImageFilter > MatrixTransform(const SkMatrix &matrix, const SkSamplingOptions &sampling, sk_sp< SkImageFilter > input)
static sk_sp< SkImageFilter > Dilate(SkScalar radiusX, SkScalar radiusY, sk_sp< SkImageFilter > input, const CropRect &cropRect={})
sk_sp< SkShader > makeShader(SkTileMode tmx, SkTileMode tmy, const SkSamplingOptions &, const SkMatrix *localMatrix=nullptr) const
Definition SkImage.cpp:179
static sk_sp< SkMaskFilter > MakeBlur(SkBlurStyle style, SkScalar sigma, bool respectCTM=true)
void setStyle(Style style)
Definition SkPaint.cpp:105
void setColor(SkColor color)
Definition SkPaint.cpp:119
void setStrokeMiter(SkScalar miter)
Definition SkPaint.cpp:169
void setAntiAlias(bool aa)
Definition SkPaint.h:170
void setDither(bool dither)
Definition SkPaint.h:182
void setImageFilter(sk_sp< SkImageFilter > imageFilter)
void setStrokeCap(Cap cap)
Definition SkPaint.cpp:179
void setStrokeJoin(Join join)
Definition SkPaint.cpp:189
void setMaskFilter(sk_sp< SkMaskFilter > maskFilter)
void setShader(sk_sp< SkShader > shader)
void setPathEffect(sk_sp< SkPathEffect > pathEffect)
void setBlendMode(SkBlendMode mode)
Definition SkPaint.cpp:151
void setColorFilter(sk_sp< SkColorFilter > colorFilter)
void setStrokeWidth(SkScalar width)
Definition SkPaint.cpp:159
static sk_sp< SkVertices > MakeCopy(VertexMode mode, int vertexCount, const SkPoint positions[], const SkPoint texs[], const SkColor colors[], int indexCount, const uint16_t indices[])
virtual T type() const =0
DlTileMode tile_mode() const
DlBlurStyle style() const
const std::shared_ptr< const DlColorFilter > color_filter() const
virtual const DlBlendColorFilter * asBlend() const
virtual const DlMatrixColorFilter * asMatrix() const
std::shared_ptr< const DlImageFilter > outer() const
std::shared_ptr< const DlImageFilter > inner() const
const SkScalar * intervals() const
DlImageSampling sampling() const
DlTileMode vertical_tile_mode() const
DlTileMode horizontal_tile_mode() const
sk_sp< const DlImage > image() const
virtual const DlLocalMatrixImageFilter * asLocalMatrix() const
virtual const DlColorFilterImageFilter * asColorFilter() const
virtual const DlMatrixImageFilter * asMatrix() const
virtual const DlComposeImageFilter * asCompose() const
virtual const DlBlurImageFilter * asBlur() const
virtual const DlDilateImageFilter * asDilate() const
virtual const DlErodeImageFilter * asErode() const
const SkMatrix & matrix() const
const std::shared_ptr< DlImageFilter > image_filter() const
virtual const DlBlurMaskFilter * asBlur() const
void get_matrix(float matrix[20]) const
const SkMatrix * matrix_ptr() const
const SkMatrix & matrix() const
DlImageSampling sampling() const
DlPaint & setDrawStyle(DlDrawStyle style)
Definition dl_paint.h:95
DlPaint & setColorSource(std::shared_ptr< const DlColorSource > source)
Definition dl_paint.h:132
virtual const DlDashPathEffect * asDash() const
const std::shared_ptr< std::vector< uint8_t > > uniform_data() const
const sk_sp< DlRuntimeEffect > runtime_effect() const
const std::vector< std::shared_ptr< DlColorSource > > samplers() const
Holds all of the data (both required and optional) for a DisplayList drawVertices call.
Definition dl_vertices.h:71
const DlColor * colors() const
int vertex_count() const
DlVertexMode mode() const
int index_count() const
const SkPoint * vertices() const
Returns a pointer to the vertex information. Should be non-null.
const uint16_t * indices() const
const SkPoint * texture_coordinates() const
const Paint & paint
sk_sp< SkImage > image
Definition examples.cpp:29
SkBitmap source
Definition examples.cpp:28
#define FML_DCHECK(condition)
Definition logging.h:103
SkPaint ToSk(const DlPaint &paint)
SkPaint ToStrokedSk(const DlPaint &paint)
SkPaint ToNonShaderSk(const DlPaint &paint)
@ kStroke
strokes boundary of shapes
constexpr float kInvertColorMatrix[20]
constexpr float y() const
constexpr float x() const