1/*
2 * Copyright 2013 Google Inc.
3 *
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 */
9
10#include "SkExample.h"
11
12#include "SkApplication.h"
13#include "SkDraw.h"
14#include "SkGradientShader.h"
15#include "SkGraphics.h"
16
17class HelloSkia : public SkExample {
18public:
19    HelloSkia(SkExampleWindow* window) : SkExample(window) {
20        fName = "HelloSkia";
21        fBGColor = SK_ColorWHITE;
22        fRotationAngle = SkIntToScalar(0);
23
24        fWindow->setupBackend(SkExampleWindow::kGPU_DeviceType);
25        // Another option is software rendering:
26        // fWindow->setupBackend(SkExampleWindow::kRaster_DeviceType);
27    }
28
29protected:
30    void draw(SkCanvas* canvas) {
31        // Clear background
32        canvas->drawColor(fBGColor);
33
34        SkPaint paint;
35        paint.setColor(SK_ColorRED);
36
37        // Draw a rectangle with blue paint
38        SkRect rect = {
39                SkIntToScalar(10), SkIntToScalar(10),
40                SkIntToScalar(128), SkIntToScalar(128)
41        };
42        canvas->drawRect(rect, paint);
43
44        // Set up a linear gradient and draw a circle
45        {
46            SkPoint linearPoints[] = {
47                    {SkIntToScalar(0), SkIntToScalar(0)},
48                    {SkIntToScalar(300), SkIntToScalar(300)}
49            };
50            SkColor linearColors[] = {SK_ColorGREEN, SK_ColorBLACK};
51
52            SkShader* shader = SkGradientShader::CreateLinear(
53                    linearPoints, linearColors, NULL, 2,
54                    SkShader::kMirror_TileMode);
55            SkAutoUnref shader_deleter(shader);
56
57            paint.setShader(shader);
58            paint.setFlags(SkPaint::kAntiAlias_Flag);
59
60            canvas->drawCircle(SkIntToScalar(200), SkIntToScalar(200),
61                    SkIntToScalar(64), paint);
62
63            // Detach shader
64            paint.setShader(NULL);
65        }
66
67        // Draw a message with a nice black paint.
68        paint.setFlags(
69                SkPaint::kAntiAlias_Flag |
70                SkPaint::kSubpixelText_Flag |  // ... avoid waggly text when rotating.
71                SkPaint::kUnderlineText_Flag);
72        paint.setColor(SK_ColorBLACK);
73        paint.setTextSize(SkIntToScalar(20));
74
75        canvas->save();
76
77        static const char message[] = "Hello Skia!!!";
78
79        // Translate and rotate
80        canvas->translate(SkIntToScalar(300), SkIntToScalar(300));
81        fRotationAngle += SkDoubleToScalar(0.2);
82        if (fRotationAngle > SkDoubleToScalar(360.0)) {
83            fRotationAngle -= SkDoubleToScalar(360.0);
84        }
85        canvas->rotate(fRotationAngle);
86
87        // Draw the text:
88        canvas->drawText(message, strlen(message), SkIntToScalar(0), SkIntToScalar(0), paint);
89
90        canvas->restore();
91
92        // Invalidate the window to force a redraw. Poor man's animation mechanism.
93        this->fWindow->inval(NULL);
94    }
95
96private:
97    SkScalar fRotationAngle;
98    SkColor fBGColor;
99};
100
101static SkExample* MyFactory(SkExampleWindow* window) {
102    return new HelloSkia(window);
103}
104
105// Register this class as a Skia Example.
106SkExample::Registry registry(MyFactory);
107