• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 * Copyright 2017 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7 
8 #include "HelloWorld.h"
9 
10 #include "GrContext.h"
11 #include "SkCanvas.h"
12 #include "SkGradientShader.h"
13 #include "SkGraphics.h"
14 
15 using namespace sk_app;
16 
Create(int argc,char ** argv,void * platformData)17 Application* Application::Create(int argc, char** argv, void* platformData) {
18     return new HelloWorld(argc, argv, platformData);
19 }
20 
HelloWorld(int argc,char ** argv,void * platformData)21 HelloWorld::HelloWorld(int argc, char** argv, void* platformData)
22         : fBackendType(Window::kNativeGL_BackendType)
23         , fRotationAngle(0) {
24     SkGraphics::Init();
25 
26     fWindow = Window::CreateNativeWindow(platformData);
27     fWindow->setRequestedDisplayParams(DisplayParams());
28 
29     // register callbacks
30     fWindow->pushLayer(this);
31 
32     fWindow->attach(fBackendType);
33 }
34 
~HelloWorld()35 HelloWorld::~HelloWorld() {
36     fWindow->detach();
37     delete fWindow;
38 }
39 
updateTitle()40 void HelloWorld::updateTitle() {
41     if (!fWindow || fWindow->sampleCount() <= 1) {
42         return;
43     }
44 
45     SkString title("Hello World ");
46     title.append(Window::kRaster_BackendType == fBackendType ? "Raster" : "OpenGL");
47     fWindow->setTitle(title.c_str());
48 }
49 
onBackendCreated()50 void HelloWorld::onBackendCreated() {
51     this->updateTitle();
52     fWindow->show();
53     fWindow->inval();
54 }
55 
onPaint(SkCanvas * canvas)56 void HelloWorld::onPaint(SkCanvas* canvas) {
57     // Clear background
58     canvas->clear(SK_ColorWHITE);
59 
60     SkPaint paint;
61     paint.setColor(SK_ColorRED);
62 
63     // Draw a rectangle with red paint
64     SkRect rect = SkRect::MakeXYWH(10, 10, 128, 128);
65     canvas->drawRect(rect, paint);
66 
67     // Set up a linear gradient and draw a circle
68     {
69         SkPoint linearPoints[] = { { 0, 0 }, { 300, 300 } };
70         SkColor linearColors[] = { SK_ColorGREEN, SK_ColorBLACK };
71         paint.setShader(SkGradientShader::MakeLinear(linearPoints, linearColors, nullptr, 2,
72                                                      SkShader::kMirror_TileMode));
73         paint.setAntiAlias(true);
74 
75         canvas->drawCircle(200, 200, 64, paint);
76 
77         // Detach shader
78         paint.setShader(nullptr);
79     }
80 
81     // Draw a message with a nice black paint
82     paint.setSubpixelText(true);
83     paint.setColor(SK_ColorBLACK);
84     paint.setTextSize(20);
85 
86     canvas->save();
87     static const char message[] = "Hello World";
88 
89     // Translate and rotate
90     canvas->translate(300, 300);
91     fRotationAngle += 0.2f;
92     if (fRotationAngle > 360) {
93         fRotationAngle -= 360;
94     }
95     canvas->rotate(fRotationAngle);
96 
97     // Draw the text
98     canvas->drawText(message, strlen(message), 0, 0, paint);
99 
100     canvas->restore();
101 }
102 
onIdle()103 void HelloWorld::onIdle() {
104     // Just re-paint continously
105     fWindow->inval();
106 }
107 
onChar(SkUnichar c,uint32_t modifiers)108 bool HelloWorld::onChar(SkUnichar c, uint32_t modifiers) {
109     if (' ' == c) {
110         fBackendType = Window::kRaster_BackendType == fBackendType ? Window::kNativeGL_BackendType
111                                                                    : Window::kRaster_BackendType;
112         fWindow->detach();
113         fWindow->attach(fBackendType);
114     }
115     return true;
116 }
117