blob: 0b6c790460eb54900b859e839f73275a0ead41ee [file] [log] [blame]
commit-bot@chromium.org7fa22f32013-06-18 15:37:27 +00001/*
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
sglez@google.com43f2b2c2013-07-24 17:48:03 +000010#include "SkExample.h"
commit-bot@chromium.org7fa22f32013-06-18 15:37:27 +000011
12#include "SkApplication.h"
13#include "SkDraw.h"
14#include "SkGradientShader.h"
15#include "SkGraphics.h"
commit-bot@chromium.org3339ac52014-05-22 02:55:59 +000016#include "SkUnitMappers.h"
commit-bot@chromium.org7fa22f32013-06-18 15:37:27 +000017
sglez@google.com43f2b2c2013-07-24 17:48:03 +000018class HelloSkia : public SkExample {
19public:
20 HelloSkia(SkExampleWindow* window) : SkExample(window) {
21 fName = "HelloSkia";
22 fBGColor = SK_ColorWHITE;
23 fRotationAngle = SkIntToScalar(0);
commit-bot@chromium.org7fa22f32013-06-18 15:37:27 +000024
sglez@google.com43f2b2c2013-07-24 17:48:03 +000025 fWindow->setupBackend(SkExampleWindow::kGPU_DeviceType);
26 // Another option is software rendering:
commit-bot@chromium.orgab9d30c2013-10-10 02:53:30 +000027 // fWindow->setupBackend(SkExampleWindow::kRaster_DeviceType);
sglez@google.com43f2b2c2013-07-24 17:48:03 +000028 }
commit-bot@chromium.org7fa22f32013-06-18 15:37:27 +000029
sglez@google.com43f2b2c2013-07-24 17:48:03 +000030protected:
31 void draw(SkCanvas* canvas) {
32 // Clear background
33 canvas->drawColor(fBGColor);
commit-bot@chromium.org7fa22f32013-06-18 15:37:27 +000034
sglez@google.com43f2b2c2013-07-24 17:48:03 +000035 SkPaint paint;
36 paint.setColor(SK_ColorRED);
commit-bot@chromium.org7fa22f32013-06-18 15:37:27 +000037
sglez@google.com43f2b2c2013-07-24 17:48:03 +000038 // Draw a rectangle with blue paint
39 SkRect rect = {
commit-bot@chromium.org7fa22f32013-06-18 15:37:27 +000040 SkIntToScalar(10), SkIntToScalar(10),
41 SkIntToScalar(128), SkIntToScalar(128)
sglez@google.com43f2b2c2013-07-24 17:48:03 +000042 };
43 canvas->drawRect(rect, paint);
commit-bot@chromium.org7fa22f32013-06-18 15:37:27 +000044
sglez@google.com43f2b2c2013-07-24 17:48:03 +000045 // Set up a linear gradient and draw a circle
46 {
47 SkPoint linearPoints[] = {
commit-bot@chromium.org7fa22f32013-06-18 15:37:27 +000048 {SkIntToScalar(0), SkIntToScalar(0)},
49 {SkIntToScalar(300), SkIntToScalar(300)}
sglez@google.com43f2b2c2013-07-24 17:48:03 +000050 };
51 SkColor linearColors[] = {SK_ColorGREEN, SK_ColorBLACK};
commit-bot@chromium.org7fa22f32013-06-18 15:37:27 +000052
commit-bot@chromium.org3339ac52014-05-22 02:55:59 +000053 SkUnitMapper* linearMapper = new SkDiscreteMapper(100);
54 SkAutoUnref lm_deleter(linearMapper);
55
sglez@google.com43f2b2c2013-07-24 17:48:03 +000056 SkShader* shader = SkGradientShader::CreateLinear(
57 linearPoints, linearColors, NULL, 2,
commit-bot@chromium.org3339ac52014-05-22 02:55:59 +000058 SkShader::kMirror_TileMode, linearMapper);
sglez@google.com43f2b2c2013-07-24 17:48:03 +000059 SkAutoUnref shader_deleter(shader);
commit-bot@chromium.org7fa22f32013-06-18 15:37:27 +000060
sglez@google.com43f2b2c2013-07-24 17:48:03 +000061 paint.setShader(shader);
62 paint.setFlags(SkPaint::kAntiAlias_Flag);
commit-bot@chromium.org7fa22f32013-06-18 15:37:27 +000063
sglez@google.com43f2b2c2013-07-24 17:48:03 +000064 canvas->drawCircle(SkIntToScalar(200), SkIntToScalar(200),
65 SkIntToScalar(64), paint);
commit-bot@chromium.org7fa22f32013-06-18 15:37:27 +000066
sglez@google.com43f2b2c2013-07-24 17:48:03 +000067 // Detach shader
68 paint.setShader(NULL);
commit-bot@chromium.org7fa22f32013-06-18 15:37:27 +000069 }
70
sglez@google.com43f2b2c2013-07-24 17:48:03 +000071 // Draw a message with a nice black paint.
72 paint.setFlags(
73 SkPaint::kAntiAlias_Flag |
74 SkPaint::kSubpixelText_Flag | // ... avoid waggly text when rotating.
75 SkPaint::kUnderlineText_Flag);
76 paint.setColor(SK_ColorBLACK);
77 paint.setTextSize(SkIntToScalar(20));
78
79 canvas->save();
80
81 static const char message[] = "Hello Skia!!!";
82
83 // Translate and rotate
84 canvas->translate(SkIntToScalar(300), SkIntToScalar(300));
85 fRotationAngle += SkDoubleToScalar(0.2);
86 if (fRotationAngle > SkDoubleToScalar(360.0)) {
87 fRotationAngle -= SkDoubleToScalar(360.0);
88 }
89 canvas->rotate(fRotationAngle);
90
91 // Draw the text:
92 canvas->drawText(message, strlen(message), SkIntToScalar(0), SkIntToScalar(0), paint);
93
94 canvas->restore();
95
96 // Invalidate the window to force a redraw. Poor man's animation mechanism.
97 this->fWindow->inval(NULL);
98 }
99
100private:
101 SkScalar fRotationAngle;
102 SkColor fBGColor;
commit-bot@chromium.org7fa22f32013-06-18 15:37:27 +0000103};
104
sglez@google.com43f2b2c2013-07-24 17:48:03 +0000105static SkExample* MyFactory(SkExampleWindow* window) {
106 return new HelloSkia(window);
commit-bot@chromium.org7fa22f32013-06-18 15:37:27 +0000107}
sglez@google.com43f2b2c2013-07-24 17:48:03 +0000108
109// Register this class as a Skia Example.
110SkExample::Registry registry(MyFactory);