OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #include "SkBlitRow.h" | 10 #include "SkBlitRow.h" |
11 #include "SkColorFilter.h" | 11 #include "SkColorFilter.h" |
12 #include "SkColorPriv.h" | 12 #include "SkColorPriv.h" |
13 #include "SkFlattenableBuffers.h" | 13 #include "SkFlattenableBuffers.h" |
14 #include "SkUtils.h" | 14 #include "SkUtils.h" |
15 #include "SkString.h" | 15 #include "SkString.h" |
16 | 16 |
17 #define ILLEGAL_XFERMODE_MODE ((SkXfermode::Mode)-1) | 17 #define ILLEGAL_XFERMODE_MODE ((SkXfermode::Mode)-1) |
18 | 18 |
19 // baseclass for filters that store a color and mode | 19 // baseclass for filters that store a color and mode |
20 class SkModeColorFilter : public SkColorFilter { | 20 class SkModeColorFilter : public SkColorFilter { |
| 21 typedef SkColorFilter INHERITED; |
| 22 |
21 public: | 23 public: |
22 SkModeColorFilter(SkColor color) { | 24 SkModeColorFilter(SkColor color) { |
23 fColor = color; | 25 fColor = color; |
24 fMode = ILLEGAL_XFERMODE_MODE; | 26 fMode = ILLEGAL_XFERMODE_MODE; |
25 this->updateCache(); | 27 this->updateCache(); |
26 } | 28 } |
27 | 29 |
28 SkModeColorFilter(SkColor color, SkXfermode::Mode mode) { | 30 SkModeColorFilter(SkColor color, SkXfermode::Mode mode) { |
29 fColor = color; | 31 fColor = color; |
30 fMode = mode; | 32 fMode = mode; |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 // cache | 108 // cache |
107 SkPMColor fPMColor; | 109 SkPMColor fPMColor; |
108 SkXfermodeProc fProc; | 110 SkXfermodeProc fProc; |
109 SkXfermodeProc16 fProc16; | 111 SkXfermodeProc16 fProc16; |
110 | 112 |
111 void updateCache() { | 113 void updateCache() { |
112 fPMColor = SkPreMultiplyColor(fColor); | 114 fPMColor = SkPreMultiplyColor(fColor); |
113 fProc = SkXfermode::GetProc(fMode); | 115 fProc = SkXfermode::GetProc(fMode); |
114 fProc16 = SkXfermode::GetProc16(fMode, fColor); | 116 fProc16 = SkXfermode::GetProc16(fMode, fColor); |
115 } | 117 } |
116 | |
117 typedef SkColorFilter INHERITED; | |
118 }; | 118 }; |
119 | 119 |
120 class Src_SkModeColorFilter : public SkModeColorFilter { | 120 class Src_SkModeColorFilter : public SkModeColorFilter { |
| 121 typedef SkModeColorFilter INHERITED; |
| 122 |
121 public: | 123 public: |
122 Src_SkModeColorFilter(SkColor color) : INHERITED(color, SkXfermode::kSrc_Mod
e) {} | 124 Src_SkModeColorFilter(SkColor color) : INHERITED(color, SkXfermode::kSrc_Mod
e) {} |
123 | 125 |
124 virtual uint32_t getFlags() const SK_OVERRIDE { | 126 virtual uint32_t getFlags() const SK_OVERRIDE { |
125 if (SkGetPackedA32(this->getPMColor()) == 0xFF) { | 127 if (SkGetPackedA32(this->getPMColor()) == 0xFF) { |
126 return kAlphaUnchanged_Flag | kHasFilter16_Flag; | 128 return kAlphaUnchanged_Flag | kHasFilter16_Flag; |
127 } else { | 129 } else { |
128 return 0; | 130 return 0; |
129 } | 131 } |
130 } | 132 } |
131 | 133 |
132 virtual void filterSpan(const SkPMColor shader[], int count, | 134 virtual void filterSpan(const SkPMColor shader[], int count, |
133 SkPMColor result[]) const SK_OVERRIDE { | 135 SkPMColor result[]) const SK_OVERRIDE { |
134 sk_memset32(result, this->getPMColor(), count); | 136 sk_memset32(result, this->getPMColor(), count); |
135 } | 137 } |
136 | 138 |
137 virtual void filterSpan16(const uint16_t shader[], int count, | 139 virtual void filterSpan16(const uint16_t shader[], int count, |
138 uint16_t result[]) const SK_OVERRIDE { | 140 uint16_t result[]) const SK_OVERRIDE { |
139 SkASSERT(this->getFlags() & kHasFilter16_Flag); | 141 SkASSERT(this->getFlags() & kHasFilter16_Flag); |
140 sk_memset16(result, SkPixel32ToPixel16(this->getPMColor()), count); | 142 sk_memset16(result, SkPixel32ToPixel16(this->getPMColor()), count); |
141 } | 143 } |
142 | 144 |
143 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(Src_SkModeColorFilter) | 145 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(Src_SkModeColorFilter) |
144 | 146 |
145 protected: | 147 protected: |
146 Src_SkModeColorFilter(SkFlattenableReadBuffer& buffer) | 148 Src_SkModeColorFilter(SkFlattenableReadBuffer& buffer) |
147 : INHERITED(buffer) {} | 149 : INHERITED(buffer) {} |
148 | |
149 private: | |
150 typedef SkModeColorFilter INHERITED; | |
151 }; | 150 }; |
152 | 151 |
153 class SrcOver_SkModeColorFilter : public SkModeColorFilter { | 152 class SrcOver_SkModeColorFilter : public SkModeColorFilter { |
| 153 typedef SkModeColorFilter INHERITED; |
| 154 |
154 public: | 155 public: |
155 SrcOver_SkModeColorFilter(SkColor color) | 156 SrcOver_SkModeColorFilter(SkColor color) |
156 : INHERITED(color, SkXfermode::kSrcOver_Mode) { | 157 : INHERITED(color, SkXfermode::kSrcOver_Mode) { |
157 fColor32Proc = SkBlitRow::ColorProcFactory(); | 158 fColor32Proc = SkBlitRow::ColorProcFactory(); |
158 } | 159 } |
159 | 160 |
160 virtual uint32_t getFlags() const SK_OVERRIDE { | 161 virtual uint32_t getFlags() const SK_OVERRIDE { |
161 if (SkGetPackedA32(this->getPMColor()) == 0xFF) { | 162 if (SkGetPackedA32(this->getPMColor()) == 0xFF) { |
162 return kAlphaUnchanged_Flag | kHasFilter16_Flag; | 163 return kAlphaUnchanged_Flag | kHasFilter16_Flag; |
163 } else { | 164 } else { |
(...skipping 16 matching lines...) Expand all Loading... |
180 | 181 |
181 protected: | 182 protected: |
182 SrcOver_SkModeColorFilter(SkFlattenableReadBuffer& buffer) | 183 SrcOver_SkModeColorFilter(SkFlattenableReadBuffer& buffer) |
183 : INHERITED(buffer) { | 184 : INHERITED(buffer) { |
184 fColor32Proc = SkBlitRow::ColorProcFactory(); | 185 fColor32Proc = SkBlitRow::ColorProcFactory(); |
185 } | 186 } |
186 | 187 |
187 private: | 188 private: |
188 | 189 |
189 SkBlitRow::ColorProc fColor32Proc; | 190 SkBlitRow::ColorProc fColor32Proc; |
190 | |
191 typedef SkModeColorFilter INHERITED; | |
192 }; | 191 }; |
193 | 192 |
194 /////////////////////////////////////////////////////////////////////////////// | 193 /////////////////////////////////////////////////////////////////////////////// |
195 | 194 |
196 SkColorFilter* SkColorFilter::CreateModeFilter(SkColor color, | 195 SkColorFilter* SkColorFilter::CreateModeFilter(SkColor color, |
197 SkXfermode::Mode mode) { | 196 SkXfermode::Mode mode) { |
198 unsigned alpha = SkColorGetA(color); | 197 unsigned alpha = SkColorGetA(color); |
199 | 198 |
200 // first collaps some modes if possible | 199 // first collaps some modes if possible |
201 | 200 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
236 /////////////////////////////////////////////////////////////////////////////// | 235 /////////////////////////////////////////////////////////////////////////////// |
237 | 236 |
238 static inline unsigned pin(unsigned value, unsigned max) { | 237 static inline unsigned pin(unsigned value, unsigned max) { |
239 if (value > max) { | 238 if (value > max) { |
240 value = max; | 239 value = max; |
241 } | 240 } |
242 return value; | 241 return value; |
243 } | 242 } |
244 | 243 |
245 class SkLightingColorFilter : public SkColorFilter { | 244 class SkLightingColorFilter : public SkColorFilter { |
| 245 typedef SkColorFilter INHERITED; |
| 246 |
246 public: | 247 public: |
247 SkLightingColorFilter(SkColor mul, SkColor add) : fMul(mul), fAdd(add) {} | 248 SkLightingColorFilter(SkColor mul, SkColor add) : fMul(mul), fAdd(add) {} |
248 | 249 |
249 virtual void filterSpan(const SkPMColor shader[], int count, | 250 virtual void filterSpan(const SkPMColor shader[], int count, |
250 SkPMColor result[]) const SK_OVERRIDE { | 251 SkPMColor result[]) const SK_OVERRIDE { |
251 unsigned scaleR = SkAlpha255To256(SkColorGetR(fMul)); | 252 unsigned scaleR = SkAlpha255To256(SkColorGetR(fMul)); |
252 unsigned scaleG = SkAlpha255To256(SkColorGetG(fMul)); | 253 unsigned scaleG = SkAlpha255To256(SkColorGetG(fMul)); |
253 unsigned scaleB = SkAlpha255To256(SkColorGetB(fMul)); | 254 unsigned scaleB = SkAlpha255To256(SkColorGetB(fMul)); |
254 | 255 |
255 unsigned addR = SkColorGetR(fAdd); | 256 unsigned addR = SkColorGetR(fAdd); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
287 buffer.writeColor(fMul); | 288 buffer.writeColor(fMul); |
288 buffer.writeColor(fAdd); | 289 buffer.writeColor(fAdd); |
289 } | 290 } |
290 | 291 |
291 SkLightingColorFilter(SkFlattenableReadBuffer& buffer) { | 292 SkLightingColorFilter(SkFlattenableReadBuffer& buffer) { |
292 fMul = buffer.readColor(); | 293 fMul = buffer.readColor(); |
293 fAdd = buffer.readColor(); | 294 fAdd = buffer.readColor(); |
294 } | 295 } |
295 | 296 |
296 SkColor fMul, fAdd; | 297 SkColor fMul, fAdd; |
297 | |
298 private: | |
299 typedef SkColorFilter INHERITED; | |
300 }; | 298 }; |
301 | 299 |
302 class SkLightingColorFilter_JustAdd : public SkLightingColorFilter { | 300 class SkLightingColorFilter_JustAdd : public SkLightingColorFilter { |
| 301 typedef SkLightingColorFilter INHERITED; |
| 302 |
303 public: | 303 public: |
304 SkLightingColorFilter_JustAdd(SkColor mul, SkColor add) | 304 SkLightingColorFilter_JustAdd(SkColor mul, SkColor add) |
305 : INHERITED(mul, add) {} | 305 : INHERITED(mul, add) {} |
306 | 306 |
307 virtual void filterSpan(const SkPMColor shader[], int count, | 307 virtual void filterSpan(const SkPMColor shader[], int count, |
308 SkPMColor result[]) const SK_OVERRIDE { | 308 SkPMColor result[]) const SK_OVERRIDE { |
309 unsigned addR = SkColorGetR(fAdd); | 309 unsigned addR = SkColorGetR(fAdd); |
310 unsigned addG = SkColorGetG(fAdd); | 310 unsigned addG = SkColorGetG(fAdd); |
311 unsigned addB = SkColorGetB(fAdd); | 311 unsigned addB = SkColorGetB(fAdd); |
312 | 312 |
(...skipping 16 matching lines...) Expand all Loading... |
329 str->append("SkLightingColorFilter_JustAdd: add: 0x"); | 329 str->append("SkLightingColorFilter_JustAdd: add: 0x"); |
330 str->appendHex(fAdd); | 330 str->appendHex(fAdd); |
331 } | 331 } |
332 #endif | 332 #endif |
333 | 333 |
334 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLightingColorFilter_Ju
stAdd) | 334 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLightingColorFilter_Ju
stAdd) |
335 | 335 |
336 protected: | 336 protected: |
337 SkLightingColorFilter_JustAdd(SkFlattenableReadBuffer& buffer) | 337 SkLightingColorFilter_JustAdd(SkFlattenableReadBuffer& buffer) |
338 : INHERITED(buffer) {} | 338 : INHERITED(buffer) {} |
339 | |
340 private: | |
341 typedef SkLightingColorFilter INHERITED; | |
342 }; | 339 }; |
343 | 340 |
344 class SkLightingColorFilter_JustMul : public SkLightingColorFilter { | 341 class SkLightingColorFilter_JustMul : public SkLightingColorFilter { |
| 342 typedef SkLightingColorFilter INHERITED; |
| 343 |
345 public: | 344 public: |
346 SkLightingColorFilter_JustMul(SkColor mul, SkColor add) | 345 SkLightingColorFilter_JustMul(SkColor mul, SkColor add) |
347 : INHERITED(mul, add) {} | 346 : INHERITED(mul, add) {} |
348 | 347 |
349 virtual void filterSpan(const SkPMColor shader[], int count, | 348 virtual void filterSpan(const SkPMColor shader[], int count, |
350 SkPMColor result[]) const SK_OVERRIDE { | 349 SkPMColor result[]) const SK_OVERRIDE { |
351 unsigned scaleR = SkAlpha255To256(SkColorGetR(fMul)); | 350 unsigned scaleR = SkAlpha255To256(SkColorGetR(fMul)); |
352 unsigned scaleG = SkAlpha255To256(SkColorGetG(fMul)); | 351 unsigned scaleG = SkAlpha255To256(SkColorGetG(fMul)); |
353 unsigned scaleB = SkAlpha255To256(SkColorGetB(fMul)); | 352 unsigned scaleB = SkAlpha255To256(SkColorGetB(fMul)); |
354 | 353 |
(...skipping 15 matching lines...) Expand all Loading... |
370 str->append("SkLightingColorFilter_JustMul: mul: 0x"); | 369 str->append("SkLightingColorFilter_JustMul: mul: 0x"); |
371 str->appendHex(fMul); | 370 str->appendHex(fMul); |
372 } | 371 } |
373 #endif | 372 #endif |
374 | 373 |
375 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLightingColorFilter_Ju
stMul) | 374 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLightingColorFilter_Ju
stMul) |
376 | 375 |
377 protected: | 376 protected: |
378 SkLightingColorFilter_JustMul(SkFlattenableReadBuffer& buffer) | 377 SkLightingColorFilter_JustMul(SkFlattenableReadBuffer& buffer) |
379 : INHERITED(buffer) {} | 378 : INHERITED(buffer) {} |
380 | |
381 private: | |
382 typedef SkLightingColorFilter INHERITED; | |
383 }; | 379 }; |
384 | 380 |
385 class SkLightingColorFilter_SingleMul : public SkLightingColorFilter { | 381 class SkLightingColorFilter_SingleMul : public SkLightingColorFilter { |
| 382 typedef SkLightingColorFilter INHERITED; |
| 383 |
386 public: | 384 public: |
387 SkLightingColorFilter_SingleMul(SkColor mul, SkColor add) | 385 SkLightingColorFilter_SingleMul(SkColor mul, SkColor add) |
388 : INHERITED(mul, add) { | 386 : INHERITED(mul, add) { |
389 SkASSERT(SkColorGetR(add) == 0); | 387 SkASSERT(SkColorGetR(add) == 0); |
390 SkASSERT(SkColorGetG(add) == 0); | 388 SkASSERT(SkColorGetG(add) == 0); |
391 SkASSERT(SkColorGetB(add) == 0); | 389 SkASSERT(SkColorGetB(add) == 0); |
392 SkASSERT(SkColorGetR(mul) == SkColorGetG(mul)); | 390 SkASSERT(SkColorGetR(mul) == SkColorGetG(mul)); |
393 SkASSERT(SkColorGetR(mul) == SkColorGetB(mul)); | 391 SkASSERT(SkColorGetR(mul) == SkColorGetB(mul)); |
394 } | 392 } |
395 | 393 |
(...skipping 18 matching lines...) Expand all Loading... |
414 str->append("SkLightingColorFilter_SingleMul: mul: 0x"); | 412 str->append("SkLightingColorFilter_SingleMul: mul: 0x"); |
415 str->appendHex(fMul); | 413 str->appendHex(fMul); |
416 } | 414 } |
417 #endif | 415 #endif |
418 | 416 |
419 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLightingColorFilter_Si
ngleMul) | 417 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLightingColorFilter_Si
ngleMul) |
420 | 418 |
421 protected: | 419 protected: |
422 SkLightingColorFilter_SingleMul(SkFlattenableReadBuffer& buffer) | 420 SkLightingColorFilter_SingleMul(SkFlattenableReadBuffer& buffer) |
423 : INHERITED(buffer) {} | 421 : INHERITED(buffer) {} |
424 | |
425 private: | |
426 typedef SkLightingColorFilter INHERITED; | |
427 }; | 422 }; |
428 | 423 |
429 class SkLightingColorFilter_NoPin : public SkLightingColorFilter { | 424 class SkLightingColorFilter_NoPin : public SkLightingColorFilter { |
| 425 typedef SkLightingColorFilter INHERITED; |
| 426 |
430 public: | 427 public: |
431 SkLightingColorFilter_NoPin(SkColor mul, SkColor add) | 428 SkLightingColorFilter_NoPin(SkColor mul, SkColor add) |
432 : INHERITED(mul, add) {} | 429 : INHERITED(mul, add) {} |
433 | 430 |
434 virtual void filterSpan(const SkPMColor shader[], int count, | 431 virtual void filterSpan(const SkPMColor shader[], int count, |
435 SkPMColor result[]) const SK_OVERRIDE { | 432 SkPMColor result[]) const SK_OVERRIDE { |
436 unsigned scaleR = SkAlpha255To256(SkColorGetR(fMul)); | 433 unsigned scaleR = SkAlpha255To256(SkColorGetR(fMul)); |
437 unsigned scaleG = SkAlpha255To256(SkColorGetG(fMul)); | 434 unsigned scaleG = SkAlpha255To256(SkColorGetG(fMul)); |
438 unsigned scaleB = SkAlpha255To256(SkColorGetB(fMul)); | 435 unsigned scaleB = SkAlpha255To256(SkColorGetB(fMul)); |
439 | 436 |
(...skipping 22 matching lines...) Expand all Loading... |
462 str->append(" add: 0x"); | 459 str->append(" add: 0x"); |
463 str->appendHex(fAdd); | 460 str->appendHex(fAdd); |
464 } | 461 } |
465 #endif | 462 #endif |
466 | 463 |
467 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLightingColorFilter_No
Pin) | 464 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLightingColorFilter_No
Pin) |
468 | 465 |
469 protected: | 466 protected: |
470 SkLightingColorFilter_NoPin(SkFlattenableReadBuffer& buffer) | 467 SkLightingColorFilter_NoPin(SkFlattenableReadBuffer& buffer) |
471 : INHERITED(buffer) {} | 468 : INHERITED(buffer) {} |
472 | |
473 private: | |
474 typedef SkLightingColorFilter INHERITED; | |
475 }; | 469 }; |
476 | 470 |
477 /////////////////////////////////////////////////////////////////////////////// | 471 /////////////////////////////////////////////////////////////////////////////// |
478 | 472 |
479 class SkSimpleColorFilter : public SkColorFilter { | 473 class SkSimpleColorFilter : public SkColorFilter { |
480 public: | 474 public: |
481 static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) { | 475 static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) { |
482 return SkNEW(SkSimpleColorFilter); | 476 return SkNEW(SkSimpleColorFilter); |
483 } | 477 } |
484 | 478 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
538 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkModeColorFilter) | 532 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkModeColorFilter) |
539 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(Src_SkModeColorFilter) | 533 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(Src_SkModeColorFilter) |
540 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SrcOver_SkModeColorFilter) | 534 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SrcOver_SkModeColorFilter) |
541 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLightingColorFilter) | 535 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLightingColorFilter) |
542 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLightingColorFilter_JustAdd) | 536 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLightingColorFilter_JustAdd) |
543 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLightingColorFilter_JustMul) | 537 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLightingColorFilter_JustMul) |
544 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLightingColorFilter_SingleMul) | 538 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLightingColorFilter_SingleMul) |
545 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLightingColorFilter_NoPin) | 539 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLightingColorFilter_NoPin) |
546 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSimpleColorFilter) | 540 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSimpleColorFilter) |
547 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 541 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |