blob: b20d30a780729c4dccbeffee1f9179f1e0312b7f [file] [log] [blame]
caryclark52edc4d2015-02-02 12:55:14 -08001/*
Brian Osmaneff04b52017-11-21 13:18:02 -05002* 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*/
caryclark52edc4d2015-02-02 12:55:14 -08007
8#include "HelloWorld.h"
9
bsalomonf276ac52015-10-09 13:36:42 -070010#include "GrContext.h"
caryclark52edc4d2015-02-02 12:55:14 -080011#include "SkCanvas.h"
12#include "SkGradientShader.h"
13#include "SkGraphics.h"
caryclark52edc4d2015-02-02 12:55:14 -080014
Brian Osmaneff04b52017-11-21 13:18:02 -050015using namespace sk_app;
16
17Application* Application::Create(int argc, char** argv, void* platformData) {
18 return new HelloWorld(argc, argv, platformData);
19}
20
Brian Osmaneff04b52017-11-21 13:18:02 -050021HelloWorld::HelloWorld(int argc, char** argv, void* platformData)
22 : fBackendType(Window::kNativeGL_BackendType)
23 , fRotationAngle(0) {
caryclark52edc4d2015-02-02 12:55:14 -080024 SkGraphics::Init();
Brian Osmaneff04b52017-11-21 13:18:02 -050025
26 fWindow = Window::CreateNativeWindow(platformData);
27 fWindow->setRequestedDisplayParams(DisplayParams());
28
29 // register callbacks
Brian Osman80fc07e2017-12-08 16:45:43 -050030 fWindow->pushLayer(this);
Brian Osmaneff04b52017-11-21 13:18:02 -050031
32 fWindow->attach(fBackendType);
caryclark52edc4d2015-02-02 12:55:14 -080033}
34
Brian Osmaneff04b52017-11-21 13:18:02 -050035HelloWorld::~HelloWorld() {
36 fWindow->detach();
37 delete fWindow;
caryclark52edc4d2015-02-02 12:55:14 -080038}
39
Brian Osmaneff04b52017-11-21 13:18:02 -050040void HelloWorld::updateTitle() {
Brian Salomonbdecacf2018-02-02 20:32:49 -050041 if (!fWindow || fWindow->sampleCount() <= 1) {
Brian Osmaneff04b52017-11-21 13:18:02 -050042 return;
caryclark52edc4d2015-02-02 12:55:14 -080043 }
44
Brian Osmaneff04b52017-11-21 13:18:02 -050045 SkString title("Hello World ");
46 title.append(Window::kRaster_BackendType == fBackendType ? "Raster" : "OpenGL");
47 fWindow->setTitle(title.c_str());
caryclark52edc4d2015-02-02 12:55:14 -080048}
49
Brian Osmaneff04b52017-11-21 13:18:02 -050050void HelloWorld::onBackendCreated() {
51 this->updateTitle();
52 fWindow->show();
53 fWindow->inval();
caryclark52edc4d2015-02-02 12:55:14 -080054}
55
Brian Osmaneff04b52017-11-21 13:18:02 -050056void HelloWorld::onPaint(SkCanvas* canvas) {
caryclark52edc4d2015-02-02 12:55:14 -080057 // Clear background
Brian Osmaneff04b52017-11-21 13:18:02 -050058 canvas->clear(SK_ColorWHITE);
caryclark52edc4d2015-02-02 12:55:14 -080059
60 SkPaint paint;
61 paint.setColor(SK_ColorRED);
62
63 // Draw a rectangle with red paint
reedc6f28f72016-03-14 12:22:10 -070064 SkRect rect = SkRect::MakeXYWH(10, 10, 128, 128);
caryclark52edc4d2015-02-02 12:55:14 -080065 canvas->drawRect(rect, paint);
66
67 // Set up a linear gradient and draw a circle
68 {
Brian Osmaneff04b52017-11-21 13:18:02 -050069 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);
caryclark52edc4d2015-02-02 12:55:14 -080074
75 canvas->drawCircle(200, 200, 64, paint);
76
77 // Detach shader
reedc6f28f72016-03-14 12:22:10 -070078 paint.setShader(nullptr);
caryclark52edc4d2015-02-02 12:55:14 -080079 }
80
Brian Osmaneff04b52017-11-21 13:18:02 -050081 // Draw a message with a nice black paint
82 paint.setSubpixelText(true);
caryclark52edc4d2015-02-02 12:55:14 -080083 paint.setColor(SK_ColorBLACK);
84 paint.setTextSize(20);
85
86 canvas->save();
caryclark52edc4d2015-02-02 12:55:14 -080087 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
Brian Osmaneff04b52017-11-21 13:18:02 -050097 // Draw the text
caryclark52edc4d2015-02-02 12:55:14 -080098 canvas->drawText(message, strlen(message), 0, 0, paint);
99
100 canvas->restore();
101}
102
Brian Osmaneff04b52017-11-21 13:18:02 -0500103void HelloWorld::onIdle() {
104 // Just re-paint continously
105 fWindow->inval();
caryclark52edc4d2015-02-02 12:55:14 -0800106}
107
Brian Osmaneff04b52017-11-21 13:18:02 -0500108bool 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);
caryclark52edc4d2015-02-02 12:55:14 -0800114 }
115 return true;
116}