diff options
author | brianosman <brianosman@google.com> | 2016-09-08 09:33:50 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-09-08 09:33:50 -0700 |
commit | 4cea3b9e9d9836c926a8feb55d050993d40b4b5e (patch) | |
tree | 4e6f16e5bd96f10cfb9a116e00242ed76f30cd2c | |
parent | 3b10b37a1c5f273906249012ddbdfd37a91b3ae8 (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.h | 11 | ||||
-rw-r--r-- | include/gpu/GrFragmentProcessor.h | 2 | ||||
-rw-r--r-- | src/gpu/GrFragmentProcessor.cpp | 23 | ||||
-rw-r--r-- | src/gpu/SkGr.cpp | 4 |
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), |