| Index: src/core/SkBlitter_ARGB32.cpp
|
| diff --git a/src/core/SkBlitter_ARGB32.cpp b/src/core/SkBlitter_ARGB32.cpp
|
| index 118a1d12f3e21d5cbd4ac96e7f970b569489b854..d4bec1bc086fe7e7c3fcc9f4bb0b4b183731edb8 100644
|
| --- a/src/core/SkBlitter_ARGB32.cpp
|
| +++ b/src/core/SkBlitter_ARGB32.cpp
|
| @@ -275,16 +275,14 @@
|
| }
|
|
|
| SkARGB32_Shader_Blitter::SkARGB32_Shader_Blitter(const SkBitmap& device,
|
| - const SkPaint& paint, SkShader::Context* shaderContext)
|
| - : INHERITED(device, paint, shaderContext)
|
| -{
|
| + const SkPaint& paint) : INHERITED(device, paint) {
|
| fBuffer = (SkPMColor*)sk_malloc_throw(device.width() * (sizeof(SkPMColor)));
|
|
|
| fXfermode = paint.getXfermode();
|
| SkSafeRef(fXfermode);
|
|
|
| int flags = 0;
|
| - if (!(shaderContext->getFlags() & SkShader::kOpaqueAlpha_Flag)) {
|
| + if (!(fShader->getFlags() & SkShader::kOpaqueAlpha_Flag)) {
|
| flags |= SkBlitRow::kSrcPixelAlpha_Flag32;
|
| }
|
| // we call this on the output from the shader
|
| @@ -294,7 +292,7 @@
|
|
|
| fShadeDirectlyIntoDevice = false;
|
| if (fXfermode == NULL) {
|
| - if (shaderContext->getFlags() & SkShader::kOpaqueAlpha_Flag) {
|
| + if (fShader->getFlags() & SkShader::kOpaqueAlpha_Flag) {
|
| fShadeDirectlyIntoDevice = true;
|
| }
|
| } else {
|
| @@ -307,7 +305,7 @@
|
| }
|
| }
|
|
|
| - fConstInY = SkToBool(shaderContext->getFlags() & SkShader::kConstInY32_Flag);
|
| + fConstInY = SkToBool(fShader->getFlags() & SkShader::kConstInY32_Flag);
|
| }
|
|
|
| SkARGB32_Shader_Blitter::~SkARGB32_Shader_Blitter() {
|
| @@ -321,10 +319,10 @@
|
| uint32_t* device = fDevice.getAddr32(x, y);
|
|
|
| if (fShadeDirectlyIntoDevice) {
|
| - fShaderContext->shadeSpan(x, y, device, width);
|
| + fShader->shadeSpan(x, y, device, width);
|
| } else {
|
| SkPMColor* span = fBuffer;
|
| - fShaderContext->shadeSpan(x, y, span, width);
|
| + fShader->shadeSpan(x, y, span, width);
|
| if (fXfermode) {
|
| fXfermode->xfer32(device, span, width, NULL);
|
| } else {
|
| @@ -337,22 +335,22 @@
|
| SkASSERT(x >= 0 && y >= 0 &&
|
| x + width <= fDevice.width() && y + height <= fDevice.height());
|
|
|
| - uint32_t* device = fDevice.getAddr32(x, y);
|
| - size_t deviceRB = fDevice.rowBytes();
|
| - SkShader::Context* shaderContext = fShaderContext;
|
| - SkPMColor* span = fBuffer;
|
| + uint32_t* device = fDevice.getAddr32(x, y);
|
| + size_t deviceRB = fDevice.rowBytes();
|
| + SkShader* shader = fShader;
|
| + SkPMColor* span = fBuffer;
|
|
|
| if (fConstInY) {
|
| if (fShadeDirectlyIntoDevice) {
|
| // shade the first row directly into the device
|
| - shaderContext->shadeSpan(x, y, device, width);
|
| + fShader->shadeSpan(x, y, device, width);
|
| span = device;
|
| while (--height > 0) {
|
| device = (uint32_t*)((char*)device + deviceRB);
|
| memcpy(device, span, width << 2);
|
| }
|
| } else {
|
| - shaderContext->shadeSpan(x, y, span, width);
|
| + fShader->shadeSpan(x, y, span, width);
|
| SkXfermode* xfer = fXfermode;
|
| if (xfer) {
|
| do {
|
| @@ -374,7 +372,7 @@
|
|
|
| if (fShadeDirectlyIntoDevice) {
|
| void* ctx;
|
| - SkShader::Context::ShadeProc shadeProc = shaderContext->asAShadeProc(&ctx);
|
| + SkShader::ShadeProc shadeProc = fShader->asAShadeProc(&ctx);
|
| if (shadeProc) {
|
| do {
|
| shadeProc(ctx, x, y, device, width);
|
| @@ -383,7 +381,7 @@
|
| } while (--height > 0);
|
| } else {
|
| do {
|
| - shaderContext->shadeSpan(x, y, device, width);
|
| + shader->shadeSpan(x, y, device, width);
|
| y += 1;
|
| device = (uint32_t*)((char*)device + deviceRB);
|
| } while (--height > 0);
|
| @@ -392,7 +390,7 @@
|
| SkXfermode* xfer = fXfermode;
|
| if (xfer) {
|
| do {
|
| - shaderContext->shadeSpan(x, y, span, width);
|
| + shader->shadeSpan(x, y, span, width);
|
| xfer->xfer32(device, span, width, NULL);
|
| y += 1;
|
| device = (uint32_t*)((char*)device + deviceRB);
|
| @@ -400,7 +398,7 @@
|
| } else {
|
| SkBlitRow::Proc32 proc = fProc32;
|
| do {
|
| - shaderContext->shadeSpan(x, y, span, width);
|
| + shader->shadeSpan(x, y, span, width);
|
| proc(device, span, width, 255);
|
| y += 1;
|
| device = (uint32_t*)((char*)device + deviceRB);
|
| @@ -411,9 +409,9 @@
|
|
|
| void SkARGB32_Shader_Blitter::blitAntiH(int x, int y, const SkAlpha antialias[],
|
| const int16_t runs[]) {
|
| - SkPMColor* span = fBuffer;
|
| - uint32_t* device = fDevice.getAddr32(x, y);
|
| - SkShader::Context* shaderContext = fShaderContext;
|
| + SkPMColor* span = fBuffer;
|
| + uint32_t* device = fDevice.getAddr32(x, y);
|
| + SkShader* shader = fShader;
|
|
|
| if (fXfermode && !fShadeDirectlyIntoDevice) {
|
| for (;;) {
|
| @@ -424,7 +422,7 @@
|
| break;
|
| int aa = *antialias;
|
| if (aa) {
|
| - shaderContext->shadeSpan(x, y, span, count);
|
| + shader->shadeSpan(x, y, span, count);
|
| if (aa == 255) {
|
| xfer->xfer32(device, span, count, NULL);
|
| } else {
|
| @@ -440,7 +438,7 @@
|
| x += count;
|
| }
|
| } else if (fShadeDirectlyIntoDevice ||
|
| - (shaderContext->getFlags() & SkShader::kOpaqueAlpha_Flag)) {
|
| + (fShader->getFlags() & SkShader::kOpaqueAlpha_Flag)) {
|
| for (;;) {
|
| int count = *runs;
|
| if (count <= 0) {
|
| @@ -450,9 +448,9 @@
|
| if (aa) {
|
| if (aa == 255) {
|
| // cool, have the shader draw right into the device
|
| - shaderContext->shadeSpan(x, y, device, count);
|
| + shader->shadeSpan(x, y, device, count);
|
| } else {
|
| - shaderContext->shadeSpan(x, y, span, count);
|
| + shader->shadeSpan(x, y, span, count);
|
| fProc32Blend(device, span, count, aa);
|
| }
|
| }
|
| @@ -469,7 +467,7 @@
|
| }
|
| int aa = *antialias;
|
| if (aa) {
|
| - shaderContext->shadeSpan(x, y, span, count);
|
| + fShader->shadeSpan(x, y, span, count);
|
| if (aa == 255) {
|
| fProc32(device, span, count, 255);
|
| } else {
|
| @@ -493,11 +491,10 @@
|
|
|
| SkASSERT(mask.fBounds.contains(clip));
|
|
|
| - SkShader::Context* shaderContext = fShaderContext;
|
| SkBlitMask::RowProc proc = NULL;
|
| if (!fXfermode) {
|
| unsigned flags = 0;
|
| - if (shaderContext->getFlags() & SkShader::kOpaqueAlpha_Flag) {
|
| + if (fShader->getFlags() & SkShader::kOpaqueAlpha_Flag) {
|
| flags |= SkBlitMask::kSrcIsOpaque_RowFlag;
|
| }
|
| proc = SkBlitMask::RowFactory(SkBitmap::kARGB_8888_Config, mask.fFormat,
|
| @@ -518,13 +515,14 @@
|
| const uint8_t* maskRow = (const uint8_t*)mask.getAddr(x, y);
|
| const size_t maskRB = mask.fRowBytes;
|
|
|
| + SkShader* shader = fShader;
|
| SkPMColor* span = fBuffer;
|
|
|
| if (fXfermode) {
|
| SkASSERT(SkMask::kA8_Format == mask.fFormat);
|
| SkXfermode* xfer = fXfermode;
|
| do {
|
| - shaderContext->shadeSpan(x, y, span, width);
|
| + shader->shadeSpan(x, y, span, width);
|
| xfer->xfer32((SkPMColor*)dstRow, span, width, maskRow);
|
| dstRow += dstRB;
|
| maskRow += maskRB;
|
| @@ -532,7 +530,7 @@
|
| } while (--height > 0);
|
| } else {
|
| do {
|
| - shaderContext->shadeSpan(x, y, span, width);
|
| + shader->shadeSpan(x, y, span, width);
|
| proc(dstRow, maskRow, span, width);
|
| dstRow += dstRB;
|
| maskRow += maskRB;
|
| @@ -544,13 +542,13 @@
|
| void SkARGB32_Shader_Blitter::blitV(int x, int y, int height, SkAlpha alpha) {
|
| SkASSERT(x >= 0 && y >= 0 && y + height <= fDevice.height());
|
|
|
| - uint32_t* device = fDevice.getAddr32(x, y);
|
| - size_t deviceRB = fDevice.rowBytes();
|
| - SkShader::Context* shaderContext = fShaderContext;
|
| + uint32_t* device = fDevice.getAddr32(x, y);
|
| + size_t deviceRB = fDevice.rowBytes();
|
| + SkShader* shader = fShader;
|
|
|
| if (fConstInY) {
|
| SkPMColor c;
|
| - shaderContext->shadeSpan(x, y, &c, 1);
|
| + fShader->shadeSpan(x, y, &c, 1);
|
|
|
| if (fShadeDirectlyIntoDevice) {
|
| if (255 == alpha) {
|
| @@ -584,7 +582,7 @@
|
|
|
| if (fShadeDirectlyIntoDevice) {
|
| void* ctx;
|
| - SkShader::Context::ShadeProc shadeProc = shaderContext->asAShadeProc(&ctx);
|
| + SkShader::ShadeProc shadeProc = fShader->asAShadeProc(&ctx);
|
| if (255 == alpha) {
|
| if (shadeProc) {
|
| do {
|
| @@ -594,7 +592,7 @@
|
| } while (--height > 0);
|
| } else {
|
| do {
|
| - shaderContext->shadeSpan(x, y, device, 1);
|
| + shader->shadeSpan(x, y, device, 1);
|
| y += 1;
|
| device = (uint32_t*)((char*)device + deviceRB);
|
| } while (--height > 0);
|
| @@ -610,7 +608,7 @@
|
| } while (--height > 0);
|
| } else {
|
| do {
|
| - shaderContext->shadeSpan(x, y, &c, 1);
|
| + shader->shadeSpan(x, y, &c, 1);
|
| *device = SkFourByteInterp(c, *device, alpha);
|
| y += 1;
|
| device = (uint32_t*)((char*)device + deviceRB);
|
| @@ -622,7 +620,7 @@
|
| SkXfermode* xfer = fXfermode;
|
| if (xfer) {
|
| do {
|
| - shaderContext->shadeSpan(x, y, span, 1);
|
| + shader->shadeSpan(x, y, span, 1);
|
| xfer->xfer32(device, span, 1, &alpha);
|
| y += 1;
|
| device = (uint32_t*)((char*)device + deviceRB);
|
| @@ -630,7 +628,7 @@
|
| } else {
|
| SkBlitRow::Proc32 proc = (255 == alpha) ? fProc32 : fProc32Blend;
|
| do {
|
| - shaderContext->shadeSpan(x, y, span, 1);
|
| + shader->shadeSpan(x, y, span, 1);
|
| proc(device, span, 1, alpha);
|
| y += 1;
|
| device = (uint32_t*)((char*)device + deviceRB);
|
|
|