| /* |
| * 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 <string.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) |
| #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; |
| } |