| Index: src/core/SkBlitter.cpp
|
| diff --git a/src/core/SkBlitter.cpp b/src/core/SkBlitter.cpp
|
| index 98325c024501aad838387952cfffdf6fcac98d58..f925eaa7b2d7f193ef076a7b696ef0db42c339ca 100644
|
| --- a/src/core/SkBlitter.cpp
|
| +++ b/src/core/SkBlitter.cpp
|
| @@ -11,16 +11,16 @@
|
| #include "SkAntiRun.h"
|
| #include "SkColor.h"
|
| #include "SkColorFilter.h"
|
| +#include "SkCoreBlitters.h"
|
| #include "SkFilterShader.h"
|
| #include "SkReadBuffer.h"
|
| #include "SkWriteBuffer.h"
|
| #include "SkMask.h"
|
| #include "SkMaskFilter.h"
|
| -#include "SkTemplatesPriv.h"
|
| +#include "SkString.h"
|
| #include "SkTLazy.h"
|
| #include "SkUtils.h"
|
| #include "SkXfermode.h"
|
| -#include "SkString.h"
|
|
|
| SkBlitter::~SkBlitter() {}
|
|
|
| @@ -705,15 +705,10 @@ private:
|
|
|
| class Sk3DBlitter : public SkBlitter {
|
| public:
|
| - Sk3DBlitter(SkBlitter* proxy, Sk3DShader* shader, void (*killProc)(void*))
|
| - : fProxy(proxy), f3DShader(shader), fKillProc(killProc) {
|
| - shader->ref();
|
| - }
|
| -
|
| - virtual ~Sk3DBlitter() {
|
| - f3DShader->unref();
|
| - fKillProc(fProxy);
|
| - }
|
| + Sk3DBlitter(SkBlitter* proxy, Sk3DShader* shader)
|
| + : fProxy(proxy)
|
| + , f3DShader(SkRef(shader))
|
| + {}
|
|
|
| virtual void blitH(int x, int y, int width) {
|
| fProxy->blitH(x, y, width);
|
| @@ -747,50 +742,15 @@ public:
|
| }
|
|
|
| private:
|
| - SkBlitter* fProxy;
|
| - Sk3DShader* f3DShader;
|
| - void (*fKillProc)(void*);
|
| + // fProxy is unowned. It will be deleted by SkSmallAllocator.
|
| + SkBlitter* fProxy;
|
| + SkAutoTUnref<Sk3DShader> f3DShader;
|
| };
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| #include "SkCoreBlitters.h"
|
|
|
| -class SkAutoCallProc {
|
| -public:
|
| - typedef void (*Proc)(void*);
|
| -
|
| - SkAutoCallProc(void* obj, Proc proc)
|
| - : fObj(obj), fProc(proc) {}
|
| -
|
| - ~SkAutoCallProc() {
|
| - if (fObj && fProc) {
|
| - fProc(fObj);
|
| - }
|
| - }
|
| -
|
| - void* get() const { return fObj; }
|
| -
|
| - void* detach() {
|
| - void* obj = fObj;
|
| - fObj = NULL;
|
| - return obj;
|
| - }
|
| -
|
| -private:
|
| - void* fObj;
|
| - Proc fProc;
|
| -};
|
| -#define SkAutoCallProc(...) SK_REQUIRE_LOCAL_VAR(SkAutoCallProc)
|
| -
|
| -static void destroy_blitter(void* blitter) {
|
| - ((SkBlitter*)blitter)->~SkBlitter();
|
| -}
|
| -
|
| -static void delete_blitter(void* blitter) {
|
| - SkDELETE((SkBlitter*)blitter);
|
| -}
|
| -
|
| static bool just_solid_color(const SkPaint& paint) {
|
| if (paint.getAlpha() == 0xFF && paint.getColorFilter() == NULL) {
|
| SkShader* shader = paint.getShader();
|
| @@ -852,9 +812,9 @@ static XferInterp interpret_xfermode(const SkPaint& paint, SkXfermode* xfer,
|
| SkBlitter* SkBlitter::Choose(const SkBitmap& device,
|
| const SkMatrix& matrix,
|
| const SkPaint& origPaint,
|
| - void* storage, size_t storageSize,
|
| + SkTBlitterAllocator* allocator,
|
| bool drawCoverage) {
|
| - SkASSERT(storageSize == 0 || storage != NULL);
|
| + SkASSERT(allocator != NULL);
|
|
|
| SkBlitter* blitter = NULL;
|
|
|
| @@ -862,7 +822,7 @@ SkBlitter* SkBlitter::Choose(const SkBitmap& device,
|
| // (e.g. they have a bounder that always aborts the draw)
|
| if (kUnknown_SkColorType == device.colorType() ||
|
| (drawCoverage && (kAlpha_8_SkColorType != device.colorType()))) {
|
| - SK_PLACEMENT_NEW(blitter, SkNullBlitter, storage, storageSize);
|
| + blitter = allocator->createT<SkNullBlitter>();
|
| return blitter;
|
| }
|
|
|
| @@ -887,9 +847,10 @@ SkBlitter* SkBlitter::Choose(const SkBitmap& device,
|
| mode = NULL;
|
| paint.writable()->setXfermode(NULL);
|
| break;
|
| - case kSkipDrawing_XferInterp:
|
| - SK_PLACEMENT_NEW(blitter, SkNullBlitter, storage, storageSize);
|
| + case kSkipDrawing_XferInterp:{
|
| + blitter = allocator->createT<SkNullBlitter>();
|
| return blitter;
|
| + }
|
| default:
|
| break;
|
| }
|
| @@ -940,7 +901,7 @@ SkBlitter* SkBlitter::Choose(const SkBitmap& device,
|
| * not fail) in its destructor.
|
| */
|
| if (shader && !shader->setContext(device, *paint, matrix)) {
|
| - SK_PLACEMENT_NEW(blitter, SkNullBlitter, storage, storageSize);
|
| + blitter = allocator->createT<SkNullBlitter>();
|
| return blitter;
|
| }
|
|
|
| @@ -950,49 +911,40 @@ SkBlitter* SkBlitter::Choose(const SkBitmap& device,
|
| if (drawCoverage) {
|
| SkASSERT(NULL == shader);
|
| SkASSERT(NULL == paint->getXfermode());
|
| - SK_PLACEMENT_NEW_ARGS(blitter, SkA8_Coverage_Blitter,
|
| - storage, storageSize, (device, *paint));
|
| + blitter = allocator->createT<SkA8_Coverage_Blitter>(device, *paint);
|
| } else if (shader) {
|
| - SK_PLACEMENT_NEW_ARGS(blitter, SkA8_Shader_Blitter,
|
| - storage, storageSize, (device, *paint));
|
| + blitter = allocator->createT<SkA8_Shader_Blitter>(device, *paint);
|
| } else {
|
| - SK_PLACEMENT_NEW_ARGS(blitter, SkA8_Blitter,
|
| - storage, storageSize, (device, *paint));
|
| + blitter = allocator->createT<SkA8_Blitter>(device, *paint);
|
| }
|
| break;
|
|
|
| case kRGB_565_SkColorType:
|
| - blitter = SkBlitter_ChooseD565(device, *paint, storage, storageSize);
|
| + blitter = SkBlitter_ChooseD565(device, *paint, allocator);
|
| break;
|
|
|
| case kPMColor_SkColorType:
|
| if (shader) {
|
| - SK_PLACEMENT_NEW_ARGS(blitter, SkARGB32_Shader_Blitter,
|
| - storage, storageSize, (device, *paint));
|
| + blitter = allocator->createT<SkARGB32_Shader_Blitter>(device, *paint);
|
| } else if (paint->getColor() == SK_ColorBLACK) {
|
| - SK_PLACEMENT_NEW_ARGS(blitter, SkARGB32_Black_Blitter,
|
| - storage, storageSize, (device, *paint));
|
| + blitter = allocator->createT<SkARGB32_Black_Blitter>(device, *paint);
|
| } else if (paint->getAlpha() == 0xFF) {
|
| - SK_PLACEMENT_NEW_ARGS(blitter, SkARGB32_Opaque_Blitter,
|
| - storage, storageSize, (device, *paint));
|
| + blitter = allocator->createT<SkARGB32_Opaque_Blitter>(device, *paint);
|
| } else {
|
| - SK_PLACEMENT_NEW_ARGS(blitter, SkARGB32_Blitter,
|
| - storage, storageSize, (device, *paint));
|
| + blitter = allocator->createT<SkARGB32_Blitter>(device, *paint);
|
| }
|
| break;
|
|
|
| default:
|
| SkDEBUGFAIL("unsupported device config");
|
| - SK_PLACEMENT_NEW(blitter, SkNullBlitter, storage, storageSize);
|
| + blitter = allocator->createT<SkNullBlitter>();
|
| break;
|
| }
|
|
|
| if (shader3D) {
|
| - void (*proc)(void*) = ((void*)storage == (void*)blitter) ? destroy_blitter : delete_blitter;
|
| - SkAutoCallProc tmp(blitter, proc);
|
| -
|
| - blitter = SkNEW_ARGS(Sk3DBlitter, (blitter, shader3D, proc));
|
| - (void)tmp.detach();
|
| + SkBlitter* innerBlitter = blitter;
|
| + // innerBlitter was allocated by allocator, which will delete it.
|
| + blitter = allocator->createT<Sk3DBlitter>(innerBlitter, shader3D);
|
| }
|
| return blitter;
|
| }
|
|
|