Index: skia/effects/SkColorFilters.cpp |
=================================================================== |
--- skia/effects/SkColorFilters.cpp (revision 16859) |
+++ skia/effects/SkColorFilters.cpp (working copy) |
@@ -1,553 +0,0 @@ |
-/* libs/graphics/effects/SkColorFilters.cpp |
-** |
-** Copyright 2006, The Android Open Source Project |
-** |
-** Licensed under the Apache License, Version 2.0 (the "License"); |
-** you may not use this file except in compliance with the License. |
-** You may obtain a copy of the License at |
-** |
-** http://www.apache.org/licenses/LICENSE-2.0 |
-** |
-** Unless required by applicable law or agreed to in writing, software |
-** distributed under the License is distributed on an "AS IS" BASIS, |
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-** See the License for the specific language governing permissions and |
-** limitations under the License. |
-*/ |
- |
-#include "SkColorFilter.h" |
-#include "SkColorPriv.h" |
-#include "SkPorterDuff.h" |
-#include "SkUtils.h" |
- |
-//#define TRACE_CreatePorterDuffFilter |
- |
-// common baseclass |
-class Sk_XfermodeColorFilter : public SkColorFilter { |
-protected: |
- Sk_XfermodeColorFilter(SkColor color) : fColor(SkPreMultiplyColor(color)) {} |
- |
- virtual void flatten(SkFlattenableWriteBuffer& buffer) |
- { |
- buffer.write32(fColor); |
- } |
- |
- Sk_XfermodeColorFilter(SkFlattenableReadBuffer& buffer) |
- { |
- fColor = buffer.readU32(); |
- } |
- |
- SkPMColor fColor; |
-}; |
- |
-class SkSrc_XfermodeColorFilter : public Sk_XfermodeColorFilter { |
-public: |
- SkSrc_XfermodeColorFilter(SkColor color) : INHERITED(color) {} |
- |
- virtual uint32_t getFlags() |
- { |
- if (SkGetPackedA32(fColor) == 0xFF) |
- return kAlphaUnchanged_Flag | kHasFilter16_Flag; |
- else |
- return 0; |
- } |
- |
- virtual void filterSpan(const SkPMColor shader[], int count, SkPMColor result[]) |
- { |
- sk_memset32(result, fColor, count); |
- } |
- |
- virtual void filterSpan16(const uint16_t shader[], int count, uint16_t result[]) |
- { |
- SkASSERT(this->getFlags() & kHasFilter16_Flag); |
- |
- sk_memset16(result, SkPixel32ToPixel16(fColor), count); |
- } |
- |
-protected: |
- virtual Factory getFactory() { return CreateProc; } |
- |
- SkSrc_XfermodeColorFilter(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {} |
- |
-private: |
- static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) |
- { |
- return SkNEW_ARGS(SkSrc_XfermodeColorFilter, (buffer)); |
- } |
- |
- typedef Sk_XfermodeColorFilter INHERITED; |
-}; |
- |
-class SkSrcOver_XfermodeColorFilter : public Sk_XfermodeColorFilter { |
-public: |
- SkSrcOver_XfermodeColorFilter(SkColor color) : INHERITED(color) {} |
- |
- virtual uint32_t getFlags() |
- { |
- if (SkGetPackedA32(fColor) == 0xFF) |
- return kAlphaUnchanged_Flag | kHasFilter16_Flag; |
- else |
- return 0; |
- } |
- |
- virtual void filterSpan(const SkPMColor shader[], int count, SkPMColor result[]) |
- { |
- SkPMColor src = fColor; |
- unsigned scale = SkAlpha255To256(255 - SkGetPackedA32(src)); |
- |
- for (int i = 0; i < count; i++) |
- result[i] = src + SkAlphaMulQ(shader[i], scale); |
- } |
- |
- virtual void filterSpan16(const uint16_t shader[], int count, uint16_t result[]) |
- { |
- SkASSERT(this->getFlags() & kHasFilter16_Flag); |
- |
- sk_memset16(result, SkPixel32ToPixel16(fColor), count); |
- } |
- |
-protected: |
- virtual Factory getFactory() { return CreateProc; } |
- |
- SkSrcOver_XfermodeColorFilter(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {} |
- |
-private: |
- static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) |
- { |
- return SkNEW_ARGS(SkSrcOver_XfermodeColorFilter, (buffer)); |
- } |
- |
- typedef Sk_XfermodeColorFilter INHERITED; |
-}; |
- |
-////////////////////////////////////////////////////////////////////////////// |
- |
-class SkXfermodeColorFilter : public Sk_XfermodeColorFilter { |
-public: |
- SkXfermodeColorFilter(SkColor color, SkXfermodeProc proc, |
- SkXfermodeProc16 proc16) : INHERITED(color) |
- { |
- fProc = proc; |
- fProc16 = proc16; |
- } |
- |
- virtual uint32_t getFlags() |
- { |
- return fProc16 ? (kAlphaUnchanged_Flag | kHasFilter16_Flag) : 0; |
- } |
- |
- virtual void filterSpan(const SkPMColor shader[], int count, SkPMColor result[]) |
- { |
- SkPMColor color = fColor; |
- SkXfermodeProc proc = fProc; |
- |
- for (int i = 0; i < count; i++) |
- result[i] = proc(color, shader[i]); |
- } |
- |
- virtual void filterSpan16(const uint16_t shader[], int count, uint16_t result[]) |
- { |
- SkASSERT(this->getFlags() & kHasFilter16_Flag); |
- |
- SkPMColor color = fColor; |
- SkXfermodeProc16 proc16 = fProc16; |
- |
- for (int i = 0; i < count; i++) |
- result[i] = proc16(color, shader[i]); |
- } |
- |
-protected: |
- virtual void flatten(SkFlattenableWriteBuffer& buffer) { |
- this->INHERITED::flatten(buffer); |
- buffer.writeFunctionPtr((void*)fProc); |
- buffer.writeFunctionPtr((void*)fProc16); |
- } |
- |
- virtual Factory getFactory() { |
- return CreateProc; |
- } |
- |
- SkXfermodeColorFilter(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { |
- fProc = (SkXfermodeProc) buffer.readFunctionPtr(); |
- fProc16 = (SkXfermodeProc16) buffer.readFunctionPtr(); |
- } |
-private: |
- static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) { |
- return SkNEW_ARGS(SkXfermodeColorFilter, (buffer)); |
- } |
- |
- SkXfermodeProc fProc; |
- SkXfermodeProc16 fProc16; |
- |
- typedef Sk_XfermodeColorFilter INHERITED; |
-}; |
- |
-SkColorFilter* SkColorFilter::CreatXfermodeProcFilter(SkColor color, |
- SkXfermodeProc proc, |
- SkXfermodeProc16 proc16) |
-{ |
- return proc ? |
- SkNEW_ARGS(SkXfermodeColorFilter, (color, proc, proc16)) : |
- NULL; |
-} |
- |
-/////////////////////////////////////////////////////////////////////////////// |
- |
-SkColorFilter* SkColorFilter::CreatePorterDuffFilter(SkColor color, |
- SkPorterDuff::Mode mode) |
-{ |
- unsigned alpha = SkColorGetA(color); |
- |
- // first collaps some modes if possible |
- |
- if (SkPorterDuff::kClear_Mode == mode) |
- { |
- color = 0; |
- mode = SkPorterDuff::kSrc_Mode; |
- } |
- else if (SkPorterDuff::kSrcOver_Mode == mode) |
- { |
- if (0 == alpha) |
- { |
- mode = SkPorterDuff::kDst_Mode; |
- } |
- else if (255 == alpha) |
- { |
- mode = SkPorterDuff::kSrc_Mode; |
- } |
- // else just stay srcover |
- } |
- |
- // weed out combinations that are noops, and just return null |
- if (SkPorterDuff::kDst_Mode == mode || |
- (0 == alpha && (SkPorterDuff::kSrcOver_Mode == mode || |
- SkPorterDuff::kDstOver_Mode == mode || |
- SkPorterDuff::kDstOut_Mode == mode || |
- SkPorterDuff::kSrcATop_Mode == mode || |
- SkPorterDuff::kXor_Mode == mode || |
- SkPorterDuff::kDarken_Mode == mode)) || |
- (0xFF == alpha && SkPorterDuff::kDstIn_Mode == mode)) |
- { |
- return NULL; |
- } |
- |
- switch (mode) { |
- case SkPorterDuff::kSrc_Mode: |
- return SkNEW_ARGS(SkSrc_XfermodeColorFilter, (color)); |
- case SkPorterDuff::kSrcOver_Mode: |
- return SkNEW_ARGS(SkSrcOver_XfermodeColorFilter, (color)); |
- default: |
- return SkColorFilter::CreatXfermodeProcFilter(color, |
- SkPorterDuff::GetXfermodeProc(mode), |
- SkPorterDuff::GetXfermodeProc16(mode, color)); |
- } |
-} |
- |
-///////////////////////////////////////////////////////////////////////////////////////////////// |
- |
-static inline unsigned pin(unsigned value, unsigned max) |
-{ |
- if (value > max) |
- value = max; |
- return value; |
-} |
- |
-static inline unsigned SkUClampMax(unsigned value, unsigned max) |
-{ |
- SkASSERT((int32_t)value >= 0); |
- SkASSERT((int32_t)max >= 0); |
- |
- int diff = max - value; |
- // clear diff if diff is positive |
- diff &= diff >> 31; |
- |
- return value + diff; |
-} |
- |
-class SkLightingColorFilter : public SkColorFilter { |
-public: |
- SkLightingColorFilter(SkColor mul, SkColor add) : fMul(mul), fAdd(add) {} |
- |
- virtual void filterSpan(const SkPMColor shader[], int count, SkPMColor result[]) |
- { |
- unsigned scaleR = SkAlpha255To256(SkColorGetR(fMul)); |
- unsigned scaleG = SkAlpha255To256(SkColorGetG(fMul)); |
- unsigned scaleB = SkAlpha255To256(SkColorGetB(fMul)); |
- |
- unsigned addR = SkColorGetR(fAdd); |
- unsigned addG = SkColorGetG(fAdd); |
- unsigned addB = SkColorGetB(fAdd); |
- |
- for (int i = 0; i < count; i++) |
- { |
- SkPMColor c = shader[i]; |
- if (c) |
- { |
- unsigned a = SkGetPackedA32(c); |
- unsigned scaleA = SkAlpha255To256(a); |
- unsigned r = pin(SkAlphaMul(SkGetPackedR32(c), scaleR) + SkAlphaMul(addR, scaleA), a); |
- unsigned g = pin(SkAlphaMul(SkGetPackedG32(c), scaleG) + SkAlphaMul(addG, scaleA), a); |
- unsigned b = pin(SkAlphaMul(SkGetPackedB32(c), scaleB) + SkAlphaMul(addB, scaleA), a); |
- c = SkPackARGB32(a, r, g, b); |
- } |
- result[i] = c; |
- } |
- } |
- |
-protected: |
- virtual void flatten(SkFlattenableWriteBuffer& buffer) |
- { |
- buffer.write32(fMul); |
- buffer.write32(fAdd); |
- } |
- |
- virtual Factory getFactory() |
- { |
- return CreateProc; |
- } |
- |
- SkLightingColorFilter(SkFlattenableReadBuffer& buffer) |
- { |
- fMul = buffer.readU32(); |
- fAdd = buffer.readU32(); |
- } |
- |
- SkColor fMul, fAdd; |
- |
-private: |
- static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) |
- { |
- return SkNEW_ARGS(SkLightingColorFilter, (buffer)); |
- } |
-}; |
- |
-class SkLightingColorFilter_JustAdd : public SkLightingColorFilter { |
-public: |
- SkLightingColorFilter_JustAdd(SkColor mul, SkColor add) |
- : INHERITED(mul, add) {} |
- |
- virtual void filterSpan(const SkPMColor shader[], int count, SkPMColor result[]) |
- { |
- unsigned addR = SkColorGetR(fAdd); |
- unsigned addG = SkColorGetG(fAdd); |
- unsigned addB = SkColorGetB(fAdd); |
- |
- for (int i = 0; i < count; i++) |
- { |
- SkPMColor c = shader[i]; |
- if (c) |
- { |
- unsigned a = SkGetPackedA32(c); |
- unsigned scaleA = SkAlpha255To256(a); |
- unsigned r = pin(SkGetPackedR32(c) + SkAlphaMul(addR, scaleA), a); |
- unsigned g = pin(SkGetPackedG32(c) + SkAlphaMul(addG, scaleA), a); |
- unsigned b = pin(SkGetPackedB32(c) + SkAlphaMul(addB, scaleA), a); |
- c = SkPackARGB32(a, r, g, b); |
- } |
- result[i] = c; |
- } |
- } |
- |
-protected: |
- virtual Factory getFactory() { return CreateProc; } |
- |
- SkLightingColorFilter_JustAdd(SkFlattenableReadBuffer& buffer) |
- : INHERITED(buffer) {} |
- |
-private: |
- static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) |
- { |
- return SkNEW_ARGS(SkLightingColorFilter_JustAdd, (buffer)); |
- } |
- typedef SkLightingColorFilter INHERITED; |
-}; |
- |
-class SkLightingColorFilter_JustMul : public SkLightingColorFilter { |
-public: |
- SkLightingColorFilter_JustMul(SkColor mul, SkColor add) |
- : INHERITED(mul, add) {} |
- |
- virtual void filterSpan(const SkPMColor shader[], int count, SkPMColor result[]) |
- { |
- unsigned scaleR = SkAlpha255To256(SkColorGetR(fMul)); |
- unsigned scaleG = SkAlpha255To256(SkColorGetG(fMul)); |
- unsigned scaleB = SkAlpha255To256(SkColorGetB(fMul)); |
- |
- for (int i = 0; i < count; i++) |
- { |
- SkPMColor c = shader[i]; |
- if (c) |
- { |
- unsigned a = SkGetPackedA32(c); |
- unsigned r = SkAlphaMul(SkGetPackedR32(c), scaleR); |
- unsigned g = SkAlphaMul(SkGetPackedG32(c), scaleG); |
- unsigned b = SkAlphaMul(SkGetPackedB32(c), scaleB); |
- c = SkPackARGB32(a, r, g, b); |
- } |
- result[i] = c; |
- } |
- } |
- |
-protected: |
- virtual Factory getFactory() { return CreateProc; } |
- |
- SkLightingColorFilter_JustMul(SkFlattenableReadBuffer& buffer) |
- : INHERITED(buffer) {} |
- |
-private: |
- static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) |
- { |
- return SkNEW_ARGS(SkLightingColorFilter_JustMul, (buffer)); |
- } |
- |
- typedef SkLightingColorFilter INHERITED; |
-}; |
- |
-class SkLightingColorFilter_SingleMul : public SkLightingColorFilter { |
-public: |
- SkLightingColorFilter_SingleMul(SkColor mul, SkColor add) |
- : INHERITED(mul, add) |
- { |
- SkASSERT(SkColorGetR(add) == 0); |
- SkASSERT(SkColorGetG(add) == 0); |
- SkASSERT(SkColorGetB(add) == 0); |
- SkASSERT(SkColorGetR(mul) == SkColorGetG(mul)); |
- SkASSERT(SkColorGetR(mul) == SkColorGetB(mul)); |
- } |
- |
- virtual uint32_t getFlags() |
- { |
- return this->INHERITED::getFlags() | (kAlphaUnchanged_Flag | kHasFilter16_Flag); |
- } |
- |
- virtual void filterSpan16(const uint16_t shader[], int count, uint16_t result[]) |
- { |
- // all mul components are the same |
- unsigned scale = SkAlpha255To256(SkColorGetR(fMul)); |
- |
- if (count > 0) |
- do { |
- *result++ = SkAlphaMulRGB16(*shader++, scale); |
- } while (--count > 0); |
- } |
- |
-protected: |
- virtual Factory getFactory() { return CreateProc; } |
- |
- SkLightingColorFilter_SingleMul(SkFlattenableReadBuffer& buffer) |
- : INHERITED(buffer) {} |
- |
-private: |
- static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) |
- { |
- return SkNEW_ARGS(SkLightingColorFilter_SingleMul, (buffer)); |
- } |
- |
- typedef SkLightingColorFilter INHERITED; |
-}; |
- |
-class SkLightingColorFilter_NoPin : public SkLightingColorFilter { |
-public: |
- SkLightingColorFilter_NoPin(SkColor mul, SkColor add) |
- : INHERITED(mul, add) {} |
- |
- virtual void filterSpan(const SkPMColor shader[], int count, SkPMColor result[]) |
- { |
- unsigned scaleR = SkAlpha255To256(SkColorGetR(fMul)); |
- unsigned scaleG = SkAlpha255To256(SkColorGetG(fMul)); |
- unsigned scaleB = SkAlpha255To256(SkColorGetB(fMul)); |
- |
- unsigned addR = SkColorGetR(fAdd); |
- unsigned addG = SkColorGetG(fAdd); |
- unsigned addB = SkColorGetB(fAdd); |
- |
- for (int i = 0; i < count; i++) |
- { |
- SkPMColor c = shader[i]; |
- if (c) |
- { |
- unsigned a = SkGetPackedA32(c); |
- unsigned scaleA = SkAlpha255To256(a); |
- unsigned r = SkAlphaMul(SkGetPackedR32(c), scaleR) + SkAlphaMul(addR, scaleA); |
- unsigned g = SkAlphaMul(SkGetPackedG32(c), scaleG) + SkAlphaMul(addG, scaleA); |
- unsigned b = SkAlphaMul(SkGetPackedB32(c), scaleB) + SkAlphaMul(addB, scaleA); |
- c = SkPackARGB32(a, r, g, b); |
- } |
- result[i] = c; |
- } |
- } |
- |
-protected: |
- virtual Factory getFactory() { return CreateProc; } |
- |
- SkLightingColorFilter_NoPin(SkFlattenableReadBuffer& buffer) |
- : INHERITED(buffer) {} |
- |
-private: |
- static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) |
- { |
- return SkNEW_ARGS(SkLightingColorFilter_NoPin, (buffer)); |
- } |
- |
- typedef SkLightingColorFilter INHERITED; |
-}; |
- |
-////////////////////////////////////////////////////////////////////////////////////// |
- |
-class SkSimpleColorFilter : public SkColorFilter { |
-protected: |
- void filterSpan(const SkPMColor src[], int count, SkPMColor result[]) |
- { |
- if (result != src) |
- memcpy(result, src, count * sizeof(SkPMColor)); |
- } |
- |
- virtual void flatten(SkFlattenableWriteBuffer& buffer) |
- { |
- } |
- |
- virtual Factory getFactory() |
- { |
- return CreateProc; |
- } |
- |
- static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) |
- { |
- return SkNEW(SkSimpleColorFilter); |
- } |
-}; |
- |
-SkColorFilter* SkColorFilter::CreateLightingFilter(SkColor mul, SkColor add) |
-{ |
- mul &= 0x00FFFFFF; |
- add &= 0x00FFFFFF; |
- |
- if (0xFFFFFF == mul) |
- { |
- if (0 == add) |
- return SkNEW(SkSimpleColorFilter); // no change to the colors |
- else |
- return SkNEW_ARGS(SkLightingColorFilter_JustAdd, (mul, add)); |
- } |
- |
- if (0 == add) |
- { |
- if (SkColorGetR(mul) == SkColorGetG(mul) && |
- SkColorGetR(mul) == SkColorGetB(mul)) |
- { |
- return SkNEW_ARGS(SkLightingColorFilter_SingleMul, (mul, add)); |
- } |
- else |
- { |
- return SkNEW_ARGS(SkLightingColorFilter_JustMul, (mul, add)); |
- } |
- } |
- |
- if (SkColorGetR(mul) + SkColorGetR(add) <= 255 && |
- SkColorGetG(mul) + SkColorGetG(add) <= 255 && |
- SkColorGetB(mul) + SkColorGetB(add) <= 255) |
- return SkNEW_ARGS(SkLightingColorFilter_NoPin, (mul, add)); |
- |
- return SkNEW_ARGS(SkLightingColorFilter, (mul, add)); |
-} |
- |