Home | History | Annotate | Download | only in effects
      1 /*
      2  * Copyright 2017 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 #if SK_SUPPORT_GPU
     13 
     14 inline GrFragmentProcessor::OptimizationFlags GrAlphaThresholdFragmentProcessor::optFlags(
     15         float outerThreshold) {
     16     if (outerThreshold >= 1.0) {
     17         return kPreservesOpaqueInput_OptimizationFlag |
     18                kCompatibleWithCoverageAsAlpha_OptimizationFlag;
     19     } else {
     20         return kCompatibleWithCoverageAsAlpha_OptimizationFlag;
     21     }
     22 }
     23 #include "glsl/GrGLSLColorSpaceXformHelper.h"
     24 #include "glsl/GrGLSLFragmentProcessor.h"
     25 #include "glsl/GrGLSLFragmentShaderBuilder.h"
     26 #include "glsl/GrGLSLProgramBuilder.h"
     27 #include "SkSLCPP.h"
     28 #include "SkSLUtil.h"
     29 class GrGLSLAlphaThresholdFragmentProcessor : public GrGLSLFragmentProcessor {
     30 public:
     31     GrGLSLAlphaThresholdFragmentProcessor() {}
     32     void emitCode(EmitArgs& args) override {
     33         GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
     34         const GrAlphaThresholdFragmentProcessor& _outer =
     35                 args.fFp.cast<GrAlphaThresholdFragmentProcessor>();
     36         (void)_outer;
     37         fColorSpaceHelper.emitCode(args.fUniformHandler, _outer.colorXform().get());
     38         fInnerThresholdVar = args.fUniformHandler->addUniform(
     39                 kFragment_GrShaderFlag, kFloat_GrSLType, kDefault_GrSLPrecision, "innerThreshold");
     40         fOuterThresholdVar = args.fUniformHandler->addUniform(
     41                 kFragment_GrShaderFlag, kFloat_GrSLType, kDefault_GrSLPrecision, "outerThreshold");
     42         SkSL::String sk_TransformedCoords2D_0 =
     43                 fragBuilder->ensureCoords2D(args.fTransformedCoords[0]);
     44         SkSL::String sk_TransformedCoords2D_1 =
     45                 fragBuilder->ensureCoords2D(args.fTransformedCoords[1]);
     46         fragBuilder->codeAppendf(
     47                 "vec4 _tmpVar1;vec4 color = %stexture(%s, %s).%s%s;\nvec4 mask_color = texture(%s, "
     48                 "%s).%s;\nif (mask_color.w < 0.5) {\n    if (color.w > %s) {\n        float scale "
     49                 "= %s / color.w;\n        color.xyz *= scale;\n        color.w = %s;\n    }\n} "
     50                 "else if (color.w < %s) {\n    float scale = %s / max(0.001, color.w);\n    "
     51                 "color.xyz *= scale;\n    color.w = %s;\n}\n%s = color;\n",
     52                 fColorSpaceHelper.isValid() ? "(_tmpVar1 = " : "",
     53                 fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[0]).c_str(),
     54                 sk_TransformedCoords2D_0.c_str(),
     55                 fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[0]).c_str(),
     56                 fColorSpaceHelper.isValid()
     57                         ? SkStringPrintf(", vec4(clamp((%s * vec4(_tmpVar1.rgb, 1.0)).rgb, 0.0, "
     58                                          "_tmpVar1.a), _tmpVar1.a))",
     59                                          args.fUniformHandler->getUniformCStr(
     60                                                  fColorSpaceHelper.gamutXformUniform()))
     61                                   .c_str()
     62                         : "",
     63                 fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[1]).c_str(),
     64                 sk_TransformedCoords2D_1.c_str(),
     65                 fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[1]).c_str(),
     66                 args.fUniformHandler->getUniformCStr(fOuterThresholdVar),
     67                 args.fUniformHandler->getUniformCStr(fOuterThresholdVar),
     68                 args.fUniformHandler->getUniformCStr(fOuterThresholdVar),
     69                 args.fUniformHandler->getUniformCStr(fInnerThresholdVar),
     70                 args.fUniformHandler->getUniformCStr(fInnerThresholdVar),
     71                 args.fUniformHandler->getUniformCStr(fInnerThresholdVar), args.fOutputColor);
     72     }
     73 
     74 private:
     75     void onSetData(const GrGLSLProgramDataManager& pdman,
     76                    const GrFragmentProcessor& _proc) override {
     77         const GrAlphaThresholdFragmentProcessor& _outer =
     78                 _proc.cast<GrAlphaThresholdFragmentProcessor>();
     79         {
     80             if (fColorSpaceHelper.isValid()) {
     81                 fColorSpaceHelper.setData(pdman, _outer.colorXform().get());
     82             }
     83             pdman.set1f(fInnerThresholdVar, _outer.innerThreshold());
     84             pdman.set1f(fOuterThresholdVar, _outer.outerThreshold());
     85         }
     86     }
     87     UniformHandle fImageVar;
     88     UniformHandle fMaskVar;
     89     UniformHandle fInnerThresholdVar;
     90     UniformHandle fOuterThresholdVar;
     91     GrGLSLColorSpaceXformHelper fColorSpaceHelper;
     92 };
     93 GrGLSLFragmentProcessor* GrAlphaThresholdFragmentProcessor::onCreateGLSLInstance() const {
     94     return new GrGLSLAlphaThresholdFragmentProcessor();
     95 }
     96 void GrAlphaThresholdFragmentProcessor::onGetGLSLProcessorKey(const GrShaderCaps& caps,
     97                                                               GrProcessorKeyBuilder* b) const {
     98     b->add32(GrColorSpaceXform::XformKey(fColorXform.get()));
     99 }
    100 bool GrAlphaThresholdFragmentProcessor::onIsEqual(const GrFragmentProcessor& other) const {
    101     const GrAlphaThresholdFragmentProcessor& that = other.cast<GrAlphaThresholdFragmentProcessor>();
    102     (void)that;
    103     if (fImage != that.fImage) return false;
    104     if (fColorXform != that.fColorXform) return false;
    105     if (fMask != that.fMask) return false;
    106     if (fInnerThreshold != that.fInnerThreshold) return false;
    107     if (fOuterThreshold != that.fOuterThreshold) return false;
    108     return true;
    109 }
    110 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrAlphaThresholdFragmentProcessor);
    111 #if GR_TEST_UTILS
    112 sk_sp<GrFragmentProcessor> GrAlphaThresholdFragmentProcessor::TestCreate(
    113         GrProcessorTestData* testData) {
    114     sk_sp<GrTextureProxy> bmpProxy = testData->textureProxy(GrProcessorUnitTest::kSkiaPMTextureIdx);
    115     sk_sp<GrTextureProxy> maskProxy = testData->textureProxy(GrProcessorUnitTest::kAlphaTextureIdx);
    116 
    117     float innerThresh = testData->fRandom->nextUScalar1() * .99f + 0.005f;
    118     float outerThresh = testData->fRandom->nextUScalar1() * .99f + 0.005f;
    119     const int kMaxWidth = 1000;
    120     const int kMaxHeight = 1000;
    121     uint32_t width = testData->fRandom->nextULessThan(kMaxWidth);
    122     uint32_t height = testData->fRandom->nextULessThan(kMaxHeight);
    123     uint32_t x = testData->fRandom->nextULessThan(kMaxWidth - width);
    124     uint32_t y = testData->fRandom->nextULessThan(kMaxHeight - height);
    125     SkIRect bounds = SkIRect::MakeXYWH(x, y, width, height);
    126     sk_sp<GrColorSpaceXform> colorSpaceXform = GrTest::TestColorXform(testData->fRandom);
    127     return GrAlphaThresholdFragmentProcessor::Make(std::move(bmpProxy), colorSpaceXform,
    128                                                    std::move(maskProxy), innerThresh, outerThresh,
    129                                                    bounds);
    130 }
    131 #endif
    132 #endif
    133