2 * Copyright 2013 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
8 #include "SkLumaColorFilter.h"
10 #include "SkColorPriv.h"
14 #include "gl/GrGLEffect.h"
15 #include "GrContext.h"
16 #include "GrTBackendEffectFactory.h"
19 void SkLumaColorFilter::filterSpan(const SkPMColor src[], int count,
20 SkPMColor dst[]) const {
21 for (int i = 0; i < count; ++i) {
25 * While LuminanceToAlpha is defined to operate on un-premultiplied
26 * inputs, due to the final alpha scaling it can be computed based on
27 * premultipled components:
29 * LumA = (k1 * r / a + k2 * g / a + k3 * b / a) * a
30 * LumA = (k1 * r + k2 * g + k3 * b)
32 unsigned luma = SkComputeLuminance(SkGetPackedR32(c),
35 dst[i] = SkPackARGB32(luma, 0, 0, 0);
39 SkColorFilter* SkLumaColorFilter::Create() {
40 return SkNEW(SkLumaColorFilter);
43 SkLumaColorFilter::SkLumaColorFilter()
47 SkLumaColorFilter::SkLumaColorFilter(SkReadBuffer& buffer)
51 void SkLumaColorFilter::flatten(SkWriteBuffer&) const {
55 void SkLumaColorFilter::toString(SkString* str) const {
56 str->append("SkLumaColorFilter ");
61 class LumaColorFilterEffect : public GrEffect {
63 static GrEffectRef* Create() {
64 AutoEffectUnref effect(SkNEW(LumaColorFilterEffect));
65 return CreateEffectRef(effect);
68 static const char* Name() { return "Luminance-to-Alpha"; }
70 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE {
71 return GrTBackendEffectFactory<LumaColorFilterEffect>::getInstance();
74 virtual void getConstantColorComponents(GrColor* color,
75 uint32_t* validFlags) const SK_OVERRIDE {
76 // The output is always black.
77 *color = GrColorPackRGBA(0, 0, 0, GrColorUnpackA(*color));
78 *validFlags = kRGB_GrColorComponentFlags;
81 class GLEffect : public GrGLEffect {
83 GLEffect(const GrBackendEffectFactory& factory,
85 : INHERITED(factory) {
88 static EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&) {
89 // this class always generates the same code.
93 virtual void emitCode(GrGLShaderBuilder* builder,
96 const char* outputColor,
97 const char* inputColor,
98 const TransformedCoordsArray&,
99 const TextureSamplerArray&) SK_OVERRIDE {
100 if (NULL == inputColor) {
101 inputColor = "vec4(1)";
104 builder->fsCodeAppendf("\tfloat luma = dot(vec3(%f, %f, %f), %s.rgb);\n",
105 SK_ITU_BT709_LUM_COEFF_R,
106 SK_ITU_BT709_LUM_COEFF_G,
107 SK_ITU_BT709_LUM_COEFF_B,
109 builder->fsCodeAppendf("\t%s = vec4(0, 0, 0, luma);\n",
115 typedef GrGLEffect INHERITED;
119 virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE {
124 GrEffectRef* SkLumaColorFilter::asNewEffect(GrContext*) const {
125 return LumaColorFilterEffect::Create();