| Index: src/core/SkDraw.cpp
|
| diff --git a/src/core/SkDraw.cpp b/src/core/SkDraw.cpp
|
| index 175abb68440b34de7270c543c354fd9c273415b6..05b06453dbf200df8cebccfc3aee4c69825d5143 100644
|
| --- a/src/core/SkDraw.cpp
|
| +++ b/src/core/SkDraw.cpp
|
| @@ -21,9 +21,9 @@
|
| #include "SkRRect.h"
|
| #include "SkScan.h"
|
| #include "SkShader.h"
|
| +#include "SkSmallAllocator.h"
|
| #include "SkString.h"
|
| #include "SkStroke.h"
|
| -#include "SkTemplatesPriv.h"
|
| #include "SkTLazy.h"
|
| #include "SkUtils.h"
|
|
|
| @@ -32,9 +32,9 @@
|
| #include "SkDrawProcs.h"
|
| #include "SkMatrixUtils.h"
|
|
|
| +
|
| //#define TRACE_BITMAP_DRAWS
|
|
|
| -#define kBlitterStorageLongCount (sizeof(SkBitmapProcShader) >> 2)
|
|
|
| /** Helper for allocating small blitters on the stack.
|
| */
|
| @@ -45,16 +45,8 @@ public:
|
| }
|
| SkAutoBlitterChoose(const SkBitmap& device, const SkMatrix& matrix,
|
| const SkPaint& paint, bool drawCoverage = false) {
|
| - fBlitter = SkBlitter::Choose(device, matrix, paint,
|
| - fStorage, sizeof(fStorage), drawCoverage);
|
| - }
|
| -
|
| - ~SkAutoBlitterChoose() {
|
| - if ((void*)fBlitter == (void*)fStorage) {
|
| - fBlitter->~SkBlitter();
|
| - } else {
|
| - SkDELETE(fBlitter);
|
| - }
|
| + fBlitter = SkBlitter::Choose(device, matrix, paint, &fAllocator,
|
| + drawCoverage);
|
| }
|
|
|
| SkBlitter* operator->() { return fBlitter; }
|
| @@ -63,13 +55,13 @@ public:
|
| void choose(const SkBitmap& device, const SkMatrix& matrix,
|
| const SkPaint& paint) {
|
| SkASSERT(!fBlitter);
|
| - fBlitter = SkBlitter::Choose(device, matrix, paint,
|
| - fStorage, sizeof(fStorage));
|
| + fBlitter = SkBlitter::Choose(device, matrix, paint, &fAllocator);
|
| }
|
|
|
| private:
|
| - SkBlitter* fBlitter;
|
| - uint32_t fStorage[kBlitterStorageLongCount];
|
| + // Owned by fAllocator, which will handle the delete.
|
| + SkBlitter* fBlitter;
|
| + SkTBlitterAllocator fAllocator;
|
| };
|
| #define SkAutoBlitterChoose(...) SK_REQUIRE_LOCAL_VAR(SkAutoBlitterChoose)
|
|
|
| @@ -82,34 +74,29 @@ class SkAutoBitmapShaderInstall : SkNoncopyable {
|
| public:
|
| SkAutoBitmapShaderInstall(const SkBitmap& src, const SkPaint& paint)
|
| : fPaint(paint) /* makes a copy of the paint */ {
|
| - fPaint.setShader(SkShader::CreateBitmapShader(src,
|
| - SkShader::kClamp_TileMode, SkShader::kClamp_TileMode,
|
| - fStorage, sizeof(fStorage)));
|
| + fPaint.setShader(CreateBitmapShader(src, SkShader::kClamp_TileMode,
|
| + SkShader::kClamp_TileMode,
|
| + &fAllocator));
|
| // we deliberately left the shader with an owner-count of 2
|
| SkASSERT(2 == fPaint.getShader()->getRefCnt());
|
| }
|
|
|
| ~SkAutoBitmapShaderInstall() {
|
| - SkShader* shader = fPaint.getShader();
|
| - // since we manually destroy shader, we insist that owners == 2
|
| - SkASSERT(2 == shader->getRefCnt());
|
| + // since fAllocator will destroy shader, we insist that owners == 2
|
| + SkASSERT(2 == fPaint.getShader()->getRefCnt());
|
|
|
| fPaint.setShader(NULL); // unref the shader by 1
|
|
|
| - // now destroy to take care of the 2nd owner-count
|
| - if ((void*)shader == (void*)fStorage) {
|
| - shader->~SkShader();
|
| - } else {
|
| - SkDELETE(shader);
|
| - }
|
| }
|
|
|
| // return the new paint that has the shader applied
|
| const SkPaint& paintWithShader() const { return fPaint; }
|
|
|
| private:
|
| - SkPaint fPaint; // copy of caller's paint (which we then modify)
|
| - uint32_t fStorage[kBlitterStorageLongCount];
|
| + // copy of caller's paint (which we then modify)
|
| + SkPaint fPaint;
|
| + // Stores the shader.
|
| + SkTBlitterAllocator fAllocator;
|
| };
|
| #define SkAutoBitmapShaderInstall(...) SK_REQUIRE_LOCAL_VAR(SkAutoBitmapShaderInstall)
|
|
|
| @@ -1323,12 +1310,11 @@ void SkDraw::drawBitmap(const SkBitmap& bitmap, const SkMatrix& prematrix,
|
| int ix = SkScalarRoundToInt(matrix.getTranslateX());
|
| int iy = SkScalarRoundToInt(matrix.getTranslateY());
|
| if (clipHandlesSprite(*fRC, ix, iy, bitmap)) {
|
| - uint32_t storage[kBlitterStorageLongCount];
|
| - SkBlitter* blitter = SkBlitter::ChooseSprite(*fBitmap, paint, bitmap,
|
| - ix, iy, storage, sizeof(storage));
|
| + SkTBlitterAllocator allocator;
|
| + // blitter will be owned by the allocator.
|
| + SkBlitter* blitter = SkBlitter::ChooseSprite(*fBitmap, paint, bitmap,
|
| + ix, iy, &allocator);
|
| if (blitter) {
|
| - SkAutoTPlacementDelete<SkBlitter> ad(blitter, storage);
|
| -
|
| SkIRect ir;
|
| ir.set(ix, iy, ix + bitmap.width(), iy + bitmap.height());
|
|
|
| @@ -1378,13 +1364,12 @@ void SkDraw::drawSprite(const SkBitmap& bitmap, int x, int y,
|
| paint.setStyle(SkPaint::kFill_Style);
|
|
|
| if (NULL == paint.getColorFilter() && clipHandlesSprite(*fRC, x, y, bitmap)) {
|
| - uint32_t storage[kBlitterStorageLongCount];
|
| - SkBlitter* blitter = SkBlitter::ChooseSprite(*fBitmap, paint, bitmap,
|
| - x, y, storage, sizeof(storage));
|
| + SkTBlitterAllocator allocator;
|
| + // blitter will be owned by the allocator.
|
| + SkBlitter* blitter = SkBlitter::ChooseSprite(*fBitmap, paint, bitmap,
|
| + x, y, &allocator);
|
|
|
| if (blitter) {
|
| - SkAutoTPlacementDelete<SkBlitter> ad(blitter, storage);
|
| -
|
| if (fBounder && !fBounder->doIRect(bounds)) {
|
| return;
|
| }
|
|
|