OLD | NEW |
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 Loading... |
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 |
OLD | NEW |