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