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        sk_tool_utils::set_portable_typeface(&paint);
31        paint.setColor(0xFFFFFFFF);
32        paint.setTextSize(SkIntToScalar(96));
33        const char* str = "e";
34        canvas.drawText(str, strlen(str), SkIntToScalar(20), SkIntToScalar(70), paint);
35    }
36
37    virtual SkISize onISize() SK_OVERRIDE { return SkISize::Make(500, 150); }
38
39    virtual void onOnceBeforeDraw() SK_OVERRIDE {
40        this->makeBitmap();
41    }
42
43    static void fillRectFiltered(SkCanvas* canvas, const SkRect& clipRect, SkImageFilter* filter) {
44        SkPaint paint;
45        paint.setImageFilter(filter);
46        canvas->save();
47        canvas->clipRect(clipRect);
48        canvas->drawPaint(paint);
49        canvas->restore();
50    }
51
52    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
53        canvas->clear(0x00000000);
54        {
55            SkRect srcRect = SkRect::MakeXYWH(20, 20, 30, 30);
56            SkRect dstRect = SkRect::MakeXYWH(0, 10, 60, 60);
57            SkRect clipRect = SkRect::MakeXYWH(0, 0, 100, 100);
58            SkRect bounds;
59            fBitmap.getBounds(&bounds);
60            SkAutoTUnref<SkImageFilter> bitmapSource(SkBitmapSource::Create(fBitmap));
61            SkAutoTUnref<SkImageFilter> bitmapSourceSrcRect(SkBitmapSource::Create(fBitmap, srcRect, srcRect));
62            SkAutoTUnref<SkImageFilter> bitmapSourceSrcRectDstRect(SkBitmapSource::Create(fBitmap, srcRect, dstRect));
63            SkAutoTUnref<SkImageFilter> bitmapSourceDstRectOnly(SkBitmapSource::Create(fBitmap, bounds, dstRect));
64
65            // Draw an unscaled bitmap.
66            fillRectFiltered(canvas, clipRect, bitmapSource);
67            canvas->translate(SkIntToScalar(100), 0);
68
69            // Draw an unscaled subset of the source bitmap (srcRect -> srcRect).
70            fillRectFiltered(canvas, clipRect, bitmapSourceSrcRect);
71            canvas->translate(SkIntToScalar(100), 0);
72
73            // Draw a subset of the bitmap scaled to a destination rect (srcRect -> dstRect).
74            fillRectFiltered(canvas, clipRect, bitmapSourceSrcRectDstRect);
75            canvas->translate(SkIntToScalar(100), 0);
76
77            // Draw the entire bitmap scaled to a destination rect (bounds -> dstRect).
78            fillRectFiltered(canvas, clipRect, bitmapSourceDstRectOnly);
79            canvas->translate(SkIntToScalar(100), 0);
80        }
81    }
82
83private:
84    SkBitmap fBitmap;
85    typedef GM INHERITED;
86};
87
88///////////////////////////////////////////////////////////////////////////////
89
90DEF_GM( return new BitmapSourceGM; )
91