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