GrCircleEffect.cpp revision 83d118550f7237d25e7e096cc968dbb9a06678a3
183d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas/* 283d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas * Copyright 2017 Google Inc. 383d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas * 483d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas * Use of this source code is governed by a BSD-style license that can be 583d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas * found in the LICENSE file. 683d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas */ 783d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas 883d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas/* 983d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas * This file was autogenerated from GrCircleEffect.fp; do not modify. 1083d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas */ 1183d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas#include "GrCircleEffect.h" 1283d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas#if SK_SUPPORT_GPU 1383d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas#include "glsl/GrGLSLColorSpaceXformHelper.h" 1483d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas#include "glsl/GrGLSLFragmentProcessor.h" 1583d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas#include "glsl/GrGLSLFragmentShaderBuilder.h" 1683d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas#include "glsl/GrGLSLProgramBuilder.h" 1783d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas#include "SkSLCPP.h" 1883d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas#include "SkSLUtil.h" 1983d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholasclass GrGLSLCircleEffect : public GrGLSLFragmentProcessor { 2083d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholaspublic: 2183d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas GrGLSLCircleEffect() {} 2283d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas void emitCode(EmitArgs& args) override { 2383d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder; 2483d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas const GrCircleEffect& _outer = args.fFp.cast<GrCircleEffect>(); 2583d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas (void) _outer; 2683d118550f7237d25e7e096cc968dbb9a06678a3Ethan NicholasprevRadius = -1.0; 2783d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas fCircleVar = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kVec4f_GrSLType, kDefault_GrSLPrecision, "circle"); 2883d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas fragBuilder->codeAppendf("vec2 prevCenter;\nfloat prevRadius = %f;\nfloat d;\nif (%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}\nif ((%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)"); 2983d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas } 3083d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholasprivate: 3183d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas void onSetData(const GrGLSLProgramDataManager& pdman, const GrFragmentProcessor& _proc) override { 3283d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas const GrCircleEffect& _outer = _proc.cast<GrCircleEffect>(); 3383d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas auto edgeType = _outer.edgeType(); 3483d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas (void) edgeType; 3583d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas auto center = _outer.center(); 3683d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas (void) center; 3783d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas auto radius = _outer.radius(); 3883d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas (void) radius; 3983d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas UniformHandle& circle = fCircleVar; 4083d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas (void) circle; 4183d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas 4283d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas if (radius != prevRadius || center != prevCenter) { 4383d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas SkScalar effectiveRadius = radius; 4483d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas if (GrProcessorEdgeTypeIsInverseFill((GrPrimitiveEdgeType) edgeType)) { 4583d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas effectiveRadius -= 0.5f; 4683d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas } else { 4783d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas effectiveRadius += 0.5f; 4883d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas } 4983d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas pdman.set4f(circle, center.fX, center.fY, effectiveRadius, 5083d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas SkScalarInvert(effectiveRadius)); 5183d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas prevCenter = center; 5283d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas prevRadius = radius; 5383d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas } 5483d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas } 5583d118550f7237d25e7e096cc968dbb9a06678a3Ethan NicholasSkPoint prevCenter; 5683d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholasfloat prevRadius; 5783d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas UniformHandle fCircleVar; 5883d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas}; 5983d118550f7237d25e7e096cc968dbb9a06678a3Ethan NicholasGrGLSLFragmentProcessor* GrCircleEffect::onCreateGLSLInstance() const { 6083d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas return new GrGLSLCircleEffect(); 6183d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas} 6283d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholasvoid GrCircleEffect::onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const { 6383d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas b->add32(fEdgeType); 6483d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas} 6583d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholasbool GrCircleEffect::onIsEqual(const GrFragmentProcessor& other) const { 6683d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas const GrCircleEffect& that = other.cast<GrCircleEffect>(); 6783d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas (void) that; 6883d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas if (fEdgeType != that.fEdgeType) return false; 6983d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas if (fCenter != that.fCenter) return false; 7083d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas if (fRadius != that.fRadius) return false; 7183d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas return true; 7283d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas} 7383d118550f7237d25e7e096cc968dbb9a06678a3Ethan NicholasGR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrCircleEffect); 7483d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas#if GR_TEST_UTILS 7583d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholassk_sp<GrFragmentProcessor> GrCircleEffect::TestCreate(GrProcessorTestData* testData) { 7683d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas 7783d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas SkPoint center; 7883d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas center.fX = testData->fRandom->nextRangeScalar(0.f, 1000.f); 7983d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas center.fY = testData->fRandom->nextRangeScalar(0.f, 1000.f); 8083d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas SkScalar radius = testData->fRandom->nextRangeF(0.f, 1000.f); 8183d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas GrPrimitiveEdgeType et; 8283d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas do { 8383d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas et = (GrPrimitiveEdgeType) testData->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt); 8483d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas } while (kHairlineAA_GrProcessorEdgeType == et); 8583d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas return GrCircleEffect::Make(et, center, radius); 8683d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas} 8783d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas#endif 8883d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas#endif 89