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