1/*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "gm.h"
9
10#include "SkBitmapSource.h"
11
12// This GM exercises the SkBitmapSource ImageFilter class.
13
14class BitmapSourceGM : public skiagm::GM {
15public:
16    BitmapSourceGM() {
17    }
18
19protected:
20    virtual SkString onShortName() SK_OVERRIDE {
21        return SkString("bitmapsource");
22    }
23
24    void makeBitmap() {
25        fBitmap.allocN32Pixels(100, 100);
26        SkCanvas canvas(fBitmap);
27        canvas.clear(0x00000000);
28        SkPaint paint;
29        paint.setAntiAlias(true);
30        paint.setColor(0xFFFFFFFF);
31        paint.setTextSize(SkIntToScalar(96));
32        const char* str = "e";
33        canvas.drawText(str, strlen(str), SkIntToScalar(20), SkIntToScalar(70), paint);
34    }
35
36    virtual SkISize onISize() SK_OVERRIDE { return SkISize::Make(500, 150); }
37
38    virtual void onOnceBeforeDraw() SK_OVERRIDE {
39        this->makeBitmap();
40    }
41
42    static void fillRectFiltered(SkCanvas* canvas, const SkRect& clipRect, SkImageFilter* filter) {
43        SkPaint paint;
44        paint.setImageFilter(filter);
45        canvas->save();
46        canvas->clipRect(clipRect);
47        canvas->drawPaint(paint);
48        canvas->restore();
49    }
50
51    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
52        canvas->clear(0x00000000);
53        {
54            SkRect srcRect = SkRect::MakeXYWH(20, 20, 30, 30);
55            SkRect dstRect = SkRect::MakeXYWH(0, 10, 60, 60);
56            SkRect clipRect = SkRect::MakeXYWH(0, 0, 100, 100);
57            SkRect bounds;
58            fBitmap.getBounds(&bounds);
59            SkAutoTUnref<SkImageFilter> bitmapSource(SkBitmapSource::Create(fBitmap));
60            SkAutoTUnref<SkImageFilter> bitmapSourceSrcRect(SkBitmapSource::Create(fBitmap, srcRect, srcRect));
61            SkAutoTUnref<SkImageFilter> bitmapSourceSrcRectDstRect(SkBitmapSource::Create(fBitmap, srcRect, dstRect));
62            SkAutoTUnref<SkImageFilter> bitmapSourceDstRectOnly(SkBitmapSource::Create(fBitmap, bounds, dstRect));
63
64            // Draw an unscaled bitmap.
65            fillRectFiltered(canvas, clipRect, bitmapSource);
66            canvas->translate(SkIntToScalar(100), 0);
67
68            // Draw an unscaled subset of the source bitmap (srcRect -> srcRect).
69            fillRectFiltered(canvas, clipRect, bitmapSourceSrcRect);
70            canvas->translate(SkIntToScalar(100), 0);
71
72            // Draw a subset of the bitmap scaled to a destination rect (srcRect -> dstRect).
73            fillRectFiltered(canvas, clipRect, bitmapSourceSrcRectDstRect);
74            canvas->translate(SkIntToScalar(100), 0);
75
76            // Draw the entire bitmap scaled to a destination rect (bounds -> dstRect).
77            fillRectFiltered(canvas, clipRect, bitmapSourceDstRectOnly);
78            canvas->translate(SkIntToScalar(100), 0);
79        }
80    }
81
82private:
83    SkBitmap fBitmap;
84    typedef GM INHERITED;
85};
86
87///////////////////////////////////////////////////////////////////////////////
88
89DEF_GM( return new BitmapSourceGM; )
90