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" |
(...skipping 1420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1431 protected: | 1431 protected: |
1432 SkProcCoeffXfermode(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { | 1432 SkProcCoeffXfermode(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { |
1433 fMode = (SkXfermode::Mode)buffer.read32(); | 1433 fMode = (SkXfermode::Mode)buffer.read32(); |
1434 | 1434 |
1435 const ProcCoeff& rec = gProcCoeffs[fMode]; | 1435 const ProcCoeff& rec = gProcCoeffs[fMode]; |
1436 // these may be valid, or may be CANNOT_USE_COEFF | 1436 // these may be valid, or may be CANNOT_USE_COEFF |
1437 fSrcCoeff = rec.fSC; | 1437 fSrcCoeff = rec.fSC; |
1438 fDstCoeff = rec.fDC; | 1438 fDstCoeff = rec.fDC; |
1439 // now update our function-ptr in the super class | 1439 // now update our function-ptr in the super class |
1440 this->INHERITED::setProc(rec.fProc); | 1440 this->INHERITED::setProc(rec.fProc); |
| 1441 |
| 1442 buffer.validateData(IsValidMode(fMode) && |
| 1443 IsValidCoeff(fSrcCoeff) && |
| 1444 IsValidCoeff(fDstCoeff)); |
1441 } | 1445 } |
1442 | 1446 |
1443 virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE { | 1447 virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE { |
1444 this->INHERITED::flatten(buffer); | 1448 this->INHERITED::flatten(buffer); |
1445 buffer.write32(fMode); | 1449 buffer.write32(fMode); |
1446 } | 1450 } |
1447 | 1451 |
1448 private: | 1452 private: |
1449 Mode fMode; | 1453 Mode fMode; |
1450 Coeff fSrcCoeff, fDstCoeff; | 1454 Coeff fSrcCoeff, fDstCoeff; |
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1774 return xfer->asMode(mode); | 1778 return xfer->asMode(mode); |
1775 } | 1779 } |
1776 | 1780 |
1777 bool SkXfermode::AsCoeff(const SkXfermode* xfer, Coeff* src, Coeff* dst) { | 1781 bool SkXfermode::AsCoeff(const SkXfermode* xfer, Coeff* src, Coeff* dst) { |
1778 if (NULL == xfer) { | 1782 if (NULL == xfer) { |
1779 return ModeAsCoeff(kSrcOver_Mode, src, dst); | 1783 return ModeAsCoeff(kSrcOver_Mode, src, dst); |
1780 } | 1784 } |
1781 return xfer->asCoeff(src, dst); | 1785 return xfer->asCoeff(src, dst); |
1782 } | 1786 } |
1783 | 1787 |
| 1788 bool SkXfermode::IsValidCoeff(Coeff coeff) { |
| 1789 return coeff >= 0 && coeff < kCoeffCount; |
| 1790 } |
| 1791 |
1784 bool SkXfermode::IsMode(const SkXfermode* xfer, Mode mode) { | 1792 bool SkXfermode::IsMode(const SkXfermode* xfer, Mode mode) { |
1785 // if xfer==null then the mode is srcover | 1793 // if xfer==null then the mode is srcover |
1786 Mode m = kSrcOver_Mode; | 1794 Mode m = kSrcOver_Mode; |
1787 if (xfer && !xfer->asMode(&m)) { | 1795 if (xfer && !xfer->asMode(&m)) { |
1788 return false; | 1796 return false; |
1789 } | 1797 } |
1790 return mode == m; | 1798 return mode == m; |
1791 } | 1799 } |
1792 | 1800 |
| 1801 bool SkXfermode::IsValidMode(Mode mode) { |
| 1802 return (mode >= 0) && (mode <= SkXfermode::kLastMode); |
| 1803 } |
| 1804 |
1793 /////////////////////////////////////////////////////////////////////////////// | 1805 /////////////////////////////////////////////////////////////////////////////// |
1794 //////////// 16bit xfermode procs | 1806 //////////// 16bit xfermode procs |
1795 | 1807 |
1796 #ifdef SK_DEBUG | 1808 #ifdef SK_DEBUG |
1797 static bool require_255(SkPMColor src) { return SkGetPackedA32(src) == 0xFF; } | 1809 static bool require_255(SkPMColor src) { return SkGetPackedA32(src) == 0xFF; } |
1798 static bool require_0(SkPMColor src) { return SkGetPackedA32(src) == 0; } | 1810 static bool require_0(SkPMColor src) { return SkGetPackedA32(src) == 0; } |
1799 #endif | 1811 #endif |
1800 | 1812 |
1801 static uint16_t src_modeproc16_255(SkPMColor src, uint16_t dst) { | 1813 static uint16_t src_modeproc16_255(SkPMColor src, uint16_t dst) { |
1802 SkASSERT(require_255(src)); | 1814 SkASSERT(require_255(src)); |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1963 return proc16; | 1975 return proc16; |
1964 } | 1976 } |
1965 | 1977 |
1966 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) | 1978 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) |
1967 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) | 1979 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) |
1968 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkClearXfermode) | 1980 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkClearXfermode) |
1969 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode) | 1981 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode) |
1970 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode) | 1982 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode) |
1971 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode) | 1983 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode) |
1972 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1984 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |