Flutter Engine
 
Loading...
Searching...
No Matches
paint.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
6
13#include "third_party/skia/include/core/SkColorFilter.h"
14#include "third_party/skia/include/core/SkImageFilter.h"
15#include "third_party/skia/include/core/SkMaskFilter.h"
16#include "third_party/skia/include/core/SkShader.h"
17#include "third_party/skia/include/core/SkString.h"
20
21namespace flutter {
22
23// Indices for 32bit values.
24// Must match //lib/ui/painting.dart.
25constexpr int kIsAntiAliasIndex = 0;
26constexpr int kColorRedIndex = 1;
27constexpr int kColorGreenIndex = 2;
28constexpr int kColorBlueIndex = 3;
29constexpr int kColorAlphaIndex = 4;
30constexpr int kColorSpaceIndex = 5;
31constexpr int kBlendModeIndex = 6;
32constexpr int kStyleIndex = 7;
33constexpr int kStrokeWidthIndex = 8;
34constexpr int kStrokeCapIndex = 9;
35constexpr int kStrokeJoinIndex = 10;
36constexpr int kStrokeMiterLimitIndex = 11;
37constexpr int kFilterQualityIndex = 12;
38constexpr int kMaskFilterIndex = 13;
39constexpr int kMaskFilterBlurStyleIndex = 14;
40constexpr int kMaskFilterSigmaIndex = 15;
41constexpr int kInvertColorIndex = 16;
42constexpr size_t kDataByteCount = 68; // 4 * (last index + 1)
43static_assert(kDataByteCount == sizeof(uint32_t) * (kInvertColorIndex + 1),
44 "kDataByteCount must match the size of the data array.");
45
46// Indices for objects.
47constexpr int kShaderIndex = 0;
48constexpr int kColorFilterIndex = 1;
49constexpr int kImageFilterIndex = 2;
50constexpr int kObjectCount = 3; // One larger than largest object index.
51
52// Must be kept in sync with the default in painting.dart.
53constexpr uint32_t kBlendModeDefault =
54 static_cast<uint32_t>(SkBlendMode::kSrcOver);
55
56// Must be kept in sync with the default in painting.dart, and also with the
57// default SkPaintDefaults_MiterLimit in Skia (which is not in a public header).
58constexpr float kStrokeMiterLimitDefault = 4.0f;
59
60// Must be kept in sync with the MaskFilter private constants in painting.dart.
62
63namespace {
64DlColor ReadColor(const tonic::DartByteData& byte_data) {
65 const uint32_t* uint_data = static_cast<const uint32_t*>(byte_data.data());
66 const float* float_data = static_cast<const float*>(byte_data.data());
67
68 float red = float_data[kColorRedIndex];
69 float green = float_data[kColorGreenIndex];
70 float blue = float_data[kColorBlueIndex];
71 // Invert alpha so 0 initialized buffer has default value;
72 float alpha = 1.f - float_data[kColorAlphaIndex];
73 uint32_t colorspace = uint_data[kColorSpaceIndex];
74
75 DlColor dl_color(alpha, red, green, blue,
76 static_cast<DlColorSpace>(colorspace));
77
78 return dl_color.withColorSpace(DlColorSpace::kExtendedSRGB);
79}
80} // namespace
81
82Paint::Paint(Dart_Handle paint_objects, Dart_Handle paint_data)
83 : paint_objects_(paint_objects), paint_data_(paint_data) {}
84
86 const DisplayListAttributeFlags& flags,
87 DlTileMode tile_mode) const {
88 if (isNull()) {
89 return nullptr;
90 }
91 tonic::DartByteData byte_data(paint_data_);
93
94 const uint32_t* uint_data = static_cast<const uint32_t*>(byte_data.data());
95 const float* float_data = static_cast<const float*>(byte_data.data());
96
97 Dart_Handle values[kObjectCount];
98 if (Dart_IsNull(paint_objects_)) {
99 if (flags.applies_shader()) {
100 paint.setColorSource(nullptr);
101 }
102 if (flags.applies_color_filter()) {
103 paint.setColorFilter(nullptr);
104 }
105 if (flags.applies_image_filter()) {
106 paint.setImageFilter(nullptr);
107 }
108 } else {
109 FML_DCHECK(Dart_IsList(paint_objects_));
110 intptr_t length = 0;
111 Dart_ListLength(paint_objects_, &length);
112
114 if (Dart_IsError(
115 Dart_ListGetRange(paint_objects_, 0, kObjectCount, values))) {
116 return nullptr;
117 }
118
119 if (flags.applies_shader()) {
120 Dart_Handle shader = values[kShaderIndex];
121 if (Dart_IsNull(shader)) {
122 paint.setColorSource(nullptr);
123 } else {
124 if (Shader* decoded = tonic::DartConverter<Shader*>::FromDart(shader)) {
125 auto sampling =
126 ImageFilter::SamplingFromIndex(uint_data[kFilterQualityIndex]);
127 paint.setColorSource(decoded->shader(sampling));
128 } else {
129 paint.setColorSource(nullptr);
130 }
131 }
132 }
133
134 if (flags.applies_color_filter()) {
135 Dart_Handle color_filter = values[kColorFilterIndex];
136 if (Dart_IsNull(color_filter)) {
137 paint.setColorFilter(nullptr);
138 } else {
139 ColorFilter* decoded =
141 paint.setColorFilter(decoded->filter());
142 }
143 }
144
145 if (flags.applies_image_filter()) {
146 Dart_Handle image_filter = values[kImageFilterIndex];
147 if (Dart_IsNull(image_filter)) {
148 paint.setImageFilter(nullptr);
149 } else {
150 ImageFilter* decoded =
152 paint.setImageFilter(decoded->filter(tile_mode));
153 }
154 }
155 }
156
157 if (flags.applies_anti_alias()) {
158 paint.setAntiAlias(uint_data[kIsAntiAliasIndex] == 0);
159 }
160
161 if (flags.applies_alpha_or_color()) {
162 paint.setColor(ReadColor(byte_data));
163 }
164
165 if (flags.applies_blend()) {
166 uint32_t encoded_blend_mode = uint_data[kBlendModeIndex];
167 uint32_t blend_mode = encoded_blend_mode ^ kBlendModeDefault;
168 paint.setBlendMode(static_cast<DlBlendMode>(blend_mode));
169 }
170
171 if (flags.applies_style()) {
172 uint32_t style = uint_data[kStyleIndex];
173 paint.setDrawStyle(static_cast<DlDrawStyle>(style));
174 }
175
176 if (flags.is_stroked(paint.getDrawStyle())) {
177 float stroke_width = float_data[kStrokeWidthIndex];
178 paint.setStrokeWidth(stroke_width);
179
180 float stroke_miter_limit = float_data[kStrokeMiterLimitIndex];
181 paint.setStrokeMiter(stroke_miter_limit + kStrokeMiterLimitDefault);
182
183 uint32_t stroke_cap = uint_data[kStrokeCapIndex];
184 paint.setStrokeCap(static_cast<DlStrokeCap>(stroke_cap));
185
186 uint32_t stroke_join = uint_data[kStrokeJoinIndex];
187 paint.setStrokeJoin(static_cast<DlStrokeJoin>(stroke_join));
188 }
189
190 if (flags.applies_color_filter()) {
191 paint.setInvertColors(uint_data[kInvertColorIndex] != 0);
192 }
193
194 if (flags.applies_mask_filter()) {
195 switch (uint_data[kMaskFilterIndex]) {
196 case kNull:
197 paint.setMaskFilter(nullptr);
198 break;
199 case kBlur:
200 DlBlurStyle blur_style =
201 static_cast<DlBlurStyle>(uint_data[kMaskFilterBlurStyleIndex]);
202 double sigma = float_data[kMaskFilterSigmaIndex];
203 paint.setMaskFilter(
204 DlBlurMaskFilter::Make(blur_style, SafeNarrow(sigma)));
205 break;
206 }
207 }
208
209 return &paint;
210}
211
212} // namespace flutter
const std::shared_ptr< const DlColorFilter > filter() const
constexpr bool is_stroked(DlDrawStyle style=DlDrawStyle::kStroke) const
constexpr bool applies_color_filter() const
constexpr bool applies_alpha_or_color() const
constexpr bool applies_image_filter() const
constexpr bool applies_shader() const
constexpr bool applies_anti_alias() const
constexpr bool applies_mask_filter() const
constexpr bool applies_blend() const
The primitive honors the DlBlendMode.
constexpr bool applies_style() const
DlPaint & setColor(DlColor color)
Definition dl_paint.h:70
DlPaint & setAntiAlias(bool isAntiAlias)
Definition dl_paint.h:58
DlPaint & setInvertColors(bool isInvertColors)
Definition dl_paint.h:64
DlPaint & setStrokeCap(DlStrokeCap cap)
Definition dl_paint.h:101
DlPaint & setStrokeWidth(float width)
Definition dl_paint.h:115
DlPaint & setStrokeMiter(float miter)
Definition dl_paint.h:121
DlPaint & setBlendMode(DlBlendMode mode)
Definition dl_paint.h:85
DlDrawStyle getDrawStyle() const
Definition dl_paint.h:90
DlPaint & setImageFilter(std::nullptr_t filter)
Definition dl_paint.h:167
DlPaint & setMaskFilter(std::nullptr_t filter)
Definition dl_paint.h:185
DlPaint & setDrawStyle(DlDrawStyle style)
Definition dl_paint.h:93
DlPaint & setStrokeJoin(DlStrokeJoin join)
Definition dl_paint.h:109
DlPaint & setColorFilter(std::nullptr_t filter)
Definition dl_paint.h:149
DlPaint & setColorSource(std::nullptr_t source)
Definition dl_paint.h:131
const std::shared_ptr< DlImageFilter > filter(DlTileMode mode) const
const DlPaint * paint(DlPaint &paint, const DisplayListAttributeFlags &flags, DlTileMode tile_mode) const
Definition paint.cc:85
Paint(Dart_Handle paint_objects, Dart_Handle paint_data)
Definition paint.cc:82
const void * data() const
size_t length_in_bytes() const
#define FML_CHECK(condition)
Definition logging.h:104
#define FML_DCHECK(condition)
Definition logging.h:122
size_t length
constexpr int kStrokeJoinIndex
Definition paint.cc:35
constexpr int kMaskFilterIndex
Definition paint.cc:38
DlStrokeJoin
Definition dl_paint.h:37
constexpr int kShaderIndex
Definition paint.cc:47
constexpr int kInvertColorIndex
Definition paint.cc:41
constexpr int kBlendModeIndex
Definition paint.cc:31
DlStrokeCap
Definition dl_paint.h:28
constexpr int kColorAlphaIndex
Definition paint.cc:29
constexpr int kStyleIndex
Definition paint.cc:32
constexpr int kMaskFilterSigmaIndex
Definition paint.cc:40
constexpr int kStrokeCapIndex
Definition paint.cc:34
constexpr int kObjectCount
Definition paint.cc:50
DlDrawStyle
Definition dl_paint.h:19
constexpr int kColorRedIndex
Definition paint.cc:26
constexpr uint32_t kBlendModeDefault
Definition paint.cc:53
constexpr int kColorFilterIndex
Definition paint.cc:48
constexpr int kStrokeMiterLimitIndex
Definition paint.cc:36
constexpr int kImageFilterIndex
Definition paint.cc:49
constexpr int kIsAntiAliasIndex
Definition paint.cc:25
constexpr int kColorSpaceIndex
Definition paint.cc:30
DlColorSpace
Definition dl_color.h:13
constexpr int kStrokeWidthIndex
Definition paint.cc:33
MaskFilterType
Definition paint.cc:61
@ kBlur
Definition paint.cc:61
@ kNull
Definition paint.cc:61
constexpr float kStrokeMiterLimitDefault
Definition paint.cc:58
constexpr int kColorBlueIndex
Definition paint.cc:28
constexpr int kColorGreenIndex
Definition paint.cc:27
constexpr int kFilterQualityIndex
Definition paint.cc:37
constexpr int kMaskFilterBlurStyleIndex
Definition paint.cc:39
constexpr size_t kDataByteCount
Definition paint.cc:42
BlendMode
Definition color.h:58
const flutter::DlColorFilter * color_filter
Definition paint.h:77
const flutter::DlImageFilter * image_filter
Definition paint.h:78
Style style
Definition paint.h:81
BlendMode blend_mode
Definition paint.h:82