aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/SkBlitter_Sprite.cpp24
-rw-r--r--src/core/SkSpriteBlitter.h11
-rw-r--r--src/core/SkSpriteBlitter_ARGB32.cpp23
-rw-r--r--src/core/SkSpriteBlitter_RGB16.cpp37
4 files changed, 48 insertions, 47 deletions
diff --git a/src/core/SkBlitter_Sprite.cpp b/src/core/SkBlitter_Sprite.cpp
index 91a3cd1fee..ab70222c6b 100644
--- a/src/core/SkBlitter_Sprite.cpp
+++ b/src/core/SkBlitter_Sprite.cpp
@@ -8,21 +8,21 @@
#include "SkSmallAllocator.h"
#include "SkSpriteBlitter.h"
-SkSpriteBlitter::SkSpriteBlitter(const SkBitmap& source)
- : fSource(&source) {
- fSource->lockPixels();
-}
-
-SkSpriteBlitter::~SkSpriteBlitter() {
- fSource->unlockPixels();
+SkSpriteBlitter::SkSpriteBlitter(const SkBitmap& source) : fSource(NULL) {
+ if (source.requestLock(&fUnlocker)) {
+ fSource = &fUnlocker.pixmap();
+ }
}
-void SkSpriteBlitter::setup(const SkBitmap& device, int left, int top,
- const SkPaint& paint) {
+bool SkSpriteBlitter::setup(const SkBitmap& device, int left, int top, const SkPaint& paint) {
+ if (NULL == fSource) {
+ return false;
+ }
fDevice = &device;
fLeft = left;
fTop = top;
fPaint = &paint;
+ return true;
}
#ifdef SK_DEBUG
@@ -76,7 +76,11 @@ SkBlitter* SkBlitter::ChooseSprite(const SkBitmap& device, const SkPaint& paint,
}
if (blitter) {
- blitter->setup(device, left, top, paint);
+ if (!blitter->setup(device, left, top, paint)) {
+ // blitter was allocated by allocator, so we have to manually call its destructor
+ blitter->~SkSpriteBlitter();
+ blitter = NULL;
+ }
}
return blitter;
}
diff --git a/src/core/SkSpriteBlitter.h b/src/core/SkSpriteBlitter.h
index f69a55a2a0..0bbc8561d0 100644
--- a/src/core/SkSpriteBlitter.h
+++ b/src/core/SkSpriteBlitter.h
@@ -20,11 +20,9 @@ class SkPaint;
class SkSpriteBlitter : public SkBlitter {
public:
- SkSpriteBlitter(const SkBitmap& source);
- virtual ~SkSpriteBlitter();
+ SkSpriteBlitter(const SkBitmap& source);
- virtual void setup(const SkBitmap& device, int left, int top,
- const SkPaint& paint);
+ virtual bool setup(const SkBitmap& device, int left, int top, const SkPaint& paint);
// overrides
#ifdef SK_DEBUG
@@ -41,9 +39,12 @@ public:
protected:
const SkBitmap* fDevice;
- const SkBitmap* fSource;
+ const SkPixmap* fSource;
int fLeft, fTop;
const SkPaint* fPaint;
+
+private:
+ SkAutoPixmapUnlock fUnlocker;
};
#endif
diff --git a/src/core/SkSpriteBlitter_ARGB32.cpp b/src/core/SkSpriteBlitter_ARGB32.cpp
index c3f63fee9a..7d5ac152db 100644
--- a/src/core/SkSpriteBlitter_ARGB32.cpp
+++ b/src/core/SkSpriteBlitter_ARGB32.cpp
@@ -37,8 +37,7 @@ public:
void blitRect(int x, int y, int width, int height) override {
SkASSERT(width > 0 && height > 0);
uint32_t* SK_RESTRICT dst = fDevice->getAddr32(x, y);
- const uint32_t* SK_RESTRICT src = fSource->getAddr32(x - fLeft,
- y - fTop);
+ const uint32_t* SK_RESTRICT src = fSource->addr32(x - fLeft, y - fTop);
size_t dstRB = fDevice->rowBytes();
size_t srcRB = fSource->rowBytes();
SkBlitRow::Proc32 proc = fProc32;
@@ -91,9 +90,10 @@ public:
SkSafeUnref(fColorFilter);
}
- virtual void setup(const SkBitmap& device, int left, int top,
- const SkPaint& paint) override {
- this->INHERITED::setup(device, left, top, paint);
+ bool setup(const SkBitmap& device, int left, int top, const SkPaint& paint) override {
+ if (!this->INHERITED::setup(device, left, top, paint)) {
+ return false;
+ }
int width = device.width();
if (width > fBufferSize) {
@@ -101,6 +101,7 @@ public:
delete[] fBuffer;
fBuffer = new SkPMColor[width];
}
+ return true;
}
protected:
@@ -125,8 +126,7 @@ public:
void blitRect(int x, int y, int width, int height) override {
SkASSERT(width > 0 && height > 0);
uint32_t* SK_RESTRICT dst = fDevice->getAddr32(x, y);
- const uint32_t* SK_RESTRICT src = fSource->getAddr32(x - fLeft,
- y - fTop);
+ const uint32_t* SK_RESTRICT src = fSource->addr32(x - fLeft, y - fTop);
size_t dstRB = fDevice->rowBytes();
size_t srcRB = fSource->rowBytes();
SkColorFilter* colorFilter = fColorFilter;
@@ -172,8 +172,7 @@ public:
void blitRect(int x, int y, int width, int height) override {
SkASSERT(width > 0 && height > 0);
SkPMColor* SK_RESTRICT dst = fDevice->getAddr32(x, y);
- const SkPMColor16* SK_RESTRICT src = fSource->getAddr16(x - fLeft,
- y - fTop);
+ const SkPMColor16* SK_RESTRICT src = fSource->addr16(x - fLeft, y - fTop);
size_t dstRB = fDevice->rowBytes();
size_t srcRB = fSource->rowBytes();
SkPMColor* SK_RESTRICT buffer = fBuffer;
@@ -219,8 +218,7 @@ public:
void blitRect(int x, int y, int width, int height) override {
SkASSERT(width > 0 && height > 0);
SkPMColor* SK_RESTRICT dst = fDevice->getAddr32(x, y);
- const SkPMColor16* SK_RESTRICT src = fSource->getAddr16(x - fLeft,
- y - fTop);
+ const SkPMColor16* SK_RESTRICT src = fSource->addr16(x - fLeft, y - fTop);
size_t dstRB = fDevice->rowBytes();
size_t srcRB = fSource->rowBytes();
@@ -248,8 +246,7 @@ public:
void blitRect(int x, int y, int width, int height) override {
SkASSERT(width > 0 && height > 0);
SkPMColor* SK_RESTRICT dst = fDevice->getAddr32(x, y);
- const SkPMColor16* SK_RESTRICT src = fSource->getAddr16(x - fLeft,
- y - fTop);
+ const SkPMColor16* SK_RESTRICT src = fSource->addr16(x - fLeft, y - fTop);
size_t dstRB = fDevice->rowBytes();
size_t srcRB = fSource->rowBytes();
diff --git a/src/core/SkSpriteBlitter_RGB16.cpp b/src/core/SkSpriteBlitter_RGB16.cpp
index ca0eb50311..3cd8306c9b 100644
--- a/src/core/SkSpriteBlitter_RGB16.cpp
+++ b/src/core/SkSpriteBlitter_RGB16.cpp
@@ -56,8 +56,7 @@ public:
// overrides
void blitRect(int x, int y, int width, int height) override {
uint16_t* SK_RESTRICT dst = fDevice->getAddr16(x, y);
- const uint16_t* SK_RESTRICT src = fSource->getAddr16(x - fLeft,
- y - fTop);
+ const uint16_t* SK_RESTRICT src = fSource->addr16(x - fLeft, y - fTop);
size_t dstRB = fDevice->rowBytes();
size_t srcRB = fSource->rowBytes();
@@ -82,7 +81,7 @@ public:
#define SkSPRITE_DST_TYPE uint16_t
#define SkSPRITE_SRC_TYPE uint16_t
#define SkSPRITE_DST_GETADDR getAddr16
-#define SkSPRITE_SRC_GETADDR getAddr16
+#define SkSPRITE_SRC_GETADDR addr16
#define SkSPRITE_PREAMBLE(srcBM, x, y) int scale = SkAlpha255To256(fSrcAlpha);
#define SkSPRITE_BLIT_PIXEL(dst, src) D16_S16_Blend_Pixel(dst, src, scale)
#define SkSPRITE_NEXT_ROW
@@ -104,7 +103,7 @@ public:
#define SkSPRITE_DST_TYPE uint16_t
#define SkSPRITE_SRC_TYPE SkPMColor16
#define SkSPRITE_DST_GETADDR getAddr16
-#define SkSPRITE_SRC_GETADDR getAddr16
+#define SkSPRITE_SRC_GETADDR addr16
#define SkSPRITE_PREAMBLE(srcBM, x, y)
#define SkSPRITE_BLIT_PIXEL(dst, src) D16_S4444_Opaque(dst, src)
#define SkSPRITE_NEXT_ROW
@@ -125,7 +124,7 @@ public:
#define SkSPRITE_DST_TYPE uint16_t
#define SkSPRITE_SRC_TYPE uint16_t
#define SkSPRITE_DST_GETADDR getAddr16
-#define SkSPRITE_SRC_GETADDR getAddr16
+#define SkSPRITE_SRC_GETADDR addr16
#define SkSPRITE_PREAMBLE(srcBM, x, y) int scale = SkAlpha15To16(fSrcAlpha);
#define SkSPRITE_BLIT_PIXEL(dst, src) D16_S4444_Blend(dst, src, scale)
#define SkSPRITE_NEXT_ROW
@@ -141,8 +140,8 @@ public:
#define SkSPRITE_DST_TYPE uint16_t
#define SkSPRITE_SRC_TYPE uint8_t
#define SkSPRITE_DST_GETADDR getAddr16
-#define SkSPRITE_SRC_GETADDR getAddr8
-#define SkSPRITE_PREAMBLE(srcBM, x, y) const SkPMColor* ctable = srcBM.getColorTable()->readColors()
+#define SkSPRITE_SRC_GETADDR addr8
+#define SkSPRITE_PREAMBLE(srcBM, x, y) const SkPMColor* ctable = srcBM.ctable()->readColors()
#define SkSPRITE_BLIT_PIXEL(dst, src) D16_S32A_Opaque_Pixel(dst, ctable[src])
#define SkSPRITE_NEXT_ROW
#define SkSPRITE_POSTAMBLE(srcBM)
@@ -155,8 +154,8 @@ public:
#define SkSPRITE_DST_TYPE uint16_t
#define SkSPRITE_SRC_TYPE uint8_t
#define SkSPRITE_DST_GETADDR getAddr16
-#define SkSPRITE_SRC_GETADDR getAddr8
-#define SkSPRITE_PREAMBLE(srcBM, x, y) const SkPMColor* ctable = srcBM.getColorTable()->readColors(); unsigned src_scale = SkAlpha255To256(fSrcAlpha);
+#define SkSPRITE_SRC_GETADDR addr8
+#define SkSPRITE_PREAMBLE(srcBM, x, y) const SkPMColor* ctable = srcBM.ctable()->readColors(); unsigned src_scale = SkAlpha255To256(fSrcAlpha);
#define SkSPRITE_BLIT_PIXEL(dst, src) D16_S32A_Blend_Pixel(dst, ctable[src], src_scale)
#define SkSPRITE_NEXT_ROW
#define SkSPRITE_POSTAMBLE(srcBM)
@@ -233,8 +232,8 @@ static void blitrow_d16_si8(uint16_t* SK_RESTRICT dst,
#define SkSPRITE_DST_TYPE uint16_t
#define SkSPRITE_SRC_TYPE uint8_t
#define SkSPRITE_DST_GETADDR getAddr16
-#define SkSPRITE_SRC_GETADDR getAddr8
-#define SkSPRITE_PREAMBLE(srcBM, x, y) const uint16_t* ctable = srcBM.getColorTable()->read16BitCache()
+#define SkSPRITE_SRC_GETADDR addr8
+#define SkSPRITE_PREAMBLE(srcBM, x, y) const uint16_t* ctable = srcBM.ctable()->read16BitCache()
#define SkSPRITE_BLIT_PIXEL(dst, src) *dst = ctable[src]
#define SkSPRITE_NEXT_ROW
#define SkSPRITE_POSTAMBLE(srcBM)
@@ -247,8 +246,8 @@ static void blitrow_d16_si8(uint16_t* SK_RESTRICT dst,
#define SkSPRITE_DST_TYPE uint16_t
#define SkSPRITE_SRC_TYPE uint8_t
#define SkSPRITE_DST_GETADDR getAddr16
-#define SkSPRITE_SRC_GETADDR getAddr8
-#define SkSPRITE_PREAMBLE(srcBM, x, y) const uint16_t* ctable = srcBM.getColorTable()->read16BitCache(); unsigned src_scale = SkAlpha255To256(fSrcAlpha);
+#define SkSPRITE_SRC_GETADDR addr8
+#define SkSPRITE_PREAMBLE(srcBM, x, y) const uint16_t* ctable = srcBM.ctable()->read16BitCache(); unsigned src_scale = SkAlpha255To256(fSrcAlpha);
#define SkSPRITE_BLIT_PIXEL(dst, src) D16_S16_Blend_Pixel(dst, ctable[src], src_scale)
#define SkSPRITE_NEXT_ROW
#define SkSPRITE_POSTAMBLE(srcBM)
@@ -261,11 +260,11 @@ public:
Sprite_D16_S32_BlitRowProc(const SkBitmap& source)
: SkSpriteBlitter(source) {}
- // overrides
-
- virtual void setup(const SkBitmap& device, int left, int top,
+ bool setup(const SkBitmap& device, int left, int top,
const SkPaint& paint) override {
- this->INHERITED::setup(device, left, top, paint);
+ if (!this->INHERITED::setup(device, left, top, paint)) {
+ return false;
+ }
unsigned flags = 0;
@@ -279,12 +278,12 @@ public:
flags |= SkBlitRow::kDither_Flag;
}
fProc = SkBlitRow::Factory16(flags);
+ return true;
}
void blitRect(int x, int y, int width, int height) override {
uint16_t* SK_RESTRICT dst = fDevice->getAddr16(x, y);
- const SkPMColor* SK_RESTRICT src = fSource->getAddr32(x - fLeft,
- y - fTop);
+ const SkPMColor* SK_RESTRICT src = fSource->addr32(x - fLeft, y - fTop);
size_t dstRB = fDevice->rowBytes();
size_t srcRB = fSource->rowBytes();
SkBlitRow::Proc16 proc = fProc;