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

Side by Side Diff: skia/sgl/SkXfermode.cpp

Issue 93093: Implement canvas's globalCompositeOperation lighter properly.... (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: '' Created 11 years, 8 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 | Annotate | Revision Log
« no previous file with comments | « skia/sgl/SkMask.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « skia/sgl/SkMask.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698