Chromium Code Reviews| Index: src/core/SkBlitter.cpp |
| diff --git a/src/core/SkBlitter.cpp b/src/core/SkBlitter.cpp |
| index 98325c024501aad838387952cfffdf6fcac98d58..abd037e7206c8974ce208c31ae30b2fa34c7ae92 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 SkStackAllocator. |
| + 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, |
| + SkStackAllocator<kBlitterStorageByteCount>* allocator, |
|
reed1
2014/02/27 18:48:12
typedef SkStackAllocator<kBlitterStorageByteCount>
scroggo
2014/03/05 20:25:52
Done.
|
| 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); |
| + SkSTACK_ALLOCATE(blitter, (*allocator), 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:{ |
| + SkSTACK_ALLOCATE(blitter, (*allocator), 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); |
| + SkSTACK_ALLOCATE(blitter, (*allocator), SkNullBlitter, ()); |
| return blitter; |
| } |
| @@ -950,49 +911,48 @@ 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)); |
| + SkSTACK_ALLOCATE(blitter, (*allocator), SkA8_Coverage_Blitter, |
| + (device, *paint)); |
| } else if (shader) { |
| - SK_PLACEMENT_NEW_ARGS(blitter, SkA8_Shader_Blitter, |
| - storage, storageSize, (device, *paint)); |
| + SkSTACK_ALLOCATE(blitter, (*allocator), SkA8_Shader_Blitter, |
| + (device, *paint)); |
| } else { |
| - SK_PLACEMENT_NEW_ARGS(blitter, SkA8_Blitter, |
| - storage, storageSize, (device, *paint)); |
| + SkSTACK_ALLOCATE(blitter, (*allocator), 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)); |
| + SkSTACK_ALLOCATE(blitter, (*allocator), SkARGB32_Shader_Blitter, |
| + (device, *paint)); |
| } else if (paint->getColor() == SK_ColorBLACK) { |
| - SK_PLACEMENT_NEW_ARGS(blitter, SkARGB32_Black_Blitter, |
| - storage, storageSize, (device, *paint)); |
| + SkSTACK_ALLOCATE(blitter, (*allocator), SkARGB32_Black_Blitter, |
| + (device, *paint)); |
| } else if (paint->getAlpha() == 0xFF) { |
| - SK_PLACEMENT_NEW_ARGS(blitter, SkARGB32_Opaque_Blitter, |
| - storage, storageSize, (device, *paint)); |
| + SkSTACK_ALLOCATE(blitter, (*allocator), SkARGB32_Opaque_Blitter, |
| + (device, *paint)); |
| } else { |
| - SK_PLACEMENT_NEW_ARGS(blitter, SkARGB32_Blitter, |
| - storage, storageSize, (device, *paint)); |
| + SkSTACK_ALLOCATE(blitter, (*allocator), SkARGB32_Blitter, |
| + (device, *paint)); |
| } |
| break; |
| default: |
| SkDEBUGFAIL("unsupported device config"); |
| - SK_PLACEMENT_NEW(blitter, SkNullBlitter, storage, storageSize); |
| + SkSTACK_ALLOCATE(blitter, (*allocator), 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. |
| + SkSTACK_ALLOCATE(blitter, (*allocator), Sk3DBlitter, |
| + (innerBlitter, shader3D)); |
| } |
| return blitter; |
| } |