/* * 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/SkColor.h" #include "include/core/SkFont.h" #include "include/core/SkFontTypes.h" #include "include/core/SkGraphics.h" #include "include/core/SkPaint.h" #include "include/core/SkPoint.h" #include "include/core/SkRect.h" #include "include/core/SkShader.h" #include "include/core/SkString.h" #include "include/core/SkSurface.h" #include "include/core/SkTileMode.h" #include "include/effects/SkGradientShader.h" #include "tools/sk_app/DisplayParams.h" #include 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) #if defined(SK_GL) : fBackendType(Window::kNativeGL_BackendType), #elif defined(SK_VULKAN) : fBackendType(Window::kVulkan_BackendType), #elif defined(SK_DAWN) : fBackendType(Window::kDawn_BackendType), #else : fBackendType(Window::kRaster_BackendType), #endif 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) { return; } SkString title("Hello World "); if (Window::kRaster_BackendType == fBackendType) { title.append("Raster"); } else { #if defined(SK_GL) title.append("GL"); #elif defined(SK_VULKAN) title.append("Vulkan"); #elif defined(SK_DAWN) title.append("Dawn"); #else title.append("Unknown GPU backend"); #endif } 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 continuously fWindow->inval(); } bool HelloWorld::onChar(SkUnichar c, skui::ModifierKey modifiers) { if (' ' == c) { if (Window::kRaster_BackendType == fBackendType) { #if defined(SK_GL) fBackendType = Window::kNativeGL_BackendType; #elif defined(SK_VULKAN) fBackendType = Window::kVulkan_BackendType; #elif defined(SK_DAWN) fBackendType = Window::kDawn_BackendType; #else SkDebugf("No GPU backend configured\n"); return true; #endif } else { fBackendType = Window::kRaster_BackendType; } fWindow->detach(); fWindow->attach(fBackendType); } return true; }