| Index: src/gpu/SkGpuDevice.cpp
|
| diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
|
| index 17e4468acb21f293b1e3ba87945a8b48d57619df..2545313e92655c99f3255a55420cbfd2515460bb 100644
|
| --- a/src/gpu/SkGpuDevice.cpp
|
| +++ b/src/gpu/SkGpuDevice.cpp
|
| @@ -27,6 +27,7 @@
|
| #include "SkGr.h"
|
| #include "SkGrPriv.h"
|
| #include "SkImage_Base.h"
|
| +#include "SkImageCacherator.h"
|
| #include "SkImageFilter.h"
|
| #include "SkLayerInfo.h"
|
| #include "SkMaskFilter.h"
|
| @@ -1399,43 +1400,36 @@ bool SkGpuDevice::filterImage(const SkImageFilter* filter, const SkBitmap& src,
|
| filter, ctx, result, offset);
|
| }
|
|
|
| -static bool wrap_as_bm(GrContext* ctx, const SkImage* image, SkBitmap* bm) {
|
| - // TODO: It is wrong to assume these texture params here.
|
| - SkAutoTUnref<GrTexture> tex(as_IB(image)->asTextureRef(ctx, GrTextureParams::ClampNoFilter()));
|
| - if (tex) {
|
| - GrWrapTextureInBitmap(tex, image->width(), image->height(), image->isOpaque(), bm);
|
| - return true;
|
| - } else {
|
| - return as_IB(image)->getROPixels(bm);
|
| - }
|
| -}
|
| -
|
| void SkGpuDevice::drawImage(const SkDraw& draw, const SkImage* image, SkScalar x, SkScalar y,
|
| const SkPaint& paint) {
|
| - SkBitmap bm;
|
| + SkMatrix viewMatrix = *draw.fMatrix;
|
| + viewMatrix.preTranslate(x, y);
|
| if (GrTexture* tex = as_IB(image)->peekTexture()) {
|
| CHECK_SHOULD_DRAW(draw);
|
| - SkMatrix viewMatrix = *draw.fMatrix;
|
| - viewMatrix.preTranslate(x, y);
|
| bool alphaOnly = GrPixelConfigIsAlphaOnly(tex->config());
|
| GrImageTextureAdjuster adjuster(as_IB(image));
|
| this->drawTextureProducer(&adjuster, alphaOnly, nullptr, nullptr,
|
| SkCanvas::kFast_SrcRectConstraint, viewMatrix, fClip, paint);
|
| return;
|
| } else {
|
| + SkBitmap bm;
|
| if (this->shouldTileImage(image, nullptr, SkCanvas::kFast_SrcRectConstraint,
|
| paint.getFilterQuality(), *draw.fMatrix)) {
|
| // only support tiling as bitmap at the moment, so force raster-version
|
| if (!as_IB(image)->getROPixels(&bm)) {
|
| return;
|
| }
|
| - } else {
|
| - if (!wrap_as_bm(this->context(), image, &bm)) {
|
| - return;
|
| - }
|
| + this->drawBitmap(draw, bm, SkMatrix::MakeTrans(x, y), paint);
|
| + } else if (SkImageCacherator* cacher = as_IB(image)->peekCacherator()) {
|
| + CHECK_SHOULD_DRAW(draw);
|
| + GrImageTextureMaker maker(fContext, cacher, image, SkImage::kAllow_CachingHint);
|
| + bool alphaOnly = kAlpha_8_SkColorType == cacher->info().colorType();
|
| + this->drawTextureProducer(&maker, alphaOnly, nullptr, nullptr,
|
| + SkCanvas::kFast_SrcRectConstraint, viewMatrix, fClip, paint);
|
| + } else if (as_IB(image)->getROPixels(&bm)) {
|
| + this->drawBitmap(draw, bm, SkMatrix::MakeTrans(x, y), paint);
|
| }
|
| }
|
| - this->drawBitmap(draw, bm, SkMatrix::MakeTrans(x, y), paint);
|
| }
|
|
|
| void SkGpuDevice::drawImageRect(const SkDraw& draw, const SkImage* image, const SkRect* src,
|
| @@ -1450,20 +1444,35 @@ void SkGpuDevice::drawImageRect(const SkDraw& draw, const SkImage* image, const
|
| return;
|
| }
|
| SkBitmap bm;
|
| - SkMatrix viewMatrix = *draw.fMatrix;
|
| - viewMatrix.preScale(dst.width() / (src ? src->width() : image->width()),
|
| - dst.height() / (src ? src->height() : image->height()));
|
| - if (this->shouldTileImage(image, src, constraint, paint.getFilterQuality(), viewMatrix)) {
|
| + SkMatrix totalMatrix = *draw.fMatrix;
|
| + totalMatrix.preScale(dst.width() / (src ? src->width() : image->width()),
|
| + dst.height() / (src ? src->height() : image->height()));
|
| + if (this->shouldTileImage(image, src, constraint, paint.getFilterQuality(), totalMatrix)) {
|
| // only support tiling as bitmap at the moment, so force raster-version
|
| if (!as_IB(image)->getROPixels(&bm)) {
|
| return;
|
| }
|
| + this->drawBitmapRect(draw, bm, src, dst, paint, constraint);
|
| + } else if (SkImageCacherator* cacher = as_IB(image)->peekCacherator()) {
|
| + CHECK_SHOULD_DRAW(draw);
|
| + GrImageTextureMaker maker(fContext, cacher, image, SkImage::kAllow_CachingHint);
|
| + bool alphaOnly = kAlpha_8_SkColorType == cacher->info().colorType();
|
| + this->drawTextureProducer(&maker, alphaOnly, src, &dst, constraint, *draw.fMatrix,
|
| + fClip, paint);
|
| + } else if (as_IB(image)->getROPixels(&bm)) {
|
| + this->drawBitmapRect(draw, bm, src, dst, paint, constraint);
|
| + }
|
| +}
|
| +
|
| +static bool wrap_as_bm(GrContext* ctx, const SkImage* image, SkBitmap* bm) {
|
| + // TODO: It is wrong to assume these texture params here.
|
| + SkAutoTUnref<GrTexture> tex(as_IB(image)->asTextureRef(ctx, GrTextureParams::ClampNoFilter()));
|
| + if (tex) {
|
| + GrWrapTextureInBitmap(tex, image->width(), image->height(), image->isOpaque(), bm);
|
| + return true;
|
| } else {
|
| - if (!wrap_as_bm(this->context(), image, &bm)) {
|
| - return;
|
| - }
|
| + return as_IB(image)->getROPixels(bm);
|
| }
|
| - this->drawBitmapRect(draw, bm, src, dst, paint, constraint);
|
| }
|
|
|
| void SkGpuDevice::drawImageNine(const SkDraw& draw, const SkImage* image,
|
|
|