Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(103)

Side by Side Diff: src/effects/SkColorFilters.cpp

Issue 151353005: remove legacy LightingColorFilter impl (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2006 The Android Open Source Project 2 * Copyright 2006 The Android Open Source Project
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkBlitRow.h" 8 #include "SkBlitRow.h"
9 #include "SkColorFilter.h" 9 #include "SkColorFilter.h"
10 #include "SkColorPriv.h" 10 #include "SkColorPriv.h"
11 #include "SkReadBuffer.h" 11 #include "SkReadBuffer.h"
12 #include "SkWriteBuffer.h" 12 #include "SkWriteBuffer.h"
13 #include "SkUtils.h" 13 #include "SkUtils.h"
14 #include "SkString.h" 14 #include "SkString.h"
15 #include "SkValidationUtils.h" 15 #include "SkValidationUtils.h"
16 #include "SkColorMatrixFilter.h" 16 #include "SkColorMatrixFilter.h"
17 17
18 #define SK_MAP_LIGHTINGCOLORFILTER_TO_COLORMATRIX
19
20
21 #define ILLEGAL_XFERMODE_MODE ((SkXfermode::Mode)-1) 18 #define ILLEGAL_XFERMODE_MODE ((SkXfermode::Mode)-1)
22 19
23 // baseclass for filters that store a color and mode 20 // baseclass for filters that store a color and mode
24 class SkModeColorFilter : public SkColorFilter { 21 class SkModeColorFilter : public SkColorFilter {
25 public: 22 public:
26 SkModeColorFilter(SkColor color) { 23 SkModeColorFilter(SkColor color) {
27 fColor = color; 24 fColor = color;
28 fMode = ILLEGAL_XFERMODE_MODE; 25 fMode = ILLEGAL_XFERMODE_MODE;
29 this->updateCache(); 26 this->updateCache();
30 } 27 }
(...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after
534 return SkNEW_ARGS(Src_SkModeColorFilter, (color)); 531 return SkNEW_ARGS(Src_SkModeColorFilter, (color));
535 case SkXfermode::kSrcOver_Mode: 532 case SkXfermode::kSrcOver_Mode:
536 return SkNEW_ARGS(SrcOver_SkModeColorFilter, (color)); 533 return SkNEW_ARGS(SrcOver_SkModeColorFilter, (color));
537 default: 534 default:
538 return SkNEW_ARGS(SkModeColorFilter, (color, mode)); 535 return SkNEW_ARGS(SkModeColorFilter, (color, mode));
539 } 536 }
540 } 537 }
541 538
542 /////////////////////////////////////////////////////////////////////////////// 539 ///////////////////////////////////////////////////////////////////////////////
543 540
544 #ifdef SK_MAP_LIGHTINGCOLORFILTER_TO_COLORMATRIX
545
546 static SkScalar byte_to_scale(U8CPU byte) { 541 static SkScalar byte_to_scale(U8CPU byte) {
547 if (0xFF == byte) { 542 if (0xFF == byte) {
548 // want to get this exact 543 // want to get this exact
549 return 1; 544 return 1;
550 } else { 545 } else {
551 return byte * 0.00392156862745f; 546 return byte * 0.00392156862745f;
552 } 547 }
553 } 548 }
554 549
555 #else
556
557 static inline unsigned pin(unsigned value, unsigned max) {
558 if (value > max) {
559 value = max;
560 }
561 return value;
562 }
563
564 class SkLightingColorFilter : public SkColorFilter {
565 public:
566 SkLightingColorFilter(SkColor mul, SkColor add) : fMul(mul), fAdd(add) {}
567
568 virtual void filterSpan(const SkPMColor shader[], int count,
569 SkPMColor result[]) const SK_OVERRIDE {
570 unsigned scaleR = SkAlpha255To256(SkColorGetR(fMul));
571 unsigned scaleG = SkAlpha255To256(SkColorGetG(fMul));
572 unsigned scaleB = SkAlpha255To256(SkColorGetB(fMul));
573
574 unsigned addR = SkColorGetR(fAdd);
575 unsigned addG = SkColorGetG(fAdd);
576 unsigned addB = SkColorGetB(fAdd);
577
578 for (int i = 0; i < count; i++) {
579 SkPMColor c = shader[i];
580 if (c) {
581 unsigned a = SkGetPackedA32(c);
582 unsigned scaleA = SkAlpha255To256(a);
583 unsigned r = pin(SkAlphaMul(SkGetPackedR32(c), scaleR) + SkAlpha Mul(addR, scaleA), a);
584 unsigned g = pin(SkAlphaMul(SkGetPackedG32(c), scaleG) + SkAlpha Mul(addG, scaleA), a);
585 unsigned b = pin(SkAlphaMul(SkGetPackedB32(c), scaleB) + SkAlpha Mul(addB, scaleA), a);
586 c = SkPackARGB32(a, r, g, b);
587 }
588 result[i] = c;
589 }
590 }
591
592 #ifdef SK_DEVELOPER
593 virtual void toString(SkString* str) const SK_OVERRIDE {
594 str->append("SkLightingColorFilter: mul: 0x");
595 str->appendHex(fMul);
596 str->append(" add: 0x");
597 str->appendHex(fAdd);
598 }
599 #endif
600
601 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLightingColorFilter)
602
603 protected:
604 virtual void flatten(SkWriteBuffer& buffer) const SK_OVERRIDE {
605 this->INHERITED::flatten(buffer);
606 buffer.writeColor(fMul);
607 buffer.writeColor(fAdd);
608 }
609
610 SkLightingColorFilter(SkReadBuffer& buffer) {
611 fMul = buffer.readColor();
612 fAdd = buffer.readColor();
613 }
614
615 SkColor fMul, fAdd;
616
617 private:
618 typedef SkColorFilter INHERITED;
619 };
620
621 class SkLightingColorFilter_JustAdd : public SkLightingColorFilter {
622 public:
623 SkLightingColorFilter_JustAdd(SkColor mul, SkColor add)
624 : INHERITED(mul, add) {}
625
626 virtual void filterSpan(const SkPMColor shader[], int count,
627 SkPMColor result[]) const SK_OVERRIDE {
628 unsigned addR = SkColorGetR(fAdd);
629 unsigned addG = SkColorGetG(fAdd);
630 unsigned addB = SkColorGetB(fAdd);
631
632 for (int i = 0; i < count; i++) {
633 SkPMColor c = shader[i];
634 if (c) {
635 unsigned a = SkGetPackedA32(c);
636 unsigned scaleA = SkAlpha255To256(a);
637 unsigned r = pin(SkGetPackedR32(c) + SkAlphaMul(addR, scaleA), a );
638 unsigned g = pin(SkGetPackedG32(c) + SkAlphaMul(addG, scaleA), a );
639 unsigned b = pin(SkGetPackedB32(c) + SkAlphaMul(addB, scaleA), a );
640 c = SkPackARGB32(a, r, g, b);
641 }
642 result[i] = c;
643 }
644 }
645
646 #ifdef SK_DEVELOPER
647 virtual void toString(SkString* str) const SK_OVERRIDE {
648 str->append("SkLightingColorFilter_JustAdd: add: 0x");
649 str->appendHex(fAdd);
650 }
651 #endif
652
653 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLightingColorFilter_Ju stAdd)
654
655 protected:
656 SkLightingColorFilter_JustAdd(SkReadBuffer& buffer)
657 : INHERITED(buffer) {}
658
659 private:
660 typedef SkLightingColorFilter INHERITED;
661 };
662
663 class SkLightingColorFilter_JustMul : public SkLightingColorFilter {
664 public:
665 SkLightingColorFilter_JustMul(SkColor mul, SkColor add)
666 : INHERITED(mul, add) {}
667
668 virtual void filterSpan(const SkPMColor shader[], int count,
669 SkPMColor result[]) const SK_OVERRIDE {
670 unsigned scaleR = SkAlpha255To256(SkColorGetR(fMul));
671 unsigned scaleG = SkAlpha255To256(SkColorGetG(fMul));
672 unsigned scaleB = SkAlpha255To256(SkColorGetB(fMul));
673
674 for (int i = 0; i < count; i++) {
675 SkPMColor c = shader[i];
676 if (c) {
677 unsigned a = SkGetPackedA32(c);
678 unsigned r = SkAlphaMul(SkGetPackedR32(c), scaleR);
679 unsigned g = SkAlphaMul(SkGetPackedG32(c), scaleG);
680 unsigned b = SkAlphaMul(SkGetPackedB32(c), scaleB);
681 c = SkPackARGB32(a, r, g, b);
682 }
683 result[i] = c;
684 }
685 }
686
687 #ifdef SK_DEVELOPER
688 virtual void toString(SkString* str) const SK_OVERRIDE {
689 str->append("SkLightingColorFilter_JustMul: mul: 0x");
690 str->appendHex(fMul);
691 }
692 #endif
693
694 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLightingColorFilter_Ju stMul)
695
696 protected:
697 SkLightingColorFilter_JustMul(SkReadBuffer& buffer)
698 : INHERITED(buffer) {}
699
700 private:
701 typedef SkLightingColorFilter INHERITED;
702 };
703
704 class SkLightingColorFilter_SingleMul : public SkLightingColorFilter {
705 public:
706 SkLightingColorFilter_SingleMul(SkColor mul, SkColor add)
707 : INHERITED(mul, add) {
708 SkASSERT(SkColorGetR(add) == 0);
709 SkASSERT(SkColorGetG(add) == 0);
710 SkASSERT(SkColorGetB(add) == 0);
711 SkASSERT(SkColorGetR(mul) == SkColorGetG(mul));
712 SkASSERT(SkColorGetR(mul) == SkColorGetB(mul));
713 }
714
715 virtual uint32_t getFlags() const SK_OVERRIDE {
716 return this->INHERITED::getFlags() | (kAlphaUnchanged_Flag | kHasFilter1 6_Flag);
717 }
718
719 virtual void filterSpan16(const uint16_t shader[], int count,
720 uint16_t result[]) const SK_OVERRIDE {
721 // all mul components are the same
722 unsigned scale = SkAlpha255To256(SkColorGetR(fMul));
723
724 if (count > 0) {
725 do {
726 *result++ = SkAlphaMulRGB16(*shader++, scale);
727 } while (--count > 0);
728 }
729 }
730
731 #ifdef SK_DEVELOPER
732 virtual void toString(SkString* str) const SK_OVERRIDE {
733 str->append("SkLightingColorFilter_SingleMul: mul: 0x");
734 str->appendHex(fMul);
735 }
736 #endif
737
738 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLightingColorFilter_Si ngleMul)
739
740 protected:
741 SkLightingColorFilter_SingleMul(SkReadBuffer& buffer)
742 : INHERITED(buffer) {}
743
744 private:
745 typedef SkLightingColorFilter INHERITED;
746 };
747
748 class SkLightingColorFilter_NoPin : public SkLightingColorFilter {
749 public:
750 SkLightingColorFilter_NoPin(SkColor mul, SkColor add)
751 : INHERITED(mul, add) {}
752
753 virtual void filterSpan(const SkPMColor shader[], int count,
754 SkPMColor result[]) const SK_OVERRIDE {
755 unsigned scaleR = SkAlpha255To256(SkColorGetR(fMul));
756 unsigned scaleG = SkAlpha255To256(SkColorGetG(fMul));
757 unsigned scaleB = SkAlpha255To256(SkColorGetB(fMul));
758
759 unsigned addR = SkColorGetR(fAdd);
760 unsigned addG = SkColorGetG(fAdd);
761 unsigned addB = SkColorGetB(fAdd);
762
763 for (int i = 0; i < count; i++) {
764 SkPMColor c = shader[i];
765 if (c) {
766 unsigned a = SkGetPackedA32(c);
767 unsigned scaleA = SkAlpha255To256(a);
768 unsigned r = SkAlphaMul(SkGetPackedR32(c), scaleR) + SkAlphaMul( addR, scaleA);
769 unsigned g = SkAlphaMul(SkGetPackedG32(c), scaleG) + SkAlphaMul( addG, scaleA);
770 unsigned b = SkAlphaMul(SkGetPackedB32(c), scaleB) + SkAlphaMul( addB, scaleA);
771 c = SkPackARGB32(a, r, g, b);
772 }
773 result[i] = c;
774 }
775 }
776
777 #ifdef SK_DEVELOPER
778 virtual void toString(SkString* str) const SK_OVERRIDE {
779 str->append("SkLightingColorFilter_NoPin: mul: 0x");
780 str->appendHex(fMul);
781 str->append(" add: 0x");
782 str->appendHex(fAdd);
783 }
784 #endif
785
786 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLightingColorFilter_No Pin)
787
788 protected:
789 SkLightingColorFilter_NoPin(SkReadBuffer& buffer)
790 : INHERITED(buffer) {}
791
792 private:
793 typedef SkLightingColorFilter INHERITED;
794 };
795
796 class SkSimpleColorFilter : public SkColorFilter {
797 public:
798 static SkFlattenable* CreateProc(SkReadBuffer& buffer) {
799 return SkNEW(SkSimpleColorFilter);
800 }
801
802 #ifdef SK_DEVELOPER
803 virtual void toString(SkString* str) const SK_OVERRIDE {
804 str->append("SkSimpleColorFilter");
805 }
806 #endif
807
808 protected:
809 void filterSpan(const SkPMColor src[], int count, SkPMColor
810 result[]) const SK_OVERRIDE {
811 if (result != src) {
812 memcpy(result, src, count * sizeof(SkPMColor));
813 }
814 }
815
816 virtual void flatten(SkWriteBuffer& buffer) const SK_OVERRIDE {}
817
818 virtual Factory getFactory() const {
819 return CreateProc;
820 }
821
822 };
823
824 #endif // SK_MAP_LIGHTINGCOLORFILTER_TO_COLORMATRIX
825
826 SkColorFilter* SkColorFilter::CreateLightingFilter(SkColor mul, SkColor add) { 550 SkColorFilter* SkColorFilter::CreateLightingFilter(SkColor mul, SkColor add) {
827 #ifdef SK_MAP_LIGHTINGCOLORFILTER_TO_COLORMATRIX
828 SkColorMatrix matrix; 551 SkColorMatrix matrix;
829 matrix.setScale(byte_to_scale(SkColorGetR(mul)), 552 matrix.setScale(byte_to_scale(SkColorGetR(mul)),
830 byte_to_scale(SkColorGetG(mul)), 553 byte_to_scale(SkColorGetG(mul)),
831 byte_to_scale(SkColorGetB(mul)), 554 byte_to_scale(SkColorGetB(mul)),
832 1); 555 1);
833 matrix.postTranslate(SkIntToScalar(SkColorGetR(add)), 556 matrix.postTranslate(SkIntToScalar(SkColorGetR(add)),
834 SkIntToScalar(SkColorGetG(add)), 557 SkIntToScalar(SkColorGetG(add)),
835 SkIntToScalar(SkColorGetB(add)), 558 SkIntToScalar(SkColorGetB(add)),
836 0); 559 0);
837 return SkNEW_ARGS(SkColorMatrixFilter, (matrix)); 560 return SkNEW_ARGS(SkColorMatrixFilter, (matrix));
838 #else
839 mul &= 0x00FFFFFF;
840 add &= 0x00FFFFFF;
841
842 if (0xFFFFFF == mul) {
843 if (0 == add) {
844 return SkNEW(SkSimpleColorFilter); // no change to the colors
845 } else {
846 return SkNEW_ARGS(SkLightingColorFilter_JustAdd, (mul, add));
847 }
848 }
849
850 if (0 == add) {
851 if (SkColorGetR(mul) == SkColorGetG(mul) &&
852 SkColorGetR(mul) == SkColorGetB(mul)) {
853 return SkNEW_ARGS(SkLightingColorFilter_SingleMul, (mul, add));
854 } else {
855 return SkNEW_ARGS(SkLightingColorFilter_JustMul, (mul, add));
856 }
857 }
858
859 if (SkColorGetR(mul) + SkColorGetR(add) <= 255 &&
860 SkColorGetG(mul) + SkColorGetG(add) <= 255 &&
861 SkColorGetB(mul) + SkColorGetB(add) <= 255) {
862 return SkNEW_ARGS(SkLightingColorFilter_NoPin, (mul, add));
863 }
864
865 return SkNEW_ARGS(SkLightingColorFilter, (mul, add));
866 #endif
867 } 561 }
868 562
869 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkColorFilter) 563 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkColorFilter)
870 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkModeColorFilter) 564 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkModeColorFilter)
871 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(Src_SkModeColorFilter) 565 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(Src_SkModeColorFilter)
872 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SrcOver_SkModeColorFilter) 566 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SrcOver_SkModeColorFilter)
873 #ifndef SK_MAP_LIGHTINGCOLORFILTER_TO_COLORMATRIX
874 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLightingColorFilter)
875 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLightingColorFilter_JustAdd)
876 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLightingColorFilter_JustMul)
877 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLightingColorFilter_SingleMul)
878 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLightingColorFilter_NoPin)
879 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSimpleColorFilter)
880 #endif
881 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 567 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698