| /* |
| * 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 "GrContext.h" |
| #include "SkCanvas.h" |
| #include "SkGradientShader.h" |
| #include "SkGraphics.h" |
| |
| using namespace sk_app; |
| |
| Application* Application::Create(int argc, char** argv, void* platformData) { |
| return new HelloWorld(argc, argv, platformData); |
| } |
| |
| static void on_backend_created_func(void* userData) { |
| HelloWorld* hw = reinterpret_cast<HelloWorld*>(userData); |
| return hw->onBackendCreated(); |
| } |
| |
| static void on_paint_handler(SkCanvas* canvas, void* userData) { |
| HelloWorld* hw = reinterpret_cast<HelloWorld*>(userData); |
| return hw->onPaint(canvas); |
| } |
| |
| static bool on_char_handler(SkUnichar c, uint32_t modifiers, void* userData) { |
| HelloWorld* hw = reinterpret_cast<HelloWorld*>(userData); |
| return hw->onChar(c, modifiers); |
| } |
| |
| 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->registerBackendCreatedFunc(on_backend_created_func, this); |
| fWindow->registerPaintFunc(on_paint_handler, this); |
| fWindow->registerCharFunc(on_char_handler, this); |
| |
| fWindow->attach(fBackendType); |
| } |
| |
| HelloWorld::~HelloWorld() { |
| fWindow->detach(); |
| delete fWindow; |
| } |
| |
| void HelloWorld::updateTitle() { |
| if (!fWindow || fWindow->sampleCount() < 0) { |
| 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(SkCanvas* canvas) { |
| // 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 |
| paint.setSubpixelText(true); |
| paint.setColor(SK_ColorBLACK); |
| paint.setTextSize(20); |
| |
| 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->drawText(message, strlen(message), 0, 0, 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; |
| } |