/* * 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 "HelloWorld.h" #include "SkCanvas.h" #include "SkFont.h" #include "SkGradientShader.h" #include "SkGraphics.h" #include "SkSurface.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, SkShader::kMirror_TileMode)); 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), kUTF8_SkTextEncoding, 0, 0, font, paint); canvas->restore(); } void HelloWorld::onIdle() { // Just re-paint continously fWindow->inval(); } bool HelloWorld::onChar(SkUnichar c, uint32_t modifiers) { if (' ' == c) { fBackendType = Window::kRaster_BackendType == fBackendType ? Window::kNativeGL_BackendType : Window::kRaster_BackendType; fWindow->detach(); fWindow->attach(fBackendType); } return true; }