1b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com/*
2b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com * Copyright 2011 Google Inc.
3b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com *
4b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com * Use of this source code is governed by a BSD-style license that can be
5b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com * found in the LICENSE file.
6b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com */
7b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com
8b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com#include "gm.h"
9b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com
107873333236ba36ac123312666a0b9f7755e73642commit-bot@chromium.orgstatic void make_bitmap(SkBitmap* bitmap, SkIRect* center) {
11b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    const int kFixed = 28;
12b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    const int kStretchy = 8;
13b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    const int kSize = 2*kFixed + kStretchy;
14cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com
15eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com    bitmap->allocN32Pixels(kSize, kSize);
16c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org    SkCanvas canvas(*bitmap);
17dbfac8a72393eaf01670aeb3244de0e18d8faf98junov@google.com    canvas.clear(SK_ColorTRANSPARENT);
18d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
19b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    SkRect r = SkRect::MakeWH(SkIntToScalar(kSize), SkIntToScalar(kSize));
20b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    const SkScalar strokeWidth = SkIntToScalar(6);
21b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    const SkScalar radius = SkIntToScalar(kFixed) - strokeWidth/2;
22d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
23b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    center->setXYWH(kFixed, kFixed, kStretchy, kStretchy);
24d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
25b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    SkPaint paint;
26b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    paint.setAntiAlias(true);
27d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
28b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    paint.setColor(0xFFFF0000);
29b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    canvas.drawRoundRect(r, radius, radius, paint);
30b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    r.setXYWH(SkIntToScalar(kFixed), 0, SkIntToScalar(kStretchy), SkIntToScalar(kSize));
31b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    paint.setColor(0x8800FF00);
32b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    canvas.drawRect(r, paint);
33b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    r.setXYWH(0, SkIntToScalar(kFixed), SkIntToScalar(kSize), SkIntToScalar(kStretchy));
34b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    paint.setColor(0x880000FF);
35b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    canvas.drawRect(r, paint);
36b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com}
37b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com
38b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.comnamespace skiagm {
39d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
40b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.comclass NinePatchStretchGM : public GM {
41b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.compublic:
42b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    SkBitmap fBM;
43b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com
44d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    NinePatchStretchGM() {}
45b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com
46b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.comprotected:
47a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
48a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
49a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
50a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
51b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    virtual SkString onShortName() {
52b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com        return SkString("ninepatch-stretch");
53b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    }
54b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com
55d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    virtual SkISize onISize() {
56f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina        return SkISize::Make(400, 400);
57b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    }
58b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com
59b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    virtual void onDraw(SkCanvas* canvas) {
60b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com        SkBitmap bm;
61b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com        SkIRect center;
627873333236ba36ac123312666a0b9f7755e73642commit-bot@chromium.org        make_bitmap(&bm, &center);
63d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
64b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com        // amount of bm that should not be stretched (unless we have to)
65b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com        const SkScalar fixed = SkIntToScalar(bm.width() - center.width());
66d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
67b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com        const SkTSize<SkScalar> size[] = {
68b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com            { fixed * 4 / 5, fixed * 4 / 5 },   // shrink in both axes
69b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com            { fixed * 4 / 5, fixed * 4 },       // shrink in X
70b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com            { fixed * 4,     fixed * 4 / 5 },   // shrink in Y
71b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com            { fixed * 4,     fixed * 4 }
72b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com        };
73d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
74b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com        canvas->drawBitmap(bm, SkIntToScalar(10), SkIntToScalar(10), NULL);
75d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
76b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com        SkScalar x = SkIntToScalar(100);
77b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com        SkScalar y = SkIntToScalar(100);
78d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
79b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com        SkPaint paint;
804469938e92d779dff05e745559e67907bbf21e78reed@google.com        paint.setFilterLevel(SkPaint::kLow_FilterLevel);
81d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
82b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com        for (int iy = 0; iy < 2; ++iy) {
83b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com            for (int ix = 0; ix < 2; ++ix) {
84b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com                int i = ix * 2 + iy;
85b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com                SkRect r = SkRect::MakeXYWH(x + ix * fixed, y + iy * fixed,
86b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com                                            size[i].width(), size[i].height());
879c9b8d90c822132e205af4c70363fe3a272d6c6freed@google.com                canvas->drawBitmapNine(bm, center, r, &paint);
88b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com            }
89b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com        }
90b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    }
91d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
92b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.comprivate:
93b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    typedef GM INHERITED;
94b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com};
95b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com
96b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com//////////////////////////////////////////////////////////////////////////////
97b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com
98b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.comstatic GM* MyFactory(void*) { return new NinePatchStretchGM; }
99b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.comstatic GMRegistry reg(MyFactory);
100b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com
101b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com}
102