• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2015 Google Inc.
3  *
4  *
5  * Use of this source code is governed by a BSD-style license that can be
6  * found in the LICENSE file.
7  *
8  */
9 
10 #include "HelloWorld.h"
11 
12 #include "gl/GrGLInterface.h"
13 #include "GrContext.h"
14 #include "SkApplication.h"
15 #include "SkCanvas.h"
16 #include "SkGradientShader.h"
17 #include "SkGraphics.h"
18 #include "SkGr.h"
19 
application_init()20 void application_init() {
21     SkGraphics::Init();
22     SkEvent::Init();
23 }
24 
application_term()25 void application_term() {
26     SkEvent::Term();
27 }
28 
HelloWorldWindow(void * hwnd)29 HelloWorldWindow::HelloWorldWindow(void* hwnd)
30     : INHERITED(hwnd) {
31     fType = kGPU_DeviceType;
32     fRotationAngle = 0;
33     this->setTitle();
34     this->setUpBackend();
35 }
36 
~HelloWorldWindow()37 HelloWorldWindow::~HelloWorldWindow() {
38     tearDownBackend();
39 }
40 
tearDownBackend()41 void HelloWorldWindow::tearDownBackend() {
42     SkSafeUnref(fContext);
43     fContext = NULL;
44 
45     SkSafeUnref(fInterface);
46     fInterface = NULL;
47 
48     fGpuSurface = nullptr;
49 
50     INHERITED::release();
51 }
52 
setTitle()53 void HelloWorldWindow::setTitle() {
54     SkString title("Hello World ");
55     title.appendf(fType == kRaster_DeviceType ? "raster" : "opengl");
56     INHERITED::setTitle(title.c_str());
57 }
58 
setUpBackend()59 bool HelloWorldWindow::setUpBackend() {
60     this->setVisibleP(true);
61     this->setClipToBounds(false);
62 
63     bool result = attach(kNativeGL_BackEndType, 0 /*msaa*/, false, &fAttachmentInfo);
64     if (false == result) {
65         SkDebugf("Not possible to create backend.\n");
66         release();
67         return false;
68     }
69 
70     fInterface = GrGLCreateNativeInterface();
71     SkASSERT(NULL != fInterface);
72 
73     fContext = GrContext::Create(kOpenGL_GrBackend, (GrBackendContext)fInterface);
74     SkASSERT(NULL != fContext);
75 
76     this->setUpGpuBackedSurface();
77     return true;
78 }
79 
setUpGpuBackedSurface()80 void HelloWorldWindow::setUpGpuBackedSurface() {
81     fGpuSurface = this->makeGpuBackedSurface(fAttachmentInfo, fInterface, fContext);
82 }
83 
drawContents(SkCanvas * canvas)84 void HelloWorldWindow::drawContents(SkCanvas* canvas) {
85     // Clear background
86     canvas->drawColor(SK_ColorWHITE);
87 
88     SkPaint paint;
89     paint.setColor(SK_ColorRED);
90 
91     // Draw a rectangle with red paint
92     SkRect rect = SkRect::MakeXYWH(10, 10, 128, 128);
93     canvas->drawRect(rect, paint);
94 
95     // Set up a linear gradient and draw a circle
96     {
97         SkPoint linearPoints[] = {
98                 {0, 0},
99                 {300, 300}
100         };
101         SkColor linearColors[] = {SK_ColorGREEN, SK_ColorBLACK};
102 
103         paint.setShader(SkGradientShader::MakeLinear(
104                 linearPoints, linearColors, nullptr, 2,
105                 SkShader::kMirror_TileMode));
106         paint.setFlags(SkPaint::kAntiAlias_Flag);
107 
108         canvas->drawCircle(200, 200, 64, paint);
109 
110         // Detach shader
111         paint.setShader(nullptr);
112     }
113 
114     // Draw a message with a nice black paint.
115     paint.setFlags(
116             SkPaint::kAntiAlias_Flag |
117             SkPaint::kSubpixelText_Flag |  // ... avoid waggly text when rotating.
118             SkPaint::kUnderlineText_Flag);
119     paint.setColor(SK_ColorBLACK);
120     paint.setTextSize(20);
121 
122     canvas->save();
123 
124     static const char message[] = "Hello World";
125 
126     // Translate and rotate
127     canvas->translate(300, 300);
128     fRotationAngle += 0.2f;
129     if (fRotationAngle > 360) {
130         fRotationAngle -= 360;
131     }
132     canvas->rotate(fRotationAngle);
133 
134     // Draw the text:
135     canvas->drawText(message, strlen(message), 0, 0, paint);
136 
137     canvas->restore();
138 }
139 
draw(SkCanvas * canvas)140 void HelloWorldWindow::draw(SkCanvas* canvas) {
141     this->drawContents(canvas);
142     // Invalidate the window to force a redraw. Poor man's animation mechanism.
143     this->inval(NULL);
144 
145     if (kRaster_DeviceType == fType) {
146         fRasterSurface->draw(fGpuSurface->getCanvas(), 0, 0, nullptr);
147     }
148     fGpuSurface->getCanvas()->flush();
149     INHERITED::present();
150 }
151 
onSizeChange()152 void HelloWorldWindow::onSizeChange() {
153     this->setUpGpuBackedSurface();
154 }
155 
onHandleChar(SkUnichar unichar)156 bool HelloWorldWindow::onHandleChar(SkUnichar unichar) {
157     if (' ' == unichar) {
158         fType = fType == kRaster_DeviceType ? kGPU_DeviceType: kRaster_DeviceType;
159         tearDownBackend();
160         setUpBackend();
161         this->setTitle();
162         this->inval(NULL);
163     }
164     return true;
165 }
166 
create_sk_window(void * hwnd,int,char **)167 SkOSWindow* create_sk_window(void* hwnd, int , char** ) {
168     return new HelloWorldWindow(hwnd);
169 }
170