summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/skia/src/effects/SkColorFilters.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/skia/src/effects/SkColorFilters.cpp')
-rw-r--r--chromium/third_party/skia/src/effects/SkColorFilters.cpp335
1 files changed, 26 insertions, 309 deletions
diff --git a/chromium/third_party/skia/src/effects/SkColorFilters.cpp b/chromium/third_party/skia/src/effects/SkColorFilters.cpp
index d482a09d1f8..81d70a7ff9f 100644
--- a/chromium/third_party/skia/src/effects/SkColorFilters.cpp
+++ b/chromium/third_party/skia/src/effects/SkColorFilters.cpp
@@ -1,4 +1,3 @@
-
/*
* Copyright 2006 The Android Open Source Project
*
@@ -6,14 +5,15 @@
* found in the LICENSE file.
*/
-
#include "SkBlitRow.h"
#include "SkColorFilter.h"
#include "SkColorPriv.h"
-#include "SkFlattenableBuffers.h"
+#include "SkReadBuffer.h"
+#include "SkWriteBuffer.h"
#include "SkUtils.h"
#include "SkString.h"
#include "SkValidationUtils.h"
+#include "SkColorMatrixFilter.h"
#define ILLEGAL_XFERMODE_MODE ((SkXfermode::Mode)-1)
@@ -77,7 +77,7 @@ public:
}
}
-#ifdef SK_DEVELOPER
+#ifndef SK_IGNORE_TO_STRING
virtual void toString(SkString* str) const SK_OVERRIDE {
str->append("SkModeColorFilter: color: 0x");
str->appendHex(fColor);
@@ -92,13 +92,13 @@ public:
SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkModeColorFilter)
protected:
- virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE {
+ virtual void flatten(SkWriteBuffer& buffer) const SK_OVERRIDE {
this->INHERITED::flatten(buffer);
buffer.writeColor(fColor);
buffer.writeUInt(fMode);
}
- SkModeColorFilter(SkFlattenableReadBuffer& buffer) {
+ SkModeColorFilter(SkReadBuffer& buffer) {
fColor = buffer.readColor();
fMode = (SkXfermode::Mode)buffer.readUInt();
if (buffer.isValid()) {
@@ -145,7 +145,7 @@ static inline ColorExpr blend_term(SkXfermode::Coeff coeff,
const ColorExpr& value) {
switch (coeff) {
default:
- GrCrash("Unexpected xfer coeff.");
+ SkFAIL("Unexpected xfer coeff.");
case SkXfermode::kZero_Coeff: /** 0 */
return ColorExpr(0);
case SkXfermode::kOne_Coeff: /** 1 */
@@ -305,7 +305,7 @@ namespace {
* to which direction the 0.5 goes.
*/
static inline int color_component_to_int(float value) {
- return sk_float_round2int(GrMax(0.f, GrMin(1.f, value)) * 255.f);
+ return sk_float_round2int(SkTMax(0.f, SkTMin(1.f, value)) * 255.f);
}
/** MaskedColorExpr is used to evaluate the color and valid color component flags through the
@@ -446,7 +446,7 @@ public:
SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(Src_SkModeColorFilter)
protected:
- Src_SkModeColorFilter(SkFlattenableReadBuffer& buffer)
+ Src_SkModeColorFilter(SkReadBuffer& buffer)
: INHERITED(buffer) {}
private:
@@ -482,7 +482,7 @@ public:
SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SrcOver_SkModeColorFilter)
protected:
- SrcOver_SkModeColorFilter(SkFlattenableReadBuffer& buffer)
+ SrcOver_SkModeColorFilter(SkReadBuffer& buffer)
: INHERITED(buffer) {
fColor32Proc = SkBlitRow::ColorProcFactory();
}
@@ -538,313 +538,30 @@ SkColorFilter* SkColorFilter::CreateModeFilter(SkColor color,
///////////////////////////////////////////////////////////////////////////////
-static inline unsigned pin(unsigned value, unsigned max) {
- if (value > max) {
- value = max;
+static SkScalar byte_to_scale(U8CPU byte) {
+ if (0xFF == byte) {
+ // want to get this exact
+ return 1;
+ } else {
+ return byte * 0.00392156862745f;
}
- return value;
}
-class SkLightingColorFilter : public SkColorFilter {
-public:
- SkLightingColorFilter(SkColor mul, SkColor add) : fMul(mul), fAdd(add) {}
-
- virtual void filterSpan(const SkPMColor shader[], int count,
- SkPMColor result[]) const SK_OVERRIDE {
- 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;
- }
- }
-
-#ifdef SK_DEVELOPER
- virtual void toString(SkString* str) const SK_OVERRIDE {
- str->append("SkLightingColorFilter: mul: 0x");
- str->appendHex(fMul);
- str->append(" add: 0x");
- str->appendHex(fAdd);
- }
-#endif
-
- SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLightingColorFilter)
-
-protected:
- virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE {
- this->INHERITED::flatten(buffer);
- buffer.writeColor(fMul);
- buffer.writeColor(fAdd);
- }
-
- SkLightingColorFilter(SkFlattenableReadBuffer& buffer) {
- fMul = buffer.readColor();
- fAdd = buffer.readColor();
- }
-
- SkColor fMul, fAdd;
-
-private:
- typedef SkColorFilter INHERITED;
-};
-
-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[]) const SK_OVERRIDE {
- 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;
- }
- }
-
-#ifdef SK_DEVELOPER
- virtual void toString(SkString* str) const SK_OVERRIDE {
- str->append("SkLightingColorFilter_JustAdd: add: 0x");
- str->appendHex(fAdd);
- }
-#endif
-
- SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLightingColorFilter_JustAdd)
-
-protected:
- SkLightingColorFilter_JustAdd(SkFlattenableReadBuffer& buffer)
- : INHERITED(buffer) {}
-
-private:
- 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[]) const SK_OVERRIDE {
- 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;
- }
- }
-
-#ifdef SK_DEVELOPER
- virtual void toString(SkString* str) const SK_OVERRIDE {
- str->append("SkLightingColorFilter_JustMul: mul: 0x");
- str->appendHex(fMul);
- }
-#endif
-
- SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLightingColorFilter_JustMul)
-
-protected:
- SkLightingColorFilter_JustMul(SkFlattenableReadBuffer& buffer)
- : INHERITED(buffer) {}
-
-private:
- 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() const SK_OVERRIDE {
- return this->INHERITED::getFlags() | (kAlphaUnchanged_Flag | kHasFilter16_Flag);
- }
-
- virtual void filterSpan16(const uint16_t shader[], int count,
- uint16_t result[]) const SK_OVERRIDE {
- // all mul components are the same
- unsigned scale = SkAlpha255To256(SkColorGetR(fMul));
-
- if (count > 0) {
- do {
- *result++ = SkAlphaMulRGB16(*shader++, scale);
- } while (--count > 0);
- }
- }
-
-#ifdef SK_DEVELOPER
- virtual void toString(SkString* str) const SK_OVERRIDE {
- str->append("SkLightingColorFilter_SingleMul: mul: 0x");
- str->appendHex(fMul);
- }
-#endif
-
- SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLightingColorFilter_SingleMul)
-
-protected:
- SkLightingColorFilter_SingleMul(SkFlattenableReadBuffer& buffer)
- : INHERITED(buffer) {}
-
-private:
- 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[]) const SK_OVERRIDE {
- 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;
- }
- }
-
-#ifdef SK_DEVELOPER
- virtual void toString(SkString* str) const SK_OVERRIDE {
- str->append("SkLightingColorFilter_NoPin: mul: 0x");
- str->appendHex(fMul);
- str->append(" add: 0x");
- str->appendHex(fAdd);
- }
-#endif
-
- SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLightingColorFilter_NoPin)
-
-protected:
- SkLightingColorFilter_NoPin(SkFlattenableReadBuffer& buffer)
- : INHERITED(buffer) {}
-
-private:
- typedef SkLightingColorFilter INHERITED;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-
-class SkSimpleColorFilter : public SkColorFilter {
-public:
- static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
- return SkNEW(SkSimpleColorFilter);
- }
-
-#ifdef SK_DEVELOPER
- virtual void toString(SkString* str) const SK_OVERRIDE {
- str->append("SkSimpleColorFilter");
- }
-#endif
-
-protected:
- void filterSpan(const SkPMColor src[], int count, SkPMColor
- result[]) const SK_OVERRIDE {
- if (result != src) {
- memcpy(result, src, count * sizeof(SkPMColor));
- }
- }
-
- virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE {}
-
- virtual Factory getFactory() const {
- return CreateProc;
- }
-
-};
-
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));
+ SkColorMatrix matrix;
+ matrix.setScale(byte_to_scale(SkColorGetR(mul)),
+ byte_to_scale(SkColorGetG(mul)),
+ byte_to_scale(SkColorGetB(mul)),
+ 1);
+ matrix.postTranslate(SkIntToScalar(SkColorGetR(add)),
+ SkIntToScalar(SkColorGetG(add)),
+ SkIntToScalar(SkColorGetB(add)),
+ 0);
+ return SkColorMatrixFilter::Create(matrix);
}
SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkColorFilter)
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkModeColorFilter)
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(Src_SkModeColorFilter)
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SrcOver_SkModeColorFilter)
- SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLightingColorFilter)
- SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLightingColorFilter_JustAdd)
- SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLightingColorFilter_JustMul)
- SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLightingColorFilter_SingleMul)
- SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLightingColorFilter_NoPin)
- SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSimpleColorFilter)
SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END