|  | /* | 
|  | * Copyright 2017 Google Inc. | 
|  | * | 
|  | * Use of this source code is governed by a BSD-style license that can be | 
|  | * found in the LICENSE file. | 
|  | */ | 
|  |  | 
|  | #include "example/HelloWorld.h" | 
|  |  | 
|  | #include "include/core/SkCanvas.h" | 
|  | #include "include/core/SkFont.h" | 
|  | #include "include/core/SkGraphics.h" | 
|  | #include "include/core/SkSurface.h" | 
|  | #include "include/effects/SkGradientShader.h" | 
|  |  | 
|  | using namespace sk_app; | 
|  |  | 
|  | Application* Application::Create(int argc, char** argv, void* platformData) { | 
|  | return new HelloWorld(argc, argv, platformData); | 
|  | } | 
|  |  | 
|  | HelloWorld::HelloWorld(int argc, char** argv, void* platformData) | 
|  | : fBackendType(Window::kNativeGL_BackendType) | 
|  | , fRotationAngle(0) { | 
|  | SkGraphics::Init(); | 
|  |  | 
|  | fWindow = Window::CreateNativeWindow(platformData); | 
|  | fWindow->setRequestedDisplayParams(DisplayParams()); | 
|  |  | 
|  | // register callbacks | 
|  | fWindow->pushLayer(this); | 
|  |  | 
|  | fWindow->attach(fBackendType); | 
|  | } | 
|  |  | 
|  | HelloWorld::~HelloWorld() { | 
|  | fWindow->detach(); | 
|  | delete fWindow; | 
|  | } | 
|  |  | 
|  | void HelloWorld::updateTitle() { | 
|  | if (!fWindow || fWindow->sampleCount() <= 1) { | 
|  | return; | 
|  | } | 
|  |  | 
|  | SkString title("Hello World "); | 
|  | title.append(Window::kRaster_BackendType == fBackendType ? "Raster" : "OpenGL"); | 
|  | fWindow->setTitle(title.c_str()); | 
|  | } | 
|  |  | 
|  | void HelloWorld::onBackendCreated() { | 
|  | this->updateTitle(); | 
|  | fWindow->show(); | 
|  | fWindow->inval(); | 
|  | } | 
|  |  | 
|  | void HelloWorld::onPaint(SkSurface* surface) { | 
|  | auto canvas = surface->getCanvas(); | 
|  |  | 
|  | // Clear background | 
|  | canvas->clear(SK_ColorWHITE); | 
|  |  | 
|  | SkPaint paint; | 
|  | paint.setColor(SK_ColorRED); | 
|  |  | 
|  | // Draw a rectangle with red paint | 
|  | SkRect rect = SkRect::MakeXYWH(10, 10, 128, 128); | 
|  | canvas->drawRect(rect, paint); | 
|  |  | 
|  | // Set up a linear gradient and draw a circle | 
|  | { | 
|  | SkPoint linearPoints[] = { { 0, 0 }, { 300, 300 } }; | 
|  | SkColor linearColors[] = { SK_ColorGREEN, SK_ColorBLACK }; | 
|  | paint.setShader(SkGradientShader::MakeLinear(linearPoints, linearColors, nullptr, 2, | 
|  | SkTileMode::kMirror)); | 
|  | paint.setAntiAlias(true); | 
|  |  | 
|  | canvas->drawCircle(200, 200, 64, paint); | 
|  |  | 
|  | // Detach shader | 
|  | paint.setShader(nullptr); | 
|  | } | 
|  |  | 
|  | // Draw a message with a nice black paint | 
|  | SkFont font; | 
|  | font.setSubpixel(true); | 
|  | font.setSize(20); | 
|  | paint.setColor(SK_ColorBLACK); | 
|  |  | 
|  | canvas->save(); | 
|  | static const char message[] = "Hello World"; | 
|  |  | 
|  | // Translate and rotate | 
|  | canvas->translate(300, 300); | 
|  | fRotationAngle += 0.2f; | 
|  | if (fRotationAngle > 360) { | 
|  | fRotationAngle -= 360; | 
|  | } | 
|  | canvas->rotate(fRotationAngle); | 
|  |  | 
|  | // Draw the text | 
|  | canvas->drawSimpleText(message, strlen(message), SkTextEncoding::kUTF8, 0, 0, font, paint); | 
|  |  | 
|  | canvas->restore(); | 
|  | } | 
|  |  | 
|  | void HelloWorld::onIdle() { | 
|  | // Just re-paint continously | 
|  | fWindow->inval(); | 
|  | } | 
|  |  | 
|  | bool HelloWorld::onChar(SkUnichar c, skui::ModifierKey modifiers) { | 
|  | if (' ' == c) { | 
|  | fBackendType = Window::kRaster_BackendType == fBackendType ? Window::kNativeGL_BackendType | 
|  | : Window::kRaster_BackendType; | 
|  | fWindow->detach(); | 
|  | fWindow->attach(fBackendType); | 
|  | } | 
|  | return true; | 
|  | } |