1 /* 2 * Copyright 2013 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 #include "SkLumaColorFilter.h" 9 #include "SkPM4f.h" 10 #include "SkColorPriv.h" 11 #include "SkRasterPipeline.h" 12 #include "SkString.h" 13 14 #if SK_SUPPORT_GPU 15 #include "GrContext.h" 16 #include "glsl/GrGLSLFragmentProcessor.h" 17 #include "glsl/GrGLSLFragmentShaderBuilder.h" 18 #endif 19 20 void SkLumaColorFilter::onAppendStages(SkRasterPipeline* p, 21 SkColorSpace* dst, 22 SkArenaAlloc* scratch, 23 bool shaderIsOpaque) const { 24 p->append(SkRasterPipeline::luminance_to_alpha); 25 } 26 27 sk_sp<SkColorFilter> SkLumaColorFilter::Make() { 28 return sk_sp<SkColorFilter>(new SkLumaColorFilter); 29 } 30 31 SkLumaColorFilter::SkLumaColorFilter() : INHERITED() {} 32 33 sk_sp<SkFlattenable> SkLumaColorFilter::CreateProc(SkReadBuffer&) { 34 return Make(); 35 } 36 37 void SkLumaColorFilter::flatten(SkWriteBuffer&) const {} 38 39 #ifndef SK_IGNORE_TO_STRING 40 void SkLumaColorFilter::toString(SkString* str) const { 41 str->append("SkLumaColorFilter "); 42 } 43 #endif 44 45 #if SK_SUPPORT_GPU 46 class LumaColorFilterEffect : public GrFragmentProcessor { 47 public: 48 static sk_sp<GrFragmentProcessor> Make() { 49 return sk_sp<GrFragmentProcessor>(new LumaColorFilterEffect); 50 } 51 52 const char* name() const override { return "Luminance-to-Alpha"; } 53 54 class GLSLProcessor : public GrGLSLFragmentProcessor { 55 public: 56 static void GenKey(const GrProcessor&, const GrShaderCaps&, GrProcessorKeyBuilder*) {} 57 58 void emitCode(EmitArgs& args) override { 59 if (nullptr == args.fInputColor) { 60 args.fInputColor = "vec4(1)"; 61 } 62 63 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder; 64 fragBuilder->codeAppendf("\tfloat luma = dot(vec3(%f, %f, %f), %s.rgb);\n", 65 SK_ITU_BT709_LUM_COEFF_R, 66 SK_ITU_BT709_LUM_COEFF_G, 67 SK_ITU_BT709_LUM_COEFF_B, 68 args.fInputColor); 69 fragBuilder->codeAppendf("\t%s = vec4(0, 0, 0, luma);\n", 70 args.fOutputColor); 71 72 } 73 74 private: 75 typedef GrGLSLFragmentProcessor INHERITED; 76 }; 77 78 private: 79 LumaColorFilterEffect() : INHERITED(kConstantOutputForConstantInput_OptimizationFlag) { 80 this->initClassID<LumaColorFilterEffect>(); 81 } 82 83 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override { 84 return new GLSLProcessor; 85 } 86 87 virtual void onGetGLSLProcessorKey(const GrShaderCaps& caps, 88 GrProcessorKeyBuilder* b) const override { 89 GLSLProcessor::GenKey(*this, caps, b); 90 } 91 92 bool onIsEqual(const GrFragmentProcessor&) const override { return true; } 93 94 GrColor4f constantOutputForConstantInput(GrColor4f input) const override { 95 float luma = SK_ITU_BT709_LUM_COEFF_R * input.fRGBA[0] + 96 SK_ITU_BT709_LUM_COEFF_G * input.fRGBA[1] + 97 SK_ITU_BT709_LUM_COEFF_B * input.fRGBA[2]; 98 return GrColor4f(0, 0, 0, luma); 99 } 100 101 typedef GrFragmentProcessor INHERITED; 102 }; 103 104 sk_sp<GrFragmentProcessor> SkLumaColorFilter::asFragmentProcessor(GrContext*, SkColorSpace*) const { 105 return LumaColorFilterEffect::Make(); 106 } 107 #endif 108