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

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

Issue 23021015: Initial error handling code (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Added ImageFilter derived classes safety checks (retry) Created 7 years, 3 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
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 9
10 #include "SkXfermode.h" 10 #include "SkXfermode.h"
(...skipping 1420 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698