diff options
-rwxr-xr-x | gn/compile_processors.py | 4 | ||||
-rw-r--r-- | src/effects/GrAlphaThresholdFragmentProcessor.cpp | 97 | ||||
-rw-r--r-- | src/effects/GrAlphaThresholdFragmentProcessor.h | 49 | ||||
-rw-r--r-- | src/effects/GrCircleBlurFragmentProcessor.cpp | 447 | ||||
-rw-r--r-- | src/effects/GrCircleBlurFragmentProcessor.h | 21 | ||||
-rw-r--r-- | src/gpu/effects/GrBlurredEdgeFragmentProcessor.cpp | 22 | ||||
-rw-r--r-- | src/gpu/effects/GrBlurredEdgeFragmentProcessor.h | 13 | ||||
-rw-r--r-- | src/gpu/effects/GrCircleEffect.cpp | 69 | ||||
-rw-r--r-- | src/gpu/effects/GrCircleEffect.h | 11 | ||||
-rw-r--r-- | src/gpu/effects/GrDitherEffect.cpp | 29 | ||||
-rw-r--r-- | src/gpu/effects/GrDitherEffect.h | 7 | ||||
-rw-r--r-- | src/gpu/effects/GrEllipseEffect.cpp | 100 | ||||
-rw-r--r-- | src/gpu/effects/GrEllipseEffect.h | 11 | ||||
-rw-r--r-- | src/gpu/effects/GrSimpleTextureEffect.cpp | 50 | ||||
-rw-r--r-- | src/gpu/effects/GrSimpleTextureEffect.h | 53 |
15 files changed, 529 insertions, 454 deletions
diff --git a/gn/compile_processors.py b/gn/compile_processors.py index fabdbc2a70..9fc5c3de59 100755 --- a/gn/compile_processors.py +++ b/gn/compile_processors.py @@ -16,7 +16,11 @@ for p in processors: print("Recompiling " + p + "...") try: subprocess.check_output([skslc, p, path + ".h"]) + subprocess.check_call("clang-format --sort-includes=false -i \"" + + path + ".h\"", shell=True) subprocess.check_output([skslc, p, path + ".cpp"]) + subprocess.check_call("clang-format --sort-includes=false -i \"" + + path + ".cpp\"", shell=True) except subprocess.CalledProcessError as err: print("### Error compiling " + p + ":") print(err.output) diff --git a/src/effects/GrAlphaThresholdFragmentProcessor.cpp b/src/effects/GrAlphaThresholdFragmentProcessor.cpp index f400777e24..6de452bfa1 100644 --- a/src/effects/GrAlphaThresholdFragmentProcessor.cpp +++ b/src/effects/GrAlphaThresholdFragmentProcessor.cpp @@ -11,15 +11,15 @@ #include "GrAlphaThresholdFragmentProcessor.h" #if SK_SUPPORT_GPU - inline GrFragmentProcessor::OptimizationFlags GrAlphaThresholdFragmentProcessor::optFlags( - float outerThreshold) { - if (outerThreshold >= 1.0) { - return kPreservesOpaqueInput_OptimizationFlag | - kCompatibleWithCoverageAsAlpha_OptimizationFlag; - } else { - return kCompatibleWithCoverageAsAlpha_OptimizationFlag; - } +inline GrFragmentProcessor::OptimizationFlags GrAlphaThresholdFragmentProcessor::optFlags( + float outerThreshold) { + if (outerThreshold >= 1.0) { + return kPreservesOpaqueInput_OptimizationFlag | + kCompatibleWithCoverageAsAlpha_OptimizationFlag; + } else { + return kCompatibleWithCoverageAsAlpha_OptimizationFlag; } +} #include "glsl/GrGLSLColorSpaceXformHelper.h" #include "glsl/GrGLSLFragmentProcessor.h" #include "glsl/GrGLSLFragmentShaderBuilder.h" @@ -31,24 +31,57 @@ public: GrGLSLAlphaThresholdFragmentProcessor() {} void emitCode(EmitArgs& args) override { GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder; - const GrAlphaThresholdFragmentProcessor& _outer = args.fFp.cast<GrAlphaThresholdFragmentProcessor>(); - (void) _outer; + const GrAlphaThresholdFragmentProcessor& _outer = + args.fFp.cast<GrAlphaThresholdFragmentProcessor>(); + (void)_outer; fColorSpaceHelper.emitCode(args.fUniformHandler, _outer.colorXform().get()); - fInnerThresholdVar = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kFloat_GrSLType, kDefault_GrSLPrecision, "innerThreshold"); - fOuterThresholdVar = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kFloat_GrSLType, kDefault_GrSLPrecision, "outerThreshold"); - SkSL::String sk_TransformedCoords2D_0 = fragBuilder->ensureCoords2D(args.fTransformedCoords[0]); - SkSL::String sk_TransformedCoords2D_1 = fragBuilder->ensureCoords2D(args.fTransformedCoords[1]); - fragBuilder->codeAppendf("vec4 _tmpVar1;vec4 color = %stexture(%s, %s).%s%s;\nvec4 mask_color = texture(%s, %s).%s;\nif (mask_color.w < 0.5) {\n if (color.w > %s) {\n float scale = %s / color.w;\n color.xyz *= scale;\n color.w = %s;\n }\n} else if (color.w < %s) {\n float scale = %s / max(0.001, color.w);\n color.xyz *= scale;\n color.w = %s;\n}\n%s = color;\n", fColorSpaceHelper.isValid() ? "(_tmpVar1 = " : "", fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[0]).c_str(), sk_TransformedCoords2D_0.c_str(), fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[0]).c_str(), fColorSpaceHelper.isValid() ? SkStringPrintf(", vec4(clamp((%s * vec4(_tmpVar1.rgb, 1.0)).rgb, 0.0, _tmpVar1.a), _tmpVar1.a))", args.fUniformHandler->getUniformCStr(fColorSpaceHelper.gamutXformUniform())).c_str() : "", fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[1]).c_str(), sk_TransformedCoords2D_1.c_str(), fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[1]).c_str(), args.fUniformHandler->getUniformCStr(fOuterThresholdVar), args.fUniformHandler->getUniformCStr(fOuterThresholdVar), args.fUniformHandler->getUniformCStr(fOuterThresholdVar), args.fUniformHandler->getUniformCStr(fInnerThresholdVar), args.fUniformHandler->getUniformCStr(fInnerThresholdVar), args.fUniformHandler->getUniformCStr(fInnerThresholdVar), args.fOutputColor); + fInnerThresholdVar = args.fUniformHandler->addUniform( + kFragment_GrShaderFlag, kFloat_GrSLType, kDefault_GrSLPrecision, "innerThreshold"); + fOuterThresholdVar = args.fUniformHandler->addUniform( + kFragment_GrShaderFlag, kFloat_GrSLType, kDefault_GrSLPrecision, "outerThreshold"); + SkSL::String sk_TransformedCoords2D_0 = + fragBuilder->ensureCoords2D(args.fTransformedCoords[0]); + SkSL::String sk_TransformedCoords2D_1 = + fragBuilder->ensureCoords2D(args.fTransformedCoords[1]); + fragBuilder->codeAppendf( + "vec4 _tmpVar1;vec4 color = %stexture(%s, %s).%s%s;\nvec4 mask_color = texture(%s, " + "%s).%s;\nif (mask_color.w < 0.5) {\n if (color.w > %s) {\n float scale " + "= %s / color.w;\n color.xyz *= scale;\n color.w = %s;\n }\n} " + "else if (color.w < %s) {\n float scale = %s / max(0.001, color.w);\n " + "color.xyz *= scale;\n color.w = %s;\n}\n%s = color;\n", + fColorSpaceHelper.isValid() ? "(_tmpVar1 = " : "", + fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[0]).c_str(), + sk_TransformedCoords2D_0.c_str(), + fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[0]).c_str(), + fColorSpaceHelper.isValid() + ? SkStringPrintf(", vec4(clamp((%s * vec4(_tmpVar1.rgb, 1.0)).rgb, 0.0, " + "_tmpVar1.a), _tmpVar1.a))", + args.fUniformHandler->getUniformCStr( + fColorSpaceHelper.gamutXformUniform())) + .c_str() + : "", + fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[1]).c_str(), + sk_TransformedCoords2D_1.c_str(), + fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[1]).c_str(), + args.fUniformHandler->getUniformCStr(fOuterThresholdVar), + args.fUniformHandler->getUniformCStr(fOuterThresholdVar), + args.fUniformHandler->getUniformCStr(fOuterThresholdVar), + args.fUniformHandler->getUniformCStr(fInnerThresholdVar), + args.fUniformHandler->getUniformCStr(fInnerThresholdVar), + args.fUniformHandler->getUniformCStr(fInnerThresholdVar), args.fOutputColor); } + private: - void onSetData(const GrGLSLProgramDataManager& pdman, const GrFragmentProcessor& _proc) override { - const GrAlphaThresholdFragmentProcessor& _outer = _proc.cast<GrAlphaThresholdFragmentProcessor>(); + void onSetData(const GrGLSLProgramDataManager& pdman, + const GrFragmentProcessor& _proc) override { + const GrAlphaThresholdFragmentProcessor& _outer = + _proc.cast<GrAlphaThresholdFragmentProcessor>(); { - if (fColorSpaceHelper.isValid()) { - fColorSpaceHelper.setData(pdman, _outer.colorXform().get()); - } - pdman.set1f(fInnerThresholdVar, _outer.innerThreshold()); - pdman.set1f(fOuterThresholdVar, _outer.outerThreshold()); + if (fColorSpaceHelper.isValid()) { + fColorSpaceHelper.setData(pdman, _outer.colorXform().get()); + } + pdman.set1f(fInnerThresholdVar, _outer.innerThreshold()); + pdman.set1f(fOuterThresholdVar, _outer.outerThreshold()); } } UniformHandle fImageVar; @@ -60,12 +93,13 @@ private: GrGLSLFragmentProcessor* GrAlphaThresholdFragmentProcessor::onCreateGLSLInstance() const { return new GrGLSLAlphaThresholdFragmentProcessor(); } -void GrAlphaThresholdFragmentProcessor::onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const { +void GrAlphaThresholdFragmentProcessor::onGetGLSLProcessorKey(const GrShaderCaps& caps, + GrProcessorKeyBuilder* b) const { b->add32(GrColorSpaceXform::XformKey(fColorXform.get())); } bool GrAlphaThresholdFragmentProcessor::onIsEqual(const GrFragmentProcessor& other) const { const GrAlphaThresholdFragmentProcessor& that = other.cast<GrAlphaThresholdFragmentProcessor>(); - (void) that; + (void)that; if (fImage != that.fImage) return false; if (fColorXform != that.fColorXform) return false; if (fMask != that.fMask) return false; @@ -75,11 +109,11 @@ bool GrAlphaThresholdFragmentProcessor::onIsEqual(const GrFragmentProcessor& oth } GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrAlphaThresholdFragmentProcessor); #if GR_TEST_UTILS -sk_sp<GrFragmentProcessor> GrAlphaThresholdFragmentProcessor::TestCreate(GrProcessorTestData* testData) { - +sk_sp<GrFragmentProcessor> GrAlphaThresholdFragmentProcessor::TestCreate( + GrProcessorTestData* testData) { sk_sp<GrTextureProxy> bmpProxy = testData->textureProxy(GrProcessorUnitTest::kSkiaPMTextureIdx); sk_sp<GrTextureProxy> maskProxy = testData->textureProxy(GrProcessorUnitTest::kAlphaTextureIdx); - + float innerThresh = testData->fRandom->nextUScalar1() * .99f + 0.005f; float outerThresh = testData->fRandom->nextUScalar1() * .99f + 0.005f; const int kMaxWidth = 1000; @@ -90,12 +124,9 @@ sk_sp<GrFragmentProcessor> GrAlphaThresholdFragmentProcessor::TestCreate(GrProce uint32_t y = testData->fRandom->nextULessThan(kMaxHeight - height); SkIRect bounds = SkIRect::MakeXYWH(x, y, width, height); sk_sp<GrColorSpaceXform> colorSpaceXform = GrTest::TestColorXform(testData->fRandom); - return GrAlphaThresholdFragmentProcessor::Make( - std::move(bmpProxy), - colorSpaceXform, - std::move(maskProxy), - innerThresh, outerThresh, - bounds); + return GrAlphaThresholdFragmentProcessor::Make(std::move(bmpProxy), colorSpaceXform, + std::move(maskProxy), innerThresh, outerThresh, + bounds); } #endif #endif diff --git a/src/effects/GrAlphaThresholdFragmentProcessor.h b/src/effects/GrAlphaThresholdFragmentProcessor.h index 5dd669ac14..3bc42a7ddd 100644 --- a/src/effects/GrAlphaThresholdFragmentProcessor.h +++ b/src/effects/GrAlphaThresholdFragmentProcessor.h @@ -13,49 +13,46 @@ #include "SkTypes.h" #if SK_SUPPORT_GPU - #include "GrColorSpaceXform.h" +#include "GrColorSpaceXform.h" #include "GrFragmentProcessor.h" #include "GrCoordTransform.h" #include "GrColorSpaceXform.h" #include "effects/GrProxyMove.h" class GrAlphaThresholdFragmentProcessor : public GrFragmentProcessor { public: - inline OptimizationFlags optFlags(float outerThreshold); sk_sp<GrColorSpaceXform> colorXform() const { return fColorXform; } float innerThreshold() const { return fInnerThreshold; } float outerThreshold() const { return fOuterThreshold; } static sk_sp<GrFragmentProcessor> Make(sk_sp<GrTextureProxy> image, - sk_sp<GrColorSpaceXform> colorXform, - sk_sp<GrTextureProxy> mask, + sk_sp<GrColorSpaceXform> + colorXform, + sk_sp<GrTextureProxy> + mask, float innerThreshold, float outerThreshold, const SkIRect& bounds) { - return sk_sp<GrFragmentProcessor>(new GrAlphaThresholdFragmentProcessor(image, - colorXform, - mask, - innerThreshold, - outerThreshold, - bounds)); + return sk_sp<GrFragmentProcessor>(new GrAlphaThresholdFragmentProcessor( + image, colorXform, mask, innerThreshold, outerThreshold, bounds)); } const char* name() const override { return "AlphaThresholdFragmentProcessor"; } + private: - GrAlphaThresholdFragmentProcessor(sk_sp<GrTextureProxy> image, sk_sp<GrColorSpaceXform> colorXform, sk_sp<GrTextureProxy> mask, float innerThreshold, float outerThreshold, - const SkIRect& bounds -) - : INHERITED(kNone_OptimizationFlags) - , fImage(std::move(image)) - , fColorXform(colorXform) - , fMask(std::move(mask)) - , fInnerThreshold(innerThreshold) - , fOuterThreshold(outerThreshold) - , fImageCoordTransform( - SkMatrix::I() -, fImage.proxy()) - , fMaskCoordTransform( - SkMatrix::MakeTrans(SkIntToScalar(-bounds.x()), SkIntToScalar(-bounds.y())) -, fMask.proxy()) { + GrAlphaThresholdFragmentProcessor(sk_sp<GrTextureProxy> image, + sk_sp<GrColorSpaceXform> colorXform, + sk_sp<GrTextureProxy> mask, float innerThreshold, + float outerThreshold, const SkIRect& bounds) + : INHERITED(kNone_OptimizationFlags) + , fImage(std::move(image)) + , fColorXform(colorXform) + , fMask(std::move(mask)) + , fInnerThreshold(innerThreshold) + , fOuterThreshold(outerThreshold) + , fImageCoordTransform(SkMatrix::I(), fImage.proxy()) + , fMaskCoordTransform( + SkMatrix::MakeTrans(SkIntToScalar(-bounds.x()), SkIntToScalar(-bounds.y())), + fMask.proxy()) { this->addTextureSampler(&fImage); this->addTextureSampler(&fMask); this->addCoordTransform(&fImageCoordTransform); @@ -63,7 +60,7 @@ private: this->initClassID<GrAlphaThresholdFragmentProcessor>(); } GrGLSLFragmentProcessor* onCreateGLSLInstance() const override; - void onGetGLSLProcessorKey(const GrShaderCaps&,GrProcessorKeyBuilder*) const override; + void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override; bool onIsEqual(const GrFragmentProcessor&) const override; GR_DECLARE_FRAGMENT_PROCESSOR_TEST TextureSampler fImage; diff --git a/src/effects/GrCircleBlurFragmentProcessor.cpp b/src/effects/GrCircleBlurFragmentProcessor.cpp index 5759fc47cf..135b00e4d9 100644 --- a/src/effects/GrCircleBlurFragmentProcessor.cpp +++ b/src/effects/GrCircleBlurFragmentProcessor.cpp @@ -11,248 +11,211 @@ #include "GrCircleBlurFragmentProcessor.h" #if SK_SUPPORT_GPU - #include "GrResourceProvider.h" - - - - static float make_unnormalized_half_kernel(float* halfKernel, int halfKernelSize, float sigma) { - const float invSigma = 1.f / sigma; - const float b = -0.5f * invSigma * invSigma; - float tot = 0.0f; - - float t = 0.5f; - for (int i = 0; i < halfKernelSize; ++i) { - float value = expf(t * t * b); - tot += value; - halfKernel[i] = value; - t += 1.f; - } - return tot; +#include "GrResourceProvider.h" + +static float make_unnormalized_half_kernel(float* halfKernel, int halfKernelSize, float sigma) { + const float invSigma = 1.f / sigma; + const float b = -0.5f * invSigma * invSigma; + float tot = 0.0f; + + float t = 0.5f; + for (int i = 0; i < halfKernelSize; ++i) { + float value = expf(t * t * b); + tot += value; + halfKernel[i] = value; + t += 1.f; } + return tot; +} - - - static void make_half_kernel_and_summed_table(float* halfKernel, float* summedHalfKernel, - int halfKernelSize, float sigma) { - - const float tot = 2.f * make_unnormalized_half_kernel(halfKernel, halfKernelSize, sigma); - float sum = 0.f; - for (int i = 0; i < halfKernelSize; ++i) { - halfKernel[i] /= tot; - sum += halfKernel[i]; - summedHalfKernel[i] = sum; - } +static void make_half_kernel_and_summed_table(float* halfKernel, float* summedHalfKernel, + int halfKernelSize, float sigma) { + const float tot = 2.f * make_unnormalized_half_kernel(halfKernel, halfKernelSize, sigma); + float sum = 0.f; + for (int i = 0; i < halfKernelSize; ++i) { + halfKernel[i] /= tot; + sum += halfKernel[i]; + summedHalfKernel[i] = sum; } +} - - - void apply_kernel_in_y(float* results, int numSteps, float firstX, float circleR, - int halfKernelSize, const float* summedHalfKernelTable) { - float x = firstX; - for (int i = 0; i < numSteps; ++i, x += 1.f) { - if (x < -circleR || x > circleR) { - results[i] = 0; - continue; - } - float y = sqrtf(circleR * circleR - x * x); - - - y -= 0.5f; - int yInt = SkScalarFloorToInt(y); - SkASSERT(yInt >= -1); - if (y < 0) { - results[i] = (y + 0.5f) * summedHalfKernelTable[0]; - } else if (yInt >= halfKernelSize - 1) { - results[i] = 0.5f; - } else { - float yFrac = y - yInt; - results[i] = (1.f - yFrac) * summedHalfKernelTable[yInt] + - yFrac * summedHalfKernelTable[yInt + 1]; - } +void apply_kernel_in_y(float* results, int numSteps, float firstX, float circleR, + int halfKernelSize, const float* summedHalfKernelTable) { + float x = firstX; + for (int i = 0; i < numSteps; ++i, x += 1.f) { + if (x < -circleR || x > circleR) { + results[i] = 0; + continue; + } + float y = sqrtf(circleR * circleR - x * x); + + y -= 0.5f; + int yInt = SkScalarFloorToInt(y); + SkASSERT(yInt >= -1); + if (y < 0) { + results[i] = (y + 0.5f) * summedHalfKernelTable[0]; + } else if (yInt >= halfKernelSize - 1) { + results[i] = 0.5f; + } else { + float yFrac = y - yInt; + results[i] = (1.f - yFrac) * summedHalfKernelTable[yInt] + + yFrac * summedHalfKernelTable[yInt + 1]; } } +} - - - - - static uint8_t eval_at(float evalX, float circleR, const float* halfKernel, int halfKernelSize, - const float* yKernelEvaluations) { - float acc = 0; - - float x = evalX - halfKernelSize; - for (int i = 0; i < halfKernelSize; ++i, x += 1.f) { - if (x < -circleR || x > circleR) { - continue; - } - float verticalEval = yKernelEvaluations[i]; - acc += verticalEval * halfKernel[halfKernelSize - i - 1]; +static uint8_t eval_at(float evalX, float circleR, const float* halfKernel, int halfKernelSize, + const float* yKernelEvaluations) { + float acc = 0; + + float x = evalX - halfKernelSize; + for (int i = 0; i < halfKernelSize; ++i, x += 1.f) { + if (x < -circleR || x > circleR) { + continue; } - for (int i = 0; i < halfKernelSize; ++i, x += 1.f) { - if (x < -circleR || x > circleR) { - continue; - } - float verticalEval = yKernelEvaluations[i + halfKernelSize]; - acc += verticalEval * halfKernel[i]; + float verticalEval = yKernelEvaluations[i]; + acc += verticalEval * halfKernel[halfKernelSize - i - 1]; + } + for (int i = 0; i < halfKernelSize; ++i, x += 1.f) { + if (x < -circleR || x > circleR) { + continue; } - - - return SkUnitScalarClampToByte(2.f * acc); + float verticalEval = yKernelEvaluations[i + halfKernelSize]; + acc += verticalEval * halfKernel[i]; } - - - - - - - - static uint8_t* create_circle_profile(float sigma, float circleR, int profileTextureWidth) { - const int numSteps = profileTextureWidth; - uint8_t* weights = new uint8_t[numSteps]; - - - int halfKernelSize = SkScalarCeilToInt(6.0f*sigma); - - halfKernelSize = ((halfKernelSize + 1) & ~1) >> 1; - - - int numYSteps = numSteps + 2 * halfKernelSize; - - SkAutoTArray<float> bulkAlloc(halfKernelSize + halfKernelSize + numYSteps); - float* halfKernel = bulkAlloc.get(); - float* summedKernel = bulkAlloc.get() + halfKernelSize; - float* yEvals = bulkAlloc.get() + 2 * halfKernelSize; - make_half_kernel_and_summed_table(halfKernel, summedKernel, halfKernelSize, sigma); - - float firstX = -halfKernelSize + 0.5f; - apply_kernel_in_y(yEvals, numYSteps, firstX, circleR, halfKernelSize, summedKernel); - - for (int i = 0; i < numSteps - 1; ++i) { - float evalX = i + 0.5f; - weights[i] = eval_at(evalX, circleR, halfKernel, halfKernelSize, yEvals + i); - } - - weights[numSteps - 1] = 0; - return weights; + return SkUnitScalarClampToByte(2.f * acc); +} + +static uint8_t* create_circle_profile(float sigma, float circleR, int profileTextureWidth) { + const int numSteps = profileTextureWidth; + uint8_t* weights = new uint8_t[numSteps]; + + int halfKernelSize = SkScalarCeilToInt(6.0f * sigma); + + halfKernelSize = ((halfKernelSize + 1) & ~1) >> 1; + + int numYSteps = numSteps + 2 * halfKernelSize; + + SkAutoTArray<float> bulkAlloc(halfKernelSize + halfKernelSize + numYSteps); + float* halfKernel = bulkAlloc.get(); + float* summedKernel = bulkAlloc.get() + halfKernelSize; + float* yEvals = bulkAlloc.get() + 2 * halfKernelSize; + make_half_kernel_and_summed_table(halfKernel, summedKernel, halfKernelSize, sigma); + + float firstX = -halfKernelSize + 0.5f; + apply_kernel_in_y(yEvals, numYSteps, firstX, circleR, halfKernelSize, summedKernel); + + for (int i = 0; i < numSteps - 1; ++i) { + float evalX = i + 0.5f; + weights[i] = eval_at(evalX, circleR, halfKernel, halfKernelSize, yEvals + i); } - static uint8_t* create_half_plane_profile(int profileWidth) { - SkASSERT(!(profileWidth & 0x1)); - - float sigma = profileWidth / 6.f; - int halfKernelSize = profileWidth / 2; - - SkAutoTArray<float> halfKernel(halfKernelSize); - uint8_t* profile = new uint8_t[profileWidth]; - - - const float tot = 2.f * make_unnormalized_half_kernel(halfKernel.get(), halfKernelSize, - sigma); - float sum = 0.f; - - for (int i = 0; i < halfKernelSize; ++i) { - halfKernel[halfKernelSize - i - 1] /= tot; - sum += halfKernel[halfKernelSize - i - 1]; - profile[profileWidth - i - 1] = SkUnitScalarClampToByte(sum); - } - - - for (int i = 0; i < halfKernelSize; ++i) { - sum += halfKernel[i]; - profile[halfKernelSize - i - 1] = SkUnitScalarClampToByte(sum); - } - - profile[profileWidth - 1] = 0; - return profile; + weights[numSteps - 1] = 0; + return weights; +} + +static uint8_t* create_half_plane_profile(int profileWidth) { + SkASSERT(!(profileWidth & 0x1)); + + float sigma = profileWidth / 6.f; + int halfKernelSize = profileWidth / 2; + + SkAutoTArray<float> halfKernel(halfKernelSize); + uint8_t* profile = new uint8_t[profileWidth]; + + const float tot = 2.f * make_unnormalized_half_kernel(halfKernel.get(), halfKernelSize, sigma); + float sum = 0.f; + + for (int i = 0; i < halfKernelSize; ++i) { + halfKernel[halfKernelSize - i - 1] /= tot; + sum += halfKernel[halfKernelSize - i - 1]; + profile[profileWidth - i - 1] = SkUnitScalarClampToByte(sum); + } + + for (int i = 0; i < halfKernelSize; ++i) { + sum += halfKernel[i]; + profile[halfKernelSize - i - 1] = SkUnitScalarClampToByte(sum); + } + + profile[profileWidth - 1] = 0; + return profile; +} + +static sk_sp<GrTextureProxy> create_profile_texture(GrResourceProvider* resourceProvider, + const SkRect& circle, float sigma, + float* solidRadius, float* textureRadius) { + float circleR = circle.width() / 2.0f; + + SkScalar sigmaToCircleRRatio = sigma / circleR; + + sigmaToCircleRRatio = SkTMin(sigmaToCircleRRatio, 8.f); + SkFixed sigmaToCircleRRatioFixed; + static const SkScalar kHalfPlaneThreshold = 0.1f; + bool useHalfPlaneApprox = false; + if (sigmaToCircleRRatio <= kHalfPlaneThreshold) { + useHalfPlaneApprox = true; + sigmaToCircleRRatioFixed = 0; + *solidRadius = circleR - 3 * sigma; + *textureRadius = 6 * sigma; + } else { + sigmaToCircleRRatioFixed = SkScalarToFixed(sigmaToCircleRRatio); + + sigmaToCircleRRatioFixed &= ~0xff; + sigmaToCircleRRatio = SkFixedToScalar(sigmaToCircleRRatioFixed); + sigma = circleR * sigmaToCircleRRatio; + *solidRadius = 0; + *textureRadius = circleR + 3 * sigma; } - static sk_sp<GrTextureProxy> create_profile_texture(GrResourceProvider* resourceProvider, - const SkRect& circle, - float sigma, - float* solidRadius, float* textureRadius) { - float circleR = circle.width() / 2.0f; - - - SkScalar sigmaToCircleRRatio = sigma / circleR; - - - - - sigmaToCircleRRatio = SkTMin(sigmaToCircleRRatio, 8.f); - SkFixed sigmaToCircleRRatioFixed; - static const SkScalar kHalfPlaneThreshold = 0.1f; - bool useHalfPlaneApprox = false; - if (sigmaToCircleRRatio <= kHalfPlaneThreshold) { - useHalfPlaneApprox = true; - sigmaToCircleRRatioFixed = 0; - *solidRadius = circleR - 3 * sigma; - *textureRadius = 6 * sigma; + static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain(); + GrUniqueKey key; + GrUniqueKey::Builder builder(&key, kDomain, 1); + builder[0] = sigmaToCircleRRatioFixed; + builder.finish(); + + sk_sp<GrTextureProxy> blurProfile = resourceProvider->findProxyByUniqueKey(key); + if (!blurProfile) { + static constexpr int kProfileTextureWidth = 512; + GrSurfaceDesc texDesc; + texDesc.fWidth = kProfileTextureWidth; + texDesc.fHeight = 1; + texDesc.fConfig = kAlpha_8_GrPixelConfig; + + std::unique_ptr<uint8_t[]> profile(nullptr); + if (useHalfPlaneApprox) { + profile.reset(create_half_plane_profile(kProfileTextureWidth)); } else { - - sigmaToCircleRRatioFixed = SkScalarToFixed(sigmaToCircleRRatio); - - - sigmaToCircleRRatioFixed &= ~0xff; - sigmaToCircleRRatio = SkFixedToScalar(sigmaToCircleRRatioFixed); - sigma = circleR * sigmaToCircleRRatio; - *solidRadius = 0; - *textureRadius = circleR + 3 * sigma; + SkScalar scale = kProfileTextureWidth / *textureRadius; + profile.reset( + create_circle_profile(sigma * scale, circleR * scale, kProfileTextureWidth)); } - static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain(); - GrUniqueKey key; - GrUniqueKey::Builder builder(&key, kDomain, 1); - builder[0] = sigmaToCircleRRatioFixed; - builder.finish(); - - sk_sp<GrTextureProxy> blurProfile = resourceProvider->findProxyByUniqueKey(key); + blurProfile = GrSurfaceProxy::MakeDeferred(resourceProvider, texDesc, SkBudgeted::kYes, + profile.get(), 0); if (!blurProfile) { - static constexpr int kProfileTextureWidth = 512; - GrSurfaceDesc texDesc; - texDesc.fWidth = kProfileTextureWidth; - texDesc.fHeight = 1; - texDesc.fConfig = kAlpha_8_GrPixelConfig; - - std::unique_ptr<uint8_t[]> profile(nullptr); - if (useHalfPlaneApprox) { - profile.reset(create_half_plane_profile(kProfileTextureWidth)); - } else { - - SkScalar scale = kProfileTextureWidth / *textureRadius; - profile.reset(create_circle_profile(sigma * scale, circleR * scale, - kProfileTextureWidth)); - } - - blurProfile = GrSurfaceProxy::MakeDeferred(resourceProvider, - texDesc, SkBudgeted::kYes, profile.get(), 0); - if (!blurProfile) { - return nullptr; - } - - resourceProvider->assignUniqueKeyToProxy(key, blurProfile.get()); + return nullptr; } - return blurProfile; + resourceProvider->assignUniqueKeyToProxy(key, blurProfile.get()); } - sk_sp<GrFragmentProcessor> GrCircleBlurFragmentProcessor::Make( - GrResourceProvider* resourceProvider, + return blurProfile; +} + +sk_sp<GrFragmentProcessor> GrCircleBlurFragmentProcessor::Make(GrResourceProvider* resourceProvider, const SkRect& circle, float sigma) { - float solidRadius; - float textureRadius; - sk_sp<GrTextureProxy> profile(create_profile_texture(resourceProvider, circle, sigma, - &solidRadius, &textureRadius)); - if (!profile) { - return nullptr; - } - return sk_sp<GrFragmentProcessor>(new GrCircleBlurFragmentProcessor(circle, - textureRadius, - solidRadius, - std::move(profile), - resourceProvider)); + float solidRadius; + float textureRadius; + sk_sp<GrTextureProxy> profile( + create_profile_texture(resourceProvider, circle, sigma, &solidRadius, &textureRadius)); + if (!profile) { + return nullptr; } + return sk_sp<GrFragmentProcessor>(new GrCircleBlurFragmentProcessor( + circle, textureRadius, solidRadius, std::move(profile), resourceProvider)); +} #include "glsl/GrGLSLColorSpaceXformHelper.h" #include "glsl/GrGLSLFragmentProcessor.h" #include "glsl/GrGLSLFragmentShaderBuilder.h" @@ -264,27 +227,43 @@ public: GrGLSLCircleBlurFragmentProcessor() {} void emitCode(EmitArgs& args) override { GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder; - const GrCircleBlurFragmentProcessor& _outer = args.fFp.cast<GrCircleBlurFragmentProcessor>(); - (void) _outer; - fCircleDataVar = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kVec4f_GrSLType, kDefault_GrSLPrecision, "circleData"); - fragBuilder->codeAppendf("vec2 vec = vec2((sk_FragCoord.x - %s.x) * %s.w, (sk_FragCoord.y - %s.y) * %s.w);\nfloat dist = length(vec) + (0.5 - %s.z) * %s.w;\n%s = %s * texture(%s, vec2(dist, 0.5)).%s.w;\n", args.fUniformHandler->getUniformCStr(fCircleDataVar), args.fUniformHandler->getUniformCStr(fCircleDataVar), args.fUniformHandler->getUniformCStr(fCircleDataVar), args.fUniformHandler->getUniformCStr(fCircleDataVar), args.fUniformHandler->getUniformCStr(fCircleDataVar), args.fUniformHandler->getUniformCStr(fCircleDataVar), args.fOutputColor, args.fInputColor ? args.fInputColor : "vec4(1)", fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[0]).c_str(), fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[0]).c_str()); + const GrCircleBlurFragmentProcessor& _outer = + args.fFp.cast<GrCircleBlurFragmentProcessor>(); + (void)_outer; + fCircleDataVar = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kVec4f_GrSLType, + kDefault_GrSLPrecision, "circleData"); + fragBuilder->codeAppendf( + "vec2 vec = vec2((sk_FragCoord.x - %s.x) * %s.w, (sk_FragCoord.y - %s.y) * " + "%s.w);\nfloat dist = length(vec) + (0.5 - %s.z) * %s.w;\n%s = %s * texture(%s, " + "vec2(dist, 0.5)).%s.w;\n", + args.fUniformHandler->getUniformCStr(fCircleDataVar), + args.fUniformHandler->getUniformCStr(fCircleDataVar), + args.fUniformHandler->getUniformCStr(fCircleDataVar), + args.fUniformHandler->getUniformCStr(fCircleDataVar), + args.fUniformHandler->getUniformCStr(fCircleDataVar), + args.fUniformHandler->getUniformCStr(fCircleDataVar), args.fOutputColor, + args.fInputColor ? args.fInputColor : "vec4(1)", + fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[0]).c_str(), + fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[0]).c_str()); } + private: - void onSetData(const GrGLSLProgramDataManager& data, const GrFragmentProcessor& _proc) override { + void onSetData(const GrGLSLProgramDataManager& data, + const GrFragmentProcessor& _proc) override { const GrCircleBlurFragmentProcessor& _outer = _proc.cast<GrCircleBlurFragmentProcessor>(); auto circleRect = _outer.circleRect(); - (void) circleRect; + (void)circleRect; auto textureRadius = _outer.textureRadius(); - (void) textureRadius; + (void)textureRadius; auto solidRadius = _outer.solidRadius(); - (void) solidRadius; + (void)solidRadius; UniformHandle& blurProfileSampler = fBlurProfileSamplerVar; - (void) blurProfileSampler; + (void)blurProfileSampler; UniformHandle& circleData = fCircleDataVar; - (void) circleData; + (void)circleData; - data.set4f(circleData, circleRect.centerX(), circleRect.centerY(), solidRadius, - 1.f / textureRadius); + data.set4f(circleData, circleRect.centerX(), circleRect.centerY(), solidRadius, + 1.f / textureRadius); } UniformHandle fCircleDataVar; UniformHandle fBlurProfileSamplerVar; @@ -292,11 +271,11 @@ private: GrGLSLFragmentProcessor* GrCircleBlurFragmentProcessor::onCreateGLSLInstance() const { return new GrGLSLCircleBlurFragmentProcessor(); } -void GrCircleBlurFragmentProcessor::onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const { -} +void GrCircleBlurFragmentProcessor::onGetGLSLProcessorKey(const GrShaderCaps& caps, + GrProcessorKeyBuilder* b) const {} bool GrCircleBlurFragmentProcessor::onIsEqual(const GrFragmentProcessor& other) const { const GrCircleBlurFragmentProcessor& that = other.cast<GrCircleBlurFragmentProcessor>(); - (void) that; + (void)that; if (fCircleRect != that.fCircleRect) return false; if (fTextureRadius != that.fTextureRadius) return false; if (fSolidRadius != that.fSolidRadius) return false; @@ -305,10 +284,10 @@ bool GrCircleBlurFragmentProcessor::onIsEqual(const GrFragmentProcessor& other) } GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrCircleBlurFragmentProcessor); #if GR_TEST_UTILS -sk_sp<GrFragmentProcessor> GrCircleBlurFragmentProcessor::TestCreate(GrProcessorTestData* testData) { - +sk_sp<GrFragmentProcessor> GrCircleBlurFragmentProcessor::TestCreate( + GrProcessorTestData* testData) { SkScalar wh = testData->fRandom->nextRangeScalar(100.f, 1000.f); - SkScalar sigma = testData->fRandom->nextRangeF(1.f,10.f); + SkScalar sigma = testData->fRandom->nextRangeF(1.f, 10.f); SkRect circle = SkRect::MakeWH(wh, wh); return GrCircleBlurFragmentProcessor::Make(testData->resourceProvider(), circle, sigma); } diff --git a/src/effects/GrCircleBlurFragmentProcessor.h b/src/effects/GrCircleBlurFragmentProcessor.h index 72632d2796..354928d49e 100644 --- a/src/effects/GrCircleBlurFragmentProcessor.h +++ b/src/effects/GrCircleBlurFragmentProcessor.h @@ -25,22 +25,21 @@ public: static sk_sp<GrFragmentProcessor> Make(GrResourceProvider* resourceProvider, const SkRect& circle, float sigma); const char* name() const override { return "CircleBlurFragmentProcessor"; } + private: - GrCircleBlurFragmentProcessor(SkRect circleRect, float textureRadius, float solidRadius, sk_sp<GrTextureProxy> blurProfileSampler, - GrResourceProvider* resourceProvider -) - : INHERITED((OptimizationFlags) - kCompatibleWithCoverageAsAlpha_OptimizationFlag -) - , fCircleRect(circleRect) - , fTextureRadius(textureRadius) - , fSolidRadius(solidRadius) - , fBlurProfileSampler(std::move(blurProfileSampler)) { + GrCircleBlurFragmentProcessor(SkRect circleRect, float textureRadius, float solidRadius, + sk_sp<GrTextureProxy> blurProfileSampler, + GrResourceProvider* resourceProvider) + : INHERITED((OptimizationFlags)kCompatibleWithCoverageAsAlpha_OptimizationFlag) + , fCircleRect(circleRect) + , fTextureRadius(textureRadius) + , fSolidRadius(solidRadius) + , fBlurProfileSampler(std::move(blurProfileSampler)) { this->addTextureSampler(&fBlurProfileSampler); this->initClassID<GrCircleBlurFragmentProcessor>(); } GrGLSLFragmentProcessor* onCreateGLSLInstance() const override; - void onGetGLSLProcessorKey(const GrShaderCaps&,GrProcessorKeyBuilder*) const override; + void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override; bool onIsEqual(const GrFragmentProcessor&) const override; GR_DECLARE_FRAGMENT_PROCESSOR_TEST SkRect fCircleRect; diff --git a/src/gpu/effects/GrBlurredEdgeFragmentProcessor.cpp b/src/gpu/effects/GrBlurredEdgeFragmentProcessor.cpp index a66de57e7a..aa39d95a79 100644 --- a/src/gpu/effects/GrBlurredEdgeFragmentProcessor.cpp +++ b/src/gpu/effects/GrBlurredEdgeFragmentProcessor.cpp @@ -21,23 +21,31 @@ public: GrGLSLBlurredEdgeFragmentProcessor() {} void emitCode(EmitArgs& args) override { GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder; - const GrBlurredEdgeFragmentProcessor& _outer = args.fFp.cast<GrBlurredEdgeFragmentProcessor>(); - (void) _outer; - fragBuilder->codeAppendf("float factor = 1.0 - %s.w;\n@switch (%d) {\n case 0:\n factor = exp((-factor * factor) * 4.0) - 0.017999999999999999;\n break;\n case 1:\n factor = smoothstep(1.0, 0.0, factor);\n break;\n}\n%s = vec4(factor);\n", args.fInputColor ? args.fInputColor : "vec4(1)", _outer.mode(), args.fOutputColor); + const GrBlurredEdgeFragmentProcessor& _outer = + args.fFp.cast<GrBlurredEdgeFragmentProcessor>(); + (void)_outer; + fragBuilder->codeAppendf( + "float factor = 1.0 - %s.w;\n@switch (%d) {\n case 0:\n factor = " + "exp((-factor * factor) * 4.0) - 0.017999999999999999;\n break;\n case " + "1:\n factor = smoothstep(1.0, 0.0, factor);\n break;\n}\n%s = " + "vec4(factor);\n", + args.fInputColor ? args.fInputColor : "vec4(1)", _outer.mode(), args.fOutputColor); } + private: - void onSetData(const GrGLSLProgramDataManager& pdman, const GrFragmentProcessor& _proc) override { - } + void onSetData(const GrGLSLProgramDataManager& pdman, + const GrFragmentProcessor& _proc) override {} }; GrGLSLFragmentProcessor* GrBlurredEdgeFragmentProcessor::onCreateGLSLInstance() const { return new GrGLSLBlurredEdgeFragmentProcessor(); } -void GrBlurredEdgeFragmentProcessor::onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const { +void GrBlurredEdgeFragmentProcessor::onGetGLSLProcessorKey(const GrShaderCaps& caps, + GrProcessorKeyBuilder* b) const { b->add32(fMode); } bool GrBlurredEdgeFragmentProcessor::onIsEqual(const GrFragmentProcessor& other) const { const GrBlurredEdgeFragmentProcessor& that = other.cast<GrBlurredEdgeFragmentProcessor>(); - (void) that; + (void)that; if (fMode != that.fMode) return false; return true; } diff --git a/src/gpu/effects/GrBlurredEdgeFragmentProcessor.h b/src/gpu/effects/GrBlurredEdgeFragmentProcessor.h index d81ae2318c..0875d88f8c 100644 --- a/src/gpu/effects/GrBlurredEdgeFragmentProcessor.h +++ b/src/gpu/effects/GrBlurredEdgeFragmentProcessor.h @@ -18,24 +18,19 @@ #include "effects/GrProxyMove.h" class GrBlurredEdgeFragmentProcessor : public GrFragmentProcessor { public: - - enum Mode { - kGaussian_Mode = 0, - kSmoothStep_Mode = 1 - }; + enum Mode { kGaussian_Mode = 0, kSmoothStep_Mode = 1 }; int mode() const { return fMode; } static sk_sp<GrFragmentProcessor> Make(int mode) { return sk_sp<GrFragmentProcessor>(new GrBlurredEdgeFragmentProcessor(mode)); } const char* name() const override { return "BlurredEdgeFragmentProcessor"; } + private: - GrBlurredEdgeFragmentProcessor(int mode) - : INHERITED(kNone_OptimizationFlags) - , fMode(mode) { + GrBlurredEdgeFragmentProcessor(int mode) : INHERITED(kNone_OptimizationFlags), fMode(mode) { this->initClassID<GrBlurredEdgeFragmentProcessor>(); } GrGLSLFragmentProcessor* onCreateGLSLInstance() const override; - void onGetGLSLProcessorKey(const GrShaderCaps&,GrProcessorKeyBuilder*) const override; + void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override; bool onIsEqual(const GrFragmentProcessor&) const override; GR_DECLARE_FRAGMENT_PROCESSOR_TEST int fMode; diff --git a/src/gpu/effects/GrCircleEffect.cpp b/src/gpu/effects/GrCircleEffect.cpp index 23d6551770..638d94d357 100644 --- a/src/gpu/effects/GrCircleEffect.cpp +++ b/src/gpu/effects/GrCircleEffect.cpp @@ -22,49 +22,67 @@ public: void emitCode(EmitArgs& args) override { GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder; const GrCircleEffect& _outer = args.fFp.cast<GrCircleEffect>(); - (void) _outer; -prevRadius = -1.0; - fCircleVar = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kVec4f_GrSLType, kDefault_GrSLPrecision, "circle"); - fragBuilder->codeAppendf("vec2 prevCenter;\nfloat prevRadius = %f;\nfloat d;\n@if (%d == 2 || %d == 3) {\n d = (length((%s.xy - sk_FragCoord.xy) * %s.w) - 1.0) * %s.z;\n} else {\n d = (1.0 - length((%s.xy - sk_FragCoord.xy) * %s.w)) * %s.z;\n}\n@if ((%d == 1 || %d == 3) || %d == 4) {\n d = clamp(d, 0.0, 1.0);\n} else {\n d = d > 0.5 ? 1.0 : 0.0;\n}\n%s = %s * d;\n", prevRadius, _outer.edgeType(), _outer.edgeType(), args.fUniformHandler->getUniformCStr(fCircleVar), args.fUniformHandler->getUniformCStr(fCircleVar), args.fUniformHandler->getUniformCStr(fCircleVar), args.fUniformHandler->getUniformCStr(fCircleVar), args.fUniformHandler->getUniformCStr(fCircleVar), args.fUniformHandler->getUniformCStr(fCircleVar), _outer.edgeType(), _outer.edgeType(), _outer.edgeType(), args.fOutputColor, args.fInputColor ? args.fInputColor : "vec4(1)"); + (void)_outer; + prevRadius = -1.0; + fCircleVar = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kVec4f_GrSLType, + kDefault_GrSLPrecision, "circle"); + fragBuilder->codeAppendf( + "vec2 prevCenter;\nfloat prevRadius = %f;\nfloat d;\n@if (%d == 2 || %d == 3) {\n " + " d = (length((%s.xy - sk_FragCoord.xy) * %s.w) - 1.0) * %s.z;\n} else {\n d = " + "(1.0 - length((%s.xy - sk_FragCoord.xy) * %s.w)) * %s.z;\n}\n@if ((%d == 1 || %d " + "== 3) || %d == 4) {\n d = clamp(d, 0.0, 1.0);\n} else {\n d = d > 0.5 ? 1.0 " + ": 0.0;\n}\n%s = %s * d;\n", + prevRadius, _outer.edgeType(), _outer.edgeType(), + args.fUniformHandler->getUniformCStr(fCircleVar), + args.fUniformHandler->getUniformCStr(fCircleVar), + args.fUniformHandler->getUniformCStr(fCircleVar), + args.fUniformHandler->getUniformCStr(fCircleVar), + args.fUniformHandler->getUniformCStr(fCircleVar), + args.fUniformHandler->getUniformCStr(fCircleVar), _outer.edgeType(), + _outer.edgeType(), _outer.edgeType(), args.fOutputColor, + args.fInputColor ? args.fInputColor : "vec4(1)"); } + private: - void onSetData(const GrGLSLProgramDataManager& pdman, const GrFragmentProcessor& _proc) override { + void onSetData(const GrGLSLProgramDataManager& pdman, + const GrFragmentProcessor& _proc) override { const GrCircleEffect& _outer = _proc.cast<GrCircleEffect>(); auto edgeType = _outer.edgeType(); - (void) edgeType; + (void)edgeType; auto center = _outer.center(); - (void) center; + (void)center; auto radius = _outer.radius(); - (void) radius; + (void)radius; UniformHandle& circle = fCircleVar; - (void) circle; + (void)circle; - if (radius != prevRadius || center != prevCenter) { - SkScalar effectiveRadius = radius; - if (GrProcessorEdgeTypeIsInverseFill((GrPrimitiveEdgeType) edgeType)) { - effectiveRadius -= 0.5f; - } else { - effectiveRadius += 0.5f; + if (radius != prevRadius || center != prevCenter) { + SkScalar effectiveRadius = radius; + if (GrProcessorEdgeTypeIsInverseFill((GrPrimitiveEdgeType)edgeType)) { + effectiveRadius -= 0.5f; + } else { + effectiveRadius += 0.5f; + } + pdman.set4f(circle, center.fX, center.fY, effectiveRadius, + SkScalarInvert(effectiveRadius)); + prevCenter = center; + prevRadius = radius; } - pdman.set4f(circle, center.fX, center.fY, effectiveRadius, - SkScalarInvert(effectiveRadius)); - prevCenter = center; - prevRadius = radius; - } } -SkPoint prevCenter; -float prevRadius; + SkPoint prevCenter; + float prevRadius; UniformHandle fCircleVar; }; GrGLSLFragmentProcessor* GrCircleEffect::onCreateGLSLInstance() const { return new GrGLSLCircleEffect(); } -void GrCircleEffect::onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const { +void GrCircleEffect::onGetGLSLProcessorKey(const GrShaderCaps& caps, + GrProcessorKeyBuilder* b) const { b->add32(fEdgeType); } bool GrCircleEffect::onIsEqual(const GrFragmentProcessor& other) const { const GrCircleEffect& that = other.cast<GrCircleEffect>(); - (void) that; + (void)that; if (fEdgeType != that.fEdgeType) return false; if (fCenter != that.fCenter) return false; if (fRadius != that.fRadius) return false; @@ -73,14 +91,13 @@ bool GrCircleEffect::onIsEqual(const GrFragmentProcessor& other) const { GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrCircleEffect); #if GR_TEST_UTILS sk_sp<GrFragmentProcessor> GrCircleEffect::TestCreate(GrProcessorTestData* testData) { - SkPoint center; center.fX = testData->fRandom->nextRangeScalar(0.f, 1000.f); center.fY = testData->fRandom->nextRangeScalar(0.f, 1000.f); SkScalar radius = testData->fRandom->nextRangeF(0.f, 1000.f); GrPrimitiveEdgeType et; do { - et = (GrPrimitiveEdgeType) testData->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt); + et = (GrPrimitiveEdgeType)testData->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt); } while (kHairlineAA_GrProcessorEdgeType == et); return GrCircleEffect::Make(et, center, radius); } diff --git a/src/gpu/effects/GrCircleEffect.h b/src/gpu/effects/GrCircleEffect.h index 24a238da6c..00f98d416e 100644 --- a/src/gpu/effects/GrCircleEffect.h +++ b/src/gpu/effects/GrCircleEffect.h @@ -25,16 +25,17 @@ public: return sk_sp<GrFragmentProcessor>(new GrCircleEffect(edgeType, center, radius)); } const char* name() const override { return "CircleEffect"; } + private: GrCircleEffect(int edgeType, SkPoint center, float radius) - : INHERITED((OptimizationFlags) kCompatibleWithCoverageAsAlpha_OptimizationFlag ) - , fEdgeType(edgeType) - , fCenter(center) - , fRadius(radius) { + : INHERITED((OptimizationFlags)kCompatibleWithCoverageAsAlpha_OptimizationFlag) + , fEdgeType(edgeType) + , fCenter(center) + , fRadius(radius) { this->initClassID<GrCircleEffect>(); } GrGLSLFragmentProcessor* onCreateGLSLInstance() const override; - void onGetGLSLProcessorKey(const GrShaderCaps&,GrProcessorKeyBuilder*) const override; + void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override; bool onIsEqual(const GrFragmentProcessor&) const override; GR_DECLARE_FRAGMENT_PROCESSOR_TEST int fEdgeType; diff --git a/src/gpu/effects/GrDitherEffect.cpp b/src/gpu/effects/GrDitherEffect.cpp index 753bbce185..73ab1812a9 100644 --- a/src/gpu/effects/GrDitherEffect.cpp +++ b/src/gpu/effects/GrDitherEffect.cpp @@ -22,29 +22,44 @@ public: void emitCode(EmitArgs& args) override { GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder; const GrDitherEffect& _outer = args.fFp.cast<GrDitherEffect>(); - (void) _outer; - fragBuilder->codeAppendf("float value;\nfloat range;\n@switch (%d) {\n case 0:\n range = 0.0039215686274509803;\n break;\n case 1:\n range = 0.015873015873015872;\n break;\n default:\n range = 0.0083333333333333332;\n break;\n}\n@if (sk_Caps.integerSupport) {\n int x = int(sk_FragCoord.x);\n int y = int(sk_FragCoord.y);\n uint m = uint((((((y & 1) << 5 | (x & 1) << 4) | (y & 2) << 2) | (x & 2) << 1) | (y & 4) >> 1) | (x & 4) >> 2);\n value = float(m) / 64.0 - 0.4921875;\n} else {\n value = fract(sin(dot(sk_FragCoord.xy, vec2(12.989800000000001, 78.233000000000004))) * 43758.545299999998) - 0.5;\n}\n%s = vec4(clamp(%s.xyz + value * range, 0.0, %s.w), %s.w);\n", _outer.rangeType(), args.fOutputColor, args.fInputColor ? args.fInputColor : "vec4(1)", args.fInputColor ? args.fInputColor : "vec4(1)", args.fInputColor ? args.fInputColor : "vec4(1)"); + (void)_outer; + fragBuilder->codeAppendf( + "float value;\nfloat range;\n@switch (%d) {\n case 0:\n range = " + "0.0039215686274509803;\n break;\n case 1:\n range = " + "0.015873015873015872;\n break;\n default:\n range = " + "0.0083333333333333332;\n break;\n}\n@if (sk_Caps.integerSupport) {\n " + "int x = int(sk_FragCoord.x);\n int y = int(sk_FragCoord.y);\n uint m = " + "uint((((((y & 1) << 5 | (x & 1) << 4) | (y & 2) << 2) | (x & 2) << 1) | (y & 4) " + ">> 1) | (x & 4) >> 2);\n value = float(m) / 64.0 - 0.4921875;\n} else {\n " + "value = fract(sin(dot(sk_FragCoord.xy, vec2(12.989800000000001, " + "78.233000000000004))) * 43758.545299999998) - 0.5;\n}\n%s = vec4(clamp(%s.xyz + " + "value * range, 0.0, %s.w), %s.w);\n", + _outer.rangeType(), args.fOutputColor, + args.fInputColor ? args.fInputColor : "vec4(1)", + args.fInputColor ? args.fInputColor : "vec4(1)", + args.fInputColor ? args.fInputColor : "vec4(1)"); } + private: - void onSetData(const GrGLSLProgramDataManager& pdman, const GrFragmentProcessor& _proc) override { - } + void onSetData(const GrGLSLProgramDataManager& pdman, + const GrFragmentProcessor& _proc) override {} }; GrGLSLFragmentProcessor* GrDitherEffect::onCreateGLSLInstance() const { return new GrGLSLDitherEffect(); } -void GrDitherEffect::onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const { +void GrDitherEffect::onGetGLSLProcessorKey(const GrShaderCaps& caps, + GrProcessorKeyBuilder* b) const { b->add32(fRangeType); } bool GrDitherEffect::onIsEqual(const GrFragmentProcessor& other) const { const GrDitherEffect& that = other.cast<GrDitherEffect>(); - (void) that; + (void)that; if (fRangeType != that.fRangeType) return false; return true; } GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrDitherEffect); #if GR_TEST_UTILS sk_sp<GrFragmentProcessor> GrDitherEffect::TestCreate(GrProcessorTestData* testData) { - float range = testData->fRandom->nextRangeF(0.001f, 0.05f); return sk_sp<GrFragmentProcessor>(new GrDitherEffect(range)); } diff --git a/src/gpu/effects/GrDitherEffect.h b/src/gpu/effects/GrDitherEffect.h index 63c0df7eb2..62c97d5bf7 100644 --- a/src/gpu/effects/GrDitherEffect.h +++ b/src/gpu/effects/GrDitherEffect.h @@ -48,14 +48,13 @@ public: return sk_sp<GrFragmentProcessor>(new GrDitherEffect(rangeType)); } const char* name() const override { return "DitherEffect"; } + private: - GrDitherEffect(int rangeType) - : INHERITED(kNone_OptimizationFlags) - , fRangeType(rangeType) { + GrDitherEffect(int rangeType) : INHERITED(kNone_OptimizationFlags), fRangeType(rangeType) { this->initClassID<GrDitherEffect>(); } GrGLSLFragmentProcessor* onCreateGLSLInstance() const override; - void onGetGLSLProcessorKey(const GrShaderCaps&,GrProcessorKeyBuilder*) const override; + void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override; bool onIsEqual(const GrFragmentProcessor&) const override; GR_DECLARE_FRAGMENT_PROCESSOR_TEST int fRangeType; diff --git a/src/gpu/effects/GrEllipseEffect.cpp b/src/gpu/effects/GrEllipseEffect.cpp index 2b9675fd94..020c34e644 100644 --- a/src/gpu/effects/GrEllipseEffect.cpp +++ b/src/gpu/effects/GrEllipseEffect.cpp @@ -22,70 +22,89 @@ public: void emitCode(EmitArgs& args) override { GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder; const GrEllipseEffect& _outer = args.fFp.cast<GrEllipseEffect>(); - (void) _outer; -prevRadii = vec2(-1.0); -useScale = sk_Caps.floatPrecisionVaries; - fEllipseVar = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kVec4f_GrSLType, kHigh_GrSLPrecision, "ellipse"); + (void)_outer; + prevRadii = vec2(-1.0); + useScale = sk_Caps.floatPrecisionVaries; + fEllipseVar = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kVec4f_GrSLType, + kHigh_GrSLPrecision, "ellipse"); if (useScale) { - fScaleVar = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kVec2f_GrSLType, kDefault_GrSLPrecision, "scale"); + fScaleVar = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kVec2f_GrSLType, + kDefault_GrSLPrecision, "scale"); } - fragBuilder->codeAppendf("vec2 prevCenter;\nvec2 prevRadii = vec2(%f, %f);\nbool useScale = %s;\nvec2 d = sk_FragCoord.xy - %s.xy;\n@if (useScale) {\n d *= %s.y;\n}\nvec2 Z = d * %s.zw;\nfloat implicit = dot(Z, d) - 1.0;\nfloat grad_dot = 4.0 * dot(Z, Z);\ngrad_dot = max(grad_dot, 0.0001);\nfloat approx_dist = implicit * inversesqrt(grad_dot);\n@if (useScale) {\n approx_dist *= %s.x;\n}\nfloat alpha;\n@switch (%d) {\n case 0:\n alpha = approx_dist > 0.0 ? 0.0 : 1.0;\n break;\n case 1:\n alpha = clamp(0.5 - approx_dist, 0.0, 1.0);\n break;\n case 2:\n alpha = approx_dist > 0.0 ? 1.0 : 0.0;\n break;\n case 3:\n alpha = clamp(0.5 + approx_dist, 0.0, 1.0);\n break;\n default:\n discard;\n}\n%s = %s * alpha;\n", prevRadii.fX, prevRadii.fY, (useScale ? "true" : "false"), args.fUniformHandler->getUniformCStr(fEllipseVar), fScaleVar.isValid() ? args.fUniformHandler->getUniformCStr(fScaleVar) : "vec2(0.0)", args.fUniformHandler->getUniformCStr(fEllipseVar), fScaleVar.isValid() ? args.fUniformHandler->getUniformCStr(fScaleVar) : "vec2(0.0)", _outer.edgeType(), args.fOutputColor, args.fInputColor ? args.fInputColor : "vec4(1)"); + fragBuilder->codeAppendf( + "vec2 prevCenter;\nvec2 prevRadii = vec2(%f, %f);\nbool useScale = %s;\nvec2 d = " + "sk_FragCoord.xy - %s.xy;\n@if (useScale) {\n d *= %s.y;\n}\nvec2 Z = d * " + "%s.zw;\nfloat implicit = dot(Z, d) - 1.0;\nfloat grad_dot = 4.0 * dot(Z, " + "Z);\ngrad_dot = max(grad_dot, 0.0001);\nfloat approx_dist = implicit * " + "inversesqrt(grad_dot);\n@if (useScale) {\n approx_dist *= %s.x;\n}\nfloat " + "alpha;\n@switch (%d) {\n case 0:\n alpha = approx_dist > 0.0 ? 0.0 : " + "1.0;\n break;\n case 1:\n alpha = clamp(0.5 - approx_dist, 0.0, " + "1.0);\n break;\n case 2:\n alpha = approx_dist > 0.0 ? 1.0 : " + "0.0;\n break;\n case 3:\n alpha = clamp(0.5 + approx_dist, 0.0, " + "1.0);\n break;\n default:\n discard;\n}\n%s = %s * alpha;\n", + prevRadii.fX, prevRadii.fY, (useScale ? "true" : "false"), + args.fUniformHandler->getUniformCStr(fEllipseVar), + fScaleVar.isValid() ? args.fUniformHandler->getUniformCStr(fScaleVar) : "vec2(0.0)", + args.fUniformHandler->getUniformCStr(fEllipseVar), + fScaleVar.isValid() ? args.fUniformHandler->getUniformCStr(fScaleVar) : "vec2(0.0)", + _outer.edgeType(), args.fOutputColor, + args.fInputColor ? args.fInputColor : "vec4(1)"); } + private: - void onSetData(const GrGLSLProgramDataManager& pdman, const GrFragmentProcessor& _proc) override { + void onSetData(const GrGLSLProgramDataManager& pdman, + const GrFragmentProcessor& _proc) override { const GrEllipseEffect& _outer = _proc.cast<GrEllipseEffect>(); auto edgeType = _outer.edgeType(); - (void) edgeType; + (void)edgeType; auto center = _outer.center(); - (void) center; + (void)center; auto radii = _outer.radii(); - (void) radii; + (void)radii; UniformHandle& ellipse = fEllipseVar; - (void) ellipse; + (void)ellipse; UniformHandle& scale = fScaleVar; - (void) scale; + (void)scale; + + if (radii != prevRadii || center != prevCenter) { + float invRXSqd; + float invRYSqd; - if (radii != prevRadii || center != prevCenter) { - float invRXSqd; - float invRYSqd; - - - if (scale.isValid()) { - if (radii.fX > radii.fY) { - invRXSqd = 1.f; - invRYSqd = (radii.fX * radii.fX) / - (radii.fY * radii.fY); - pdman.set2f(scale, radii.fX, 1.f / radii.fX); + if (scale.isValid()) { + if (radii.fX > radii.fY) { + invRXSqd = 1.f; + invRYSqd = (radii.fX * radii.fX) / (radii.fY * radii.fY); + pdman.set2f(scale, radii.fX, 1.f / radii.fX); + } else { + invRXSqd = (radii.fY * radii.fY) / (radii.fX * radii.fX); + invRYSqd = 1.f; + pdman.set2f(scale, radii.fY, 1.f / radii.fY); + } } else { - invRXSqd = (radii.fY * radii.fY) / - (radii.fX * radii.fX); - invRYSqd = 1.f; - pdman.set2f(scale, radii.fY, 1.f / radii.fY); + invRXSqd = 1.f / (radii.fX * radii.fX); + invRYSqd = 1.f / (radii.fY * radii.fY); } - } else { - invRXSqd = 1.f / (radii.fX * radii.fX); - invRYSqd = 1.f / (radii.fY * radii.fY); + pdman.set4f(ellipse, center.fX, center.fY, invRXSqd, invRYSqd); + prevCenter = center; + prevRadii = radii; } - pdman.set4f(ellipse, center.fX, center.fY, invRXSqd, invRYSqd); - prevCenter = center; - prevRadii = radii; } - } -SkPoint prevCenter; -SkPoint prevRadii; -bool useScale; + SkPoint prevCenter; + SkPoint prevRadii; + bool useScale; UniformHandle fEllipseVar; UniformHandle fScaleVar; }; GrGLSLFragmentProcessor* GrEllipseEffect::onCreateGLSLInstance() const { return new GrGLSLEllipseEffect(); } -void GrEllipseEffect::onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const { +void GrEllipseEffect::onGetGLSLProcessorKey(const GrShaderCaps& caps, + GrProcessorKeyBuilder* b) const { b->add32(fEdgeType); } bool GrEllipseEffect::onIsEqual(const GrFragmentProcessor& other) const { const GrEllipseEffect& that = other.cast<GrEllipseEffect>(); - (void) that; + (void)that; if (fEdgeType != that.fEdgeType) return false; if (fCenter != that.fCenter) return false; if (fRadii != that.fRadii) return false; @@ -94,7 +113,6 @@ bool GrEllipseEffect::onIsEqual(const GrFragmentProcessor& other) const { GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrEllipseEffect); #if GR_TEST_UTILS sk_sp<GrFragmentProcessor> GrEllipseEffect::TestCreate(GrProcessorTestData* testData) { - SkPoint center; center.fX = testData->fRandom->nextRangeScalar(0.f, 1000.f); center.fY = testData->fRandom->nextRangeScalar(0.f, 1000.f); @@ -102,7 +120,7 @@ sk_sp<GrFragmentProcessor> GrEllipseEffect::TestCreate(GrProcessorTestData* test SkScalar ry = testData->fRandom->nextRangeF(0.f, 1000.f); GrPrimitiveEdgeType et; do { - et = (GrPrimitiveEdgeType) testData->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt); + et = (GrPrimitiveEdgeType)testData->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt); } while (kHairlineAA_GrProcessorEdgeType == et); return GrEllipseEffect::Make(et, center, SkPoint::Make(rx, ry)); } diff --git a/src/gpu/effects/GrEllipseEffect.h b/src/gpu/effects/GrEllipseEffect.h index f4a92c0bc4..02efb6761d 100644 --- a/src/gpu/effects/GrEllipseEffect.h +++ b/src/gpu/effects/GrEllipseEffect.h @@ -25,16 +25,17 @@ public: return sk_sp<GrFragmentProcessor>(new GrEllipseEffect(edgeType, center, radii)); } const char* name() const override { return "EllipseEffect"; } + private: GrEllipseEffect(int edgeType, SkPoint center, SkPoint radii) - : INHERITED((OptimizationFlags) kCompatibleWithCoverageAsAlpha_OptimizationFlag ) - , fEdgeType(edgeType) - , fCenter(center) - , fRadii(radii) { + : INHERITED((OptimizationFlags)kCompatibleWithCoverageAsAlpha_OptimizationFlag) + , fEdgeType(edgeType) + , fCenter(center) + , fRadii(radii) { this->initClassID<GrEllipseEffect>(); } GrGLSLFragmentProcessor* onCreateGLSLInstance() const override; - void onGetGLSLProcessorKey(const GrShaderCaps&,GrProcessorKeyBuilder*) const override; + void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override; bool onIsEqual(const GrFragmentProcessor&) const override; GR_DECLARE_FRAGMENT_PROCESSOR_TEST int fEdgeType; diff --git a/src/gpu/effects/GrSimpleTextureEffect.cpp b/src/gpu/effects/GrSimpleTextureEffect.cpp index 181d0f788e..a7ef7801d9 100644 --- a/src/gpu/effects/GrSimpleTextureEffect.cpp +++ b/src/gpu/effects/GrSimpleTextureEffect.cpp @@ -22,18 +22,34 @@ public: void emitCode(EmitArgs& args) override { GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder; const GrSimpleTextureEffect& _outer = args.fFp.cast<GrSimpleTextureEffect>(); - (void) _outer; + (void)_outer; fColorSpaceHelper.emitCode(args.fUniformHandler, _outer.colorXform().get()); - SkSL::String sk_TransformedCoords2D_0 = fragBuilder->ensureCoords2D(args.fTransformedCoords[0]); - fragBuilder->codeAppendf("vec4 _tmpVar1;%s = %s * %stexture(%s, %s).%s%s;\n", args.fOutputColor, args.fInputColor ? args.fInputColor : "vec4(1)", fColorSpaceHelper.isValid() ? "(_tmpVar1 = " : "", fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[0]).c_str(), sk_TransformedCoords2D_0.c_str(), fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[0]).c_str(), fColorSpaceHelper.isValid() ? SkStringPrintf(", vec4(clamp((%s * vec4(_tmpVar1.rgb, 1.0)).rgb, 0.0, _tmpVar1.a), _tmpVar1.a))", args.fUniformHandler->getUniformCStr(fColorSpaceHelper.gamutXformUniform())).c_str() : ""); + SkSL::String sk_TransformedCoords2D_0 = + fragBuilder->ensureCoords2D(args.fTransformedCoords[0]); + fragBuilder->codeAppendf( + "vec4 _tmpVar1;%s = %s * %stexture(%s, %s).%s%s;\n", args.fOutputColor, + args.fInputColor ? args.fInputColor : "vec4(1)", + fColorSpaceHelper.isValid() ? "(_tmpVar1 = " : "", + fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[0]).c_str(), + sk_TransformedCoords2D_0.c_str(), + fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[0]).c_str(), + fColorSpaceHelper.isValid() + ? SkStringPrintf(", vec4(clamp((%s * vec4(_tmpVar1.rgb, 1.0)).rgb, 0.0, " + "_tmpVar1.a), _tmpVar1.a))", + args.fUniformHandler->getUniformCStr( + fColorSpaceHelper.gamutXformUniform())) + .c_str() + : ""); } + private: - void onSetData(const GrGLSLProgramDataManager& pdman, const GrFragmentProcessor& _proc) override { + void onSetData(const GrGLSLProgramDataManager& pdman, + const GrFragmentProcessor& _proc) override { const GrSimpleTextureEffect& _outer = _proc.cast<GrSimpleTextureEffect>(); { - if (fColorSpaceHelper.isValid()) { - fColorSpaceHelper.setData(pdman, _outer.colorXform().get()); - } + if (fColorSpaceHelper.isValid()) { + fColorSpaceHelper.setData(pdman, _outer.colorXform().get()); + } } } UniformHandle fImageVar; @@ -42,12 +58,13 @@ private: GrGLSLFragmentProcessor* GrSimpleTextureEffect::onCreateGLSLInstance() const { return new GrGLSLSimpleTextureEffect(); } -void GrSimpleTextureEffect::onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const { +void GrSimpleTextureEffect::onGetGLSLProcessorKey(const GrShaderCaps& caps, + GrProcessorKeyBuilder* b) const { b->add32(GrColorSpaceXform::XformKey(fColorXform.get())); } bool GrSimpleTextureEffect::onIsEqual(const GrFragmentProcessor& other) const { const GrSimpleTextureEffect& that = other.cast<GrSimpleTextureEffect>(); - (void) that; + (void)that; if (fImage != that.fImage) return false; if (fColorXform != that.fColorXform) return false; if (fMatrix != that.fMatrix) return false; @@ -56,21 +73,18 @@ bool GrSimpleTextureEffect::onIsEqual(const GrFragmentProcessor& other) const { GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrSimpleTextureEffect); #if GR_TEST_UTILS sk_sp<GrFragmentProcessor> GrSimpleTextureEffect::TestCreate(GrProcessorTestData* testData) { - int texIdx = testData->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx : GrProcessorUnitTest::kAlphaTextureIdx; static const SkShader::TileMode kTileModes[] = { - SkShader::kClamp_TileMode, - SkShader::kRepeat_TileMode, - SkShader::kMirror_TileMode, + SkShader::kClamp_TileMode, SkShader::kRepeat_TileMode, SkShader::kMirror_TileMode, }; SkShader::TileMode tileModes[] = { - kTileModes[testData->fRandom->nextULessThan(SK_ARRAY_COUNT(kTileModes))], - kTileModes[testData->fRandom->nextULessThan(SK_ARRAY_COUNT(kTileModes))], + kTileModes[testData->fRandom->nextULessThan(SK_ARRAY_COUNT(kTileModes))], + kTileModes[testData->fRandom->nextULessThan(SK_ARRAY_COUNT(kTileModes))], }; - GrSamplerParams params(tileModes, testData->fRandom->nextBool() - ? GrSamplerParams::kBilerp_FilterMode - : GrSamplerParams::kNone_FilterMode); + GrSamplerParams params(tileModes, + testData->fRandom->nextBool() ? GrSamplerParams::kBilerp_FilterMode + : GrSamplerParams::kNone_FilterMode); const SkMatrix& matrix = GrTest::TestMatrix(testData->fRandom); sk_sp<GrColorSpaceXform> colorSpaceXform = GrTest::TestColorXform(testData->fRandom); diff --git a/src/gpu/effects/GrSimpleTextureEffect.h b/src/gpu/effects/GrSimpleTextureEffect.h index aed91d7c10..af85ff1d3c 100644 --- a/src/gpu/effects/GrSimpleTextureEffect.h +++ b/src/gpu/effects/GrSimpleTextureEffect.h @@ -22,54 +22,51 @@ public: SkMatrix44 matrix() const { return fMatrix; } static sk_sp<GrFragmentProcessor> Make(sk_sp<GrTextureProxy> proxy, - sk_sp<GrColorSpaceXform> colorSpaceXform, + sk_sp<GrColorSpaceXform> + colorSpaceXform, const SkMatrix& matrix) { - return sk_sp<GrFragmentProcessor>( - new GrSimpleTextureEffect(std::move(proxy), std::move(colorSpaceXform), matrix, - GrSamplerParams(SkShader::kClamp_TileMode, GrSamplerParams::kNone_FilterMode))); + return sk_sp<GrFragmentProcessor>(new GrSimpleTextureEffect( + std::move(proxy), std::move(colorSpaceXform), matrix, + GrSamplerParams(SkShader::kClamp_TileMode, GrSamplerParams::kNone_FilterMode))); } - static sk_sp<GrFragmentProcessor> Make(sk_sp<GrTextureProxy> proxy, - sk_sp<GrColorSpaceXform> colorSpaceXform, + sk_sp<GrColorSpaceXform> + colorSpaceXform, const SkMatrix& matrix, GrSamplerParams::FilterMode filterMode) { return sk_sp<GrFragmentProcessor>( - new GrSimpleTextureEffect(std::move(proxy), std::move(colorSpaceXform), matrix, - GrSamplerParams(SkShader::kClamp_TileMode, filterMode))); - } + new GrSimpleTextureEffect(std::move(proxy), std::move(colorSpaceXform), matrix, + GrSamplerParams(SkShader::kClamp_TileMode, filterMode))); + } static sk_sp<GrFragmentProcessor> Make(sk_sp<GrTextureProxy> proxy, - sk_sp<GrColorSpaceXform> colorSpaceXform, + sk_sp<GrColorSpaceXform> + colorSpaceXform, const SkMatrix& matrix, const GrSamplerParams& p) { return sk_sp<GrFragmentProcessor>( - new GrSimpleTextureEffect(std::move(proxy), std::move(colorSpaceXform), matrix, p)); + new GrSimpleTextureEffect(std::move(proxy), std::move(colorSpaceXform), matrix, p)); } const char* name() const override { return "SimpleTextureEffect"; } + private: - GrSimpleTextureEffect(sk_sp<GrTextureProxy> image, sk_sp<GrColorSpaceXform> colorXform, SkMatrix44 matrix, - GrSamplerParams samplerParams -) - : INHERITED((OptimizationFlags) - kCompatibleWithCoverageAsAlpha_OptimizationFlag | - (GrPixelConfigIsOpaque(image->config()) ? kPreservesOpaqueInput_OptimizationFlag : - kNone_OptimizationFlags) -) - , fImage(std::move(image), - samplerParams -) - , fColorXform(colorXform) - , fMatrix(matrix) - , fImageCoordTransform( - matrix -, fImage.proxy()) { + GrSimpleTextureEffect(sk_sp<GrTextureProxy> image, sk_sp<GrColorSpaceXform> colorXform, + SkMatrix44 matrix, GrSamplerParams samplerParams) + : INHERITED((OptimizationFlags)kCompatibleWithCoverageAsAlpha_OptimizationFlag | + (GrPixelConfigIsOpaque(image->config()) + ? kPreservesOpaqueInput_OptimizationFlag + : kNone_OptimizationFlags)) + , fImage(std::move(image), samplerParams) + , fColorXform(colorXform) + , fMatrix(matrix) + , fImageCoordTransform(matrix, fImage.proxy()) { this->addTextureSampler(&fImage); this->addCoordTransform(&fImageCoordTransform); this->initClassID<GrSimpleTextureEffect>(); } GrGLSLFragmentProcessor* onCreateGLSLInstance() const override; - void onGetGLSLProcessorKey(const GrShaderCaps&,GrProcessorKeyBuilder*) const override; + void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override; bool onIsEqual(const GrFragmentProcessor&) const override; GR_DECLARE_FRAGMENT_PROCESSOR_TEST TextureSampler fImage; |