| Index: gm/drawbitmaprect.cpp
|
| diff --git a/gm/drawbitmaprect.cpp b/gm/drawbitmaprect.cpp
|
| index fd205f53378b9e36ce0065082eedde8b1d41c54d..39d46dbd807dd87fff7c871536af76032ae17489 100644
|
| --- a/gm/drawbitmaprect.cpp
|
| +++ b/gm/drawbitmaprect.cpp
|
| @@ -1,18 +1,17 @@
|
| -
|
| /*
|
| * Copyright 2011 Google Inc.
|
| *
|
| * Use of this source code is governed by a BSD-style license that can be
|
| * found in the LICENSE file.
|
| */
|
| +
|
| #include "gm.h"
|
| #include "SkBlurMask.h"
|
| #include "SkBlurMaskFilter.h"
|
| #include "SkColorPriv.h"
|
| #include "SkGradientShader.h"
|
| #include "SkShader.h"
|
| -
|
| -namespace skiagm {
|
| +#include "SkImage.h"
|
|
|
| static SkBitmap make_chessbm(int w, int h) {
|
| SkBitmap bm;
|
| @@ -28,7 +27,13 @@ static SkBitmap make_chessbm(int w, int h) {
|
| return bm;
|
| }
|
|
|
| -static void makebm(SkBitmap* bm, int w, int h) {
|
| +static SkImage* image_from_bitmap(const SkBitmap& bm) {
|
| + SkBitmap b(bm);
|
| + b.lockPixels();
|
| + return SkImage::NewRasterCopy(b.info(), b.getPixels(), b.rowBytes());
|
| +}
|
| +
|
| +static SkImage* makebm(SkBitmap* bm, int w, int h) {
|
| bm->allocN32Pixels(w, h);
|
| bm->eraseColor(SK_ColorTRANSPARENT);
|
|
|
| @@ -70,31 +75,83 @@ static void makebm(SkBitmap* bm, int w, int h) {
|
| }
|
| // Let backends know we won't change this, so they don't have to deep copy it defensively.
|
| bm->setImmutable();
|
| +
|
| + return image_from_bitmap(*bm);
|
| }
|
|
|
| +static void canvasproc(SkCanvas* canvas, SkImage*, const SkBitmap& bm, const SkIRect* srcR,
|
| + const SkRect& dstR) {
|
| + canvas->drawBitmapRect(bm, srcR, dstR);
|
| +}
|
| +
|
| +static void imageproc(SkCanvas* canvas, SkImage* image, const SkBitmap&, const SkIRect* srcIR,
|
| + const SkRect& dstR) {
|
| + SkRect storage, *srcR = NULL;
|
| + if (srcIR) {
|
| + storage.set(*srcIR);
|
| + srcR = &storage;
|
| + }
|
| + canvas->drawImageRect(image, srcR, dstR);
|
| +}
|
| +
|
| +static void imagescaleproc(SkCanvas* canvas, SkImage* image, const SkBitmap&, const SkIRect* srcIR,
|
| + const SkRect& dstR) {
|
| + const int newW = SkScalarRoundToInt(dstR.width());
|
| + const int newH = SkScalarRoundToInt(dstR.height());
|
| + SkAutoTUnref<SkImage> newImage(image->newImage(newW, newH, srcIR));
|
| +
|
| +#ifdef SK_DEBUG
|
| + const SkIRect baseR = SkIRect::MakeWH(image->width(), image->height());
|
| + const bool containsSubset = !srcIR || baseR.contains(*srcIR);
|
| +#endif
|
| +
|
| + if (newImage) {
|
| + SkASSERT(containsSubset);
|
| + canvas->drawImage(newImage, dstR.x(), dstR.y());
|
| + } else {
|
| + // newImage() does not support subsets that are not contained by the original
|
| + // but drawImageRect does, so we just draw an X in its place to indicate that we are
|
| + // deliberately not drawing here.
|
| + SkASSERT(!containsSubset);
|
| + SkPaint paint;
|
| + paint.setStyle(SkPaint::kStroke_Style);
|
| + paint.setStrokeWidth(4);
|
| + canvas->drawLine(4, 4, newW - 4.0f, newH - 4.0f, paint);
|
| + canvas->drawLine(4, newH - 4.0f, newW - 4.0f, 4, paint);
|
| + }
|
| +}
|
| +
|
| +typedef void DrawRectRectProc(SkCanvas*, SkImage*, const SkBitmap&, const SkIRect*, const SkRect&);
|
| +
|
| static const int gSize = 1024;
|
| +static const int gBmpSize = 2048;
|
|
|
| -class DrawBitmapRectGM : public GM {
|
| +class DrawBitmapRectGM : public skiagm::GM {
|
| public:
|
| - DrawBitmapRectGM() {
|
| + DrawBitmapRectGM(DrawRectRectProc proc, const char suffix[]) : fProc(proc) {
|
| + fName.set("drawbitmaprect");
|
| + if (suffix) {
|
| + fName.append(suffix);
|
| + }
|
| }
|
|
|
| - SkBitmap fLargeBitmap;
|
| + DrawRectRectProc* fProc;
|
| + SkBitmap fLargeBitmap;
|
| + SkAutoTUnref<SkImage> fImage;
|
| + SkString fName;
|
|
|
| protected:
|
| - SkString onShortName() {
|
| - return SkString("drawbitmaprect");
|
| - }
|
| + SkString onShortName() SK_OVERRIDE { return fName; }
|
|
|
| - SkISize onISize() { return SkISize::Make(gSize, gSize); }
|
| + SkISize onISize() SK_OVERRIDE { return SkISize::Make(gSize, gSize); }
|
|
|
| - virtual void onDraw(SkCanvas* canvas) {
|
| - static const int kBmpSize = 2048;
|
| - if (fLargeBitmap.isNull()) {
|
| - makebm(&fLargeBitmap, kBmpSize, kBmpSize);
|
| - }
|
| + void onOnceBeforeDraw() SK_OVERRIDE {
|
| + fImage.reset(makebm(&fLargeBitmap, gBmpSize, gBmpSize));
|
| + }
|
| +
|
| + void onDraw(SkCanvas* canvas) SK_OVERRIDE {
|
| SkRect dstRect = { 0, 0, SkIntToScalar(64), SkIntToScalar(64)};
|
| - static const int kMaxSrcRectSize = 1 << (SkNextLog2(kBmpSize) + 2);
|
| + static const int kMaxSrcRectSize = 1 << (SkNextLog2(gBmpSize) + 2);
|
|
|
| static const int kPadX = 30;
|
| static const int kPadY = 40;
|
| @@ -113,7 +170,7 @@ protected:
|
| blackPaint.setAntiAlias(true);
|
| sk_tool_utils::set_portable_typeface(&blackPaint);
|
| SkString title;
|
| - title.printf("Bitmap size: %d x %d", kBmpSize, kBmpSize);
|
| + title.printf("Bitmap size: %d x %d", gBmpSize, gBmpSize);
|
| canvas->drawText(title.c_str(), title.size(), 0,
|
| titleHeight, blackPaint);
|
|
|
| @@ -123,10 +180,8 @@ protected:
|
| for (int w = 1; w <= kMaxSrcRectSize; w *= 4) {
|
| for (int h = 1; h <= kMaxSrcRectSize; h *= 4) {
|
|
|
| - SkIRect srcRect = SkIRect::MakeXYWH((kBmpSize - w) / 2,
|
| - (kBmpSize - h) / 2,
|
| - w, h);
|
| - canvas->drawBitmapRect(fLargeBitmap, &srcRect, dstRect);
|
| + SkIRect srcRect = SkIRect::MakeXYWH((gBmpSize - w) / 2, (gBmpSize - h) / 2, w, h);
|
| + fProc(canvas, fImage, fLargeBitmap, &srcRect, dstRect);
|
|
|
| SkString label;
|
| label.appendf("%d x %d", w, h);
|
| @@ -176,11 +231,9 @@ protected:
|
| }
|
|
|
| private:
|
| - typedef GM INHERITED;
|
| + typedef skiagm::GM INHERITED;
|
| };
|
|
|
| -//////////////////////////////////////////////////////////////////////////////
|
| -
|
| -static GM* MyFactory(void*) { return new DrawBitmapRectGM; }
|
| -static GMRegistry reg(MyFactory);
|
| -}
|
| +DEF_GM( return new DrawBitmapRectGM(canvasproc, NULL); )
|
| +DEF_GM( return new DrawBitmapRectGM(imageproc, "-imagerect"); )
|
| +DEF_GM( return new DrawBitmapRectGM(imagescaleproc, "-imagescale"); )
|
|
|