aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar brianosman <brianosman@google.com>2016-09-08 09:33:50 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-09-08 09:33:50 -0700
commit4cea3b9e9d9836c926a8feb55d050993d40b4b5e (patch)
tree4e6f16e5bd96f10cfb9a116e00242ed76f30cd2c
parent3b10b37a1c5f273906249012ddbdfd37a91b3ae8 (diff)
Push usage of GrColor4f into OverrideInput
Just a change to preserve precision. BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2324553002 Review-Url: https://codereview.chromium.org/2324553002
-rw-r--r--include/gpu/GrColor.h11
-rw-r--r--include/gpu/GrFragmentProcessor.h2
-rw-r--r--src/gpu/GrFragmentProcessor.cpp23
-rw-r--r--src/gpu/SkGr.cpp4
4 files changed, 21 insertions, 19 deletions
diff --git a/include/gpu/GrColor.h b/include/gpu/GrColor.h
index 911b18fc16..f52671732a 100644
--- a/include/gpu/GrColor.h
+++ b/include/gpu/GrColor.h
@@ -195,6 +195,17 @@ struct GrColor4f {
return GrColor4f(color.fR, color.fG, color.fB, color.fA);
}
+ bool operator==(const GrColor4f& other) const {
+ return
+ fRGBA[0] == other.fRGBA[0] &&
+ fRGBA[1] == other.fRGBA[1] &&
+ fRGBA[2] == other.fRGBA[2] &&
+ fRGBA[3] == other.fRGBA[3];
+ }
+ bool operator!=(const GrColor4f& other) const {
+ return !(*this == other);
+ }
+
GrColor toGrColor() const {
return GrColorPackRGBA(
SkTPin<unsigned>(static_cast<unsigned>(fRGBA[0] * 255.0f + 0.5f), 0, 255),
diff --git a/include/gpu/GrFragmentProcessor.h b/include/gpu/GrFragmentProcessor.h
index ffbf576dbe..f955207385 100644
--- a/include/gpu/GrFragmentProcessor.h
+++ b/include/gpu/GrFragmentProcessor.h
@@ -45,7 +45,7 @@ public:
* The parent will ignore its input color and instead feed the passed in color as input to the
* child.
*/
- static sk_sp<GrFragmentProcessor> OverrideInput(sk_sp<GrFragmentProcessor>, GrColor);
+ static sk_sp<GrFragmentProcessor> OverrideInput(sk_sp<GrFragmentProcessor>, GrColor4f);
/**
* Returns a fragment processor that premuls the input before calling the passed in fragment
diff --git a/src/gpu/GrFragmentProcessor.cpp b/src/gpu/GrFragmentProcessor.cpp
index a8a4898e78..c905fcc44f 100644
--- a/src/gpu/GrFragmentProcessor.cpp
+++ b/src/gpu/GrFragmentProcessor.cpp
@@ -259,10 +259,10 @@ sk_sp<GrFragmentProcessor> GrFragmentProcessor::MulOutputByInputUnpremulColor(
//////////////////////////////////////////////////////////////////////////////
sk_sp<GrFragmentProcessor> GrFragmentProcessor::OverrideInput(sk_sp<GrFragmentProcessor> fp,
- GrColor color) {
+ GrColor4f color) {
class ReplaceInputFragmentProcessor : public GrFragmentProcessor {
public:
- ReplaceInputFragmentProcessor(sk_sp<GrFragmentProcessor> child, GrColor color)
+ ReplaceInputFragmentProcessor(sk_sp<GrFragmentProcessor> child, GrColor4f color)
: fColor(color) {
this->initClassID<ReplaceInputFragmentProcessor>();
this->registerChildProcessor(std::move(child));
@@ -286,24 +286,17 @@ sk_sp<GrFragmentProcessor> GrFragmentProcessor::OverrideInput(sk_sp<GrFragmentPr
private:
void onSetData(const GrGLSLProgramDataManager& pdman,
const GrProcessor& fp) override {
- GrColor color = fp.cast<ReplaceInputFragmentProcessor>().fColor;
+ GrColor4f color = fp.cast<ReplaceInputFragmentProcessor>().fColor;
if (!fHaveSetColor || color != fPreviousColor) {
- static const float scale = 1.f / 255.f;
- float floatColor[4] = {
- GrColorUnpackR(color) * scale,
- GrColorUnpackG(color) * scale,
- GrColorUnpackB(color) * scale,
- GrColorUnpackA(color) * scale,
- };
- pdman.set4fv(fColorUni, 1, floatColor);
+ pdman.set4fv(fColorUni, 1, color.fRGBA);
fPreviousColor = color;
fHaveSetColor = true;
}
}
GrGLSLProgramDataManager::UniformHandle fColorUni;
- bool fHaveSetColor;
- GrColor fPreviousColor;
+ bool fHaveSetColor;
+ GrColor4f fPreviousColor;
};
return new GLFP;
@@ -318,12 +311,12 @@ sk_sp<GrFragmentProcessor> GrFragmentProcessor::OverrideInput(sk_sp<GrFragmentPr
}
void onComputeInvariantOutput(GrInvariantOutput* inout) const override {
- inout->setToOther(kRGBA_GrColorComponentFlags, fColor,
+ inout->setToOther(kRGBA_GrColorComponentFlags, fColor.toGrColor(),
GrInvariantOutput::kWillNot_ReadInput);
this->childProcessor(0).computeInvariantOutput(inout);
}
- GrColor fColor;
+ GrColor4f fColor;
};
GrInvariantOutput childOut(0x0, kNone_GrColorComponentFlags, false);
diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp
index 3d6d4ec8bf..7c0d09b702 100644
--- a/src/gpu/SkGr.cpp
+++ b/src/gpu/SkGr.cpp
@@ -569,9 +569,7 @@ 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 = origColor.opaque().toGrColor();
-
- // SRGBTODO: Preserve 4f on this code path
+ GrColor4f shaderInput = origColor.opaque();
shaderFP = GrFragmentProcessor::OverrideInput(shaderFP, shaderInput);
if (primitiveIsSrc) {
shaderFP = GrXfermodeFragmentProcessor::MakeFromDstProcessor(std::move(shaderFP),