1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci* Copyright 2017 Google Inc.
3cb93a386Sopenharmony_ci*
4cb93a386Sopenharmony_ci* Use of this source code is governed by a BSD-style license that can be
5cb93a386Sopenharmony_ci* found in the LICENSE file.
6cb93a386Sopenharmony_ci*/
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci#include "example/HelloWorld.h"
9cb93a386Sopenharmony_ci
10cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h"
11cb93a386Sopenharmony_ci#include "include/core/SkFont.h"
12cb93a386Sopenharmony_ci#include "include/core/SkGraphics.h"
13cb93a386Sopenharmony_ci#include "include/core/SkSurface.h"
14cb93a386Sopenharmony_ci#include "include/effects/SkGradientShader.h"
15cb93a386Sopenharmony_ci
16cb93a386Sopenharmony_ciusing namespace sk_app;
17cb93a386Sopenharmony_ci
18cb93a386Sopenharmony_ciApplication* Application::Create(int argc, char** argv, void* platformData) {
19cb93a386Sopenharmony_ci    return new HelloWorld(argc, argv, platformData);
20cb93a386Sopenharmony_ci}
21cb93a386Sopenharmony_ci
22cb93a386Sopenharmony_ciHelloWorld::HelloWorld(int argc, char** argv, void* platformData)
23cb93a386Sopenharmony_ci        : fBackendType(Window::kNativeGL_BackendType)
24cb93a386Sopenharmony_ci        , fRotationAngle(0) {
25cb93a386Sopenharmony_ci    SkGraphics::Init();
26cb93a386Sopenharmony_ci
27cb93a386Sopenharmony_ci    fWindow = Window::CreateNativeWindow(platformData);
28cb93a386Sopenharmony_ci    fWindow->setRequestedDisplayParams(DisplayParams());
29cb93a386Sopenharmony_ci
30cb93a386Sopenharmony_ci    // register callbacks
31cb93a386Sopenharmony_ci    fWindow->pushLayer(this);
32cb93a386Sopenharmony_ci
33cb93a386Sopenharmony_ci    fWindow->attach(fBackendType);
34cb93a386Sopenharmony_ci}
35cb93a386Sopenharmony_ci
36cb93a386Sopenharmony_ciHelloWorld::~HelloWorld() {
37cb93a386Sopenharmony_ci    fWindow->detach();
38cb93a386Sopenharmony_ci    delete fWindow;
39cb93a386Sopenharmony_ci}
40cb93a386Sopenharmony_ci
41cb93a386Sopenharmony_civoid HelloWorld::updateTitle() {
42cb93a386Sopenharmony_ci    if (!fWindow || fWindow->sampleCount() <= 1) {
43cb93a386Sopenharmony_ci        return;
44cb93a386Sopenharmony_ci    }
45cb93a386Sopenharmony_ci
46cb93a386Sopenharmony_ci    SkString title("Hello World ");
47cb93a386Sopenharmony_ci    title.append(Window::kRaster_BackendType == fBackendType ? "Raster" : "OpenGL");
48cb93a386Sopenharmony_ci    fWindow->setTitle(title.c_str());
49cb93a386Sopenharmony_ci}
50cb93a386Sopenharmony_ci
51cb93a386Sopenharmony_civoid HelloWorld::onBackendCreated() {
52cb93a386Sopenharmony_ci    this->updateTitle();
53cb93a386Sopenharmony_ci    fWindow->show();
54cb93a386Sopenharmony_ci    fWindow->inval();
55cb93a386Sopenharmony_ci}
56cb93a386Sopenharmony_ci
57cb93a386Sopenharmony_civoid HelloWorld::onPaint(SkSurface* surface) {
58cb93a386Sopenharmony_ci    auto canvas = surface->getCanvas();
59cb93a386Sopenharmony_ci
60cb93a386Sopenharmony_ci    // Clear background
61cb93a386Sopenharmony_ci    canvas->clear(SK_ColorWHITE);
62cb93a386Sopenharmony_ci
63cb93a386Sopenharmony_ci    SkPaint paint;
64cb93a386Sopenharmony_ci    paint.setColor(SK_ColorRED);
65cb93a386Sopenharmony_ci
66cb93a386Sopenharmony_ci    // Draw a rectangle with red paint
67cb93a386Sopenharmony_ci    SkRect rect = SkRect::MakeXYWH(10, 10, 128, 128);
68cb93a386Sopenharmony_ci    canvas->drawRect(rect, paint);
69cb93a386Sopenharmony_ci
70cb93a386Sopenharmony_ci    // Set up a linear gradient and draw a circle
71cb93a386Sopenharmony_ci    {
72cb93a386Sopenharmony_ci        SkPoint linearPoints[] = { { 0, 0 }, { 300, 300 } };
73cb93a386Sopenharmony_ci        SkColor linearColors[] = { SK_ColorGREEN, SK_ColorBLACK };
74cb93a386Sopenharmony_ci        paint.setShader(SkGradientShader::MakeLinear(linearPoints, linearColors, nullptr, 2,
75cb93a386Sopenharmony_ci                                                     SkTileMode::kMirror));
76cb93a386Sopenharmony_ci        paint.setAntiAlias(true);
77cb93a386Sopenharmony_ci
78cb93a386Sopenharmony_ci        canvas->drawCircle(200, 200, 64, paint);
79cb93a386Sopenharmony_ci
80cb93a386Sopenharmony_ci        // Detach shader
81cb93a386Sopenharmony_ci        paint.setShader(nullptr);
82cb93a386Sopenharmony_ci    }
83cb93a386Sopenharmony_ci
84cb93a386Sopenharmony_ci    // Draw a message with a nice black paint
85cb93a386Sopenharmony_ci    SkFont font;
86cb93a386Sopenharmony_ci    font.setSubpixel(true);
87cb93a386Sopenharmony_ci    font.setSize(20);
88cb93a386Sopenharmony_ci    paint.setColor(SK_ColorBLACK);
89cb93a386Sopenharmony_ci
90cb93a386Sopenharmony_ci    canvas->save();
91cb93a386Sopenharmony_ci    static const char message[] = "Hello World";
92cb93a386Sopenharmony_ci
93cb93a386Sopenharmony_ci    // Translate and rotate
94cb93a386Sopenharmony_ci    canvas->translate(300, 300);
95cb93a386Sopenharmony_ci    fRotationAngle += 0.2f;
96cb93a386Sopenharmony_ci    if (fRotationAngle > 360) {
97cb93a386Sopenharmony_ci        fRotationAngle -= 360;
98cb93a386Sopenharmony_ci    }
99cb93a386Sopenharmony_ci    canvas->rotate(fRotationAngle);
100cb93a386Sopenharmony_ci
101cb93a386Sopenharmony_ci    // Draw the text
102cb93a386Sopenharmony_ci    canvas->drawSimpleText(message, strlen(message), SkTextEncoding::kUTF8, 0, 0, font, paint);
103cb93a386Sopenharmony_ci
104cb93a386Sopenharmony_ci    canvas->restore();
105cb93a386Sopenharmony_ci}
106cb93a386Sopenharmony_ci
107cb93a386Sopenharmony_civoid HelloWorld::onIdle() {
108cb93a386Sopenharmony_ci    // Just re-paint continously
109cb93a386Sopenharmony_ci    fWindow->inval();
110cb93a386Sopenharmony_ci}
111cb93a386Sopenharmony_ci
112cb93a386Sopenharmony_cibool HelloWorld::onChar(SkUnichar c, skui::ModifierKey modifiers) {
113cb93a386Sopenharmony_ci    if (' ' == c) {
114cb93a386Sopenharmony_ci        fBackendType = Window::kRaster_BackendType == fBackendType ? Window::kNativeGL_BackendType
115cb93a386Sopenharmony_ci                                                                   : Window::kRaster_BackendType;
116cb93a386Sopenharmony_ci        fWindow->detach();
117cb93a386Sopenharmony_ci        fWindow->attach(fBackendType);
118cb93a386Sopenharmony_ci    }
119cb93a386Sopenharmony_ci    return true;
120cb93a386Sopenharmony_ci}
121