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 "SkXfermode.h" | 10 #include "SkXfermode.h" |
(...skipping 756 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
767 (SkPMColor)(dstA << SK_A32_SHIFT))); | 767 (SkPMColor)(dstA << SK_A32_SHIFT))); |
768 if (0xFF != a) { | 768 if (0xFF != a) { |
769 A = SkAlphaBlend(A, dstA, SkAlpha255To256(a)); | 769 A = SkAlphaBlend(A, dstA, SkAlpha255To256(a)); |
770 } | 770 } |
771 dst[i] = SkToU8(A); | 771 dst[i] = SkToU8(A); |
772 } | 772 } |
773 } | 773 } |
774 } | 774 } |
775 } | 775 } |
776 | 776 |
777 /////////////////////////////////////////////////////////////////////////////// | |
778 #ifdef SK_SUPPORT_LEGACY_PROCXFERMODE | |
779 | |
780 void SkProcXfermode::xfer32(SkPMColor* SK_RESTRICT dst, | |
781 const SkPMColor* SK_RESTRICT src, int count, | |
782 const SkAlpha* SK_RESTRICT aa) const { | |
783 SkASSERT(dst && src && count >= 0); | |
784 | |
785 SkXfermodeProc proc = fProc; | |
786 | |
787 if (NULL != proc) { | |
788 if (NULL == aa) { | |
789 for (int i = count - 1; i >= 0; --i) { | |
790 dst[i] = proc(src[i], dst[i]); | |
791 } | |
792 } else { | |
793 for (int i = count - 1; i >= 0; --i) { | |
794 unsigned a = aa[i]; | |
795 if (0 != a) { | |
796 SkPMColor dstC = dst[i]; | |
797 SkPMColor C = proc(src[i], dstC); | |
798 if (a != 0xFF) { | |
799 C = SkFourByteInterp(C, dstC, a); | |
800 } | |
801 dst[i] = C; | |
802 } | |
803 } | |
804 } | |
805 } | |
806 } | |
807 | |
808 void SkProcXfermode::xfer16(uint16_t* SK_RESTRICT dst, | |
809 const SkPMColor* SK_RESTRICT src, int count, | |
810 const SkAlpha* SK_RESTRICT aa) const { | |
811 SkASSERT(dst && src && count >= 0); | |
812 | |
813 SkXfermodeProc proc = fProc; | |
814 | |
815 if (NULL != proc) { | |
816 if (NULL == aa) { | |
817 for (int i = count - 1; i >= 0; --i) { | |
818 SkPMColor dstC = SkPixel16ToPixel32(dst[i]); | |
819 dst[i] = SkPixel32ToPixel16_ToU16(proc(src[i], dstC)); | |
820 } | |
821 } else { | |
822 for (int i = count - 1; i >= 0; --i) { | |
823 unsigned a = aa[i]; | |
824 if (0 != a) { | |
825 SkPMColor dstC = SkPixel16ToPixel32(dst[i]); | |
826 SkPMColor C = proc(src[i], dstC); | |
827 if (0xFF != a) { | |
828 C = SkFourByteInterp(C, dstC, a); | |
829 } | |
830 dst[i] = SkPixel32ToPixel16_ToU16(C); | |
831 } | |
832 } | |
833 } | |
834 } | |
835 } | |
836 | |
837 void SkProcXfermode::xferA8(SkAlpha* SK_RESTRICT dst, | |
838 const SkPMColor* SK_RESTRICT src, int count, | |
839 const SkAlpha* SK_RESTRICT aa) const { | |
840 SkASSERT(dst && src && count >= 0); | |
841 | |
842 SkXfermodeProc proc = fProc; | |
843 | |
844 if (NULL != proc) { | |
845 if (NULL == aa) { | |
846 for (int i = count - 1; i >= 0; --i) { | |
847 SkPMColor res = proc(src[i], dst[i] << SK_A32_SHIFT); | |
848 dst[i] = SkToU8(SkGetPackedA32(res)); | |
849 } | |
850 } else { | |
851 for (int i = count - 1; i >= 0; --i) { | |
852 unsigned a = aa[i]; | |
853 if (0 != a) { | |
854 SkAlpha dstA = dst[i]; | |
855 SkPMColor res = proc(src[i], dstA << SK_A32_SHIFT); | |
856 unsigned A = SkGetPackedA32(res); | |
857 if (0xFF != a) { | |
858 A = SkAlphaBlend(A, dstA, SkAlpha255To256(a)); | |
859 } | |
860 dst[i] = SkToU8(A); | |
861 } | |
862 } | |
863 } | |
864 } | |
865 } | |
866 | |
867 SkProcXfermode::SkProcXfermode(SkReadBuffer& buffer) | |
868 : SkXfermode(buffer) { | |
869 fProc = NULL; | |
870 if (!buffer.isCrossProcess()) { | |
871 fProc = (SkXfermodeProc)buffer.readFunctionPtr(); | |
872 } | |
873 } | |
874 | |
875 void SkProcXfermode::flatten(SkWriteBuffer& buffer) const { | |
876 this->INHERITED::flatten(buffer); | |
877 if (!buffer.isCrossProcess()) { | |
878 buffer.writeFunctionPtr((void*)fProc); | |
879 } | |
880 } | |
881 | |
882 #ifndef SK_IGNORE_TO_STRING | |
883 void SkProcXfermode::toString(SkString* str) const { | |
884 str->appendf("SkProcXfermode: %p", fProc); | |
885 } | |
886 #endif | |
887 | |
888 #endif | |
889 ////////////////////////////////////////////////////////////////////////////// | 777 ////////////////////////////////////////////////////////////////////////////// |
890 | 778 |
891 #if SK_SUPPORT_GPU | 779 #if SK_SUPPORT_GPU |
892 | 780 |
893 #include "GrEffect.h" | 781 #include "GrEffect.h" |
894 #include "GrCoordTransform.h" | 782 #include "GrCoordTransform.h" |
895 #include "GrEffectUnitTest.h" | 783 #include "GrEffectUnitTest.h" |
896 #include "GrTBackendEffectFactory.h" | 784 #include "GrTBackendEffectFactory.h" |
897 #include "gl/GrGLEffect.h" | 785 #include "gl/GrGLEffect.h" |
898 | 786 |
(...skipping 1183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2082 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode) | 1970 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode) |
2083 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode) | 1971 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode) |
2084 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode) | 1972 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode) |
2085 #if !SK_ARM_NEON_IS_NONE | 1973 #if !SK_ARM_NEON_IS_NONE |
2086 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkNEONProcCoeffXfermode) | 1974 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkNEONProcCoeffXfermode) |
2087 #endif | 1975 #endif |
2088 #if defined(SK_CPU_X86) && !defined(SK_BUILD_FOR_IOS) | 1976 #if defined(SK_CPU_X86) && !defined(SK_BUILD_FOR_IOS) |
2089 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSSE2ProcCoeffXfermode) | 1977 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSSE2ProcCoeffXfermode) |
2090 #endif | 1978 #endif |
2091 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1979 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |