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-26 13:27:37 +0000
committerGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-02-26 13:27:37 +0000
commitf792a1b20747f769b28906a4b00fd67691ce8d0b (patch)
tree4c953a1345dbea2eb0ea01f85f6c1ae93ab86636 /src
parente600c3268e6f21545a3be4964e23c056e00ffb2f (diff)
Builder class for SkLayerRasterizer.
Provide builder class to make SkLayerRasterizer immutable. We have to keep the addLayer() methods for now because they are used in Chrome. They will be removed once this changed has been rolled into Chrome. An added benefit of this is that this class can only be allocated on the heap. BUG=skia:2187 R=reed@google.com, scroggo@google.com, mtklein@google.com Author: dominikg@chromium.org Review URL: https://codereview.chromium.org/176873004 git-svn-id: http://skia.googlecode.com/svn/trunk@13590 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src')
-rw-r--r--src/effects/SkLayerRasterizer.cpp62
1 files changed, 52 insertions, 10 deletions
diff --git a/src/effects/SkLayerRasterizer.cpp b/src/effects/SkLayerRasterizer.cpp
index a10d758ede..e35c5e828f 100644
--- a/src/effects/SkLayerRasterizer.cpp
+++ b/src/effects/SkLayerRasterizer.cpp
@@ -25,25 +25,36 @@ struct SkLayerRasterizer_Rec {
SkVector fOffset;
};
-SkLayerRasterizer::SkLayerRasterizer() : fLayers(sizeof(SkLayerRasterizer_Rec))
+SkLayerRasterizer::SkLayerRasterizer()
+ : fLayers(SkNEW_ARGS(SkDeque, (sizeof(SkLayerRasterizer_Rec))))
+{
+}
+
+SkLayerRasterizer::SkLayerRasterizer(SkDeque* layers) : fLayers(layers)
{
}
SkLayerRasterizer::~SkLayerRasterizer() {
- SkDeque::F2BIter iter(fLayers);
+ SkASSERT(fLayers);
+ SkDeque::F2BIter iter(*fLayers);
SkLayerRasterizer_Rec* rec;
while ((rec = (SkLayerRasterizer_Rec*)iter.next()) != NULL)
rec->fPaint.~SkPaint();
+
+ SkDELETE(fLayers);
}
+#ifdef SK_SUPPORT_LEGACY_LAYERRASTERIZER_API
void SkLayerRasterizer::addLayer(const SkPaint& paint, SkScalar dx,
SkScalar dy) {
- SkLayerRasterizer_Rec* rec = (SkLayerRasterizer_Rec*)fLayers.push_back();
+ SkASSERT(fLayers);
+ SkLayerRasterizer_Rec* rec = (SkLayerRasterizer_Rec*)fLayers->push_back();
SkNEW_PLACEMENT_ARGS(&rec->fPaint, SkPaint, (paint));
rec->fOffset.set(dx, dy);
}
+#endif
static bool compute_bounds(const SkDeque& layers, const SkPath& path,
const SkMatrix& matrix,
@@ -89,12 +100,13 @@ static bool compute_bounds(const SkDeque& layers, const SkPath& path,
bool SkLayerRasterizer::onRasterize(const SkPath& path, const SkMatrix& matrix,
const SkIRect* clipBounds,
SkMask* mask, SkMask::CreateMode mode) const {
- if (fLayers.empty()) {
+ SkASSERT(fLayers);
+ if (fLayers->empty()) {
return false;
}
if (SkMask::kJustRenderImage_CreateMode != mode) {
- if (!compute_bounds(fLayers, path, matrix, clipBounds, &mask->fBounds))
+ if (!compute_bounds(*fLayers, path, matrix, clipBounds, &mask->fBounds))
return false;
}
@@ -131,7 +143,7 @@ bool SkLayerRasterizer::onRasterize(const SkPath& path, const SkMatrix& matrix,
// we set the matrixproc in the loop, as the matrix changes each time (potentially)
draw.fBounder = NULL;
- SkDeque::F2BIter iter(fLayers);
+ SkDeque::F2BIter iter(*fLayers);
SkLayerRasterizer_Rec* rec;
while ((rec = (SkLayerRasterizer_Rec*)iter.next()) != NULL) {
@@ -144,24 +156,29 @@ bool SkLayerRasterizer::onRasterize(const SkPath& path, const SkMatrix& matrix,
}
SkLayerRasterizer::SkLayerRasterizer(SkReadBuffer& buffer)
- : SkRasterizer(buffer), fLayers(sizeof(SkLayerRasterizer_Rec)) {
+ : SkRasterizer(buffer), fLayers(ReadLayers(buffer)) {}
+
+SkDeque* SkLayerRasterizer::ReadLayers(SkReadBuffer& buffer) {
int count = buffer.readInt();
+ SkDeque* layers = SkNEW_ARGS(SkDeque, (sizeof(SkLayerRasterizer_Rec)));
for (int i = 0; i < count; i++) {
- SkLayerRasterizer_Rec* rec = (SkLayerRasterizer_Rec*)fLayers.push_back();
+ SkLayerRasterizer_Rec* rec = (SkLayerRasterizer_Rec*)layers->push_back();
SkNEW_PLACEMENT(&rec->fPaint, SkPaint);
buffer.readPaint(&rec->fPaint);
buffer.readPoint(&rec->fOffset);
}
+ return layers;
}
void SkLayerRasterizer::flatten(SkWriteBuffer& buffer) const {
this->INHERITED::flatten(buffer);
- buffer.writeInt(fLayers.count());
+ SkASSERT(fLayers);
+ buffer.writeInt(fLayers->count());
- SkDeque::F2BIter iter(fLayers);
+ SkDeque::F2BIter iter(*fLayers);
const SkLayerRasterizer_Rec* rec;
while ((rec = (const SkLayerRasterizer_Rec*)iter.next()) != NULL) {
@@ -169,3 +186,28 @@ void SkLayerRasterizer::flatten(SkWriteBuffer& buffer) const {
buffer.writePoint(rec->fOffset);
}
}
+
+SkLayerRasterizer::Builder::Builder()
+ : fLayers(SkNEW_ARGS(SkDeque, (sizeof(SkLayerRasterizer_Rec))))
+{
+}
+
+SkLayerRasterizer::Builder::~Builder()
+{
+ SkDELETE(fLayers);
+}
+
+void SkLayerRasterizer::Builder::addLayer(const SkPaint& paint, SkScalar dx,
+ SkScalar dy) {
+ SkASSERT(fLayers);
+ SkLayerRasterizer_Rec* rec = (SkLayerRasterizer_Rec*)fLayers->push_back();
+
+ SkNEW_PLACEMENT_ARGS(&rec->fPaint, SkPaint, (paint));
+ rec->fOffset.set(dx, dy);
+}
+
+SkLayerRasterizer* SkLayerRasterizer::Builder::detachRasterizer() {
+ SkLayerRasterizer* rasterizer = SkNEW_ARGS(SkLayerRasterizer, (fLayers));
+ fLayers = NULL;
+ return rasterizer;
+}