| /* | 
 | * 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; | 
 | } |