1/*
2 * Copyright 2011 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
10static void make_bitmap(SkBitmap* bitmap, SkIRect* center) {
11    const int kFixed = 28;
12    const int kStretchy = 8;
13    const int kSize = 2*kFixed + kStretchy;
14
15    bitmap->allocN32Pixels(kSize, kSize);
16    SkCanvas canvas(*bitmap);
17    canvas.clear(SK_ColorTRANSPARENT);
18
19    SkRect r = SkRect::MakeWH(SkIntToScalar(kSize), SkIntToScalar(kSize));
20    const SkScalar strokeWidth = SkIntToScalar(6);
21    const SkScalar radius = SkIntToScalar(kFixed) - strokeWidth/2;
22
23    center->setXYWH(kFixed, kFixed, kStretchy, kStretchy);
24
25    SkPaint paint;
26    paint.setAntiAlias(true);
27
28    paint.setColor(0xFFFF0000);
29    canvas.drawRoundRect(r, radius, radius, paint);
30    r.setXYWH(SkIntToScalar(kFixed), 0, SkIntToScalar(kStretchy), SkIntToScalar(kSize));
31    paint.setColor(0x8800FF00);
32    canvas.drawRect(r, paint);
33    r.setXYWH(0, SkIntToScalar(kFixed), SkIntToScalar(kSize), SkIntToScalar(kStretchy));
34    paint.setColor(0x880000FF);
35    canvas.drawRect(r, paint);
36}
37
38namespace skiagm {
39
40class NinePatchStretchGM : public GM {
41public:
42    SkBitmap fBM;
43
44    NinePatchStretchGM() {}
45
46protected:
47    virtual SkString onShortName() {
48        return SkString("ninepatch-stretch");
49    }
50
51    virtual SkISize onISize() {
52        return SkISize::Make(400, 400);
53    }
54
55    virtual void onDraw(SkCanvas* canvas) {
56        SkBitmap bm;
57        SkIRect center;
58        make_bitmap(&bm, &center);
59
60        // amount of bm that should not be stretched (unless we have to)
61        const SkScalar fixed = SkIntToScalar(bm.width() - center.width());
62
63        const SkTSize<SkScalar> size[] = {
64            { fixed * 4 / 5, fixed * 4 / 5 },   // shrink in both axes
65            { fixed * 4 / 5, fixed * 4 },       // shrink in X
66            { fixed * 4,     fixed * 4 / 5 },   // shrink in Y
67            { fixed * 4,     fixed * 4 }
68        };
69
70        canvas->drawBitmap(bm, SkIntToScalar(10), SkIntToScalar(10), NULL);
71
72        SkScalar x = SkIntToScalar(100);
73        SkScalar y = SkIntToScalar(100);
74
75        SkPaint paint;
76        paint.setFilterLevel(SkPaint::kLow_FilterLevel);
77
78        for (int iy = 0; iy < 2; ++iy) {
79            for (int ix = 0; ix < 2; ++ix) {
80                int i = ix * 2 + iy;
81                SkRect r = SkRect::MakeXYWH(x + ix * fixed, y + iy * fixed,
82                                            size[i].width(), size[i].height());
83                canvas->drawBitmapNine(bm, center, r, &paint);
84            }
85        }
86    }
87
88private:
89    typedef GM INHERITED;
90};
91
92//////////////////////////////////////////////////////////////////////////////
93
94static GM* MyFactory(void*) { return new NinePatchStretchGM; }
95static GMRegistry reg(MyFactory);
96
97}
98