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 #include "SkXfermode.h" | 9 #include "SkXfermode.h" |
10 #include "SkXfermode_opts_SSE2.h" | 10 #include "SkXfermode_opts_SSE2.h" |
(...skipping 649 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
660 { exclusion_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 660 { exclusion_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
661 { multiply_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 661 { multiply_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
662 { hue_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 662 { hue_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
663 { saturation_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 663 { saturation_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
664 { color_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 664 { color_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
665 { luminosity_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 665 { luminosity_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
666 }; | 666 }; |
667 | 667 |
668 /////////////////////////////////////////////////////////////////////////////// | 668 /////////////////////////////////////////////////////////////////////////////// |
669 | 669 |
670 bool SkXfermode::asCoeff(Coeff* src, Coeff* dst) const { | |
671 return false; | |
672 } | |
673 | |
674 bool SkXfermode::asMode(Mode* mode) const { | 670 bool SkXfermode::asMode(Mode* mode) const { |
675 return false; | 671 return false; |
676 } | 672 } |
677 | 673 |
678 bool SkXfermode::asFragmentProcessor(GrFragmentProcessor**, GrTexture*) const { | 674 bool SkXfermode::asFragmentProcessor(GrFragmentProcessor**, GrTexture*) const { |
679 return false; | 675 return false; |
680 } | 676 } |
681 | 677 |
682 bool SkXfermode::asXPFactory(GrXPFactory**) const { | 678 bool SkXfermode::asXPFactory(GrXPFactory**) const { |
683 return false; | 679 return false; |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
776 (SkPMColor)(dstA << SK_A32_SHIFT))); | 772 (SkPMColor)(dstA << SK_A32_SHIFT))); |
777 if (0xFF != a) { | 773 if (0xFF != a) { |
778 A = SkAlphaBlend(A, dstA, SkAlpha255To256(a)); | 774 A = SkAlphaBlend(A, dstA, SkAlpha255To256(a)); |
779 } | 775 } |
780 dst[i] = SkToU8(A); | 776 dst[i] = SkToU8(A); |
781 } | 777 } |
782 } | 778 } |
783 } | 779 } |
784 } | 780 } |
785 | 781 |
| 782 bool SkXfermode::supportsCoverageAsAlpha() const { |
| 783 return false; |
| 784 } |
| 785 |
| 786 bool SkXfermode::isOpaque(SkXfermode::SrcColorOpacity opacityType) const { |
| 787 return false; |
| 788 } |
| 789 |
786 /////////////////////////////////////////////////////////////////////////////// | 790 /////////////////////////////////////////////////////////////////////////////// |
787 /////////////////////////////////////////////////////////////////////////////// | 791 /////////////////////////////////////////////////////////////////////////////// |
788 | 792 |
789 SkFlattenable* SkProcCoeffXfermode::CreateProc(SkReadBuffer& buffer) { | 793 SkFlattenable* SkProcCoeffXfermode::CreateProc(SkReadBuffer& buffer) { |
790 uint32_t mode32 = buffer.read32(); | 794 uint32_t mode32 = buffer.read32(); |
791 if (!buffer.validate(mode32 < SK_ARRAY_COUNT(gProcCoeffs))) { | 795 if (!buffer.validate(mode32 < SK_ARRAY_COUNT(gProcCoeffs))) { |
792 return NULL; | 796 return NULL; |
793 } | 797 } |
794 return SkXfermode::Create((SkXfermode::Mode)mode32); | 798 return SkXfermode::Create((SkXfermode::Mode)mode32); |
795 } | 799 } |
796 | 800 |
797 void SkProcCoeffXfermode::flatten(SkWriteBuffer& buffer) const { | 801 void SkProcCoeffXfermode::flatten(SkWriteBuffer& buffer) const { |
798 buffer.write32(fMode); | 802 buffer.write32(fMode); |
799 } | 803 } |
800 | 804 |
801 bool SkProcCoeffXfermode::asMode(Mode* mode) const { | 805 bool SkProcCoeffXfermode::asMode(Mode* mode) const { |
802 if (mode) { | 806 if (mode) { |
803 *mode = fMode; | 807 *mode = fMode; |
804 } | 808 } |
805 return true; | 809 return true; |
806 } | 810 } |
807 | 811 |
808 bool SkProcCoeffXfermode::asCoeff(Coeff* sc, Coeff* dc) const { | 812 bool SkProcCoeffXfermode::supportsCoverageAsAlpha() const { |
809 if (CANNOT_USE_COEFF == fSrcCoeff) { | 813 if (CANNOT_USE_COEFF == fSrcCoeff) { |
810 return false; | 814 return false; |
811 } | 815 } |
812 | 816 |
813 if (sc) { | 817 switch (fDstCoeff) { |
814 *sc = fSrcCoeff; | 818 case SkXfermode::kOne_Coeff: |
| 819 case SkXfermode::kISA_Coeff: |
| 820 case SkXfermode::kISC_Coeff: |
| 821 return true; |
| 822 default: |
| 823 return false; |
815 } | 824 } |
816 if (dc) { | 825 } |
817 *dc = fDstCoeff; | 826 |
| 827 bool SkProcCoeffXfermode::isOpaque(SkXfermode::SrcColorOpacity opacityType) cons
t { |
| 828 if (CANNOT_USE_COEFF == fSrcCoeff) { |
| 829 return false; |
818 } | 830 } |
819 return true; | 831 |
| 832 if (SkXfermode::kDA_Coeff == fSrcCoeff || SkXfermode::kDC_Coeff == fSrcCoeff
|| |
| 833 SkXfermode::kIDA_Coeff == fSrcCoeff || SkXfermode::kIDC_Coeff == fSrcCoe
ff) { |
| 834 return false; |
| 835 } |
| 836 |
| 837 switch (fDstCoeff) { |
| 838 case SkXfermode::kZero_Coeff: |
| 839 return true; |
| 840 case SkXfermode::kISA_Coeff: |
| 841 return SkXfermode::kOpaque_SrcColorOpacity == opacityType; |
| 842 case SkXfermode::kSA_Coeff: |
| 843 return SkXfermode::kTransparentBlack_SrcColorOpacity == opacityType
|| |
| 844 SkXfermode::kTransparentAlpha_SrcColorOpacity == opacityType; |
| 845 case SkXfermode::kSC_Coeff: |
| 846 return SkXfermode::kTransparentBlack_SrcColorOpacity == opacityType; |
| 847 default: |
| 848 return false; |
| 849 } |
| 850 |
820 } | 851 } |
821 | 852 |
822 void SkProcCoeffXfermode::xfer32(SkPMColor* SK_RESTRICT dst, | 853 void SkProcCoeffXfermode::xfer32(SkPMColor* SK_RESTRICT dst, |
823 const SkPMColor* SK_RESTRICT src, int count, | 854 const SkPMColor* SK_RESTRICT src, int count, |
824 const SkAlpha* SK_RESTRICT aa) const { | 855 const SkAlpha* SK_RESTRICT aa) const { |
825 SkASSERT(dst && src && count >= 0); | 856 SkASSERT(dst && src && count >= 0); |
826 | 857 |
827 SkXfermodeProc proc = fProc; | 858 SkXfermodeProc proc = fProc; |
828 | 859 |
829 if (proc) { | 860 if (proc) { |
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1302 bool SkXfermode::AsMode(const SkXfermode* xfer, Mode* mode) { | 1333 bool SkXfermode::AsMode(const SkXfermode* xfer, Mode* mode) { |
1303 if (NULL == xfer) { | 1334 if (NULL == xfer) { |
1304 if (mode) { | 1335 if (mode) { |
1305 *mode = kSrcOver_Mode; | 1336 *mode = kSrcOver_Mode; |
1306 } | 1337 } |
1307 return true; | 1338 return true; |
1308 } | 1339 } |
1309 return xfer->asMode(mode); | 1340 return xfer->asMode(mode); |
1310 } | 1341 } |
1311 | 1342 |
1312 bool SkXfermode::AsCoeff(const SkXfermode* xfer, Coeff* src, Coeff* dst) { | |
1313 if (NULL == xfer) { | |
1314 return ModeAsCoeff(kSrcOver_Mode, src, dst); | |
1315 } | |
1316 return xfer->asCoeff(src, dst); | |
1317 } | |
1318 | |
1319 bool SkXfermode::IsMode(const SkXfermode* xfer, Mode mode) { | 1343 bool SkXfermode::IsMode(const SkXfermode* xfer, Mode mode) { |
1320 // if xfer==null then the mode is srcover | 1344 // if xfer==null then the mode is srcover |
1321 Mode m = kSrcOver_Mode; | 1345 Mode m = kSrcOver_Mode; |
1322 if (xfer && !xfer->asMode(&m)) { | 1346 if (xfer && !xfer->asMode(&m)) { |
1323 return false; | 1347 return false; |
1324 } | 1348 } |
1325 return mode == m; | 1349 return mode == m; |
1326 } | 1350 } |
1327 | 1351 |
| 1352 bool SkXfermode::SupportsCoverageAsAlpha(const SkXfermode* xfer) { |
| 1353 // if xfer is NULL we treat it as srcOver which always supports coverageAsAl
pha |
| 1354 if (!xfer) { |
| 1355 return true; |
| 1356 } |
| 1357 |
| 1358 return xfer->supportsCoverageAsAlpha(); |
| 1359 } |
| 1360 |
| 1361 bool SkXfermode::IsOpaque(const SkXfermode* xfer, SrcColorOpacity opacityType) { |
| 1362 // if xfer is NULL we treat it as srcOver which is opaque if our src is opaq
ue |
| 1363 if (!xfer) { |
| 1364 return SkXfermode::kOpaque_SrcColorOpacity == opacityType; |
| 1365 } |
| 1366 |
| 1367 return xfer->isOpaque(opacityType); |
| 1368 } |
| 1369 |
1328 /////////////////////////////////////////////////////////////////////////////// | 1370 /////////////////////////////////////////////////////////////////////////////// |
1329 //////////// 16bit xfermode procs | 1371 //////////// 16bit xfermode procs |
1330 | 1372 |
1331 #ifdef SK_DEBUG | 1373 #ifdef SK_DEBUG |
1332 static bool require_255(SkPMColor src) { return SkGetPackedA32(src) == 0xFF; } | 1374 static bool require_255(SkPMColor src) { return SkGetPackedA32(src) == 0xFF; } |
1333 static bool require_0(SkPMColor src) { return SkGetPackedA32(src) == 0; } | 1375 static bool require_0(SkPMColor src) { return SkGetPackedA32(src) == 0; } |
1334 #endif | 1376 #endif |
1335 | 1377 |
1336 static uint16_t src_modeproc16_255(SkPMColor src, uint16_t dst) { | 1378 static uint16_t src_modeproc16_255(SkPMColor src, uint16_t dst) { |
1337 SkASSERT(require_255(src)); | 1379 SkASSERT(require_255(src)); |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1494 } else { | 1536 } else { |
1495 proc16 = rec.fProc16_General; | 1537 proc16 = rec.fProc16_General; |
1496 } | 1538 } |
1497 } | 1539 } |
1498 return proc16; | 1540 return proc16; |
1499 } | 1541 } |
1500 | 1542 |
1501 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) | 1543 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) |
1502 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) | 1544 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) |
1503 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1545 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |