| Index: src/effects/SkXfermodeImageFilter.cpp
|
| diff --git a/src/effects/SkXfermodeImageFilter.cpp b/src/effects/SkXfermodeImageFilter.cpp
|
| index 14dde88379aa7dd8f990a79f1c85dbdb9192cb5c..b8beff28bf07c5e6cab4bd79894ee2cde7ed4eb2 100644
|
| --- a/src/effects/SkXfermodeImageFilter.cpp
|
| +++ b/src/effects/SkXfermodeImageFilter.cpp
|
| @@ -7,7 +7,7 @@
|
|
|
| #include "SkXfermodeImageFilter.h"
|
| #include "SkCanvas.h"
|
| -#include "SkDevice.h"
|
| +#include "SkSurface.h"
|
| #include "SkColorPriv.h"
|
| #include "SkReadBuffer.h"
|
| #include "SkWriteBuffer.h"
|
| @@ -44,55 +44,66 @@ void SkXfermodeImageFilter::flatten(SkWriteBuffer& buffer) const {
|
| }
|
|
|
| bool SkXfermodeImageFilter::onFilterImage(Proxy* proxy,
|
| - const SkBitmap& src,
|
| - const Context& ctx,
|
| - SkBitmap* dst,
|
| - SkIPoint* offset) const {
|
| - SkBitmap background = src, foreground = src;
|
| + SkImage& src,
|
| + const Context& ctx,
|
| + SkAutoTUnref<SkImage>& dst,
|
| + SkIPoint* offset) const {
|
| + SkAutoTUnref<SkImage> background(SkRef(&src));
|
| + SkAutoTUnref<SkImage> foreground(SkRef(&src));
|
| SkImageFilter* backgroundInput = getInput(0);
|
| SkImageFilter* foregroundInput = getInput(1);
|
| SkIPoint backgroundOffset = SkIPoint::Make(0, 0);
|
| + //TODO MAKE APPLY CROP RECT PTR TO HANDLE NULL.
|
| if (backgroundInput &&
|
| - !backgroundInput->filterImage(proxy, src, ctx, &background, &backgroundOffset)) {
|
| - background.reset();
|
| + !backgroundInput->filterImage(proxy, src, ctx, background, &backgroundOffset)) {
|
| + background.reset(NULL);
|
| }
|
| SkIPoint foregroundOffset = SkIPoint::Make(0, 0);
|
| if (foregroundInput &&
|
| - !foregroundInput->filterImage(proxy, src, ctx, &foreground, &foregroundOffset)) {
|
| - foreground.reset();
|
| + !foregroundInput->filterImage(proxy, src, ctx, foreground, &foregroundOffset)) {
|
| + foreground.reset(NULL);
|
| }
|
|
|
| SkIRect bounds, foregroundBounds;
|
| - if (!applyCropRect(ctx, foreground, foregroundOffset, &foregroundBounds)) {
|
| + if (!applyCropRect(ctx, *foreground, foregroundOffset, &foregroundBounds)) {
|
| foregroundBounds.setEmpty();
|
| - foreground.reset();
|
| + foreground.reset(NULL);
|
| }
|
| - if (!applyCropRect(ctx, background, backgroundOffset, &bounds)) {
|
| + if (!applyCropRect(ctx, *background, backgroundOffset, &bounds)) {
|
| bounds.setEmpty();
|
| - background.reset();
|
| + background.reset(NULL);
|
| }
|
| bounds.join(foregroundBounds);
|
| if (bounds.isEmpty()) {
|
| return false;
|
| }
|
|
|
| - SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(bounds.width(), bounds.height()));
|
| - if (NULL == device.get()) {
|
| + SkAutoTUnref<SkSurface> surface(proxy->createSurface(bounds.width(), bounds.height()));
|
| + if (NULL == surface) {
|
| return false;
|
| }
|
| - SkCanvas canvas(device);
|
| - canvas.translate(SkIntToScalar(-bounds.left()), SkIntToScalar(-bounds.top()));
|
| + SkCanvas* canvas = surface->getCanvas();
|
| + canvas->translate(SkIntToScalar(-bounds.left()), SkIntToScalar(-bounds.top()));
|
| SkPaint paint;
|
| paint.setXfermodeMode(SkXfermode::kSrc_Mode);
|
| - canvas.drawBitmap(background, SkIntToScalar(backgroundOffset.fX),
|
| - SkIntToScalar(backgroundOffset.fY), &paint);
|
| + canvas->drawImage(background, SkIntToScalar(backgroundOffset.fX),
|
| + SkIntToScalar(backgroundOffset.fY), &paint);
|
| paint.setXfermode(fMode);
|
| - canvas.drawBitmap(foreground, SkIntToScalar(foregroundOffset.fX),
|
| + canvas->drawImage(foreground, SkIntToScalar(foregroundOffset.fX),
|
| SkIntToScalar(foregroundOffset.fY), &paint);
|
| - canvas.clipRect(SkRect::Make(foregroundBounds), SkRegion::kDifference_Op);
|
| + canvas->clipRect(SkRect::Make(foregroundBounds), SkRegion::kDifference_Op);
|
| paint.setColor(SK_ColorTRANSPARENT);
|
| - canvas.drawPaint(paint);
|
| - *dst = device->accessBitmap(false);
|
| + canvas->drawPaint(paint);
|
| +
|
| + foreground.reset(NULL);
|
| + background.reset(NULL);
|
| +
|
| + SkImage* image = surface->newImageSnapshot(SkSurface::kYes_Budgeted);
|
| + if (NULL == image) {
|
| + return false;
|
| + }
|
| + dst.reset(image);
|
| +
|
| offset->fX = bounds.left();
|
| offset->fY = bounds.top();
|
| return true;
|
| @@ -116,30 +127,30 @@ bool SkXfermodeImageFilter::canFilterImageGPU() const {
|
| }
|
|
|
| bool SkXfermodeImageFilter::filterImageGPU(Proxy* proxy,
|
| - const SkBitmap& src,
|
| + SkImage& src,
|
| const Context& ctx,
|
| - SkBitmap* result,
|
| + SkAutoTUnref<SkImage>& result,
|
| SkIPoint* offset) const {
|
| - SkBitmap background = src;
|
| + SkAutoTUnref<SkImage> background(SkRef(&src));
|
| SkIPoint backgroundOffset = SkIPoint::Make(0, 0);
|
| - if (getInput(0) && !getInput(0)->getInputResultGPU(proxy, src, ctx, &background,
|
| + if (getInput(0) && !getInput(0)->getInputResultGPU(proxy, src, ctx, background,
|
| &backgroundOffset)) {
|
| return onFilterImage(proxy, src, ctx, result, offset);
|
| }
|
| - GrTexture* backgroundTex = background.getTexture();
|
| + GrTexture* backgroundTex = background->getTexture();
|
|
|
| if (NULL == backgroundTex) {
|
| SkASSERT(false);
|
| return false;
|
| }
|
|
|
| - SkBitmap foreground = src;
|
| + SkAutoTUnref<SkImage> foreground(SkRef(&src));
|
| SkIPoint foregroundOffset = SkIPoint::Make(0, 0);
|
| - if (getInput(1) && !getInput(1)->getInputResultGPU(proxy, src, ctx, &foreground,
|
| + if (getInput(1) && !getInput(1)->getInputResultGPU(proxy, src, ctx, foreground,
|
| &foregroundOffset)) {
|
| return onFilterImage(proxy, src, ctx, result, offset);
|
| }
|
| - GrTexture* foregroundTex = foreground.getTexture();
|
| + GrTexture* foregroundTex = foreground->getTexture();
|
| GrContext* context = foregroundTex->getContext();
|
|
|
| GrFragmentProcessor* xferProcessor = NULL;
|
| @@ -167,8 +178,7 @@ bool SkXfermodeImageFilter::filterImageGPU(Proxy* proxy,
|
| SkIntToScalar(backgroundOffset.fY-foregroundOffset.fY));
|
|
|
|
|
| - SkRect srcRect;
|
| - src.getBounds(&srcRect);
|
| + SkRect srcRect = SkRect::MakeWH(src.width(), src.height());
|
|
|
| GrPaint paint;
|
| paint.addColorTextureProcessor(foregroundTex, foregroundMatrix);
|
| @@ -177,7 +187,9 @@ bool SkXfermodeImageFilter::filterImageGPU(Proxy* proxy,
|
|
|
| offset->fX = backgroundOffset.fX;
|
| offset->fY = backgroundOffset.fY;
|
| - WrapTexture(dst, src.width(), src.height(), result);
|
| + if (!WrapTexture(dst, src.width(), src.height(), result)) {
|
| + return false;
|
| + }
|
| return true;
|
| }
|
|
|
|
|