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:
47b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    virtual SkString onShortName() {
48b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com        return SkString("ninepatch-stretch");
49b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    }
50b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com
51d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    virtual SkISize onISize() {
52f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina        return SkISize::Make(400, 400);
53b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    }
54b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com
55b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    virtual void onDraw(SkCanvas* canvas) {
56b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com        SkBitmap bm;
57b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com        SkIRect center;
587873333236ba36ac123312666a0b9f7755e73642commit-bot@chromium.org        make_bitmap(&bm, &center);
59d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
60b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com        // amount of bm that should not be stretched (unless we have to)
61b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com        const SkScalar fixed = SkIntToScalar(bm.width() - center.width());
62d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
63b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com        const SkTSize<SkScalar> size[] = {
64b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com            { fixed * 4 / 5, fixed * 4 / 5 },   // shrink in both axes
65b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com            { fixed * 4 / 5, fixed * 4 },       // shrink in X
66b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com            { fixed * 4,     fixed * 4 / 5 },   // shrink in Y
67b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com            { fixed * 4,     fixed * 4 }
68b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com        };
69d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
70b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com        canvas->drawBitmap(bm, SkIntToScalar(10), SkIntToScalar(10), NULL);
71d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
72b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com        SkScalar x = SkIntToScalar(100);
73b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com        SkScalar y = SkIntToScalar(100);
74d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
75b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com        SkPaint paint;
7693a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed        paint.setFilterQuality(kLow_SkFilterQuality);
77d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
78b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com        for (int iy = 0; iy < 2; ++iy) {
79b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com            for (int ix = 0; ix < 2; ++ix) {
80b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com                int i = ix * 2 + iy;
81b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com                SkRect r = SkRect::MakeXYWH(x + ix * fixed, y + iy * fixed,
82b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com                                            size[i].width(), size[i].height());
839c9b8d90c822132e205af4c70363fe3a272d6c6freed@google.com                canvas->drawBitmapNine(bm, center, r, &paint);
84b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com            }
85b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com        }
86b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    }
87d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
88b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.comprivate:
89b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com    typedef GM INHERITED;
90b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com};
91b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com
92b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com//////////////////////////////////////////////////////////////////////////////
93b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com
94b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.comstatic GM* MyFactory(void*) { return new NinePatchStretchGM; }
95b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.comstatic GMRegistry reg(MyFactory);
96b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com
97b67052596f8abebbbc6399c682b20a7dffeeecefreed@google.com}
98