aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpu')
-rw-r--r--src/gpu/GrPaint.cpp4
-rw-r--r--src/gpu/SkGr.cpp28
2 files changed, 24 insertions, 8 deletions
diff --git a/src/gpu/GrPaint.cpp b/src/gpu/GrPaint.cpp
index fd78f9f819..02518c0464 100644
--- a/src/gpu/GrPaint.cpp
+++ b/src/gpu/GrPaint.cpp
@@ -16,7 +16,7 @@ GrPaint::GrPaint()
: fAntiAlias(false)
, fDisableOutputConversionToSRGB(false)
, fAllowSRGBInputs(false)
- , fColor(GrColor_WHITE) {}
+ , fColor(GrColor4f::FromGrColor(GrColor_WHITE)) {}
void GrPaint::setCoverageSetOpXPFactory(SkRegion::Op regionOp, bool invertCoverage) {
fXPFactory = GrCoverageSetOpXPFactory::Make(regionOp, invertCoverage);
@@ -46,7 +46,7 @@ bool GrPaint::isConstantBlendedColor(GrColor* color) const {
GrProcOptInfo colorProcInfo;
colorProcInfo.calcWithInitialValues(
sk_sp_address_as_pointer_address(fColorFragmentProcessors.begin()),
- this->numColorFragmentProcessors(), fColor, kRGBA_GrColorComponentFlags, false);
+ this->numColorFragmentProcessors(), this->getColor(), kRGBA_GrColorComponentFlags, false);
GrXPFactory::InvariantBlendedColor blendedColor;
if (fXPFactory) {
diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp
index 1e4ff52752..bb0ef91a88 100644
--- a/src/gpu/SkGr.cpp
+++ b/src/gpu/SkGr.cpp
@@ -28,6 +28,7 @@
#include "SkMessageBus.h"
#include "SkMipMap.h"
#include "SkPixelRef.h"
+#include "SkPM4fPriv.h"
#include "SkResourceCache.h"
#include "SkTemplates.h"
#include "SkYUVPlanesCache.h"
@@ -529,6 +530,16 @@ static inline bool skpaint_to_grpaint_impl(GrContext* context,
grPaint->setAntiAlias(skPaint.isAntiAlias());
grPaint->setAllowSRGBInputs(allowSRGBInputs);
+ // Raw translation of the SkPaint color to our 4f format:
+ GrColor4f origColor = GrColor4f::FromGrColor(SkColorToUnpremulGrColor(skPaint.getColor()));
+
+ // Linearize, if the color is meant to be in sRGB gamma:
+ if (allowSRGBInputs) {
+ origColor.fRGBA[0] = exact_srgb_to_linear(origColor.fRGBA[0]);
+ origColor.fRGBA[1] = exact_srgb_to_linear(origColor.fRGBA[1]);
+ origColor.fRGBA[2] = exact_srgb_to_linear(origColor.fRGBA[2]);
+ }
+
// Setup the initial color considering the shader, the SkPaint color, and the presence or not
// of per-vertex colors.
sk_sp<GrFragmentProcessor> shaderFP;
@@ -559,8 +570,9 @@ static inline bool skpaint_to_grpaint_impl(GrContext* context,
// The geometry processor will insert the primitive color to start the color chain, so
// the GrPaint color will be ignored.
- GrColor shaderInput = SkColorToOpaqueGrColor(skPaint.getColor());
+ GrColor shaderInput = origColor.opaque().toGrColor();
+ // SRGBTODO: Preserve 4f on this code path
shaderFP = GrFragmentProcessor::OverrideInput(shaderFP, shaderInput);
if (primitiveIsSrc) {
shaderFP = GrXfermodeFragmentProcessor::MakeFromDstProcessor(std::move(shaderFP),
@@ -574,6 +586,7 @@ static inline bool skpaint_to_grpaint_impl(GrContext* context,
grPaint->addColorFragmentProcessor(shaderFP);
}
+ // We can ignore origColor here - alpha is unchanged by gamma
GrColor paintAlpha = SkColorAlphaToGrColor(skPaint.getColor());
if (GrColor_WHITE != paintAlpha) {
grPaint->addColorFragmentProcessor(GrConstColorProcessor::Make(
@@ -581,15 +594,16 @@ static inline bool skpaint_to_grpaint_impl(GrContext* context,
}
} else {
// The shader's FP sees the paint unpremul color
- grPaint->setColor(SkColorToUnpremulGrColor(skPaint.getColor()));
+ grPaint->setColor4f(origColor);
grPaint->addColorFragmentProcessor(std::move(shaderFP));
}
} else {
if (primColorMode) {
// There is a blend between the primitive color and the paint color. The blend considers
// the opaque paint color. The paint's alpha is applied to the post-blended color.
+ // SRGBTODO: Preserve 4f on this code path
sk_sp<GrFragmentProcessor> processor(
- GrConstColorProcessor::Make(SkColorToOpaqueGrColor(skPaint.getColor()),
+ GrConstColorProcessor::Make(origColor.opaque().toGrColor(),
GrConstColorProcessor::kIgnore_InputMode));
if (primitiveIsSrc) {
processor = GrXfermodeFragmentProcessor::MakeFromDstProcessor(std::move(processor),
@@ -602,8 +616,9 @@ static inline bool skpaint_to_grpaint_impl(GrContext* context,
grPaint->addColorFragmentProcessor(std::move(processor));
}
- grPaint->setColor(SkColorToOpaqueGrColor(skPaint.getColor()));
+ grPaint->setColor4f(origColor.opaque());
+ // We can ignore origColor here - alpha is unchanged by gamma
GrColor paintAlpha = SkColorAlphaToGrColor(skPaint.getColor());
if (GrColor_WHITE != paintAlpha) {
grPaint->addColorFragmentProcessor(GrConstColorProcessor::Make(
@@ -611,7 +626,7 @@ static inline bool skpaint_to_grpaint_impl(GrContext* context,
}
} else {
// No shader, no primitive color.
- grPaint->setColor(SkColorToPremulGrColor(skPaint.getColor()));
+ grPaint->setColor4f(origColor.premul());
applyColorFilterToPaintColor = true;
}
}
@@ -619,7 +634,8 @@ static inline bool skpaint_to_grpaint_impl(GrContext* context,
SkColorFilter* colorFilter = skPaint.getColorFilter();
if (colorFilter) {
if (applyColorFilterToPaintColor) {
- grPaint->setColor(SkColorToPremulGrColor(colorFilter->filterColor(skPaint.getColor())));
+ grPaint->setColor4f(GrColor4f::FromSkColor4f(
+ colorFilter->filterColor4f(origColor.toSkColor4f())).premul());
} else {
sk_sp<GrFragmentProcessor> cfFP(colorFilter->asFragmentProcessor(context));
if (cfFP) {