Skip to content

Commit 05fde6f

Browse files
mikerreedhjfreyer
authored andcommitted
Defer making skshader until we know quality (flutter#24376)
1 parent cf8a989 commit 05fde6f

File tree

9 files changed

+59
-38
lines changed

9 files changed

+59
-38
lines changed

flow/paint_utils.cc

+2-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ sk_sp<SkShader> CreateCheckerboardShader(SkColor c1, SkColor c2, int size) {
2020
bm.eraseColor(c1);
2121
bm.eraseArea(SkIRect::MakeLTRB(0, 0, size, size), c2);
2222
bm.eraseArea(SkIRect::MakeLTRB(size, size, 2 * size, 2 * size), c2);
23-
return bm.makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat);
23+
return bm.makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat,
24+
SkSamplingOptions());
2425
}
2526

2627
} // anonymous namespace

lib/ui/compositing/scene_builder.cc

+3-1
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,10 @@ void SceneBuilder::pushShaderMask(Dart_Handle layer_handle,
183183
int blendMode) {
184184
SkRect rect = SkRect::MakeLTRB(maskRectLeft, maskRectTop, maskRectRight,
185185
maskRectBottom);
186+
// TODO: should this come from the caller?
187+
SkFilterQuality quality = kNone_SkFilterQuality;
186188
auto layer = std::make_shared<flutter::ShaderMaskLayer>(
187-
shader->shader(), rect, static_cast<SkBlendMode>(blendMode));
189+
shader->shader(quality), rect, static_cast<SkBlendMode>(blendMode));
188190
PushLayer(layer);
189191
EngineLayer::MakeRetained(layer_handle, layer);
190192
}

lib/ui/painting/gradient.cc

+13-11
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,10 @@ void CanvasGradient::initLinear(const tonic::Float32List& end_points,
5858
sk_matrix = ToSkMatrix(matrix4);
5959
}
6060

61-
set_shader(UIDartState::CreateGPUObject(SkGradientShader::MakeLinear(
61+
sk_shader_ = UIDartState::CreateGPUObject(SkGradientShader::MakeLinear(
6262
reinterpret_cast<const SkPoint*>(end_points.data()),
6363
reinterpret_cast<const SkColor*>(colors.data()), color_stops.data(),
64-
colors.num_elements(), tile_mode, 0, has_matrix ? &sk_matrix : nullptr)));
64+
colors.num_elements(), tile_mode, 0, has_matrix ? &sk_matrix : nullptr));
6565
}
6666

6767
void CanvasGradient::initRadial(double center_x,
@@ -83,10 +83,10 @@ void CanvasGradient::initRadial(double center_x,
8383
sk_matrix = ToSkMatrix(matrix4);
8484
}
8585

86-
set_shader(UIDartState::CreateGPUObject(SkGradientShader::MakeRadial(
86+
sk_shader_ = UIDartState::CreateGPUObject(SkGradientShader::MakeRadial(
8787
SkPoint::Make(center_x, center_y), radius,
8888
reinterpret_cast<const SkColor*>(colors.data()), color_stops.data(),
89-
colors.num_elements(), tile_mode, 0, has_matrix ? &sk_matrix : nullptr)));
89+
colors.num_elements(), tile_mode, 0, has_matrix ? &sk_matrix : nullptr));
9090
}
9191

9292
void CanvasGradient::initSweep(double center_x,
@@ -109,11 +109,11 @@ void CanvasGradient::initSweep(double center_x,
109109
sk_matrix = ToSkMatrix(matrix4);
110110
}
111111

112-
set_shader(UIDartState::CreateGPUObject(SkGradientShader::MakeSweep(
112+
sk_shader_ = UIDartState::CreateGPUObject(SkGradientShader::MakeSweep(
113113
center_x, center_y, reinterpret_cast<const SkColor*>(colors.data()),
114114
color_stops.data(), colors.num_elements(), tile_mode,
115115
start_angle * 180.0 / M_PI, end_angle * 180.0 / M_PI, 0,
116-
has_matrix ? &sk_matrix : nullptr)));
116+
has_matrix ? &sk_matrix : nullptr));
117117
}
118118

119119
void CanvasGradient::initTwoPointConical(double start_x,
@@ -138,11 +138,13 @@ void CanvasGradient::initTwoPointConical(double start_x,
138138
sk_matrix = ToSkMatrix(matrix4);
139139
}
140140

141-
set_shader(UIDartState::CreateGPUObject(SkGradientShader::MakeTwoPointConical(
142-
SkPoint::Make(start_x, start_y), start_radius,
143-
SkPoint::Make(end_x, end_y), end_radius,
144-
reinterpret_cast<const SkColor*>(colors.data()), color_stops.data(),
145-
colors.num_elements(), tile_mode, 0, has_matrix ? &sk_matrix : nullptr)));
141+
sk_shader_ =
142+
UIDartState::CreateGPUObject(SkGradientShader::MakeTwoPointConical(
143+
SkPoint::Make(start_x, start_y), start_radius,
144+
SkPoint::Make(end_x, end_y), end_radius,
145+
reinterpret_cast<const SkColor*>(colors.data()), color_stops.data(),
146+
colors.num_elements(), tile_mode, 0,
147+
has_matrix ? &sk_matrix : nullptr));
146148
}
147149

148150
CanvasGradient::CanvasGradient() = default;

lib/ui/painting/gradient.h

+3
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,13 @@ class CanvasGradient : public Shader {
6262
SkTileMode tile_mode,
6363
const tonic::Float64List& matrix4);
6464

65+
sk_sp<SkShader> shader(SkFilterQuality) override { return sk_shader_.get(); }
66+
6567
static void RegisterNatives(tonic::DartLibraryNatives* natives);
6668

6769
private:
6870
CanvasGradient();
71+
flutter::SkiaGPUObject<SkShader> sk_shader_;
6972
};
7073

7174
} // namespace flutter

lib/ui/painting/image_shader.cc

+15-3
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,23 @@ void ImageShader::initWithImage(CanvasImage* image,
4343
ToDart("ImageShader constructor called with non-genuine Image."));
4444
return;
4545
}
46-
SkMatrix sk_matrix = ToSkMatrix(matrix4);
47-
set_shader(UIDartState::CreateGPUObject(
48-
image->image()->makeShader(tmx, tmy, &sk_matrix)));
46+
sk_image_ = image->image();
47+
tmx_ = tmx;
48+
tmy_ = tmy;
49+
local_matrix_ = ToSkMatrix(matrix4);
4950
}
5051

52+
sk_sp<SkShader> ImageShader::shader(SkFilterQuality quality) {
53+
if (!cached_shader_.get() || cached_quality_ != quality) {
54+
SkSamplingOptions sampling(quality,
55+
SkSamplingOptions::kMedium_asMipmapLinear);
56+
57+
cached_quality_ = quality;
58+
cached_shader_ = UIDartState::CreateGPUObject(
59+
sk_image_->makeShader(tmx_, tmy_, sampling, &local_matrix_));
60+
}
61+
return cached_shader_.get();
62+
}
5163
ImageShader::ImageShader() = default;
5264

5365
ImageShader::~ImageShader() = default;

lib/ui/painting/image_shader.h

+10
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,20 @@ class ImageShader : public Shader {
3333
SkTileMode tmy,
3434
const tonic::Float64List& matrix4);
3535

36+
sk_sp<SkShader> shader(SkFilterQuality) override;
37+
3638
static void RegisterNatives(tonic::DartLibraryNatives* natives);
3739

3840
private:
3941
ImageShader();
42+
43+
sk_sp<SkImage> sk_image_;
44+
SkTileMode tmx_;
45+
SkTileMode tmy_;
46+
SkMatrix local_matrix_;
47+
48+
SkFilterQuality cached_quality_ = kNone_SkFilterQuality;
49+
flutter::SkiaGPUObject<SkShader> cached_shader_;
4050
};
4151

4252
} // namespace flutter

lib/ui/painting/paint.cc

+9-12
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,12 @@ Paint::Paint(Dart_Handle paint_objects, Dart_Handle paint_data) {
7171
return;
7272
}
7373

74+
tonic::DartByteData byte_data(paint_data);
75+
FML_CHECK(byte_data.length_in_bytes() == kDataByteCount);
76+
77+
const uint32_t* uint_data = static_cast<const uint32_t*>(byte_data.data());
78+
const float* float_data = static_cast<const float*>(byte_data.data());
79+
7480
Dart_Handle values[kObjectCount];
7581
if (!Dart_IsNull(paint_objects)) {
7682
FML_DCHECK(Dart_IsList(paint_objects));
@@ -86,7 +92,9 @@ Paint::Paint(Dart_Handle paint_objects, Dart_Handle paint_data) {
8692
Dart_Handle shader = values[kShaderIndex];
8793
if (!Dart_IsNull(shader)) {
8894
Shader* decoded = tonic::DartConverter<Shader*>::FromDart(shader);
89-
paint_.setShader(decoded->shader());
95+
uint32_t filter_quality = uint_data[kFilterQualityIndex];
96+
paint_.setShader(
97+
decoded->shader(static_cast<SkFilterQuality>(filter_quality)));
9098
}
9199

92100
Dart_Handle color_filter = values[kColorFilterIndex];
@@ -104,12 +112,6 @@ Paint::Paint(Dart_Handle paint_objects, Dart_Handle paint_data) {
104112
}
105113
}
106114

107-
tonic::DartByteData byte_data(paint_data);
108-
FML_CHECK(byte_data.length_in_bytes() == kDataByteCount);
109-
110-
const uint32_t* uint_data = static_cast<const uint32_t*>(byte_data.data());
111-
const float* float_data = static_cast<const float*>(byte_data.data());
112-
113115
paint_.setAntiAlias(uint_data[kIsAntiAliasIndex] == 0);
114116

115117
uint32_t encoded_color = uint_data[kColorIndex];
@@ -149,11 +151,6 @@ Paint::Paint(Dart_Handle paint_objects, Dart_Handle paint_data) {
149151
paint_.setStrokeMiter(stroke_miter_limit + kStrokeMiterLimitDefault);
150152
}
151153

152-
uint32_t filter_quality = uint_data[kFilterQualityIndex];
153-
if (filter_quality) {
154-
paint_.setFilterQuality(static_cast<SkFilterQuality>(filter_quality));
155-
}
156-
157154
if (uint_data[kInvertColorIndex]) {
158155
sk_sp<SkColorFilter> invert_filter =
159156
ColorFilter::MakeColorMatrixFilter255(invert_colors);

lib/ui/painting/shader.cc

-3
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,6 @@ namespace flutter {
1010

1111
IMPLEMENT_WRAPPERTYPEINFO(ui, Shader);
1212

13-
Shader::Shader(flutter::SkiaGPUObject<SkShader> shader)
14-
: shader_(std::move(shader)) {}
15-
1613
Shader::~Shader() = default;
1714

1815
} // namespace flutter

lib/ui/painting/shader.h

+4-7
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "flutter/flow/skia_gpu_object.h"
99
#include "flutter/lib/ui/dart_wrapper.h"
1010
#include "flutter/lib/ui/ui_dart_state.h"
11+
#include "third_party/skia/include/core/SkFilterQuality.h"
1112
#include "third_party/skia/include/core/SkShader.h"
1213

1314
namespace flutter {
@@ -19,17 +20,13 @@ class Shader : public RefCountedDartWrappable<Shader> {
1920
public:
2021
~Shader() override;
2122

22-
sk_sp<SkShader> shader() { return shader_.get(); }
23-
24-
void set_shader(flutter::SkiaGPUObject<SkShader> shader) {
25-
shader_ = std::move(shader);
26-
}
23+
virtual sk_sp<SkShader> shader(SkFilterQuality) = 0;
2724

2825
protected:
29-
Shader(flutter::SkiaGPUObject<SkShader> shader = {});
26+
Shader() {}
3027

3128
private:
32-
flutter::SkiaGPUObject<SkShader> shader_;
29+
// flutter::SkiaGPUObject<SkShader> shader_;
3330
};
3431

3532
} // namespace flutter

0 commit comments

Comments
 (0)