aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rwxr-xr-xgn/compile_processors.py4
-rw-r--r--src/effects/GrAlphaThresholdFragmentProcessor.cpp97
-rw-r--r--src/effects/GrAlphaThresholdFragmentProcessor.h49
-rw-r--r--src/effects/GrCircleBlurFragmentProcessor.cpp447
-rw-r--r--src/effects/GrCircleBlurFragmentProcessor.h21
-rw-r--r--src/gpu/effects/GrBlurredEdgeFragmentProcessor.cpp22
-rw-r--r--src/gpu/effects/GrBlurredEdgeFragmentProcessor.h13
-rw-r--r--src/gpu/effects/GrCircleEffect.cpp69
-rw-r--r--src/gpu/effects/GrCircleEffect.h11
-rw-r--r--src/gpu/effects/GrDitherEffect.cpp29
-rw-r--r--src/gpu/effects/GrDitherEffect.h7
-rw-r--r--src/gpu/effects/GrEllipseEffect.cpp100
-rw-r--r--src/gpu/effects/GrEllipseEffect.h11
-rw-r--r--src/gpu/effects/GrSimpleTextureEffect.cpp50
-rw-r--r--src/gpu/effects/GrSimpleTextureEffect.h53
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;