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

Side by Side Diff: src/core/SkXfermode.cpp

Issue 864833002: Remove the need for asCoeff in SkXfermode. (Closed) Base URL: https://skia.googlesource.com/skia.git@moreXferCleanup
Patch Set: Created 5 years, 11 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
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698