diff options
author | 2014-02-20 20:40:19 +0000 | |
---|---|---|
committer | 2014-02-20 20:40:19 +0000 | |
commit | 0a2bf90dccba3bde188e0386a7f0c60e6dde1ae9 (patch) | |
tree | aa5c4198b4a200d6efe87d1a81964c8c219c1091 /src | |
parent | 4012ba51a218883daef6c9be142f970b8ef5d0d2 (diff) |
Factory methods for heap-allocated SkPathEffect and SkXfermode objects.
This is part of an effort to ensure that all SkPaint effects can only be
allocated on the heap.
This patch makes the constructors of SkPathEffect, SkXfermode and
their subclasses non-public and instead provides factory methods for
creating these objects on the heap. We temporarily keep the constructors
of the following classes public to not break Chrome/Blink:
SkXfermode
SkCornerPathEffect
SkDashPathEffect
BUG=skia:2187
R=scroggo@google.com, reed@google.com, mtklein@google.com, bungeman@google.com
Author: dominikg@chromium.org
Review URL: https://codereview.chromium.org/166583002
git-svn-id: http://skia.googlecode.com/svn/trunk@13519 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src')
-rw-r--r-- | src/animator/SkDrawDash.cpp | 2 | ||||
-rw-r--r-- | src/animator/SkDrawDiscrete.cpp | 2 | ||||
-rw-r--r-- | src/animator/SkDrawExtraPathEffect.cpp | 4 | ||||
-rw-r--r-- | src/core/SkXfermode.cpp | 30 | ||||
-rw-r--r-- | src/core/SkXfermode_proccoeff.h | 16 | ||||
-rw-r--r-- | src/effects/SkArithmeticMode.cpp | 16 | ||||
-rw-r--r-- | src/utils/debugger/SkDebugCanvas.cpp | 2 |
7 files changed, 46 insertions, 26 deletions
diff --git a/src/animator/SkDrawDash.cpp b/src/animator/SkDrawDash.cpp index 8e73aa1c2d..cfef30335b 100644 --- a/src/animator/SkDrawDash.cpp +++ b/src/animator/SkDrawDash.cpp @@ -31,5 +31,5 @@ SkPathEffect* SkDash::getPathEffect() { int count = intervals.count(); if (count == 0) return NULL; - return new SkDashPathEffect(intervals.begin(), count, phase); + return SkDashPathEffect::Create(intervals.begin(), count, phase); } diff --git a/src/animator/SkDrawDiscrete.cpp b/src/animator/SkDrawDiscrete.cpp index 18c3ee0f61..9376435950 100644 --- a/src/animator/SkDrawDiscrete.cpp +++ b/src/animator/SkDrawDiscrete.cpp @@ -30,5 +30,5 @@ SkPathEffect* SkDiscrete::getPathEffect() { if (deviation <= 0 || segLength <= 0) return NULL; else - return new SkDiscretePathEffect(segLength, deviation); + return SkDiscretePathEffect::Create(segLength, deviation); } diff --git a/src/animator/SkDrawExtraPathEffect.cpp b/src/animator/SkDrawExtraPathEffect.cpp index 7b991d251e..4b911d11c4 100644 --- a/src/animator/SkDrawExtraPathEffect.cpp +++ b/src/animator/SkDrawExtraPathEffect.cpp @@ -371,7 +371,7 @@ bool SkDrawComposePathEffect::addChild(SkAnimateMaker& , SkDisplayable* child) { SkPathEffect* SkDrawComposePathEffect::getPathEffect() { SkPathEffect* e1 = effect1->getPathEffect(); SkPathEffect* e2 = effect2->getPathEffect(); - SkPathEffect* composite = new SkComposePathEffect(e1, e2); + SkPathEffect* composite = SkComposePathEffect::Create(e1, e2); e1->unref(); e2->unref(); return composite; @@ -401,7 +401,7 @@ SkDrawCornerPathEffect::~SkDrawCornerPathEffect() { } SkPathEffect* SkDrawCornerPathEffect::getPathEffect() { - return new SkCornerPathEffect(radius); + return SkCornerPathEffect::Create(radius); } ///////// diff --git a/src/core/SkXfermode.cpp b/src/core/SkXfermode.cpp index 66e0dea2f5..f5ac20b282 100644 --- a/src/core/SkXfermode.cpp +++ b/src/core/SkXfermode.cpp @@ -1444,7 +1444,9 @@ void SkProcCoeffXfermode::toString(SkString* str) const { class SkClearXfermode : public SkProcCoeffXfermode { public: - SkClearXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kClear_Mode) {} + static SkClearXfermode* Create(const ProcCoeff& rec) { + return SkNEW_ARGS(SkClearXfermode, (rec)); + } virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const SK_OVERRIDE; virtual void xferA8(SkAlpha*, const SkPMColor*, int, const SkAlpha*) const SK_OVERRIDE; @@ -1453,6 +1455,7 @@ public: SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkClearXfermode) private: + SkClearXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kClear_Mode) {} SkClearXfermode(SkReadBuffer& buffer) : SkProcCoeffXfermode(buffer) {} @@ -1506,7 +1509,9 @@ void SkClearXfermode::toString(SkString* str) const { class SkSrcXfermode : public SkProcCoeffXfermode { public: - SkSrcXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kSrc_Mode) {} + static SkSrcXfermode* Create(const ProcCoeff& rec) { + return SkNEW_ARGS(SkSrcXfermode, (rec)); + } virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const SK_OVERRIDE; virtual void xferA8(SkAlpha*, const SkPMColor*, int, const SkAlpha*) const SK_OVERRIDE; @@ -1515,6 +1520,7 @@ public: SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSrcXfermode) private: + SkSrcXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kSrc_Mode) {} SkSrcXfermode(SkReadBuffer& buffer) : SkProcCoeffXfermode(buffer) {} @@ -1573,7 +1579,9 @@ void SkSrcXfermode::toString(SkString* str) const { class SkDstInXfermode : public SkProcCoeffXfermode { public: - SkDstInXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kDstIn_Mode) {} + static SkDstInXfermode* Create(const ProcCoeff& rec) { + return SkNEW_ARGS(SkDstInXfermode, (rec)); + } virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const SK_OVERRIDE; @@ -1581,6 +1589,7 @@ public: SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDstInXfermode) private: + SkDstInXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kDstIn_Mode) {} SkDstInXfermode(SkReadBuffer& buffer) : INHERITED(buffer) {} typedef SkProcCoeffXfermode INHERITED; @@ -1616,7 +1625,9 @@ void SkDstInXfermode::toString(SkString* str) const { class SkDstOutXfermode : public SkProcCoeffXfermode { public: - SkDstOutXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kDstOut_Mode) {} + static SkDstOutXfermode* Create(const ProcCoeff& rec) { + return SkNEW_ARGS(SkDstOutXfermode, (rec)); + } virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const SK_OVERRIDE; @@ -1624,6 +1635,7 @@ public: SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDstOutXfermode) private: + SkDstOutXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kDstOut_Mode) {} SkDstOutXfermode(SkReadBuffer& buffer) : INHERITED(buffer) {} @@ -1712,23 +1724,23 @@ SkXfermode* SkXfermode::Create(Mode mode) { // commonly used, so we call those out for their own subclasses here. switch (mode) { case kClear_Mode: - xfer = SkNEW_ARGS(SkClearXfermode, (rec)); + xfer = SkClearXfermode::Create(rec); break; case kSrc_Mode: - xfer = SkNEW_ARGS(SkSrcXfermode, (rec)); + xfer = SkSrcXfermode::Create(rec); break; case kSrcOver_Mode: SkASSERT(false); // should not land here break; case kDstIn_Mode: - xfer = SkNEW_ARGS(SkDstInXfermode, (rec)); + xfer = SkDstInXfermode::Create(rec); break; case kDstOut_Mode: - xfer = SkNEW_ARGS(SkDstOutXfermode, (rec)); + xfer = SkDstOutXfermode::Create(rec); break; default: // no special-case, just rely in the rec and its function-ptrs - xfer = SkNEW_ARGS(SkProcCoeffXfermode, (rec, mode)); + xfer = SkProcCoeffXfermode::Create(rec, mode); break; } } diff --git a/src/core/SkXfermode_proccoeff.h b/src/core/SkXfermode_proccoeff.h index 1a2f7fcc7f..11121115f1 100644 --- a/src/core/SkXfermode_proccoeff.h +++ b/src/core/SkXfermode_proccoeff.h @@ -15,12 +15,8 @@ struct ProcCoeff { class SkProcCoeffXfermode : public SkProcXfermode { public: - SkProcCoeffXfermode(const ProcCoeff& rec, Mode mode) - : INHERITED(rec.fProc) { - fMode = mode; - // these may be valid, or may be CANNOT_USE_COEFF - fSrcCoeff = rec.fSC; - fDstCoeff = rec.fDC; + static SkProcCoeffXfermode* Create(const ProcCoeff& rec, Mode mode) { + return SkNEW_ARGS(SkProcCoeffXfermode, (rec, mode)); } virtual bool asMode(Mode* mode) const SK_OVERRIDE; @@ -36,6 +32,14 @@ public: SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkProcCoeffXfermode) protected: + SkProcCoeffXfermode(const ProcCoeff& rec, Mode mode) + : INHERITED(rec.fProc) { + fMode = mode; + // these may be valid, or may be CANNOT_USE_COEFF + fSrcCoeff = rec.fSC; + fDstCoeff = rec.fDC; + } + SkProcCoeffXfermode(SkReadBuffer& buffer); virtual void flatten(SkWriteBuffer& buffer) const SK_OVERRIDE; diff --git a/src/effects/SkArithmeticMode.cpp b/src/effects/SkArithmeticMode.cpp index 052b06507c..2121e3a81d 100644 --- a/src/effects/SkArithmeticMode.cpp +++ b/src/effects/SkArithmeticMode.cpp @@ -23,11 +23,8 @@ static const bool gUseUnpremul = false; class SkArithmeticMode_scalar : public SkXfermode { public: - SkArithmeticMode_scalar(SkScalar k1, SkScalar k2, SkScalar k3, SkScalar k4) { - fK[0] = k1; - fK[1] = k2; - fK[2] = k3; - fK[3] = k4; + static SkArithmeticMode_scalar* Create(SkScalar k1, SkScalar k2, SkScalar k3, SkScalar k4) { + return SkNEW_ARGS(SkArithmeticMode_scalar, (k1, k2, k3, k4)); } virtual void xfer32(SkPMColor dst[], const SkPMColor src[], int count, @@ -41,6 +38,13 @@ public: #endif private: + SkArithmeticMode_scalar(SkScalar k1, SkScalar k2, SkScalar k3, SkScalar k4) { + fK[0] = k1; + fK[1] = k2; + fK[2] = k3; + fK[3] = k4; + } + SkArithmeticMode_scalar(SkReadBuffer& buffer) : INHERITED(buffer) { fK[0] = buffer.readScalar(); fK[1] = buffer.readScalar(); @@ -216,7 +220,7 @@ SkXfermode* SkArithmeticMode::Create(SkScalar k1, SkScalar k2, return SkNEW_ARGS(SkArithmeticMode_linear, (i2, i3, i4)); #endif } - return SkNEW_ARGS(SkArithmeticMode_scalar, (k1, k2, k3, k4)); + return SkArithmeticMode_scalar::Create(k1, k2, k3, k4); } diff --git a/src/utils/debugger/SkDebugCanvas.cpp b/src/utils/debugger/SkDebugCanvas.cpp index 32a6570954..07cb09f381 100644 --- a/src/utils/debugger/SkDebugCanvas.cpp +++ b/src/utils/debugger/SkDebugCanvas.cpp @@ -118,7 +118,7 @@ static SkPMColor OverdrawXferModeProc(SkPMColor src, SkPMColor dst) { class SkOverdrawFilter : public SkDrawFilter { public: SkOverdrawFilter() { - fXferMode = new SkProcXfermode(OverdrawXferModeProc); + fXferMode = SkProcXfermode::Create(OverdrawXferModeProc); } virtual ~SkOverdrawFilter() { |