diff options
Diffstat (limited to 'chromium/third_party/skia/src/core/SkBlitter_RGB16.cpp')
-rw-r--r-- | chromium/third_party/skia/src/core/SkBlitter_RGB16.cpp | 134 |
1 files changed, 69 insertions, 65 deletions
diff --git a/chromium/third_party/skia/src/core/SkBlitter_RGB16.cpp b/chromium/third_party/skia/src/core/SkBlitter_RGB16.cpp index 256cbc6936f..4503a2ae792 100644 --- a/chromium/third_party/skia/src/core/SkBlitter_RGB16.cpp +++ b/chromium/third_party/skia/src/core/SkBlitter_RGB16.cpp @@ -12,12 +12,11 @@ #include "SkColorPriv.h" #include "SkDither.h" #include "SkShader.h" -#include "SkTemplatesPriv.h" #include "SkUtils.h" +#include "SkUtilsArm.h" #include "SkXfermode.h" -#if defined(__ARM_HAVE_NEON) && defined(SK_CPU_LENDIAN) - #define SK_USE_NEON +#if SK_ARM_NEON_IS_ALWAYS && defined(SK_CPU_LENDIAN) #include <arm_neon.h> #else // if we don't have neon, then our black blitter is worth the extra code @@ -108,7 +107,8 @@ private: class SkRGB16_Shader_Blitter : public SkShaderBlitter { public: - SkRGB16_Shader_Blitter(const SkBitmap& device, const SkPaint& paint); + SkRGB16_Shader_Blitter(const SkBitmap& device, const SkPaint& paint, + SkShader::Context* shaderContext); virtual ~SkRGB16_Shader_Blitter(); virtual void blitH(int x, int y, int width); virtual void blitAntiH(int x, int y, const SkAlpha* antialias, @@ -130,7 +130,8 @@ private: // used only if the shader can perform shadSpan16 class SkRGB16_Shader16_Blitter : public SkRGB16_Shader_Blitter { public: - SkRGB16_Shader16_Blitter(const SkBitmap& device, const SkPaint& paint); + SkRGB16_Shader16_Blitter(const SkBitmap& device, const SkPaint& paint, + SkShader::Context* shaderContext); virtual void blitH(int x, int y, int width); virtual void blitAntiH(int x, int y, const SkAlpha* antialias, const int16_t* runs); @@ -142,7 +143,8 @@ private: class SkRGB16_Shader_Xfermode_Blitter : public SkShaderBlitter { public: - SkRGB16_Shader_Xfermode_Blitter(const SkBitmap& device, const SkPaint& paint); + SkRGB16_Shader_Xfermode_Blitter(const SkBitmap& device, const SkPaint& paint, + SkShader::Context* shaderContext); virtual ~SkRGB16_Shader_Xfermode_Blitter(); virtual void blitH(int x, int y, int width); virtual void blitAntiH(int x, int y, const SkAlpha* antialias, @@ -385,7 +387,7 @@ void SkRGB16_Opaque_Blitter::blitMask(const SkMask& mask, unsigned maskRB = mask.fRowBytes - width; uint32_t expanded32 = fExpandedRaw16; -#ifdef SK_USE_NEON +#if SK_ARM_NEON_IS_ALWAYS && defined(SK_CPU_LENDIAN) #define UNROLL 8 do { int w = width; @@ -680,8 +682,9 @@ void SkRGB16_Blitter::blitRect(int x, int y, int width, int height) { /////////////////////////////////////////////////////////////////////////////// SkRGB16_Shader16_Blitter::SkRGB16_Shader16_Blitter(const SkBitmap& device, - const SkPaint& paint) - : SkRGB16_Shader_Blitter(device, paint) { + const SkPaint& paint, + SkShader::Context* shaderContext) + : SkRGB16_Shader_Blitter(device, paint, shaderContext) { SkASSERT(SkShader::CanCallShadeSpan16(fShaderFlags)); } @@ -689,28 +692,28 @@ void SkRGB16_Shader16_Blitter::blitH(int x, int y, int width) { SkASSERT(x + width <= fDevice.width()); uint16_t* SK_RESTRICT device = fDevice.getAddr16(x, y); - SkShader* shader = fShader; + SkShader::Context* shaderContext = fShaderContext; - int alpha = shader->getSpan16Alpha(); + int alpha = shaderContext->getSpan16Alpha(); if (0xFF == alpha) { - shader->shadeSpan16(x, y, device, width); + shaderContext->shadeSpan16(x, y, device, width); } else { uint16_t* span16 = (uint16_t*)fBuffer; - shader->shadeSpan16(x, y, span16, width); + shaderContext->shadeSpan16(x, y, span16, width); SkBlendRGB16(span16, device, SkAlpha255To256(alpha), width); } } void SkRGB16_Shader16_Blitter::blitRect(int x, int y, int width, int height) { - SkShader* shader = fShader; - uint16_t* dst = fDevice.getAddr16(x, y); - size_t dstRB = fDevice.rowBytes(); - int alpha = shader->getSpan16Alpha(); + SkShader::Context* shaderContext = fShaderContext; + uint16_t* dst = fDevice.getAddr16(x, y); + size_t dstRB = fDevice.rowBytes(); + int alpha = shaderContext->getSpan16Alpha(); if (0xFF == alpha) { if (fShaderFlags & SkShader::kConstInY16_Flag) { // have the shader blit directly into the device the first time - shader->shadeSpan16(x, y, dst, width); + shaderContext->shadeSpan16(x, y, dst, width); // and now just memcpy that line on the subsequent lines if (--height > 0) { const uint16_t* orig = dst; @@ -721,7 +724,7 @@ void SkRGB16_Shader16_Blitter::blitRect(int x, int y, int width, int height) { } } else { // need to call shadeSpan16 for every line do { - shader->shadeSpan16(x, y, dst, width); + shaderContext->shadeSpan16(x, y, dst, width); y += 1; dst = (uint16_t*)((char*)dst + dstRB); } while (--height); @@ -730,14 +733,14 @@ void SkRGB16_Shader16_Blitter::blitRect(int x, int y, int width, int height) { int scale = SkAlpha255To256(alpha); uint16_t* span16 = (uint16_t*)fBuffer; if (fShaderFlags & SkShader::kConstInY16_Flag) { - shader->shadeSpan16(x, y, span16, width); + shaderContext->shadeSpan16(x, y, span16, width); do { SkBlendRGB16(span16, dst, scale, width); dst = (uint16_t*)((char*)dst + dstRB); } while (--height); } else { do { - shader->shadeSpan16(x, y, span16, width); + shaderContext->shadeSpan16(x, y, span16, width); SkBlendRGB16(span16, dst, scale, width); y += 1; dst = (uint16_t*)((char*)dst + dstRB); @@ -749,11 +752,11 @@ void SkRGB16_Shader16_Blitter::blitRect(int x, int y, int width, int height) { void SkRGB16_Shader16_Blitter::blitAntiH(int x, int y, const SkAlpha* SK_RESTRICT antialias, const int16_t* SK_RESTRICT runs) { - SkShader* shader = fShader; + SkShader::Context* shaderContext = fShaderContext; SkPMColor* SK_RESTRICT span = fBuffer; - uint16_t* SK_RESTRICT device = fDevice.getAddr16(x, y); + uint16_t* SK_RESTRICT device = fDevice.getAddr16(x, y); - int alpha = shader->getSpan16Alpha(); + int alpha = shaderContext->getSpan16Alpha(); uint16_t* span16 = (uint16_t*)span; if (0xFF == alpha) { @@ -767,9 +770,9 @@ void SkRGB16_Shader16_Blitter::blitAntiH(int x, int y, int aa = *antialias; if (aa == 255) { // go direct to the device! - shader->shadeSpan16(x, y, device, count); + shaderContext->shadeSpan16(x, y, device, count); } else if (aa) { - shader->shadeSpan16(x, y, span16, count); + shaderContext->shadeSpan16(x, y, span16, count); SkBlendRGB16(span16, device, SkAlpha255To256(aa), count); } device += count; @@ -788,7 +791,7 @@ void SkRGB16_Shader16_Blitter::blitAntiH(int x, int y, int aa = SkAlphaMul(*antialias, alpha); if (aa) { - shader->shadeSpan16(x, y, span16, count); + shaderContext->shadeSpan16(x, y, span16, count); SkBlendRGB16(span16, device, SkAlpha255To256(aa), count); } @@ -803,8 +806,9 @@ void SkRGB16_Shader16_Blitter::blitAntiH(int x, int y, /////////////////////////////////////////////////////////////////////////////// SkRGB16_Shader_Blitter::SkRGB16_Shader_Blitter(const SkBitmap& device, - const SkPaint& paint) -: INHERITED(device, paint) { + const SkPaint& paint, + SkShader::Context* shaderContext) +: INHERITED(device, paint, shaderContext) { SkASSERT(paint.getXfermode() == NULL); fBuffer = (SkPMColor*)sk_malloc_throw(device.width() * sizeof(SkPMColor)); @@ -822,10 +826,10 @@ SkRGB16_Shader_Blitter::SkRGB16_Shader_Blitter(const SkBitmap& device, flags |= SkBlitRow::kDither_Flag; } // used when we know our global alpha is 0xFF - fOpaqueProc = SkBlitRow::Factory(flags, SkBitmap::kRGB_565_Config); + fOpaqueProc = SkBlitRow::Factory(flags, kRGB_565_SkColorType); // used when we know our global alpha is < 0xFF fAlphaProc = SkBlitRow::Factory(flags | SkBlitRow::kGlobalAlpha_Flag, - SkBitmap::kRGB_565_Config); + kRGB_565_SkColorType); } SkRGB16_Shader_Blitter::~SkRGB16_Shader_Blitter() { @@ -835,20 +839,20 @@ SkRGB16_Shader_Blitter::~SkRGB16_Shader_Blitter() { void SkRGB16_Shader_Blitter::blitH(int x, int y, int width) { SkASSERT(x + width <= fDevice.width()); - fShader->shadeSpan(x, y, fBuffer, width); + fShaderContext->shadeSpan(x, y, fBuffer, width); // shaders take care of global alpha, so we pass 0xFF (should be ignored) fOpaqueProc(fDevice.getAddr16(x, y), fBuffer, width, 0xFF, x, y); } void SkRGB16_Shader_Blitter::blitRect(int x, int y, int width, int height) { - SkShader* shader = fShader; - SkBlitRow::Proc proc = fOpaqueProc; - SkPMColor* buffer = fBuffer; - uint16_t* dst = fDevice.getAddr16(x, y); - size_t dstRB = fDevice.rowBytes(); + SkShader::Context* shaderContext = fShaderContext; + SkBlitRow::Proc proc = fOpaqueProc; + SkPMColor* buffer = fBuffer; + uint16_t* dst = fDevice.getAddr16(x, y); + size_t dstRB = fDevice.rowBytes(); if (fShaderFlags & SkShader::kConstInY32_Flag) { - shader->shadeSpan(x, y, buffer, width); + shaderContext->shadeSpan(x, y, buffer, width); do { proc(dst, buffer, width, 0xFF, x, y); y += 1; @@ -856,7 +860,7 @@ void SkRGB16_Shader_Blitter::blitRect(int x, int y, int width, int height) { } while (--height); } else { do { - shader->shadeSpan(x, y, buffer, width); + shaderContext->shadeSpan(x, y, buffer, width); proc(dst, buffer, width, 0xFF, x, y); y += 1; dst = (uint16_t*)((char*)dst + dstRB); @@ -881,9 +885,9 @@ static inline int count_nonzero_span(const int16_t runs[], const SkAlpha aa[]) { void SkRGB16_Shader_Blitter::blitAntiH(int x, int y, const SkAlpha* SK_RESTRICT antialias, const int16_t* SK_RESTRICT runs) { - SkShader* shader = fShader; + SkShader::Context* shaderContext = fShaderContext; SkPMColor* SK_RESTRICT span = fBuffer; - uint16_t* SK_RESTRICT device = fDevice.getAddr16(x, y); + uint16_t* SK_RESTRICT device = fDevice.getAddr16(x, y); for (;;) { int count = *runs; @@ -902,7 +906,7 @@ void SkRGB16_Shader_Blitter::blitAntiH(int x, int y, int nonZeroCount = count + count_nonzero_span(runs + count, antialias + count); SkASSERT(nonZeroCount <= fDevice.width()); // don't overrun fBuffer - shader->shadeSpan(x, y, span, nonZeroCount); + shaderContext->shadeSpan(x, y, span, nonZeroCount); SkPMColor* localSpan = span; for (;;) { @@ -929,8 +933,9 @@ void SkRGB16_Shader_Blitter::blitAntiH(int x, int y, /////////////////////////////////////////////////////////////////////// SkRGB16_Shader_Xfermode_Blitter::SkRGB16_Shader_Xfermode_Blitter( - const SkBitmap& device, const SkPaint& paint) -: INHERITED(device, paint) { + const SkBitmap& device, const SkPaint& paint, + SkShader::Context* shaderContext) +: INHERITED(device, paint, shaderContext) { fXfermode = paint.getXfermode(); SkASSERT(fXfermode); fXfermode->ref(); @@ -951,18 +956,18 @@ void SkRGB16_Shader_Xfermode_Blitter::blitH(int x, int y, int width) { uint16_t* device = fDevice.getAddr16(x, y); SkPMColor* span = fBuffer; - fShader->shadeSpan(x, y, span, width); + fShaderContext->shadeSpan(x, y, span, width); fXfermode->xfer16(device, span, width, NULL); } void SkRGB16_Shader_Xfermode_Blitter::blitAntiH(int x, int y, const SkAlpha* SK_RESTRICT antialias, const int16_t* SK_RESTRICT runs) { - SkShader* shader = fShader; - SkXfermode* mode = fXfermode; + SkShader::Context* shaderContext = fShaderContext; + SkXfermode* mode = fXfermode; SkPMColor* SK_RESTRICT span = fBuffer; - uint8_t* SK_RESTRICT aaExpand = fAAExpand; - uint16_t* SK_RESTRICT device = fDevice.getAddr16(x, y); + uint8_t* SK_RESTRICT aaExpand = fAAExpand; + uint16_t* SK_RESTRICT device = fDevice.getAddr16(x, y); for (;;) { int count = *runs; @@ -982,7 +987,7 @@ void SkRGB16_Shader_Xfermode_Blitter::blitAntiH(int x, int y, antialias + count); SkASSERT(nonZeroCount <= fDevice.width()); // don't overrun fBuffer - shader->shadeSpan(x, y, span, nonZeroCount); + shaderContext->shadeSpan(x, y, span, nonZeroCount); x += nonZeroCount; SkPMColor* localSpan = span; @@ -1013,7 +1018,10 @@ void SkRGB16_Shader_Xfermode_Blitter::blitAntiH(int x, int y, /////////////////////////////////////////////////////////////////////////////// SkBlitter* SkBlitter_ChooseD565(const SkBitmap& device, const SkPaint& paint, - void* storage, size_t storageSize) { + SkShader::Context* shaderContext, + SkTBlitterAllocator* allocator) { + SkASSERT(allocator != NULL); + SkBlitter* blitter; SkShader* shader = paint.getShader(); SkXfermode* mode = paint.getXfermode(); @@ -1022,32 +1030,28 @@ SkBlitter* SkBlitter_ChooseD565(const SkBitmap& device, const SkPaint& paint, SkASSERT(NULL == mode || NULL != shader); if (shader) { + SkASSERT(shaderContext != NULL); if (mode) { - SK_PLACEMENT_NEW_ARGS(blitter, SkRGB16_Shader_Xfermode_Blitter, - storage, storageSize, (device, paint)); - } else if (shader->canCallShadeSpan16()) { - SK_PLACEMENT_NEW_ARGS(blitter, SkRGB16_Shader16_Blitter, - storage, storageSize, (device, paint)); + blitter = allocator->createT<SkRGB16_Shader_Xfermode_Blitter>(device, paint, + shaderContext); + } else if (shaderContext->canCallShadeSpan16()) { + blitter = allocator->createT<SkRGB16_Shader16_Blitter>(device, paint, shaderContext); } else { - SK_PLACEMENT_NEW_ARGS(blitter, SkRGB16_Shader_Blitter, - storage, storageSize, (device, paint)); + blitter = allocator->createT<SkRGB16_Shader_Blitter>(device, paint, shaderContext); } } else { // no shader, no xfermode, (and we always ignore colorfilter) SkColor color = paint.getColor(); if (0 == SkColorGetA(color)) { - SK_PLACEMENT_NEW(blitter, SkNullBlitter, storage, storageSize); + blitter = allocator->createT<SkNullBlitter>(); #ifdef USE_BLACK_BLITTER } else if (SK_ColorBLACK == color) { - SK_PLACEMENT_NEW_ARGS(blitter, SkRGB16_Black_Blitter, storage, - storageSize, (device, paint)); + blitter = allocator->createT<SkRGB16_Black_Blitter>(device, paint); #endif } else if (0xFF == SkColorGetA(color)) { - SK_PLACEMENT_NEW_ARGS(blitter, SkRGB16_Opaque_Blitter, storage, - storageSize, (device, paint)); + blitter = allocator->createT<SkRGB16_Opaque_Blitter>(device, paint); } else { - SK_PLACEMENT_NEW_ARGS(blitter, SkRGB16_Blitter, storage, - storageSize, (device, paint)); + blitter = allocator->createT<SkRGB16_Blitter>(device, paint); } } |