From ed1ce37759fe1312d590e7ed46f1eb65a8a38ac2 Mon Sep 17 00:00:00 2001 From: Leon Scroggins III Date: Fri, 30 Jan 2015 09:05:11 -0500 Subject: AvoidXferMode -> AvoidXfermode. When I moved this code here from external/skia, I accidentally changed the lowercase 'm' to uppercase 'M'. Change back, to keep consistent with SkXfermode and Xfermode.cpp. Change-Id: I9694d29a22aaed7fcc8708f5962e3d2032297d08 --- core/jni/Android.mk | 2 +- core/jni/android/graphics/AvoidXferMode.cpp | 177 ---------------------------- core/jni/android/graphics/AvoidXferMode.h | 70 ----------- core/jni/android/graphics/AvoidXfermode.cpp | 177 ++++++++++++++++++++++++++++ core/jni/android/graphics/AvoidXfermode.h | 70 +++++++++++ core/jni/android/graphics/Xfermode.cpp | 6 +- 6 files changed, 251 insertions(+), 251 deletions(-) delete mode 100644 core/jni/android/graphics/AvoidXferMode.cpp delete mode 100644 core/jni/android/graphics/AvoidXferMode.h create mode 100644 core/jni/android/graphics/AvoidXfermode.cpp create mode 100644 core/jni/android/graphics/AvoidXfermode.h diff --git a/core/jni/Android.mk b/core/jni/Android.mk index f41cd15a5f6d..1dd10e18796e 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -87,7 +87,7 @@ LOCAL_SRC_FILES:= \ android_graphics_Canvas.cpp \ android_graphics_Picture.cpp \ android/graphics/AutoDecodeCancel.cpp \ - android/graphics/AvoidXferMode.cpp \ + android/graphics/AvoidXfermode.cpp \ android/graphics/Bitmap.cpp \ android/graphics/BitmapFactory.cpp \ android/graphics/Camera.cpp \ diff --git a/core/jni/android/graphics/AvoidXferMode.cpp b/core/jni/android/graphics/AvoidXferMode.cpp deleted file mode 100644 index 89c1006ceab4..000000000000 --- a/core/jni/android/graphics/AvoidXferMode.cpp +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright 2006 The Android Open Source Project - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -#include "AvoidXferMode.h" -#include "SkColorPriv.h" -#include "SkReadBuffer.h" -#include "SkWriteBuffer.h" -#include "SkString.h" - -AvoidXferMode::AvoidXferMode(SkColor opColor, U8CPU tolerance, Mode mode) { - if (tolerance > 255) { - tolerance = 255; - } - fTolerance = SkToU8(tolerance); - fOpColor = opColor; - fDistMul = (256 << 14) / (tolerance + 1); - fMode = mode; -} - -SkFlattenable* AvoidXferMode::CreateProc(SkReadBuffer& buffer) { - const SkColor color = buffer.readColor(); - const unsigned tolerance = buffer.readUInt(); - const unsigned mode = buffer.readUInt(); - return Create(color, tolerance, (Mode)mode); -} - -void AvoidXferMode::flatten(SkWriteBuffer& buffer) const { - buffer.writeColor(fOpColor); - buffer.writeUInt(fTolerance); - buffer.writeUInt(fMode); -} - -// returns 0..31 -static unsigned color_dist16(uint16_t c, unsigned r, unsigned g, unsigned b) { - SkASSERT(r <= SK_R16_MASK); - SkASSERT(g <= SK_G16_MASK); - SkASSERT(b <= SK_B16_MASK); - - unsigned dr = SkAbs32(SkGetPackedR16(c) - r); - unsigned dg = SkAbs32(SkGetPackedG16(c) - g) >> (SK_G16_BITS - SK_R16_BITS); - unsigned db = SkAbs32(SkGetPackedB16(c) - b); - - return SkMax32(dr, SkMax32(dg, db)); -} - -// returns 0..255 -static unsigned color_dist32(SkPMColor c, U8CPU r, U8CPU g, U8CPU b) { - SkASSERT(r <= 0xFF); - SkASSERT(g <= 0xFF); - SkASSERT(b <= 0xFF); - - unsigned dr = SkAbs32(SkGetPackedR32(c) - r); - unsigned dg = SkAbs32(SkGetPackedG32(c) - g); - unsigned db = SkAbs32(SkGetPackedB32(c) - b); - - return SkMax32(dr, SkMax32(dg, db)); -} - -static int scale_dist_14(int dist, uint32_t mul, uint32_t sub) { - int tmp = dist * mul - sub; - int result = (tmp + (1 << 13)) >> 14; - - return result; -} - -static inline unsigned Accurate255To256(unsigned x) { - return x + (x >> 7); -} - -void AvoidXferMode::xfer32(SkPMColor dst[], const SkPMColor src[], int count, - const SkAlpha aa[]) const { - unsigned opR = SkColorGetR(fOpColor); - unsigned opG = SkColorGetG(fOpColor); - unsigned opB = SkColorGetB(fOpColor); - uint32_t mul = fDistMul; - uint32_t sub = (fDistMul - (1 << 14)) << 8; - - int MAX, mask; - - if (kTargetColor_Mode == fMode) { - mask = -1; - MAX = 255; - } else { - mask = 0; - MAX = 0; - } - - for (int i = 0; i < count; i++) { - int d = color_dist32(dst[i], opR, opG, opB); - // now reverse d if we need to - d = MAX + (d ^ mask) - mask; - SkASSERT((unsigned)d <= 255); - d = Accurate255To256(d); - - d = scale_dist_14(d, mul, sub); - SkASSERT(d <= 256); - - if (d > 0) { - if (aa) { - d = SkAlphaMul(d, Accurate255To256(*aa++)); - if (0 == d) { - continue; - } - } - dst[i] = SkFourByteInterp256(src[i], dst[i], d); - } - } -} - -static inline U16CPU SkBlend3216(SkPMColor src, U16CPU dst, unsigned scale) { - SkASSERT(scale <= 32); - scale <<= 3; - - return SkPackRGB16( SkAlphaBlend(SkPacked32ToR16(src), SkGetPackedR16(dst), scale), - SkAlphaBlend(SkPacked32ToG16(src), SkGetPackedG16(dst), scale), - SkAlphaBlend(SkPacked32ToB16(src), SkGetPackedB16(dst), scale)); -} - -void AvoidXferMode::xfer16(uint16_t dst[], const SkPMColor src[], int count, - const SkAlpha aa[]) const { - unsigned opR = SkColorGetR(fOpColor) >> (8 - SK_R16_BITS); - unsigned opG = SkColorGetG(fOpColor) >> (8 - SK_G16_BITS); - unsigned opB = SkColorGetB(fOpColor) >> (8 - SK_R16_BITS); - uint32_t mul = fDistMul; - uint32_t sub = (fDistMul - (1 << 14)) << SK_R16_BITS; - - int MAX, mask; - - if (kTargetColor_Mode == fMode) { - mask = -1; - MAX = 31; - } else { - mask = 0; - MAX = 0; - } - - for (int i = 0; i < count; i++) { - int d = color_dist16(dst[i], opR, opG, opB); - // now reverse d if we need to - d = MAX + (d ^ mask) - mask; - SkASSERT((unsigned)d <= 31); - // convert from 0..31 to 0..32 - d += d >> 4; - d = scale_dist_14(d, mul, sub); - SkASSERT(d <= 32); - - if (d > 0) { - if (aa) { - d = SkAlphaMul(d, Accurate255To256(*aa++)); - if (0 == d) { - continue; - } - } - dst[i] = SkBlend3216(src[i], dst[i], d); - } - } -} - -void AvoidXferMode::xferA8(SkAlpha dst[], const SkPMColor src[], int count, - const SkAlpha aa[]) const { -} - -#ifndef SK_IGNORE_TO_STRING -void AvoidXferMode::toString(SkString* str) const { - str->append("AvoidXferMode: opColor: "); - str->appendHex(fOpColor); - str->appendf("distMul: %d ", fDistMul); - - static const char* gModeStrings[] = { "Avoid", "Target" }; - - str->appendf("mode: %s", gModeStrings[fMode]); -} -#endif diff --git a/core/jni/android/graphics/AvoidXferMode.h b/core/jni/android/graphics/AvoidXferMode.h deleted file mode 100644 index 6e45c0a7c4cd..000000000000 --- a/core/jni/android/graphics/AvoidXferMode.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2006 The Android Open Source Project - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -#ifndef AvoidXferMode_DEFINED -#define AvoidXferMode_DEFINED - -#include "SkColor.h" -#include "SkTypes.h" -#include "SkXfermode.h" - -/** \class AvoidXferMode - - This xfermode will draw the src everywhere except on top of the specified - color. -*/ -class AvoidXferMode : public SkXfermode { -public: - enum Mode { - kAvoidColor_Mode, //!< draw everywhere except on the opColor - kTargetColor_Mode //!< draw only on top of the opColor - }; - - /** This xfermode draws, or doesn't draw, based on the destination's - distance from an op-color. - - There are two modes, and each mode interprets a tolerance value. - - Avoid: In this mode, drawing is allowed only on destination pixels that - are different from the op-color. - Tolerance near 0: avoid any colors even remotely similar to the op-color - Tolerance near 255: avoid only colors nearly identical to the op-color - - Target: In this mode, drawing only occurs on destination pixels that - are similar to the op-color - Tolerance near 0: draw only on colors that are nearly identical to the op-color - Tolerance near 255: draw on any colors even remotely similar to the op-color - */ - static AvoidXferMode* Create(SkColor opColor, U8CPU tolerance, Mode mode) { - return SkNEW_ARGS(AvoidXferMode, (opColor, tolerance, mode)); - } - - // overrides from SkXfermode - void xfer32(SkPMColor dst[], const SkPMColor src[], int count, - const SkAlpha aa[]) const override; - void xfer16(uint16_t dst[], const SkPMColor src[], int count, - const SkAlpha aa[]) const override; - void xferA8(SkAlpha dst[], const SkPMColor src[], int count, - const SkAlpha aa[]) const override; - - SK_TO_STRING_OVERRIDE() - SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(AvoidXferMode) - -protected: - AvoidXferMode(SkColor opColor, U8CPU tolerance, Mode mode); - void flatten(SkWriteBuffer&) const override; - -private: - SkColor fOpColor; - uint32_t fDistMul; // x.14 cached from fTolerance - uint8_t fTolerance; - Mode fMode; - - typedef SkXfermode INHERITED; -}; - -#endif diff --git a/core/jni/android/graphics/AvoidXfermode.cpp b/core/jni/android/graphics/AvoidXfermode.cpp new file mode 100644 index 000000000000..9ca1f26e3ab0 --- /dev/null +++ b/core/jni/android/graphics/AvoidXfermode.cpp @@ -0,0 +1,177 @@ +/* + * Copyright 2006 The Android Open Source Project + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "AvoidXfermode.h" +#include "SkColorPriv.h" +#include "SkReadBuffer.h" +#include "SkWriteBuffer.h" +#include "SkString.h" + +AvoidXfermode::AvoidXfermode(SkColor opColor, U8CPU tolerance, Mode mode) { + if (tolerance > 255) { + tolerance = 255; + } + fTolerance = SkToU8(tolerance); + fOpColor = opColor; + fDistMul = (256 << 14) / (tolerance + 1); + fMode = mode; +} + +SkFlattenable* AvoidXfermode::CreateProc(SkReadBuffer& buffer) { + const SkColor color = buffer.readColor(); + const unsigned tolerance = buffer.readUInt(); + const unsigned mode = buffer.readUInt(); + return Create(color, tolerance, (Mode)mode); +} + +void AvoidXfermode::flatten(SkWriteBuffer& buffer) const { + buffer.writeColor(fOpColor); + buffer.writeUInt(fTolerance); + buffer.writeUInt(fMode); +} + +// returns 0..31 +static unsigned color_dist16(uint16_t c, unsigned r, unsigned g, unsigned b) { + SkASSERT(r <= SK_R16_MASK); + SkASSERT(g <= SK_G16_MASK); + SkASSERT(b <= SK_B16_MASK); + + unsigned dr = SkAbs32(SkGetPackedR16(c) - r); + unsigned dg = SkAbs32(SkGetPackedG16(c) - g) >> (SK_G16_BITS - SK_R16_BITS); + unsigned db = SkAbs32(SkGetPackedB16(c) - b); + + return SkMax32(dr, SkMax32(dg, db)); +} + +// returns 0..255 +static unsigned color_dist32(SkPMColor c, U8CPU r, U8CPU g, U8CPU b) { + SkASSERT(r <= 0xFF); + SkASSERT(g <= 0xFF); + SkASSERT(b <= 0xFF); + + unsigned dr = SkAbs32(SkGetPackedR32(c) - r); + unsigned dg = SkAbs32(SkGetPackedG32(c) - g); + unsigned db = SkAbs32(SkGetPackedB32(c) - b); + + return SkMax32(dr, SkMax32(dg, db)); +} + +static int scale_dist_14(int dist, uint32_t mul, uint32_t sub) { + int tmp = dist * mul - sub; + int result = (tmp + (1 << 13)) >> 14; + + return result; +} + +static inline unsigned Accurate255To256(unsigned x) { + return x + (x >> 7); +} + +void AvoidXfermode::xfer32(SkPMColor dst[], const SkPMColor src[], int count, + const SkAlpha aa[]) const { + unsigned opR = SkColorGetR(fOpColor); + unsigned opG = SkColorGetG(fOpColor); + unsigned opB = SkColorGetB(fOpColor); + uint32_t mul = fDistMul; + uint32_t sub = (fDistMul - (1 << 14)) << 8; + + int MAX, mask; + + if (kTargetColor_Mode == fMode) { + mask = -1; + MAX = 255; + } else { + mask = 0; + MAX = 0; + } + + for (int i = 0; i < count; i++) { + int d = color_dist32(dst[i], opR, opG, opB); + // now reverse d if we need to + d = MAX + (d ^ mask) - mask; + SkASSERT((unsigned)d <= 255); + d = Accurate255To256(d); + + d = scale_dist_14(d, mul, sub); + SkASSERT(d <= 256); + + if (d > 0) { + if (aa) { + d = SkAlphaMul(d, Accurate255To256(*aa++)); + if (0 == d) { + continue; + } + } + dst[i] = SkFourByteInterp256(src[i], dst[i], d); + } + } +} + +static inline U16CPU SkBlend3216(SkPMColor src, U16CPU dst, unsigned scale) { + SkASSERT(scale <= 32); + scale <<= 3; + + return SkPackRGB16( SkAlphaBlend(SkPacked32ToR16(src), SkGetPackedR16(dst), scale), + SkAlphaBlend(SkPacked32ToG16(src), SkGetPackedG16(dst), scale), + SkAlphaBlend(SkPacked32ToB16(src), SkGetPackedB16(dst), scale)); +} + +void AvoidXfermode::xfer16(uint16_t dst[], const SkPMColor src[], int count, + const SkAlpha aa[]) const { + unsigned opR = SkColorGetR(fOpColor) >> (8 - SK_R16_BITS); + unsigned opG = SkColorGetG(fOpColor) >> (8 - SK_G16_BITS); + unsigned opB = SkColorGetB(fOpColor) >> (8 - SK_R16_BITS); + uint32_t mul = fDistMul; + uint32_t sub = (fDistMul - (1 << 14)) << SK_R16_BITS; + + int MAX, mask; + + if (kTargetColor_Mode == fMode) { + mask = -1; + MAX = 31; + } else { + mask = 0; + MAX = 0; + } + + for (int i = 0; i < count; i++) { + int d = color_dist16(dst[i], opR, opG, opB); + // now reverse d if we need to + d = MAX + (d ^ mask) - mask; + SkASSERT((unsigned)d <= 31); + // convert from 0..31 to 0..32 + d += d >> 4; + d = scale_dist_14(d, mul, sub); + SkASSERT(d <= 32); + + if (d > 0) { + if (aa) { + d = SkAlphaMul(d, Accurate255To256(*aa++)); + if (0 == d) { + continue; + } + } + dst[i] = SkBlend3216(src[i], dst[i], d); + } + } +} + +void AvoidXfermode::xferA8(SkAlpha dst[], const SkPMColor src[], int count, + const SkAlpha aa[]) const { +} + +#ifndef SK_IGNORE_TO_STRING +void AvoidXfermode::toString(SkString* str) const { + str->append("AvoidXfermode: opColor: "); + str->appendHex(fOpColor); + str->appendf("distMul: %d ", fDistMul); + + static const char* gModeStrings[] = { "Avoid", "Target" }; + + str->appendf("mode: %s", gModeStrings[fMode]); +} +#endif diff --git a/core/jni/android/graphics/AvoidXfermode.h b/core/jni/android/graphics/AvoidXfermode.h new file mode 100644 index 000000000000..318d7be91974 --- /dev/null +++ b/core/jni/android/graphics/AvoidXfermode.h @@ -0,0 +1,70 @@ +/* + * Copyright 2006 The Android Open Source Project + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef AvoidXfermode_DEFINED +#define AvoidXfermode_DEFINED + +#include "SkColor.h" +#include "SkTypes.h" +#include "SkXfermode.h" + +/** \class AvoidXfermode + + This xfermode will draw the src everywhere except on top of the specified + color. +*/ +class AvoidXfermode : public SkXfermode { +public: + enum Mode { + kAvoidColor_Mode, //!< draw everywhere except on the opColor + kTargetColor_Mode //!< draw only on top of the opColor + }; + + /** This xfermode draws, or doesn't draw, based on the destination's + distance from an op-color. + + There are two modes, and each mode interprets a tolerance value. + + Avoid: In this mode, drawing is allowed only on destination pixels that + are different from the op-color. + Tolerance near 0: avoid any colors even remotely similar to the op-color + Tolerance near 255: avoid only colors nearly identical to the op-color + + Target: In this mode, drawing only occurs on destination pixels that + are similar to the op-color + Tolerance near 0: draw only on colors that are nearly identical to the op-color + Tolerance near 255: draw on any colors even remotely similar to the op-color + */ + static AvoidXfermode* Create(SkColor opColor, U8CPU tolerance, Mode mode) { + return SkNEW_ARGS(AvoidXfermode, (opColor, tolerance, mode)); + } + + // overrides from SkXfermode + void xfer32(SkPMColor dst[], const SkPMColor src[], int count, + const SkAlpha aa[]) const override; + void xfer16(uint16_t dst[], const SkPMColor src[], int count, + const SkAlpha aa[]) const override; + void xferA8(SkAlpha dst[], const SkPMColor src[], int count, + const SkAlpha aa[]) const override; + + SK_TO_STRING_OVERRIDE() + SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(AvoidXfermode) + +protected: + AvoidXfermode(SkColor opColor, U8CPU tolerance, Mode mode); + void flatten(SkWriteBuffer&) const override; + +private: + SkColor fOpColor; + uint32_t fDistMul; // x.14 cached from fTolerance + uint8_t fTolerance; + Mode fMode; + + typedef SkXfermode INHERITED; +}; + +#endif diff --git a/core/jni/android/graphics/Xfermode.cpp b/core/jni/android/graphics/Xfermode.cpp index e3efc52403ef..4a424aeb09a3 100644 --- a/core/jni/android/graphics/Xfermode.cpp +++ b/core/jni/android/graphics/Xfermode.cpp @@ -18,7 +18,7 @@ #include "GraphicsJNI.h" #include "core_jni_helpers.h" -#include "AvoidXferMode.h" +#include "AvoidXfermode.h" #include "SkPixelXorXfermode.h" namespace android { @@ -35,8 +35,8 @@ public: static jlong avoid_create(JNIEnv* env, jobject, jint opColor, jint tolerance, jint modeHandle) { - AvoidXferMode::Mode mode = static_cast(modeHandle); - return reinterpret_cast(AvoidXferMode::Create(opColor, tolerance, mode)); + AvoidXfermode::Mode mode = static_cast(modeHandle); + return reinterpret_cast(AvoidXfermode::Create(opColor, tolerance, mode)); } static jlong pixelxor_create(JNIEnv* env, jobject, jint opColor) -- cgit v1.2.3-59-g8ed1b