aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-02-20 20:40:19 +0000
committerGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-02-20 20:40:19 +0000
commit0a2bf90dccba3bde188e0386a7f0c60e6dde1ae9 (patch)
treeaa5c4198b4a200d6efe87d1a81964c8c219c1091 /src
parent4012ba51a218883daef6c9be142f970b8ef5d0d2 (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.cpp2
-rw-r--r--src/animator/SkDrawDiscrete.cpp2
-rw-r--r--src/animator/SkDrawExtraPathEffect.cpp4
-rw-r--r--src/core/SkXfermode.cpp30
-rw-r--r--src/core/SkXfermode_proccoeff.h16
-rw-r--r--src/effects/SkArithmeticMode.cpp16
-rw-r--r--src/utils/debugger/SkDebugCanvas.cpp2
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() {