OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006 The Android Open Source Project | 2 * Copyright (C) 2006 The Android Open Source Project |
3 * | 3 * |
4 * Licensed under the Apache License, Version 2.0 (the "License"); | 4 * Licensed under the Apache License, Version 2.0 (the "License"); |
5 * you may not use this file except in compliance with the License. | 5 * you may not use this file except in compliance with the License. |
6 * You may obtain a copy of the License at | 6 * You may obtain a copy of the License at |
7 * | 7 * |
8 * http://www.apache.org/licenses/LICENSE-2.0 | 8 * http://www.apache.org/licenses/LICENSE-2.0 |
9 * | 9 * |
10 * Unless required by applicable law or agreed to in writing, software | 10 * Unless required by applicable law or agreed to in writing, software |
(...skipping 25 matching lines...) Expand all Loading... |
36 SkASSERT(a <= 255); | 36 SkASSERT(a <= 255); |
37 SkASSERT(b <= 255); | 37 SkASSERT(b <= 255); |
38 SkASSERT(c <= 255); | 38 SkASSERT(c <= 255); |
39 SkASSERT(d <= 255); | 39 SkASSERT(d <= 255); |
40 unsigned prod = SkMulS16(a, b) + SkMulS16(c, d) + 128; | 40 unsigned prod = SkMulS16(a, b) + SkMulS16(c, d) + 128; |
41 unsigned result = (prod + (prod >> 8)) >> 8; | 41 unsigned result = (prod + (prod >> 8)) >> 8; |
42 SkASSERT(result <= 255); | 42 SkASSERT(result <= 255); |
43 return result; | 43 return result; |
44 } | 44 } |
45 | 45 |
| 46 static unsigned saturated_add(unsigned a, unsigned b) { |
| 47 SkASSERT(a <= 255); |
| 48 SkASSERT(b <= 255); |
| 49 unsigned sum = a + b; |
| 50 if (sum > 255) { |
| 51 sum = 255; |
| 52 } |
| 53 return sum; |
| 54 } |
| 55 |
46 /////////////////////////////////////////////////////////////////////////////// | 56 /////////////////////////////////////////////////////////////////////////////// |
47 | 57 |
48 bool SkXfermode::asCoeff(Coeff* src, Coeff* dst) { | 58 bool SkXfermode::asCoeff(Coeff* src, Coeff* dst) { |
49 return false; | 59 return false; |
50 } | 60 } |
51 | 61 |
52 SkPMColor SkXfermode::xferColor(SkPMColor src, SkPMColor dst) { | 62 SkPMColor SkXfermode::xferColor(SkPMColor src, SkPMColor dst) { |
53 // no-op. subclasses should override this | 63 // no-op. subclasses should override this |
54 return dst; | 64 return dst; |
55 } | 65 } |
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
488 } | 498 } |
489 | 499 |
490 static SkPMColor screen_modeproc(SkPMColor src, SkPMColor dst) { | 500 static SkPMColor screen_modeproc(SkPMColor src, SkPMColor dst) { |
491 int a = screen_byte(SkGetPackedA32(src), SkGetPackedA32(dst)); | 501 int a = screen_byte(SkGetPackedA32(src), SkGetPackedA32(dst)); |
492 int r = screen_byte(SkGetPackedR32(src), SkGetPackedR32(dst)); | 502 int r = screen_byte(SkGetPackedR32(src), SkGetPackedR32(dst)); |
493 int g = screen_byte(SkGetPackedG32(src), SkGetPackedG32(dst)); | 503 int g = screen_byte(SkGetPackedG32(src), SkGetPackedG32(dst)); |
494 int b = screen_byte(SkGetPackedB32(src), SkGetPackedB32(dst)); | 504 int b = screen_byte(SkGetPackedB32(src), SkGetPackedB32(dst)); |
495 return SkPackARGB32(a, r, g, b); | 505 return SkPackARGB32(a, r, g, b); |
496 } | 506 } |
497 | 507 |
| 508 static SkPMColor add_modeproc(SkPMColor src, SkPMColor dst) { |
| 509 unsigned a = saturated_add(SkGetPackedA32(src), SkGetPackedA32(dst)); |
| 510 unsigned r = saturated_add(SkGetPackedR32(src), SkGetPackedR32(dst)); |
| 511 unsigned g = saturated_add(SkGetPackedG32(src), SkGetPackedG32(dst)); |
| 512 unsigned b = saturated_add(SkGetPackedB32(src), SkGetPackedB32(dst)); |
| 513 return SkPackARGB32(a, r, g, b); |
| 514 } |
| 515 |
498 /////////////////////////////////////////////////////////////////////////////// | 516 /////////////////////////////////////////////////////////////////////////////// |
499 | 517 |
500 class SkClearXfermode : public SkProcCoeffXfermode { | 518 class SkClearXfermode : public SkProcCoeffXfermode { |
501 public: | 519 public: |
502 SkClearXfermode() : SkProcCoeffXfermode(clear_modeproc, | 520 SkClearXfermode() : SkProcCoeffXfermode(clear_modeproc, |
503 kZero_Coeff, kZero_Coeff) {} | 521 kZero_Coeff, kZero_Coeff) {} |
504 | 522 |
505 virtual void xfer32(SK_RESTRICT SkPMColor dst[], | 523 virtual void xfer32(SK_RESTRICT SkPMColor dst[], |
506 const SK_RESTRICT SkPMColor[], int count, | 524 const SK_RESTRICT SkPMColor[], int count, |
507 const SK_RESTRICT SkAlpha aa[]) { | 525 const SK_RESTRICT SkAlpha aa[]) { |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
689 /////////////////////////////////////////////////////////////////////////////// | 707 /////////////////////////////////////////////////////////////////////////////// |
690 | 708 |
691 #include "SkPorterDuff.h" | 709 #include "SkPorterDuff.h" |
692 | 710 |
693 struct ProcCoeff { | 711 struct ProcCoeff { |
694 SkXfermodeProc fProc; | 712 SkXfermodeProc fProc; |
695 SkXfermode::Coeff fSC; | 713 SkXfermode::Coeff fSC; |
696 SkXfermode::Coeff fDC; | 714 SkXfermode::Coeff fDC; |
697 }; | 715 }; |
698 | 716 |
| 717 #define CANNOT_USE_COEFF SkXfermode::Coeff(-1) |
| 718 |
699 static const ProcCoeff gProcCoeffs[] = { | 719 static const ProcCoeff gProcCoeffs[] = { |
700 { clear_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kZero_Coeff }, | 720 { clear_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kZero_Coeff }, |
701 { src_modeproc, SkXfermode::kOne_Coeff, SkXfermode::kZero_Coeff }, | 721 { src_modeproc, SkXfermode::kOne_Coeff, SkXfermode::kZero_Coeff }, |
702 { dst_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kOne_Coeff }, | 722 { dst_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kOne_Coeff }, |
703 { srcover_modeproc, SkXfermode::kOne_Coeff, SkXfermode::kISA_Coeff }, | 723 { srcover_modeproc, SkXfermode::kOne_Coeff, SkXfermode::kISA_Coeff }, |
704 { dstover_modeproc, SkXfermode::kIDA_Coeff, SkXfermode::kOne_Coeff }, | 724 { dstover_modeproc, SkXfermode::kIDA_Coeff, SkXfermode::kOne_Coeff }, |
705 { srcin_modeproc, SkXfermode::kDA_Coeff, SkXfermode::kZero_Coeff }, | 725 { srcin_modeproc, SkXfermode::kDA_Coeff, SkXfermode::kZero_Coeff }, |
706 { dstin_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kSA_Coeff }, | 726 { dstin_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kSA_Coeff }, |
707 { srcout_modeproc, SkXfermode::kIDA_Coeff, SkXfermode::kZero_Coeff }, | 727 { srcout_modeproc, SkXfermode::kIDA_Coeff, SkXfermode::kZero_Coeff }, |
708 { dstout_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kISA_Coeff }, | 728 { dstout_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kISA_Coeff }, |
709 { srcatop_modeproc, SkXfermode::kDA_Coeff, SkXfermode::kISA_Coeff }, | 729 { srcatop_modeproc, SkXfermode::kDA_Coeff, SkXfermode::kISA_Coeff }, |
710 { dstatop_modeproc, SkXfermode::kIDA_Coeff, SkXfermode::kSA_Coeff }, | 730 { dstatop_modeproc, SkXfermode::kIDA_Coeff, SkXfermode::kSA_Coeff }, |
711 { xor_modeproc, SkXfermode::kIDA_Coeff, SkXfermode::kISA_Coeff }, | 731 { xor_modeproc, SkXfermode::kIDA_Coeff, SkXfermode::kISA_Coeff }, |
712 // these two can't be represented as coefficients | 732 { darken_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
713 { darken_modeproc, SkXfermode::Coeff(-1), SkXfermode::Coeff(-1) }, | 733 { lighten_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
714 { lighten_modeproc, SkXfermode::Coeff(-1), SkXfermode::Coeff(-1) }, | |
715 // these can use coefficients | |
716 { mult_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kSC_Coeff }, | 734 { mult_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kSC_Coeff }, |
717 { screen_modeproc, SkXfermode::kOne_Coeff, SkXfermode::kISC_Coeff } | 735 { screen_modeproc, SkXfermode::kOne_Coeff, SkXfermode::kISC_Coeff }, |
| 736 { add_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF } |
718 }; | 737 }; |
719 | 738 |
720 SkXfermode* SkPorterDuff::CreateXfermode(SkPorterDuff::Mode mode) { | 739 SkXfermode* SkPorterDuff::CreateXfermode(SkPorterDuff::Mode mode) { |
721 SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == SkPorterDuff::kModeCount); | 740 SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == SkPorterDuff::kModeCount); |
722 SkASSERT((unsigned)mode < SkPorterDuff::kModeCount); | 741 SkASSERT((unsigned)mode < SkPorterDuff::kModeCount); |
723 | 742 |
724 switch (mode) { | 743 switch (mode) { |
725 case kClear_Mode: | 744 case kClear_Mode: |
726 return SkNEW(SkClearXfermode); | 745 return SkNEW(SkClearXfermode); |
727 case kSrc_Mode: | 746 case kSrc_Mode: |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
969 proc16 = rec.fProc16_0; | 988 proc16 = rec.fProc16_0; |
970 } else if (255 == a) { | 989 } else if (255 == a) { |
971 proc16 = rec.fProc16_255; | 990 proc16 = rec.fProc16_255; |
972 } else { | 991 } else { |
973 proc16 = rec.fProc16_General; | 992 proc16 = rec.fProc16_General; |
974 } | 993 } |
975 } | 994 } |
976 return proc16; | 995 return proc16; |
977 } | 996 } |
978 | 997 |
OLD | NEW |