1 /* 2 * Copyright 2018 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 /************************************************************************************************** 9 *** This file was autogenerated from GrAlphaThresholdFragmentProcessor.fp; do not modify. 10 **************************************************************************************************/ 11 #include "GrAlphaThresholdFragmentProcessor.h" 12 13 inline GrFragmentProcessor::OptimizationFlags GrAlphaThresholdFragmentProcessor::optFlags( 14 float outerThreshold) { 15 if (outerThreshold >= 1.0) { 16 return kPreservesOpaqueInput_OptimizationFlag | 17 kCompatibleWithCoverageAsAlpha_OptimizationFlag; 18 } else { 19 return kCompatibleWithCoverageAsAlpha_OptimizationFlag; 20 } 21 } 22 #include "glsl/GrGLSLFragmentProcessor.h" 23 #include "glsl/GrGLSLFragmentShaderBuilder.h" 24 #include "glsl/GrGLSLProgramBuilder.h" 25 #include "GrTexture.h" 26 #include "SkSLCPP.h" 27 #include "SkSLUtil.h" 28 class GrGLSLAlphaThresholdFragmentProcessor : public GrGLSLFragmentProcessor { 29 public: 30 GrGLSLAlphaThresholdFragmentProcessor() {} 31 void emitCode(EmitArgs& args) override { 32 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder; 33 const GrAlphaThresholdFragmentProcessor& _outer = 34 args.fFp.cast<GrAlphaThresholdFragmentProcessor>(); 35 (void)_outer; 36 auto innerThreshold = _outer.innerThreshold(); 37 (void)innerThreshold; 38 auto outerThreshold = _outer.outerThreshold(); 39 (void)outerThreshold; 40 fInnerThresholdVar = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, 41 kHalf_GrSLType, "innerThreshold"); 42 fOuterThresholdVar = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, 43 kHalf_GrSLType, "outerThreshold"); 44 SkString sk_TransformedCoords2D_0 = fragBuilder->ensureCoords2D(args.fTransformedCoords[0]); 45 fragBuilder->codeAppendf( 46 "half4 color = %s;\nhalf4 mask_color = texture(%s, %s).%s;\nif (mask_color.w < " 47 "0.5) {\n if (color.w > %s) {\n half scale = %s / color.w;\n " 48 "color.xyz *= scale;\n color.w = %s;\n }\n} else if (color.w < %s) {\n " 49 " half scale = %s / max(0.001, color.w);\n color.xyz *= scale;\n color.w = " 50 "%s;\n}\n%s = color;\n", 51 args.fInputColor, 52 fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[0]).c_str(), 53 sk_TransformedCoords2D_0.c_str(), 54 fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[0]).c_str(), 55 args.fUniformHandler->getUniformCStr(fOuterThresholdVar), 56 args.fUniformHandler->getUniformCStr(fOuterThresholdVar), 57 args.fUniformHandler->getUniformCStr(fOuterThresholdVar), 58 args.fUniformHandler->getUniformCStr(fInnerThresholdVar), 59 args.fUniformHandler->getUniformCStr(fInnerThresholdVar), 60 args.fUniformHandler->getUniformCStr(fInnerThresholdVar), args.fOutputColor); 61 } 62 63 private: 64 void onSetData(const GrGLSLProgramDataManager& pdman, 65 const GrFragmentProcessor& _proc) override { 66 const GrAlphaThresholdFragmentProcessor& _outer = 67 _proc.cast<GrAlphaThresholdFragmentProcessor>(); 68 { 69 pdman.set1f(fInnerThresholdVar, (_outer.innerThreshold())); 70 pdman.set1f(fOuterThresholdVar, (_outer.outerThreshold())); 71 } 72 } 73 UniformHandle fInnerThresholdVar; 74 UniformHandle fOuterThresholdVar; 75 }; 76 GrGLSLFragmentProcessor* GrAlphaThresholdFragmentProcessor::onCreateGLSLInstance() const { 77 return new GrGLSLAlphaThresholdFragmentProcessor(); 78 } 79 void GrAlphaThresholdFragmentProcessor::onGetGLSLProcessorKey(const GrShaderCaps& caps, 80 GrProcessorKeyBuilder* b) const {} 81 bool GrAlphaThresholdFragmentProcessor::onIsEqual(const GrFragmentProcessor& other) const { 82 const GrAlphaThresholdFragmentProcessor& that = other.cast<GrAlphaThresholdFragmentProcessor>(); 83 (void)that; 84 if (fMask != that.fMask) return false; 85 if (fInnerThreshold != that.fInnerThreshold) return false; 86 if (fOuterThreshold != that.fOuterThreshold) return false; 87 return true; 88 } 89 GrAlphaThresholdFragmentProcessor::GrAlphaThresholdFragmentProcessor( 90 const GrAlphaThresholdFragmentProcessor& src) 91 : INHERITED(kGrAlphaThresholdFragmentProcessor_ClassID, src.optimizationFlags()) 92 , fMask(src.fMask) 93 , fInnerThreshold(src.fInnerThreshold) 94 , fOuterThreshold(src.fOuterThreshold) 95 , fMaskCoordTransform(src.fMaskCoordTransform) { 96 this->setTextureSamplerCnt(1); 97 this->addCoordTransform(&fMaskCoordTransform); 98 } 99 std::unique_ptr<GrFragmentProcessor> GrAlphaThresholdFragmentProcessor::clone() const { 100 return std::unique_ptr<GrFragmentProcessor>(new GrAlphaThresholdFragmentProcessor(*this)); 101 } 102 const GrFragmentProcessor::TextureSampler& GrAlphaThresholdFragmentProcessor::onTextureSampler( 103 int index) const { 104 return IthTextureSampler(index, fMask); 105 } 106 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrAlphaThresholdFragmentProcessor); 107 #if GR_TEST_UTILS 108 std::unique_ptr<GrFragmentProcessor> GrAlphaThresholdFragmentProcessor::TestCreate( 109 GrProcessorTestData* testData) { 110 sk_sp<GrTextureProxy> maskProxy = testData->textureProxy(GrProcessorUnitTest::kAlphaTextureIdx); 111 // Make the inner and outer thresholds be in (0, 1) exclusive and be sorted correctly. 112 float innerThresh = testData->fRandom->nextUScalar1() * .99f + 0.005f; 113 float outerThresh = testData->fRandom->nextUScalar1() * .99f + 0.005f; 114 const int kMaxWidth = 1000; 115 const int kMaxHeight = 1000; 116 uint32_t width = testData->fRandom->nextULessThan(kMaxWidth); 117 uint32_t height = testData->fRandom->nextULessThan(kMaxHeight); 118 uint32_t x = testData->fRandom->nextULessThan(kMaxWidth - width); 119 uint32_t y = testData->fRandom->nextULessThan(kMaxHeight - height); 120 SkIRect bounds = SkIRect::MakeXYWH(x, y, width, height); 121 return GrAlphaThresholdFragmentProcessor::Make(std::move(maskProxy), innerThresh, outerThresh, 122 bounds); 123 } 124 #endif 125