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" |
11 #include "SkColorPriv.h" | 11 #include "SkColorPriv.h" |
12 #include "SkFlattenableBuffers.h" | 12 #include "SkFlattenableBuffers.h" |
13 #include "SkMathPriv.h" | 13 #include "SkMathPriv.h" |
14 #include "SkString.h" | 14 #include "SkString.h" |
| 15 #include "SkValidationUtils.h" |
15 | 16 |
16 SK_DEFINE_INST_COUNT(SkXfermode) | 17 SK_DEFINE_INST_COUNT(SkXfermode) |
17 | 18 |
18 #define SkAlphaMulAlpha(a, b) SkMulDiv255Round(a, b) | 19 #define SkAlphaMulAlpha(a, b) SkMulDiv255Round(a, b) |
19 | 20 |
20 #if 0 | 21 #if 0 |
21 // idea for higher precision blends in xfer procs (and slightly faster) | 22 // idea for higher precision blends in xfer procs (and slightly faster) |
22 // see DstATop as a probable caller | 23 // see DstATop as a probable caller |
23 static U8CPU mulmuldiv255round(U8CPU a, U8CPU b, U8CPU c, U8CPU d) { | 24 static U8CPU mulmuldiv255round(U8CPU a, U8CPU b, U8CPU c, U8CPU d) { |
24 SkASSERT(a <= 255); | 25 SkASSERT(a <= 255); |
(...skipping 1377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1402 return false; | 1403 return false; |
1403 } | 1404 } |
1404 #endif | 1405 #endif |
1405 | 1406 |
1406 SK_DEVELOPER_TO_STRING() | 1407 SK_DEVELOPER_TO_STRING() |
1407 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkProcCoeffXfermode) | 1408 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkProcCoeffXfermode) |
1408 | 1409 |
1409 protected: | 1410 protected: |
1410 SkProcCoeffXfermode(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { | 1411 SkProcCoeffXfermode(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { |
1411 fMode = (SkXfermode::Mode)buffer.read32(); | 1412 fMode = (SkXfermode::Mode)buffer.read32(); |
1412 | 1413 bool modeIsValid = SkIsValidMode(fMode); |
1413 const ProcCoeff& rec = gProcCoeffs[fMode]; | 1414 if (modeIsValid) { |
1414 // these may be valid, or may be CANNOT_USE_COEFF | 1415 const ProcCoeff& rec = gProcCoeffs[fMode]; |
1415 fSrcCoeff = rec.fSC; | 1416 // these may be valid, or may be CANNOT_USE_COEFF |
1416 fDstCoeff = rec.fDC; | 1417 fSrcCoeff = rec.fSC; |
1417 // now update our function-ptr in the super class | 1418 fDstCoeff = rec.fDC; |
1418 this->INHERITED::setProc(rec.fProc); | 1419 // now update our function-ptr in the super class |
| 1420 this->INHERITED::setProc(rec.fProc); |
| 1421 } else { |
| 1422 fSrcCoeff = fDstCoeff = CANNOT_USE_COEFF; |
| 1423 } |
| 1424 buffer.validate(modeIsValid && |
| 1425 (SkIsValidCoeff(fSrcCoeff) || (fSrcCoeff == CANNOT_USE_C
OEFF)) && |
| 1426 (SkIsValidCoeff(fDstCoeff) || (fDstCoeff == CANNOT_USE_C
OEFF))); |
1419 } | 1427 } |
1420 | 1428 |
1421 virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE { | 1429 virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE { |
1422 this->INHERITED::flatten(buffer); | 1430 this->INHERITED::flatten(buffer); |
1423 buffer.write32(fMode); | 1431 buffer.write32(fMode); |
1424 } | 1432 } |
1425 | 1433 |
1426 private: | 1434 private: |
1427 Mode fMode; | 1435 Mode fMode; |
1428 Coeff fSrcCoeff, fDstCoeff; | 1436 Coeff fSrcCoeff, fDstCoeff; |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1681 } | 1689 } |
1682 | 1690 |
1683 #ifdef SK_DEVELOPER | 1691 #ifdef SK_DEVELOPER |
1684 void SkDstOutXfermode::toString(SkString* str) const { | 1692 void SkDstOutXfermode::toString(SkString* str) const { |
1685 this->INHERITED::toString(str); | 1693 this->INHERITED::toString(str); |
1686 } | 1694 } |
1687 #endif | 1695 #endif |
1688 | 1696 |
1689 /////////////////////////////////////////////////////////////////////////////// | 1697 /////////////////////////////////////////////////////////////////////////////// |
1690 | 1698 |
| 1699 SkFlattenable::Factory SkProcXfermode::GetFactory(SkFlattenable::Type type) { |
| 1700 switch(type) { |
| 1701 case SkFlattenable::kSkClearXfermode_Type: |
| 1702 return SkClearXfermode::CreateProc; |
| 1703 case SkFlattenable::kSkDstInXfermode_Type: |
| 1704 return SkDstInXfermode::CreateProc; |
| 1705 case SkFlattenable::kSkDstOutXfermode_Type: |
| 1706 return SkDstOutXfermode::CreateProc; |
| 1707 case SkFlattenable::kSkProcCoeffXfermode_Type: |
| 1708 return SkProcCoeffXfermode::CreateProc; |
| 1709 case SkFlattenable::kSkSrcXfermode_Type: |
| 1710 return SkSrcXfermode::CreateProc; |
| 1711 default: |
| 1712 break; |
| 1713 } |
| 1714 return NULL; |
| 1715 } |
| 1716 |
| 1717 SkFlattenable::TypeCheck SkProcXfermode::GetTypeCheck(SkFlattenable::Type type)
{ |
| 1718 switch(type) { |
| 1719 case SkFlattenable::kSkClearXfermode_Type: |
| 1720 return SkClearXfermode::IsA; |
| 1721 case SkFlattenable::kSkDstInXfermode_Type: |
| 1722 return SkDstInXfermode::IsA; |
| 1723 case SkFlattenable::kSkDstOutXfermode_Type: |
| 1724 return SkDstOutXfermode::IsA; |
| 1725 case SkFlattenable::kSkProcCoeffXfermode_Type: |
| 1726 return SkProcCoeffXfermode::IsA; |
| 1727 case SkFlattenable::kSkSrcXfermode_Type: |
| 1728 return SkSrcXfermode::IsA; |
| 1729 default: |
| 1730 break; |
| 1731 } |
| 1732 return NULL; |
| 1733 } |
| 1734 |
| 1735 /////////////////////////////////////////////////////////////////////////////// |
| 1736 |
1691 SkXfermode* SkXfermode::Create(Mode mode) { | 1737 SkXfermode* SkXfermode::Create(Mode mode) { |
1692 SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount); | 1738 SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount); |
1693 SkASSERT((unsigned)mode < kModeCount); | 1739 SkASSERT((unsigned)mode < kModeCount); |
1694 | 1740 |
1695 const ProcCoeff& rec = gProcCoeffs[mode]; | 1741 const ProcCoeff& rec = gProcCoeffs[mode]; |
1696 | 1742 |
1697 switch (mode) { | 1743 switch (mode) { |
1698 case kClear_Mode: | 1744 case kClear_Mode: |
1699 return SkNEW_ARGS(SkClearXfermode, (rec)); | 1745 return SkNEW_ARGS(SkClearXfermode, (rec)); |
1700 case kSrc_Mode: | 1746 case kSrc_Mode: |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1941 return proc16; | 1987 return proc16; |
1942 } | 1988 } |
1943 | 1989 |
1944 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) | 1990 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) |
1945 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) | 1991 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) |
1946 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkClearXfermode) | 1992 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkClearXfermode) |
1947 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode) | 1993 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode) |
1948 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode) | 1994 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode) |
1949 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode) | 1995 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode) |
1950 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1996 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |