Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1040)

Unified Diff: third_party/WebKit/Source/platform/graphics/Gradient.cpp

Issue 2893083002: cc: Move SkShader construction to a single spot in PaintShader (Closed)
Patch Set: update Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/platform/graphics/Gradient.cpp
diff --git a/third_party/WebKit/Source/platform/graphics/Gradient.cpp b/third_party/WebKit/Source/platform/graphics/Gradient.cpp
index a96f9f74a609d32fa19066705ba1ff18cbb3d990..af08ed49530f33648621e98c7ac7ef0c2de2124b 100644
--- a/third_party/WebKit/Source/platform/graphics/Gradient.cpp
+++ b/third_party/WebKit/Source/platform/graphics/Gradient.cpp
@@ -121,7 +121,7 @@ void Gradient::FillSkiaStops(ColorBuffer& colors, OffsetBuffer& pos) const {
}
}
-sk_sp<PaintShader> Gradient::CreateShaderInternal(
+std::unique_ptr<PaintShader> Gradient::CreateShaderInternal(
const SkMatrix& local_matrix) {
SortStopsIfNecessary();
DCHECK(stops_sorted_);
@@ -151,20 +151,20 @@ sk_sp<PaintShader> Gradient::CreateShaderInternal(
uint32_t flags = color_interpolation_ == ColorInterpolation::kPremultiplied
? SkGradientShader::kInterpolateColorsInPremul_Flag
: 0;
- sk_sp<SkShader> shader = CreateShader(colors, pos, tile, flags, local_matrix);
- if (!shader) {
- // use last color, since our "geometry" was degenerate (e.g. radius==0)
- shader = SkShader::MakeColorShader(colors.back());
- }
+ std::unique_ptr<PaintShader> shader =
+ CreateShader(colors, pos, tile, flags, local_matrix, colors.back());
+ DCHECK(shader);
- return WrapSkShader(std::move(shader));
+ return shader;
}
void Gradient::ApplyToFlags(PaintFlags& flags, const SkMatrix& local_matrix) {
- if (!cached_shader_ || local_matrix != cached_shader_->getLocalMatrix())
+ if (!cached_shader_ ||
+ local_matrix != cached_shader_->sk_shader()->getLocalMatrix()) {
cached_shader_ = CreateShaderInternal(local_matrix);
+ }
- flags.setShader(cached_shader_);
+ flags.setShader(WTF::MakeUnique<PaintShader>(*cached_shader_));
// Legacy behavior: gradients are always dithered.
flags.setDither(true);
@@ -183,15 +183,17 @@ class LinearGradient final : public Gradient {
p1_(p1) {}
protected:
- sk_sp<SkShader> CreateShader(const ColorBuffer& colors,
- const OffsetBuffer& pos,
- SkShader::TileMode tile_mode,
- uint32_t flags,
- const SkMatrix& local_matrix) const override {
+ std::unique_ptr<PaintShader> CreateShader(
+ const ColorBuffer& colors,
+ const OffsetBuffer& pos,
+ SkShader::TileMode tile_mode,
+ uint32_t flags,
+ const SkMatrix& local_matrix,
+ SkColor fallback_color) const override {
SkPoint pts[2] = {p0_.Data(), p1_.Data()};
- return SkGradientShader::MakeLinear(pts, colors.data(), pos.data(),
- static_cast<int>(colors.size()),
- tile_mode, flags, &local_matrix);
+ return PaintShader::MakeLinearGradient(
+ pts, colors.data(), pos.data(), static_cast<int>(colors.size()),
+ tile_mode, flags, &local_matrix, fallback_color);
}
private:
@@ -216,11 +218,13 @@ class RadialGradient final : public Gradient {
aspect_ratio_(aspect_ratio) {}
protected:
- sk_sp<SkShader> CreateShader(const ColorBuffer& colors,
- const OffsetBuffer& pos,
- SkShader::TileMode tile_mode,
- uint32_t flags,
- const SkMatrix& local_matrix) const override {
+ std::unique_ptr<PaintShader> CreateShader(
+ const ColorBuffer& colors,
+ const OffsetBuffer& pos,
+ SkShader::TileMode tile_mode,
+ uint32_t flags,
+ const SkMatrix& local_matrix,
+ SkColor fallback_color) const override {
SkTCopyOnFirstWrite<SkMatrix> adjusted_local_matrix(local_matrix);
if (aspect_ratio_ != 1) {
// CSS3 elliptical gradients: apply the elliptical scaling at the
@@ -233,20 +237,20 @@ class RadialGradient final : public Gradient {
// Since the two-point radial gradient is slower than the plain radial,
// only use it if we have to.
if (p0_ == p1_ && r0_ <= 0.0f) {
- return SkGradientShader::MakeRadial(
+ return PaintShader::MakeRadialGradient(
p1_.Data(), r1_, colors.data(), pos.data(),
static_cast<int>(colors.size()), tile_mode, flags,
- adjusted_local_matrix);
+ adjusted_local_matrix, fallback_color);
}
// The radii we give to Skia must be positive. If we're given a
// negative radius, ask for zero instead.
const SkScalar radius0 = std::max(WebCoreFloatToSkScalar(r0_), 0.0f);
const SkScalar radius1 = std::max(WebCoreFloatToSkScalar(r1_), 0.0f);
- return SkGradientShader::MakeTwoPointConical(
+ return PaintShader::MakeTwoPointConicalGradient(
p0_.Data(), radius0, p1_.Data(), radius1, colors.data(), pos.data(),
static_cast<int>(colors.size()), tile_mode, flags,
- adjusted_local_matrix);
+ adjusted_local_matrix, fallback_color);
}
private:
@@ -267,11 +271,13 @@ class ConicGradient final : public Gradient {
angle_(angle) {}
protected:
- sk_sp<SkShader> CreateShader(const ColorBuffer& colors,
- const OffsetBuffer& pos,
- SkShader::TileMode tile_mode,
- uint32_t flags,
- const SkMatrix& local_matrix) const override {
+ std::unique_ptr<PaintShader> CreateShader(
+ const ColorBuffer& colors,
+ const OffsetBuffer& pos,
+ SkShader::TileMode tile_mode,
+ uint32_t flags,
+ const SkMatrix& local_matrix,
+ SkColor fallback_color) const override {
DCHECK_NE(tile_mode, SkShader::kMirror_TileMode);
// Skia's sweep gradient angles are relative to the x-axis, not the y-axis.
@@ -282,9 +288,10 @@ class ConicGradient final : public Gradient {
position_.Y());
}
- return SkGradientShader::MakeSweep(
+ return PaintShader::MakeSweepGradient(
position_.X(), position_.Y(), colors.data(), pos.data(),
- static_cast<int>(colors.size()), flags, adjusted_local_matrix);
+ static_cast<int>(colors.size()), flags, adjusted_local_matrix,
+ fallback_color);
}
private:
« no previous file with comments | « third_party/WebKit/Source/platform/graphics/Gradient.h ('k') | third_party/WebKit/Source/platform/graphics/Image.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698