diff options
Diffstat (limited to 'chromium/third_party/skia/src/effects/SkLayerRasterizer.cpp')
-rw-r--r-- | chromium/third_party/skia/src/effects/SkLayerRasterizer.cpp | 108 |
1 files changed, 91 insertions, 17 deletions
diff --git a/chromium/third_party/skia/src/effects/SkLayerRasterizer.cpp b/chromium/third_party/skia/src/effects/SkLayerRasterizer.cpp index ea5808c2b4e..90fd59b585b 100644 --- a/chromium/third_party/skia/src/effects/SkLayerRasterizer.cpp +++ b/chromium/third_party/skia/src/effects/SkLayerRasterizer.cpp @@ -9,7 +9,8 @@ #include "SkLayerRasterizer.h" #include "SkDraw.h" -#include "SkFlattenableBuffers.h" +#include "SkReadBuffer.h" +#include "SkWriteBuffer.h" #include "SkMask.h" #include "SkMaskFilter.h" #include "SkPaint.h" @@ -24,25 +25,41 @@ struct SkLayerRasterizer_Rec { SkVector fOffset; }; -SkLayerRasterizer::SkLayerRasterizer() : fLayers(sizeof(SkLayerRasterizer_Rec)) +SkLayerRasterizer::SkLayerRasterizer() + : fLayers(SkNEW_ARGS(SkDeque, (sizeof(SkLayerRasterizer_Rec)))) { } -SkLayerRasterizer::~SkLayerRasterizer() { - SkDeque::F2BIter iter(fLayers); +SkLayerRasterizer::SkLayerRasterizer(SkDeque* layers) : fLayers(layers) +{ +} + +// Helper function to call destructors on SkPaints held by layers and delete layers. +static void clean_up_layers(SkDeque* layers) { + SkDeque::F2BIter iter(*layers); SkLayerRasterizer_Rec* rec; while ((rec = (SkLayerRasterizer_Rec*)iter.next()) != NULL) rec->fPaint.~SkPaint(); + + SkDELETE(layers); +} + +SkLayerRasterizer::~SkLayerRasterizer() { + SkASSERT(fLayers); + clean_up_layers(const_cast<SkDeque*>(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, @@ -88,12 +105,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; } @@ -121,17 +139,15 @@ bool SkLayerRasterizer::onRasterize(const SkPath& path, const SkMatrix& matrix, translatedMatrix.postTranslate(-SkIntToScalar(mask->fBounds.fLeft), -SkIntToScalar(mask->fBounds.fTop)); - device.setConfig(SkBitmap::kA8_Config, mask->fBounds.width(), mask->fBounds.height(), mask->fRowBytes); - device.setPixels(mask->fImage); + device.installMaskPixels(*mask); draw.fBitmap = &device; draw.fMatrix = &drawMatrix; draw.fRC = &rectClip; draw.fClip = &rectClip.bwRgn(); // 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) { @@ -143,25 +159,30 @@ bool SkLayerRasterizer::onRasterize(const SkPath& path, const SkMatrix& matrix, return true; } -SkLayerRasterizer::SkLayerRasterizer(SkFlattenableReadBuffer& buffer) - : SkRasterizer(buffer), fLayers(sizeof(SkLayerRasterizer_Rec)) { +SkLayerRasterizer::SkLayerRasterizer(SkReadBuffer& buffer) + : 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(SkFlattenableWriteBuffer& buffer) const { +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 +190,56 @@ void SkLayerRasterizer::flatten(SkFlattenableWriteBuffer& buffer) const { buffer.writePoint(rec->fOffset); } } + +SkLayerRasterizer::Builder::Builder() + : fLayers(SkNEW_ARGS(SkDeque, (sizeof(SkLayerRasterizer_Rec)))) +{ +} + +SkLayerRasterizer::Builder::~Builder() +{ + if (fLayers != NULL) { + clean_up_layers(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; + if (0 == fLayers->count()) { + rasterizer = NULL; + SkDELETE(fLayers); + } else { + rasterizer = SkNEW_ARGS(SkLayerRasterizer, (fLayers)); + } + fLayers = NULL; + return rasterizer; +} + +SkLayerRasterizer* SkLayerRasterizer::Builder::snapshotRasterizer() const { + if (0 == fLayers->count()) { + return NULL; + } + SkDeque* layers = SkNEW_ARGS(SkDeque, (sizeof(SkLayerRasterizer_Rec), fLayers->count())); + SkDeque::F2BIter iter(*fLayers); + const SkLayerRasterizer_Rec* recOrig; + SkDEBUGCODE(int count = 0;) + while ((recOrig = static_cast<SkLayerRasterizer_Rec*>(iter.next())) != NULL) { + SkDEBUGCODE(count++); + SkLayerRasterizer_Rec* recCopy = static_cast<SkLayerRasterizer_Rec*>(layers->push_back()); + SkNEW_PLACEMENT_ARGS(&recCopy->fPaint, SkPaint, (recOrig->fPaint)); + recCopy->fOffset = recOrig->fOffset; + } + SkASSERT(fLayers->count() == count); + SkASSERT(layers->count() == count); + SkLayerRasterizer* rasterizer = SkNEW_ARGS(SkLayerRasterizer, (layers)); + return rasterizer; +} |