| Index: src/effects/SkLumaXfermode.cpp
|
| diff --git a/src/effects/SkLumaXfermode.cpp b/src/effects/SkLumaXfermode.cpp
|
| deleted file mode 100644
|
| index aa3d780aa06ffa97ae8f3a4c85e7caf4cefc712c..0000000000000000000000000000000000000000
|
| --- a/src/effects/SkLumaXfermode.cpp
|
| +++ /dev/null
|
| @@ -1,278 +0,0 @@
|
| -/*
|
| - * Copyright 2013 Google Inc.
|
| - *
|
| - * Use of this source code is governed by a BSD-style license that can be
|
| - * found in the LICENSE file.
|
| - */
|
| -
|
| -#include "SkLumaXfermode.h"
|
| -#include "SkColorPriv.h"
|
| -#include "SkFlattenableBuffers.h"
|
| -#include "SkString.h"
|
| -
|
| -#if SK_SUPPORT_GPU
|
| -#include "gl/GrGLEffect.h"
|
| -#include "GrContext.h"
|
| -#include "GrTBackendEffectFactory.h"
|
| -#endif
|
| -
|
| -class SkLumaMaskXfermodeSrcOver : public SkLumaMaskXfermode {
|
| -public:
|
| - SkLumaMaskXfermodeSrcOver();
|
| -
|
| - SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLumaMaskXfermodeSrcOver)
|
| -
|
| -protected:
|
| - SkLumaMaskXfermodeSrcOver(SkFlattenableReadBuffer&);
|
| -
|
| -private:
|
| - typedef SkLumaMaskXfermode INHERITED;
|
| -
|
| - virtual SkPMColor lumaProc(const SkPMColor a, const SkPMColor b) const;
|
| -};
|
| -
|
| -SkPMColor SkLumaMaskXfermode::lumaProc(const SkPMColor a, const SkPMColor b) const {
|
| - unsigned luma = SkComputeLuminance(SkGetPackedR32(b),
|
| - SkGetPackedG32(b),
|
| - SkGetPackedB32(b));
|
| - return SkAlphaMulQ(a, SkAlpha255To256(luma));
|
| -}
|
| -
|
| -template <typename T>
|
| -static inline const T* lumaOpA(SkXfermode::Mode mode,
|
| - const T* src, const T* dst) {
|
| - return SkXfermode::kSrcIn_Mode == mode ? src : dst;
|
| -}
|
| -
|
| -template <typename T>
|
| -static inline const T* lumaOpB(SkXfermode::Mode mode,
|
| - const T* src, const T* dst) {
|
| - return SkXfermode::kSrcIn_Mode == mode ? dst : src;
|
| -}
|
| -
|
| -SkXfermode* SkLumaMaskXfermode::Create(SkXfermode::Mode mode) {
|
| - if (kSrcIn_Mode == mode || kDstIn_Mode == mode) {
|
| - return SkNEW_ARGS(SkLumaMaskXfermode, (mode));
|
| - }
|
| - if (kSrcOver_Mode == mode) {
|
| - return SkNEW_ARGS(SkLumaMaskXfermodeSrcOver, ());
|
| - }
|
| -
|
| - return NULL;
|
| -}
|
| -
|
| -SkLumaMaskXfermode::SkLumaMaskXfermode(SkXfermode::Mode mode)
|
| - : fMode(mode) {
|
| - SkASSERT(kSrcIn_Mode == mode || kDstIn_Mode == mode || kSrcOver_Mode == mode);
|
| -}
|
| -
|
| -SkLumaMaskXfermode::SkLumaMaskXfermode(SkFlattenableReadBuffer& buffer)
|
| - : INHERITED(buffer)
|
| - , fMode((SkXfermode::Mode)buffer.readUInt()) {
|
| - SkASSERT(kSrcIn_Mode == fMode || kDstIn_Mode == fMode || kSrcOver_Mode == fMode);
|
| -}
|
| -
|
| -void SkLumaMaskXfermode::flatten(SkFlattenableWriteBuffer& buffer) const {
|
| - INHERITED::flatten(buffer);
|
| - buffer.writeUInt(fMode);
|
| -}
|
| -
|
| -SkPMColor SkLumaMaskXfermode::xferColor(SkPMColor src, SkPMColor dst) const {
|
| - const SkPMColor* a = lumaOpA<SkPMColor>(fMode, &src, &dst);
|
| - const SkPMColor* b = lumaOpB<SkPMColor>(fMode, &src, &dst);
|
| - return this->lumaProc(*a, *b);
|
| -}
|
| -
|
| -void SkLumaMaskXfermode::xfer32(SkPMColor dst[], const SkPMColor src[],
|
| - int count, const SkAlpha aa[]) const {
|
| - const SkPMColor* a = lumaOpA<SkPMColor>(fMode, src, dst);
|
| - const SkPMColor* b = lumaOpB<SkPMColor>(fMode, src, dst);
|
| -
|
| - if (aa) {
|
| - for (int i = 0; i < count; ++i) {
|
| - unsigned cov = aa[i];
|
| - if (cov) {
|
| - unsigned resC = this->lumaProc(a[i], b[i]);
|
| - if (cov < 255) {
|
| - resC = SkFastFourByteInterp256(resC, dst[i],
|
| - SkAlpha255To256(cov));
|
| - }
|
| - dst[i] = resC;
|
| - }
|
| - }
|
| - } else {
|
| - for (int i = 0; i < count; ++i) {
|
| - dst[i] = this->lumaProc(a[i], b[i]);
|
| - }
|
| - }
|
| -}
|
| -
|
| -#ifdef SK_DEVELOPER
|
| -void SkLumaMaskXfermode::toString(SkString* str) const {
|
| - str->printf("SkLumaMaskXfermode: mode: %s",
|
| - fMode == kSrcIn_Mode ? "SRC_IN" :
|
| - fMode == kDstIn_Mode ? "DST_IN" : "SRC_OVER");
|
| -}
|
| -#endif
|
| -
|
| -SkLumaMaskXfermodeSrcOver::SkLumaMaskXfermodeSrcOver() : SkLumaMaskXfermode(kSrcOver_Mode) {}
|
| -
|
| -SkLumaMaskXfermodeSrcOver::SkLumaMaskXfermodeSrcOver(SkFlattenableReadBuffer& buffer)
|
| - : INHERITED(buffer) {
|
| -}
|
| -
|
| -SkPMColor SkLumaMaskXfermodeSrcOver::lumaProc(const SkPMColor a, const SkPMColor b) const {
|
| - unsigned luma = SkComputeLuminance(SkGetPackedR32(b),
|
| - SkGetPackedG32(b),
|
| - SkGetPackedB32(b));
|
| -
|
| - unsigned oldAlpha = SkGetPackedA32(b);
|
| - unsigned newR = 0, newG = 0, newB = 0;
|
| -
|
| - if (oldAlpha > 0) {
|
| - newR = SkGetPackedR32(b) * 255 / oldAlpha;
|
| - newG = SkGetPackedG32(b) * 255 / oldAlpha;
|
| - newB = SkGetPackedB32(b) * 255 / oldAlpha;
|
| - }
|
| -
|
| - SkPMColor colorB = SkPremultiplyARGBInline(luma, newR, newG, newB);
|
| -
|
| - return SkPMSrcOver(colorB, a);
|
| -}
|
| -
|
| -SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLumaMaskXfermode)
|
| - SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLumaMaskXfermode)
|
| - SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLumaMaskXfermodeSrcOver)
|
| -SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
|
| -
|
| -#if SK_SUPPORT_GPU
|
| -//////////////////////////////////////////////////////////////////////////////
|
| -
|
| -class GrGLLumaMaskEffect : public GrGLEffect {
|
| -public:
|
| - GrGLLumaMaskEffect(const GrBackendEffectFactory&, const GrDrawEffect&);
|
| - virtual ~GrGLLumaMaskEffect();
|
| -
|
| - virtual void emitCode(GrGLShaderBuilder*,
|
| - const GrDrawEffect&,
|
| - EffectKey,
|
| - const char* outputColor,
|
| - const char* inputColor,
|
| - const TransformedCoordsArray&,
|
| - const TextureSamplerArray&) SK_OVERRIDE;
|
| -
|
| - static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&);
|
| -
|
| -private:
|
| - typedef GrGLEffect INHERITED;
|
| -};
|
| -
|
| -class GrLumaMaskEffect : public GrEffect {
|
| -public:
|
| - static GrEffectRef* Create(SkXfermode::Mode mode) {
|
| - AutoEffectUnref effect(SkNEW_ARGS(GrLumaMaskEffect, (mode)));
|
| - return CreateEffectRef(effect);
|
| - }
|
| -
|
| - virtual ~GrLumaMaskEffect();
|
| -
|
| - typedef GrGLLumaMaskEffect GLEffect;
|
| - static const char* Name() { return "LumaMask"; }
|
| -
|
| - virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE;
|
| - virtual void getConstantColorComponents(GrColor*, uint32_t*) const SK_OVERRIDE;
|
| -
|
| - SkXfermode::Mode getMode() const { return fMode; }
|
| -
|
| -private:
|
| - GrLumaMaskEffect(SkXfermode::Mode);
|
| -
|
| - virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE;
|
| -
|
| - const SkXfermode::Mode fMode;
|
| -};
|
| -
|
| -//////////////////////////////////////////////////////////////////////////////
|
| -
|
| -GrGLLumaMaskEffect::GrGLLumaMaskEffect(const GrBackendEffectFactory& factory,
|
| - const GrDrawEffect&)
|
| - : INHERITED(factory) {
|
| -}
|
| -
|
| -GrGLLumaMaskEffect::~GrGLLumaMaskEffect() {
|
| -}
|
| -
|
| -void GrGLLumaMaskEffect::emitCode(GrGLShaderBuilder* builder,
|
| - const GrDrawEffect& effect,
|
| - EffectKey key,
|
| - const char* outputColor,
|
| - const char* inputColor,
|
| - const TransformedCoordsArray&,
|
| - const TextureSamplerArray& samplers) {
|
| -
|
| - const GrLumaMaskEffect& lumaEffect = effect.castEffect<GrLumaMaskEffect>();
|
| - const char* dstColor = builder->dstColor();
|
| - SkASSERT(NULL != dstColor);
|
| - if (NULL == inputColor) {
|
| - inputColor = "vec4(1)";
|
| - }
|
| -
|
| - const char *opA = lumaOpA<char>(lumaEffect.getMode(), inputColor, dstColor);
|
| - const char *opB = lumaOpB<char>(lumaEffect.getMode(), inputColor, dstColor);
|
| -
|
| - builder->fsCodeAppendf("\t\tfloat luma = dot(vec3(%f, %f, %f), %s.rgb); \n",
|
| - SK_ITU_BT709_LUM_COEFF_R,
|
| - SK_ITU_BT709_LUM_COEFF_G,
|
| - SK_ITU_BT709_LUM_COEFF_B,
|
| - opB);
|
| - if (SkXfermode::kSrcOver_Mode == lumaEffect.getMode()) {
|
| - builder->fsCodeAppendf("\t\tvec4 newB = %s;\n\t\tif (newB.a > 0.0) { newB *= luma / newB.a; }\n\t\tnewB.a = luma;\n", opB);
|
| - builder->fsCodeAppendf("\t\t%s = newB + %s * (1.0 - luma); \n", outputColor, opA);
|
| - } else {
|
| - builder->fsCodeAppendf("\t\t%s = %s * luma;\n", outputColor, opA);
|
| - }
|
| -}
|
| -
|
| -GrGLEffect::EffectKey GrGLLumaMaskEffect::GenKey(const GrDrawEffect& drawEffect,
|
| - const GrGLCaps&) {
|
| - const GrLumaMaskEffect& effect = drawEffect.castEffect<GrLumaMaskEffect>();
|
| - return (EffectKey)effect.getMode();
|
| -}
|
| -
|
| -//////////////////////////////////////////////////////////////////////////////
|
| -
|
| -GrLumaMaskEffect::GrLumaMaskEffect(SkXfermode::Mode mode)
|
| - : fMode(mode) {
|
| - this->setWillReadDstColor();
|
| -}
|
| -
|
| -GrLumaMaskEffect::~GrLumaMaskEffect() {
|
| -}
|
| -
|
| -const GrBackendEffectFactory& GrLumaMaskEffect::getFactory() const {
|
| - return GrTBackendEffectFactory<GrLumaMaskEffect>::getInstance();
|
| -}
|
| -
|
| -void GrLumaMaskEffect::getConstantColorComponents(GrColor*, uint32_t *validFlags) const {
|
| - *validFlags = 0;
|
| -}
|
| -
|
| -bool GrLumaMaskEffect::onIsEqual(const GrEffect& sBase) const {
|
| - return fMode == CastEffect<GrLumaMaskEffect>(sBase).fMode;
|
| -}
|
| -
|
| -//////////////////////////////////////////////////////////////////////////////
|
| -
|
| -bool SkLumaMaskXfermode::asNewEffectOrCoeff(GrContext*, GrEffectRef** effect,
|
| - Coeff*, Coeff*,
|
| - GrTexture* background) const {
|
| - // No background texture support.
|
| - if (effect && !background) {
|
| - *effect = GrLumaMaskEffect::Create(fMode);
|
| - return true;
|
| - }
|
| -
|
| - return false;
|
| -}
|
| -
|
| -#endif // SK_SUPPORT_GPU
|
|
|