| Index: gm/drawbitmaprect.cpp
|
| diff --git a/gm/drawbitmaprect.cpp b/gm/drawbitmaprect.cpp
|
| index 0747ab0910e36aea612bf346d38ae88a931ebd0f..ea9a09fe0a779fea70e9569e01fd52aa57b1b333 100644
|
| --- a/gm/drawbitmaprect.cpp
|
| +++ b/gm/drawbitmaprect.cpp
|
| @@ -93,17 +93,43 @@ static sk_sp<SkImage> makebm(SkCanvas* origCanvas, SkBitmap* resultBM, int w, in
|
| return image;
|
| }
|
|
|
| -static void canvasproc(SkCanvas* canvas, SkImage*, const SkBitmap& bm, const SkIRect& srcR,
|
| - const SkRect& dstR) {
|
| - canvas->drawBitmapRect(bm, srcR, dstR, nullptr);
|
| +static void bitmapproc(SkCanvas* canvas, SkImage*, const SkBitmap& bm, const SkIRect& srcR,
|
| + const SkRect& dstR, const SkPaint* paint) {
|
| + canvas->drawBitmapRect(bm, srcR, dstR, paint);
|
| +}
|
| +
|
| +static void bitmapsubsetproc(SkCanvas* canvas, SkImage*, const SkBitmap& bm, const SkIRect& srcR,
|
| + const SkRect& dstR, const SkPaint* paint) {
|
| + if (!bm.bounds().contains(srcR)) {
|
| + bitmapproc(canvas, nullptr, bm, srcR, dstR, paint);
|
| + return;
|
| + }
|
| +
|
| + SkBitmap subset;
|
| + if (bm.extractSubset(&subset, srcR)) {
|
| + canvas->drawBitmapRect(subset, dstR, paint);
|
| + }
|
| }
|
|
|
| static void imageproc(SkCanvas* canvas, SkImage* image, const SkBitmap&, const SkIRect& srcR,
|
| - const SkRect& dstR) {
|
| - canvas->drawImageRect(image, srcR, dstR, nullptr);
|
| + const SkRect& dstR, const SkPaint* paint) {
|
| + canvas->drawImageRect(image, srcR, dstR, paint);
|
| }
|
|
|
| -typedef void DrawRectRectProc(SkCanvas*, SkImage*, const SkBitmap&, const SkIRect&, const SkRect&);
|
| +static void imagesubsetproc(SkCanvas* canvas, SkImage* image, const SkBitmap& bm,
|
| + const SkIRect& srcR, const SkRect& dstR, const SkPaint* paint) {
|
| + if (!image->bounds().contains(srcR)) {
|
| + imageproc(canvas, image, bm, srcR, dstR, paint);
|
| + return;
|
| + }
|
| +
|
| + if (sk_sp<SkImage> subset = image->makeSubset(srcR)) {
|
| + canvas->drawImageRect(subset, dstR, paint);
|
| + }
|
| +}
|
| +
|
| +typedef void DrawRectRectProc(SkCanvas*, SkImage*, const SkBitmap&, const SkIRect&, const SkRect&,
|
| + const SkPaint*);
|
|
|
| static const int gSize = 1024;
|
| static const int gBmpSize = 2048;
|
| @@ -164,7 +190,7 @@ protected:
|
| for (int h = 1; h <= kMaxSrcRectSize; h *= 4) {
|
|
|
| SkIRect srcRect = SkIRect::MakeXYWH((gBmpSize - w) / 2, (gBmpSize - h) / 2, w, h);
|
| - fProc(canvas, fImage.get(), fLargeBitmap, srcRect, dstRect);
|
| + fProc(canvas, fImage.get(), fLargeBitmap, srcRect, dstRect, nullptr);
|
|
|
| SkString label;
|
| label.appendf("%d x %d", w, h);
|
| @@ -206,9 +232,10 @@ protected:
|
| paint.setMaskFilter(SkBlurMaskFilter::Make(
|
| kNormal_SkBlurStyle,
|
| SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(5)),
|
| - SkBlurMaskFilter::kHighQuality_BlurFlag |
|
| - SkBlurMaskFilter::kIgnoreTransform_BlurFlag));
|
| - canvas->drawBitmapRect(bm, srcRect, dstRect, &paint);
|
| + SkBlurMaskFilter::kHighQuality_BlurFlag));
|
| +
|
| + sk_sp<SkImage> image(SkImage::MakeFromBitmap(bm));
|
| + fProc(canvas, image.get(), bm, srcRect, dstRect, &paint);
|
| }
|
| }
|
|
|
| @@ -216,5 +243,7 @@ private:
|
| typedef skiagm::GM INHERITED;
|
| };
|
|
|
| -DEF_GM( return new DrawBitmapRectGM(canvasproc, nullptr); )
|
| -DEF_GM( return new DrawBitmapRectGM(imageproc, "-imagerect"); )
|
| +DEF_GM( return new DrawBitmapRectGM(bitmapproc , nullptr); )
|
| +DEF_GM( return new DrawBitmapRectGM(bitmapsubsetproc, "-subset"); )
|
| +DEF_GM( return new DrawBitmapRectGM(imageproc , "-imagerect"); )
|
| +DEF_GM( return new DrawBitmapRectGM(imagesubsetproc , "-imagerect-subset"); )
|
|
|