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