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