1
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8#include "SampleCode.h"
9#include "SkView.h"
10#include "SkCanvas.h"
11#include "SkDevice.h"
12#include "SkPaint.h"
13#include "SkShader.h"
14
15static SkBitmap createBitmap(int n) {
16    SkBitmap bitmap;
17    bitmap.setConfig(SkBitmap::kARGB_8888_Config, n, n);
18    bitmap.allocPixels();
19    bitmap.eraseColor(SK_ColorGREEN);
20
21    SkCanvas canvas(bitmap);
22    SkRect r;
23    r.set(0, 0, SkIntToScalar(n), SkIntToScalar(n));
24    SkPaint paint;
25    paint.setAntiAlias(true);
26
27    paint.setColor(SK_ColorRED);
28    canvas.drawOval(r, paint);
29    paint.setColor(SK_ColorBLUE);
30    paint.setStrokeWidth(SkIntToScalar(n)/15);
31    paint.setStyle(SkPaint::kStroke_Style);
32    canvas.drawLine(0, 0, r.fRight, r.fBottom, paint);
33    canvas.drawLine(0, r.fBottom, r.fRight, 0, paint);
34
35    return bitmap;
36}
37
38class AARectView : public SampleView {
39    SkBitmap fBitmap;
40    enum {
41        N = 64
42    };
43public:
44    AARectView() {
45        fBitmap = createBitmap(N);
46
47        fWidth = N;
48    }
49
50protected:
51    // overrides from SkEventSink
52    virtual bool onQuery(SkEvent* evt) {
53        if (SampleCode::TitleQ(*evt)) {
54            SampleCode::TitleR(evt, "AA Rects");
55            return true;
56        }
57        return this->INHERITED::onQuery(evt);
58    }
59
60    virtual void onDrawContent(SkCanvas* canvas) {
61        canvas->translate(SkIntToScalar(10), SkIntToScalar(10));
62
63        SkPaint bluePaint;
64        bluePaint.setARGB(0xff, 0x0, 0x0, 0xff);
65        SkPaint bmpPaint;
66        SkShader* bmpShader = SkShader::CreateBitmapShader(fBitmap, SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);
67        bmpPaint.setShader(bmpShader);
68        bmpShader->unref();
69
70        bluePaint.setStrokeWidth(3);
71        bmpPaint.setStrokeWidth(3);
72
73        SkPaint paints[] = { bluePaint, bmpPaint };
74
75        SkRect rect;
76
77        SkScalar dx = SkIntToScalar(80);
78        SkScalar dy = SkIntToScalar(100);
79        SkMatrix matrix;
80        for (size_t p = 0; p < SK_ARRAY_COUNT(paints); ++p) {
81            for (int stroke = 0; stroke < 2; ++stroke) {
82                paints[p].setStyle(stroke ? SkPaint::kStroke_Style : SkPaint::kFill_Style);
83                for (int a = 0; a < 3; ++ a) {
84                    paints[p].setAntiAlias(a > 0);
85                    paints[p].setAlpha(a > 1 ? 0x80 : 0xff);
86
87                    canvas->save();
88                        rect = SkRect::MakeLTRB(SkFloatToScalar(0.f),
89                                                SkFloatToScalar(0.f),
90                                                SkFloatToScalar(40.f),
91                                                SkFloatToScalar(40.f));
92                        canvas->drawRect(rect, paints[p]);
93                        canvas->translate(dx, 0);
94
95                        rect = SkRect::MakeLTRB(SkFloatToScalar(0.5f),
96                                                SkFloatToScalar(0.5f),
97                                                SkFloatToScalar(40.5f),
98                                                SkFloatToScalar(40.5f));
99                        canvas->drawRect(rect, paints[p]);
100                        canvas->translate(dx, 0);
101
102                        rect = SkRect::MakeLTRB(SkFloatToScalar(0.5f),
103                                                SkFloatToScalar(0.5f),
104                                                SkFloatToScalar(40.f),
105                                                SkFloatToScalar(40.f));
106                        canvas->drawRect(rect, paints[p]);
107                        canvas->translate(dx, 0);
108
109                        rect = SkRect::MakeLTRB(SkFloatToScalar(0.75f),
110                                                SkFloatToScalar(0.75f),
111                                                SkFloatToScalar(40.75f),
112                                                SkFloatToScalar(40.75f));
113                        canvas->drawRect(rect, paints[p]);
114                        canvas->translate(dx, 0);
115
116                        canvas->save();
117                            canvas->translate(SkFloatToScalar(.33f), SkFloatToScalar(.67f));
118                            rect = SkRect::MakeLTRB(SkFloatToScalar(0.0f),
119                                                    SkFloatToScalar(0.0f),
120                                                    SkFloatToScalar(40.0f),
121                                                    SkFloatToScalar(40.0f));
122                            canvas->drawRect(rect, paints[p]);
123                        canvas->restore();
124                        canvas->translate(dx, 0);
125
126                        canvas->save();
127                            matrix.setRotate(SkFloatToScalar(45.f));
128                            canvas->concat(matrix);
129                            canvas->translate(SkFloatToScalar(20.0f / sqrtf(2.f)),
130                                                SkFloatToScalar(20.0f / sqrtf(2.f)));
131                            rect = SkRect::MakeLTRB(SkFloatToScalar(-20.0f),
132                                                    SkFloatToScalar(-20.0f),
133                                                    SkFloatToScalar(20.0f),
134                                                    SkFloatToScalar(20.0f));
135                            canvas->drawRect(rect, paints[p]);
136                        canvas->restore();
137                        canvas->translate(dx, 0);
138
139                        canvas->save();
140                            canvas->rotate(SkFloatToScalar(90.f));
141                            rect = SkRect::MakeLTRB(SkFloatToScalar(0.0f),
142                                                    SkFloatToScalar(0.0f),
143                                                    SkFloatToScalar(40.0f),
144                                                    SkFloatToScalar(-40.0f));
145                            canvas->drawRect(rect, paints[p]);
146                        canvas->restore();
147                        canvas->translate(dx, 0);
148
149                        canvas->save();
150                            canvas->rotate(SkFloatToScalar(90.f));
151                            rect = SkRect::MakeLTRB(SkFloatToScalar(0.5f),
152                                                    SkFloatToScalar(0.5f),
153                                                    SkFloatToScalar(40.5f),
154                                                    SkFloatToScalar(-40.5f));
155                            canvas->drawRect(rect, paints[p]);
156                        canvas->restore();
157                        canvas->translate(dx, 0);
158
159                        canvas->save();
160                            matrix.setScale(SkFloatToScalar(-1.f), SkFloatToScalar(-1.f));
161                            canvas->concat(matrix);
162                            rect = SkRect::MakeLTRB(SkFloatToScalar(0.5f),
163                                                    SkFloatToScalar(0.5f),
164                                                    SkFloatToScalar(-40.5f),
165                                                    SkFloatToScalar(-40.5f));
166                            canvas->drawRect(rect, paints[p]);
167                        canvas->restore();
168                        canvas->translate(dx, 0);
169
170                        canvas->save();
171                            matrix.setScale(SkFloatToScalar(2.1f), SkFloatToScalar(4.1f));
172                            canvas->concat(matrix);
173                            rect = SkRect::MakeLTRB(SkFloatToScalar(0.1f),
174                                                    SkFloatToScalar(0.1f),
175                                                    SkFloatToScalar(19.1f),
176                                                    SkFloatToScalar(9.1f));
177                            canvas->drawRect(rect, paints[p]);
178                        canvas->restore();
179                        canvas->translate(dx, 0);
180
181                    canvas->restore();
182                    canvas->translate(0, dy);
183                }
184            }
185        }
186    }
187
188private:
189    int fWidth;
190
191    typedef SampleView INHERITED;
192};
193
194//////////////////////////////////////////////////////////////////////////////
195
196static SkView* MyFactory() { return new AARectView; }
197static SkViewRegister reg(MyFactory);
198
199