[graphite] Apply colorSpace to the gradients' color stops Bug: b/239959460 Change-Id: Iab65e2b793ae6f865e0629b06a844e803f480ddf Reviewed-on: https://skia-review.googlesource.com/c/skia/+/639077 Reviewed-by: James Godfrey-Kittle <jamesgk@google.com> Commit-Queue: Robert Phillips <robertphillips@google.com>
diff --git a/src/gpu/graphite/KeyHelpers.cpp b/src/gpu/graphite/KeyHelpers.cpp index be00321..56ac6c5 100644 --- a/src/gpu/graphite/KeyHelpers.cpp +++ b/src/gpu/graphite/KeyHelpers.cpp
@@ -88,7 +88,7 @@ VALIDATE_UNIFORMS(gatherer, dict, codeSnippetID) size_t stops = codeSnippetID == BuiltInCodeSnippetID::kLinearGradientShader4 ? 4 : 8; - gatherer->writeArray({gradData.fColor4fs, stops}); + gatherer->writeArray({gradData.fColors, stops}); gatherer->writeArray({gradData.fOffsets, stops}); gatherer->write(gradData.fPoints[0]); gatherer->write(gradData.fPoints[1]); @@ -104,7 +104,7 @@ VALIDATE_UNIFORMS(gatherer, dict, codeSnippetID) size_t stops = codeSnippetID == BuiltInCodeSnippetID::kRadialGradientShader4 ? 4 : 8; - gatherer->writeArray({gradData.fColor4fs, stops}); + gatherer->writeArray({gradData.fColors, stops}); gatherer->writeArray({gradData.fOffsets, stops}); gatherer->write(gradData.fPoints[0]); gatherer->write(gradData.fRadii[0]); @@ -120,7 +120,7 @@ VALIDATE_UNIFORMS(gatherer, dict, codeSnippetID) size_t stops = codeSnippetID == BuiltInCodeSnippetID::kSweepGradientShader4 ? 4 : 8; - gatherer->writeArray({gradData.fColor4fs, stops}); + gatherer->writeArray({gradData.fColors, stops}); gatherer->writeArray({gradData.fOffsets, stops}); gatherer->write(gradData.fPoints[0]); gatherer->write(gradData.fBias); @@ -137,7 +137,7 @@ VALIDATE_UNIFORMS(gatherer, dict, codeSnippetID) size_t stops = codeSnippetID == BuiltInCodeSnippetID::kConicalGradientShader4 ? 4 : 8; - gatherer->writeArray({gradData.fColor4fs, stops}); + gatherer->writeArray({gradData.fColors, stops}); gatherer->writeArray({gradData.fOffsets, stops}); gatherer->write(gradData.fPoints[0]); gatherer->write(gradData.fPoints[1]); @@ -158,7 +158,7 @@ , fScale(0.0f) , fTM(SkTileMode::kClamp) , fNumStops(numStops) { - sk_bzero(fColor4fs, sizeof(fColor4fs)); + sk_bzero(fColors, sizeof(fColors)); sk_bzero(fOffsets, sizeof(fOffsets)); } @@ -168,7 +168,7 @@ float bias, float scale, SkTileMode tm, int numStops, - SkColor4f* color4fs, + const SkPMColor4f* colors, float* offsets) : fType(type) , fBias(bias) @@ -181,7 +181,7 @@ fPoints[1] = point1; fRadii[0] = radius0; fRadii[1] = radius1; - memcpy(fColor4fs, color4fs, fNumStops * sizeof(SkColor4f)); + memcpy(fColors, colors, fNumStops * sizeof(SkColor4f)); if (offsets) { memcpy(fOffsets, offsets, fNumStops * sizeof(float)); } else { @@ -193,7 +193,7 @@ // Extend the colors and offset, if necessary, to fill out the arrays // TODO: this should be done later when the actual code snippet has been selected!! for (int i = fNumStops ; i < kMaxStops; ++i) { - fColor4fs[i] = fColor4fs[fNumStops-1]; + fColors[i] = fColors[fNumStops-1]; fOffsets[i] = fOffsets[fNumStops-1]; } }
diff --git a/src/gpu/graphite/KeyHelpers.h b/src/gpu/graphite/KeyHelpers.h index 4199753..6264b95 100644 --- a/src/gpu/graphite/KeyHelpers.h +++ b/src/gpu/graphite/KeyHelpers.h
@@ -82,7 +82,7 @@ float bias, float scale, SkTileMode, int numStops, - SkColor4f* colors, + const SkPMColor4f* colors, float* offsets); bool operator==(const GradientData& rhs) const { @@ -95,7 +95,7 @@ fScale == rhs.fScale && fTM == rhs.fTM && fNumStops == rhs.fNumStops && - !memcmp(fColor4fs, rhs.fColor4fs, sizeof(fColor4fs)) && + !memcmp(fColors, rhs.fColors, sizeof(fColors)) && !memcmp(fOffsets, rhs.fOffsets, sizeof(fOffsets)); } bool operator!=(const GradientData& rhs) const { return !(*this == rhs); } @@ -111,7 +111,7 @@ SkTileMode fTM; int fNumStops; - SkColor4f fColor4fs[kMaxStops]; + SkPMColor4f fColors[kMaxStops]; float fOffsets[kMaxStops]; };
diff --git a/src/gpu/graphite/PipelineData.h b/src/gpu/graphite/PipelineData.h index e477d22..224cf8a 100644 --- a/src/gpu/graphite/PipelineData.h +++ b/src/gpu/graphite/PipelineData.h
@@ -123,6 +123,7 @@ void write(const Uniform& u, const uint8_t* data) { fUniformManager.write(u, data); } void writeArray(SkSpan<const SkColor4f> colors) { fUniformManager.writeArray(colors); } + void writeArray(SkSpan<const SkPMColor4f> colors) { fUniformManager.writeArray(colors); } void writeArray(SkSpan<const float> floats) { fUniformManager.writeArray(floats); } void writeHalf(const SkMatrix& mat) { fUniformManager.writeHalf(mat); }
diff --git a/src/shaders/gradients/SkLinearGradient.cpp b/src/shaders/gradients/SkLinearGradient.cpp index d856f4c..84d351e 100644 --- a/src/shaders/gradients/SkLinearGradient.cpp +++ b/src/shaders/gradients/SkLinearGradient.cpp
@@ -12,6 +12,7 @@ #include "src/shaders/SkLocalMatrixShader.h" #ifdef SK_GRAPHITE_ENABLED +#include "src/gpu/graphite/KeyContext.h" #include "src/gpu/graphite/KeyHelpers.h" #include "src/gpu/graphite/PaintParamsKey.h" #endif @@ -105,13 +106,17 @@ skgpu::graphite::PipelineDataGatherer* gatherer) const { using namespace skgpu::graphite; + // TODO: respect the interpolateInPremul setting + SkColor4fXformer xformedColors(this, keyContext.dstColorInfo().colorSpace()); + const SkPMColor4f* colors = xformedColors.fColors.begin(); + GradientShaderBlocks::GradientData data(GradientType::kLinear, fStart, fEnd, 0.0f, 0.0f, 0.0f, 0.0f, fTileMode, fColorCount, - fColors, + colors, fPositions); GradientShaderBlocks::BeginBlock(keyContext, builder, gatherer, data);
diff --git a/src/shaders/gradients/SkRadialGradient.cpp b/src/shaders/gradients/SkRadialGradient.cpp index ef7f0c0..ebe2dd3 100644 --- a/src/shaders/gradients/SkRadialGradient.cpp +++ b/src/shaders/gradients/SkRadialGradient.cpp
@@ -11,6 +11,7 @@ #include "src/shaders/SkLocalMatrixShader.h" #ifdef SK_GRAPHITE_ENABLED +#include "src/gpu/graphite/KeyContext.h" #include "src/gpu/graphite/KeyHelpers.h" #include "src/gpu/graphite/PaintParamsKey.h" #endif @@ -146,13 +147,17 @@ skgpu::graphite::PipelineDataGatherer* gatherer) const { using namespace skgpu::graphite; + // TODO: respect the interpolateInPremul setting + SkColor4fXformer xformedColors(this, keyContext.dstColorInfo().colorSpace()); + const SkPMColor4f* colors = xformedColors.fColors.begin(); + GradientShaderBlocks::GradientData data(GradientType::kRadial, fCenter, { 0.0f, 0.0f }, fRadius, 0.0f, 0.0f, 0.0f, fTileMode, fColorCount, - fColors, + colors, fPositions); GradientShaderBlocks::BeginBlock(keyContext, builder, gatherer, data);
diff --git a/src/shaders/gradients/SkSweepGradient.cpp b/src/shaders/gradients/SkSweepGradient.cpp index efbfa66..c85f3de 100644 --- a/src/shaders/gradients/SkSweepGradient.cpp +++ b/src/shaders/gradients/SkSweepGradient.cpp
@@ -12,6 +12,7 @@ #include "src/shaders/SkLocalMatrixShader.h" #ifdef SK_GRAPHITE_ENABLED +#include "src/gpu/graphite/KeyContext.h" #include "src/gpu/graphite/KeyHelpers.h" #include "src/gpu/graphite/PaintParamsKey.h" #endif @@ -194,13 +195,17 @@ skgpu::graphite::PipelineDataGatherer* gatherer) const { using namespace skgpu::graphite; + // TODO: respect the interpolateInPremul setting + SkColor4fXformer xformedColors(this, keyContext.dstColorInfo().colorSpace()); + const SkPMColor4f* colors = xformedColors.fColors.begin(); + GradientShaderBlocks::GradientData data(SkShaderBase::GradientType::kSweep, fCenter, { 0.0f, 0.0f }, 0.0, 0.0f, fTBias, fTScale, fTileMode, fColorCount, - fColors, + colors, fPositions); GradientShaderBlocks::BeginBlock(keyContext, builder, gatherer, data);
diff --git a/src/shaders/gradients/SkTwoPointConicalGradient.cpp b/src/shaders/gradients/SkTwoPointConicalGradient.cpp index 6e3c7b9..7e771fb 100644 --- a/src/shaders/gradients/SkTwoPointConicalGradient.cpp +++ b/src/shaders/gradients/SkTwoPointConicalGradient.cpp
@@ -15,6 +15,7 @@ #include <utility> #ifdef SK_GRAPHITE_ENABLED +#include "src/gpu/graphite/KeyContext.h" #include "src/gpu/graphite/KeyHelpers.h" #include "src/gpu/graphite/PaintParamsKey.h" #endif @@ -536,13 +537,17 @@ skgpu::graphite::PipelineDataGatherer* gatherer) const { using namespace skgpu::graphite; + // TODO: respect the interpolateInPremul setting + SkColor4fXformer xformedColors(this, keyContext.dstColorInfo().colorSpace()); + const SkPMColor4f* colors = xformedColors.fColors.begin(); + GradientShaderBlocks::GradientData data(GradientType::kConical, fCenter1, fCenter2, fRadius1, fRadius2, 0.0f, 0.0f, fTileMode, fColorCount, - fColors, + colors, fPositions); GradientShaderBlocks::BeginBlock(keyContext, builder, gatherer, data);