epoger@google.com | ec3ed6a | 2011-07-28 14:26:00 +0000 | [diff] [blame] | 1 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 2 | /* |
epoger@google.com | ec3ed6a | 2011-07-28 14:26:00 +0000 | [diff] [blame] | 3 | * Copyright 2006 The Android Open Source Project |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 4 | * |
epoger@google.com | ec3ed6a | 2011-07-28 14:26:00 +0000 | [diff] [blame] | 5 | * Use of this source code is governed by a BSD-style license that can be |
| 6 | * found in the LICENSE file. |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 7 | */ |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 8 | |
epoger@google.com | ec3ed6a | 2011-07-28 14:26:00 +0000 | [diff] [blame] | 9 | |
reed@android.com | c4cae85 | 2009-09-23 15:06:10 +0000 | [diff] [blame] | 10 | #include "SkBlitRow.h" |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 11 | #include "SkColorFilter.h" |
| 12 | #include "SkColorPriv.h" |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 13 | #include "SkUtils.h" |
| 14 | |
reed@google.com | 43c50c8 | 2011-04-14 15:50:52 +0000 | [diff] [blame] | 15 | #define ILLEGAL_XFERMODE_MODE ((SkXfermode::Mode)-1) |
| 16 | |
| 17 | // baseclass for filters that store a color and mode |
| 18 | class SkModeColorFilter : public SkColorFilter { |
| 19 | public: |
| 20 | SkModeColorFilter(SkColor color) { |
| 21 | fColor = color; |
| 22 | fMode = ILLEGAL_XFERMODE_MODE; |
| 23 | |
| 24 | fPMColor = SkPreMultiplyColor(fColor); |
| 25 | } |
| 26 | |
| 27 | SkModeColorFilter(SkColor color, SkXfermode::Mode mode) { |
| 28 | fColor = color; |
| 29 | fMode = mode; |
| 30 | |
| 31 | fPMColor = SkPreMultiplyColor(fColor); |
| 32 | }; |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 33 | |
reed@google.com | 43c50c8 | 2011-04-14 15:50:52 +0000 | [diff] [blame] | 34 | virtual bool asColorMode(SkColor* color, SkXfermode::Mode* mode) { |
| 35 | if (ILLEGAL_XFERMODE_MODE == fMode) { |
| 36 | return false; |
| 37 | } |
| 38 | |
| 39 | if (color) { |
| 40 | *color = fColor; |
| 41 | } |
| 42 | if (mode) { |
| 43 | *mode = fMode; |
| 44 | } |
| 45 | return true; |
| 46 | } |
| 47 | |
| 48 | SkColor getColor() const { return fColor; } |
| 49 | SkXfermode::Mode getMode() const { return fMode; } |
| 50 | bool isModeValid() const { return ILLEGAL_XFERMODE_MODE != fMode; } |
| 51 | |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 52 | protected: |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 53 | virtual void flatten(SkFlattenableWriteBuffer& buffer) { |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 54 | this->INHERITED::flatten(buffer); |
reed@google.com | 43c50c8 | 2011-04-14 15:50:52 +0000 | [diff] [blame] | 55 | buffer.write32(fColor); |
| 56 | buffer.write32(fMode); |
| 57 | } |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 58 | |
reed@google.com | 43c50c8 | 2011-04-14 15:50:52 +0000 | [diff] [blame] | 59 | SkModeColorFilter(SkFlattenableReadBuffer& buffer) { |
| 60 | fColor = buffer.readU32(); |
| 61 | fMode = (SkXfermode::Mode)buffer.readU32(); |
| 62 | |
| 63 | fPMColor = SkPreMultiplyColor(fColor); |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 64 | } |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 65 | |
reed@google.com | 43c50c8 | 2011-04-14 15:50:52 +0000 | [diff] [blame] | 66 | // cache of fColor in premultiply space |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 67 | SkPMColor fPMColor; |
reed@google.com | 43c50c8 | 2011-04-14 15:50:52 +0000 | [diff] [blame] | 68 | |
| 69 | private: |
| 70 | SkColor fColor; |
| 71 | SkXfermode::Mode fMode; |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 72 | |
| 73 | typedef SkColorFilter INHERITED; |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 74 | }; |
| 75 | |
reed@google.com | 43c50c8 | 2011-04-14 15:50:52 +0000 | [diff] [blame] | 76 | class Src_SkModeColorFilter : public SkModeColorFilter { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 77 | public: |
reed@google.com | 43c50c8 | 2011-04-14 15:50:52 +0000 | [diff] [blame] | 78 | Src_SkModeColorFilter(SkColor color) : INHERITED(color, SkXfermode::kSrc_Mode) {} |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 79 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 80 | virtual uint32_t getFlags() { |
| 81 | if (SkGetPackedA32(fPMColor) == 0xFF) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 82 | return kAlphaUnchanged_Flag | kHasFilter16_Flag; |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 83 | } else { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 84 | return 0; |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 85 | } |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 86 | } |
| 87 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 88 | virtual void filterSpan(const SkPMColor shader[], int count, |
| 89 | SkPMColor result[]) { |
| 90 | sk_memset32(result, fPMColor, count); |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 91 | } |
| 92 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 93 | virtual void filterSpan16(const uint16_t shader[], int count, |
| 94 | uint16_t result[]) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 95 | SkASSERT(this->getFlags() & kHasFilter16_Flag); |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 96 | sk_memset16(result, SkPixel32ToPixel16(fPMColor), count); |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 97 | } |
| 98 | |
djsollen@google.com | ba28d03 | 2012-03-26 17:57:35 +0000 | [diff] [blame] | 99 | SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(Src_SkModeColorFilter) |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 100 | |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 101 | protected: |
reed@google.com | 43c50c8 | 2011-04-14 15:50:52 +0000 | [diff] [blame] | 102 | Src_SkModeColorFilter(SkFlattenableReadBuffer& buffer) |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 103 | : INHERITED(buffer) {} |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 104 | |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 105 | private: |
reed@google.com | 43c50c8 | 2011-04-14 15:50:52 +0000 | [diff] [blame] | 106 | typedef SkModeColorFilter INHERITED; |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 107 | }; |
| 108 | |
reed@google.com | 43c50c8 | 2011-04-14 15:50:52 +0000 | [diff] [blame] | 109 | class SrcOver_SkModeColorFilter : public SkModeColorFilter { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 110 | public: |
reed@google.com | 43c50c8 | 2011-04-14 15:50:52 +0000 | [diff] [blame] | 111 | SrcOver_SkModeColorFilter(SkColor color) |
| 112 | : INHERITED(color, SkXfermode::kSrcOver_Mode) { |
| 113 | fColor32Proc = NULL; |
| 114 | } |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 115 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 116 | virtual uint32_t getFlags() { |
| 117 | if (SkGetPackedA32(fPMColor) == 0xFF) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 118 | return kAlphaUnchanged_Flag | kHasFilter16_Flag; |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 119 | } else { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 120 | return 0; |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 121 | } |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 122 | } |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 123 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 124 | virtual void filterSpan(const SkPMColor shader[], int count, |
| 125 | SkPMColor result[]) { |
reed@google.com | 43c50c8 | 2011-04-14 15:50:52 +0000 | [diff] [blame] | 126 | if (NULL == fColor32Proc) { |
| 127 | fColor32Proc = SkBlitRow::ColorProcFactory(); |
| 128 | } |
senorblanco@chromium.org | 29e5054 | 2010-12-16 19:07:45 +0000 | [diff] [blame] | 129 | fColor32Proc(result, shader, count, fPMColor); |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 130 | } |
| 131 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 132 | virtual void filterSpan16(const uint16_t shader[], int count, |
| 133 | uint16_t result[]) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 134 | SkASSERT(this->getFlags() & kHasFilter16_Flag); |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 135 | sk_memset16(result, SkPixel32ToPixel16(fPMColor), count); |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 136 | } |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 137 | |
djsollen@google.com | ba28d03 | 2012-03-26 17:57:35 +0000 | [diff] [blame] | 138 | SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SrcOver_SkModeColorFilter) |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 139 | |
| 140 | protected: |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 141 | SrcOver_SkModeColorFilter(SkFlattenableReadBuffer& buffer) |
| 142 | : INHERITED(buffer), fColor32Proc(NULL) {} |
| 143 | |
| 144 | private: |
| 145 | |
senorblanco@chromium.org | 29e5054 | 2010-12-16 19:07:45 +0000 | [diff] [blame] | 146 | SkBlitRow::ColorProc fColor32Proc; |
reed@google.com | 43c50c8 | 2011-04-14 15:50:52 +0000 | [diff] [blame] | 147 | |
| 148 | typedef SkModeColorFilter INHERITED; |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 149 | }; |
| 150 | |
reed@google.com | 43c50c8 | 2011-04-14 15:50:52 +0000 | [diff] [blame] | 151 | /////////////////////////////////////////////////////////////////////////////// |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 152 | |
reed@google.com | 43c50c8 | 2011-04-14 15:50:52 +0000 | [diff] [blame] | 153 | class Proc_SkModeColorFilter : public SkModeColorFilter { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 154 | public: |
reed@google.com | 43c50c8 | 2011-04-14 15:50:52 +0000 | [diff] [blame] | 155 | Proc_SkModeColorFilter(SkColor color, SkXfermode::Mode mode) : INHERITED(color, mode) { |
| 156 | fProc = SkXfermode::GetProc(mode); |
| 157 | fProc16 = SkXfermode::GetProc16(mode, color); |
| 158 | } |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 159 | |
reed@google.com | 43c50c8 | 2011-04-14 15:50:52 +0000 | [diff] [blame] | 160 | Proc_SkModeColorFilter(SkColor color, |
| 161 | SkXfermodeProc proc, SkXfermodeProc16 proc16) |
| 162 | : INHERITED(color, ILLEGAL_XFERMODE_MODE) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 163 | fProc = proc; |
| 164 | fProc16 = proc16; |
| 165 | } |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 166 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 167 | virtual uint32_t getFlags() { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 168 | return fProc16 ? (kAlphaUnchanged_Flag | kHasFilter16_Flag) : 0; |
| 169 | } |
| 170 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 171 | virtual void filterSpan(const SkPMColor shader[], int count, |
| 172 | SkPMColor result[]) { |
| 173 | SkPMColor color = fPMColor; |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 174 | SkXfermodeProc proc = fProc; |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 175 | |
| 176 | for (int i = 0; i < count; i++) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 177 | result[i] = proc(color, shader[i]); |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 178 | } |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 179 | } |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 180 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 181 | virtual void filterSpan16(const uint16_t shader[], int count, |
| 182 | uint16_t result[]) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 183 | SkASSERT(this->getFlags() & kHasFilter16_Flag); |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 184 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 185 | SkPMColor color = fPMColor; |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 186 | SkXfermodeProc16 proc16 = fProc16; |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 187 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 188 | for (int i = 0; i < count; i++) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 189 | result[i] = proc16(color, shader[i]); |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 190 | } |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 191 | } |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 192 | |
djsollen@google.com | ba28d03 | 2012-03-26 17:57:35 +0000 | [diff] [blame] | 193 | SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(Proc_SkModeColorFilter) |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 194 | |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 195 | protected: |
| 196 | virtual void flatten(SkFlattenableWriteBuffer& buffer) { |
| 197 | this->INHERITED::flatten(buffer); |
| 198 | buffer.writeFunctionPtr((void*)fProc); |
| 199 | buffer.writeFunctionPtr((void*)fProc16); |
| 200 | } |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 201 | |
reed@google.com | 43c50c8 | 2011-04-14 15:50:52 +0000 | [diff] [blame] | 202 | Proc_SkModeColorFilter(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 203 | fProc = (SkXfermodeProc) buffer.readFunctionPtr(); |
| 204 | fProc16 = (SkXfermodeProc16) buffer.readFunctionPtr(); |
| 205 | } |
reed@google.com | 43c50c8 | 2011-04-14 15:50:52 +0000 | [diff] [blame] | 206 | |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 207 | private: |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 208 | SkXfermodeProc fProc; |
| 209 | SkXfermodeProc16 fProc16; |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 210 | |
reed@google.com | 43c50c8 | 2011-04-14 15:50:52 +0000 | [diff] [blame] | 211 | typedef SkModeColorFilter INHERITED; |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 212 | }; |
| 213 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 214 | SkColorFilter* SkColorFilter::CreateProcFilter(SkColor color, |
| 215 | SkXfermodeProc proc, |
| 216 | SkXfermodeProc16 proc16) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 217 | return proc ? |
reed@google.com | 43c50c8 | 2011-04-14 15:50:52 +0000 | [diff] [blame] | 218 | SkNEW_ARGS(Proc_SkModeColorFilter, (color, proc, proc16)) : |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 219 | NULL; |
| 220 | } |
| 221 | |
| 222 | /////////////////////////////////////////////////////////////////////////////// |
| 223 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 224 | SkColorFilter* SkColorFilter::CreateModeFilter(SkColor color, |
| 225 | SkXfermode::Mode mode) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 226 | unsigned alpha = SkColorGetA(color); |
| 227 | |
| 228 | // first collaps some modes if possible |
| 229 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 230 | if (SkXfermode::kClear_Mode == mode) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 231 | color = 0; |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 232 | mode = SkXfermode::kSrc_Mode; |
| 233 | } else if (SkXfermode::kSrcOver_Mode == mode) { |
| 234 | if (0 == alpha) { |
| 235 | mode = SkXfermode::kDst_Mode; |
| 236 | } else if (255 == alpha) { |
| 237 | mode = SkXfermode::kSrc_Mode; |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 238 | } |
| 239 | // else just stay srcover |
| 240 | } |
| 241 | |
| 242 | // weed out combinations that are noops, and just return null |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 243 | if (SkXfermode::kDst_Mode == mode || |
| 244 | (0 == alpha && (SkXfermode::kSrcOver_Mode == mode || |
| 245 | SkXfermode::kDstOver_Mode == mode || |
| 246 | SkXfermode::kDstOut_Mode == mode || |
| 247 | SkXfermode::kSrcATop_Mode == mode || |
| 248 | SkXfermode::kXor_Mode == mode || |
| 249 | SkXfermode::kDarken_Mode == mode)) || |
| 250 | (0xFF == alpha && SkXfermode::kDstIn_Mode == mode)) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 251 | return NULL; |
| 252 | } |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 253 | |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 254 | switch (mode) { |
reed@google.com | 43c50c8 | 2011-04-14 15:50:52 +0000 | [diff] [blame] | 255 | case SkXfermode::kSrc_Mode: |
| 256 | return SkNEW_ARGS(Src_SkModeColorFilter, (color)); |
| 257 | case SkXfermode::kSrcOver_Mode: |
| 258 | return SkNEW_ARGS(SrcOver_SkModeColorFilter, (color)); |
| 259 | default: |
| 260 | return SkNEW_ARGS(Proc_SkModeColorFilter, (color, mode)); |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 261 | } |
| 262 | } |
| 263 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 264 | /////////////////////////////////////////////////////////////////////////////// |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 265 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 266 | static inline unsigned pin(unsigned value, unsigned max) { |
| 267 | if (value > max) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 268 | value = max; |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 269 | } |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 270 | return value; |
| 271 | } |
| 272 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 273 | static inline unsigned SkUClampMax(unsigned value, unsigned max) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 274 | SkASSERT((int32_t)value >= 0); |
| 275 | SkASSERT((int32_t)max >= 0); |
| 276 | |
| 277 | int diff = max - value; |
| 278 | // clear diff if diff is positive |
| 279 | diff &= diff >> 31; |
| 280 | |
| 281 | return value + diff; |
| 282 | } |
| 283 | |
| 284 | class SkLightingColorFilter : public SkColorFilter { |
| 285 | public: |
| 286 | SkLightingColorFilter(SkColor mul, SkColor add) : fMul(mul), fAdd(add) {} |
| 287 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 288 | virtual void filterSpan(const SkPMColor shader[], int count, |
| 289 | SkPMColor result[]) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 290 | unsigned scaleR = SkAlpha255To256(SkColorGetR(fMul)); |
| 291 | unsigned scaleG = SkAlpha255To256(SkColorGetG(fMul)); |
| 292 | unsigned scaleB = SkAlpha255To256(SkColorGetB(fMul)); |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 293 | |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 294 | unsigned addR = SkColorGetR(fAdd); |
| 295 | unsigned addG = SkColorGetG(fAdd); |
| 296 | unsigned addB = SkColorGetB(fAdd); |
| 297 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 298 | for (int i = 0; i < count; i++) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 299 | SkPMColor c = shader[i]; |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 300 | if (c) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 301 | unsigned a = SkGetPackedA32(c); |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 302 | unsigned scaleA = SkAlpha255To256(a); |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 303 | unsigned r = pin(SkAlphaMul(SkGetPackedR32(c), scaleR) + SkAlphaMul(addR, scaleA), a); |
| 304 | unsigned g = pin(SkAlphaMul(SkGetPackedG32(c), scaleG) + SkAlphaMul(addG, scaleA), a); |
| 305 | unsigned b = pin(SkAlphaMul(SkGetPackedB32(c), scaleB) + SkAlphaMul(addB, scaleA), a); |
| 306 | c = SkPackARGB32(a, r, g, b); |
| 307 | } |
| 308 | result[i] = c; |
| 309 | } |
| 310 | } |
| 311 | |
djsollen@google.com | ba28d03 | 2012-03-26 17:57:35 +0000 | [diff] [blame] | 312 | SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLightingColorFilter) |
caryclark@google.com | d26147a | 2011-12-15 14:16:43 +0000 | [diff] [blame] | 313 | |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 314 | protected: |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 315 | virtual void flatten(SkFlattenableWriteBuffer& buffer) { |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 316 | this->INHERITED::flatten(buffer); |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 317 | buffer.write32(fMul); |
| 318 | buffer.write32(fAdd); |
| 319 | } |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 320 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 321 | SkLightingColorFilter(SkFlattenableReadBuffer& buffer) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 322 | fMul = buffer.readU32(); |
| 323 | fAdd = buffer.readU32(); |
| 324 | } |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 325 | |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 326 | SkColor fMul, fAdd; |
| 327 | |
| 328 | private: |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 329 | typedef SkColorFilter INHERITED; |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 330 | }; |
| 331 | |
| 332 | class SkLightingColorFilter_JustAdd : public SkLightingColorFilter { |
| 333 | public: |
| 334 | SkLightingColorFilter_JustAdd(SkColor mul, SkColor add) |
| 335 | : INHERITED(mul, add) {} |
| 336 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 337 | virtual void filterSpan(const SkPMColor shader[], int count, |
| 338 | SkPMColor result[]) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 339 | unsigned addR = SkColorGetR(fAdd); |
| 340 | unsigned addG = SkColorGetG(fAdd); |
| 341 | unsigned addB = SkColorGetB(fAdd); |
| 342 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 343 | for (int i = 0; i < count; i++) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 344 | SkPMColor c = shader[i]; |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 345 | if (c) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 346 | unsigned a = SkGetPackedA32(c); |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 347 | unsigned scaleA = SkAlpha255To256(a); |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 348 | unsigned r = pin(SkGetPackedR32(c) + SkAlphaMul(addR, scaleA), a); |
| 349 | unsigned g = pin(SkGetPackedG32(c) + SkAlphaMul(addG, scaleA), a); |
| 350 | unsigned b = pin(SkGetPackedB32(c) + SkAlphaMul(addB, scaleA), a); |
| 351 | c = SkPackARGB32(a, r, g, b); |
| 352 | } |
| 353 | result[i] = c; |
| 354 | } |
| 355 | } |
| 356 | |
djsollen@google.com | ba28d03 | 2012-03-26 17:57:35 +0000 | [diff] [blame] | 357 | SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLightingColorFilter_JustAdd) |
caryclark@google.com | d26147a | 2011-12-15 14:16:43 +0000 | [diff] [blame] | 358 | |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 359 | protected: |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 360 | SkLightingColorFilter_JustAdd(SkFlattenableReadBuffer& buffer) |
| 361 | : INHERITED(buffer) {} |
| 362 | |
| 363 | private: |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 364 | typedef SkLightingColorFilter INHERITED; |
| 365 | }; |
| 366 | |
| 367 | class SkLightingColorFilter_JustMul : public SkLightingColorFilter { |
| 368 | public: |
| 369 | SkLightingColorFilter_JustMul(SkColor mul, SkColor add) |
| 370 | : INHERITED(mul, add) {} |
| 371 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 372 | virtual void filterSpan(const SkPMColor shader[], int count, |
| 373 | SkPMColor result[]) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 374 | unsigned scaleR = SkAlpha255To256(SkColorGetR(fMul)); |
| 375 | unsigned scaleG = SkAlpha255To256(SkColorGetG(fMul)); |
| 376 | unsigned scaleB = SkAlpha255To256(SkColorGetB(fMul)); |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 377 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 378 | for (int i = 0; i < count; i++) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 379 | SkPMColor c = shader[i]; |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 380 | if (c) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 381 | unsigned a = SkGetPackedA32(c); |
| 382 | unsigned r = SkAlphaMul(SkGetPackedR32(c), scaleR); |
| 383 | unsigned g = SkAlphaMul(SkGetPackedG32(c), scaleG); |
| 384 | unsigned b = SkAlphaMul(SkGetPackedB32(c), scaleB); |
| 385 | c = SkPackARGB32(a, r, g, b); |
| 386 | } |
| 387 | result[i] = c; |
| 388 | } |
| 389 | } |
| 390 | |
djsollen@google.com | ba28d03 | 2012-03-26 17:57:35 +0000 | [diff] [blame] | 391 | SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLightingColorFilter_JustMul) |
caryclark@google.com | d26147a | 2011-12-15 14:16:43 +0000 | [diff] [blame] | 392 | |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 393 | protected: |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 394 | SkLightingColorFilter_JustMul(SkFlattenableReadBuffer& buffer) |
| 395 | : INHERITED(buffer) {} |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 396 | |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 397 | private: |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 398 | typedef SkLightingColorFilter INHERITED; |
| 399 | }; |
| 400 | |
| 401 | class SkLightingColorFilter_SingleMul : public SkLightingColorFilter { |
| 402 | public: |
| 403 | SkLightingColorFilter_SingleMul(SkColor mul, SkColor add) |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 404 | : INHERITED(mul, add) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 405 | SkASSERT(SkColorGetR(add) == 0); |
| 406 | SkASSERT(SkColorGetG(add) == 0); |
| 407 | SkASSERT(SkColorGetB(add) == 0); |
| 408 | SkASSERT(SkColorGetR(mul) == SkColorGetG(mul)); |
| 409 | SkASSERT(SkColorGetR(mul) == SkColorGetB(mul)); |
| 410 | } |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 411 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 412 | virtual uint32_t getFlags() { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 413 | return this->INHERITED::getFlags() | (kAlphaUnchanged_Flag | kHasFilter16_Flag); |
| 414 | } |
| 415 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 416 | virtual void filterSpan16(const uint16_t shader[], int count, |
| 417 | uint16_t result[]) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 418 | // all mul components are the same |
| 419 | unsigned scale = SkAlpha255To256(SkColorGetR(fMul)); |
| 420 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 421 | if (count > 0) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 422 | do { |
| 423 | *result++ = SkAlphaMulRGB16(*shader++, scale); |
| 424 | } while (--count > 0); |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 425 | } |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 426 | } |
| 427 | |
djsollen@google.com | ba28d03 | 2012-03-26 17:57:35 +0000 | [diff] [blame] | 428 | SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLightingColorFilter_SingleMul) |
caryclark@google.com | d26147a | 2011-12-15 14:16:43 +0000 | [diff] [blame] | 429 | |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 430 | protected: |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 431 | SkLightingColorFilter_SingleMul(SkFlattenableReadBuffer& buffer) |
| 432 | : INHERITED(buffer) {} |
| 433 | |
| 434 | private: |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 435 | typedef SkLightingColorFilter INHERITED; |
| 436 | }; |
| 437 | |
| 438 | class SkLightingColorFilter_NoPin : public SkLightingColorFilter { |
| 439 | public: |
| 440 | SkLightingColorFilter_NoPin(SkColor mul, SkColor add) |
| 441 | : INHERITED(mul, add) {} |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 442 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 443 | virtual void filterSpan(const SkPMColor shader[], int count, |
| 444 | SkPMColor result[]) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 445 | unsigned scaleR = SkAlpha255To256(SkColorGetR(fMul)); |
| 446 | unsigned scaleG = SkAlpha255To256(SkColorGetG(fMul)); |
| 447 | unsigned scaleB = SkAlpha255To256(SkColorGetB(fMul)); |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 448 | |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 449 | unsigned addR = SkColorGetR(fAdd); |
| 450 | unsigned addG = SkColorGetG(fAdd); |
| 451 | unsigned addB = SkColorGetB(fAdd); |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 452 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 453 | for (int i = 0; i < count; i++) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 454 | SkPMColor c = shader[i]; |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 455 | if (c) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 456 | unsigned a = SkGetPackedA32(c); |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 457 | unsigned scaleA = SkAlpha255To256(a); |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 458 | unsigned r = SkAlphaMul(SkGetPackedR32(c), scaleR) + SkAlphaMul(addR, scaleA); |
| 459 | unsigned g = SkAlphaMul(SkGetPackedG32(c), scaleG) + SkAlphaMul(addG, scaleA); |
| 460 | unsigned b = SkAlphaMul(SkGetPackedB32(c), scaleB) + SkAlphaMul(addB, scaleA); |
| 461 | c = SkPackARGB32(a, r, g, b); |
| 462 | } |
| 463 | result[i] = c; |
| 464 | } |
| 465 | } |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 466 | |
djsollen@google.com | ba28d03 | 2012-03-26 17:57:35 +0000 | [diff] [blame] | 467 | SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLightingColorFilter_NoPin) |
caryclark@google.com | d26147a | 2011-12-15 14:16:43 +0000 | [diff] [blame] | 468 | |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 469 | protected: |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 470 | SkLightingColorFilter_NoPin(SkFlattenableReadBuffer& buffer) |
| 471 | : INHERITED(buffer) {} |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 472 | |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 473 | private: |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 474 | typedef SkLightingColorFilter INHERITED; |
| 475 | }; |
| 476 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 477 | /////////////////////////////////////////////////////////////////////////////// |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 478 | |
| 479 | class SkSimpleColorFilter : public SkColorFilter { |
caryclark@google.com | d26147a | 2011-12-15 14:16:43 +0000 | [diff] [blame] | 480 | public: |
| 481 | static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) { |
| 482 | return SkNEW(SkSimpleColorFilter); |
| 483 | } |
| 484 | |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 485 | protected: |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 486 | void filterSpan(const SkPMColor src[], int count, SkPMColor result[]) { |
| 487 | if (result != src) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 488 | memcpy(result, src, count * sizeof(SkPMColor)); |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 489 | } |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 490 | } |
| 491 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 492 | virtual void flatten(SkFlattenableWriteBuffer& buffer) {} |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 493 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 494 | virtual Factory getFactory() { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 495 | return CreateProc; |
| 496 | } |
| 497 | |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 498 | }; |
| 499 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 500 | SkColorFilter* SkColorFilter::CreateLightingFilter(SkColor mul, SkColor add) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 501 | mul &= 0x00FFFFFF; |
| 502 | add &= 0x00FFFFFF; |
| 503 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 504 | if (0xFFFFFF == mul) { |
| 505 | if (0 == add) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 506 | return SkNEW(SkSimpleColorFilter); // no change to the colors |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 507 | } else { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 508 | return SkNEW_ARGS(SkLightingColorFilter_JustAdd, (mul, add)); |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 509 | } |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 510 | } |
| 511 | |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 512 | if (0 == add) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 513 | if (SkColorGetR(mul) == SkColorGetG(mul) && |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 514 | SkColorGetR(mul) == SkColorGetB(mul)) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 515 | return SkNEW_ARGS(SkLightingColorFilter_SingleMul, (mul, add)); |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 516 | } else { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 517 | return SkNEW_ARGS(SkLightingColorFilter_JustMul, (mul, add)); |
| 518 | } |
| 519 | } |
| 520 | |
| 521 | if (SkColorGetR(mul) + SkColorGetR(add) <= 255 && |
| 522 | SkColorGetG(mul) + SkColorGetG(add) <= 255 && |
reed@android.com | 845fdac | 2009-06-23 03:01:32 +0000 | [diff] [blame] | 523 | SkColorGetB(mul) + SkColorGetB(add) <= 255) { |
| 524 | return SkNEW_ARGS(SkLightingColorFilter_NoPin, (mul, add)); |
| 525 | } |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 526 | |
| 527 | return SkNEW_ARGS(SkLightingColorFilter, (mul, add)); |
| 528 | } |
| 529 | |
caryclark@google.com | d26147a | 2011-12-15 14:16:43 +0000 | [diff] [blame] | 530 | SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkColorFilter) |
| 531 | SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(Src_SkModeColorFilter) |
| 532 | SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SrcOver_SkModeColorFilter) |
| 533 | SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(Proc_SkModeColorFilter) |
| 534 | SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLightingColorFilter) |
| 535 | SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLightingColorFilter_JustAdd) |
| 536 | SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLightingColorFilter_JustMul) |
| 537 | SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLightingColorFilter_SingleMul) |
| 538 | SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLightingColorFilter_NoPin) |
| 539 | SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSimpleColorFilter) |
| 540 | SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
tomhudson@google.com | 1447c6f | 2011-04-27 14:09:52 +0000 | [diff] [blame] | 541 | |