OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright 2013 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 "SkExample.h" | |
11 | |
12 #include "gl/GrGLInterface.h" | |
13 #include "SkApplication.h" | |
14 #include "SkCanvas.h" | |
15 #include "SkGradientShader.h" | |
16 #include "SkGraphics.h" | |
17 #include "SkGr.h" | |
18 | |
19 void application_init() { | |
20 SkGraphics::Init(); | |
21 SkEvent::Init(); | |
22 } | |
23 | |
24 void application_term() { | |
25 SkEvent::Term(); | |
26 SkGraphics::Term(); | |
27 } | |
28 | |
29 SkExampleWindow::SkExampleWindow(void* hwnd) | |
30 : INHERITED(hwnd) { | |
31 fType = SkExampleWindow::kGPU_DeviceType; | |
32 fRenderTarget = NULL; | |
33 fRotationAngle = 0; | |
34 this->setTitle(); | |
35 this->setUpBackend(); | |
36 } | |
37 | |
38 SkExampleWindow::~SkExampleWindow() { | |
39 tearDownBackend(); | |
40 } | |
41 | |
42 void SkExampleWindow::tearDownBackend() { | |
43 SkSafeUnref(fContext); | |
44 fContext = NULL; | |
45 | |
46 SkSafeUnref(fInterface); | |
47 fInterface = NULL; | |
48 | |
49 SkSafeUnref(fRenderTarget); | |
50 fRenderTarget = NULL; | |
51 | |
52 INHERITED::detach(); | |
53 } | |
54 | |
55 void SkExampleWindow::setTitle() { | |
56 SkString title("SkiaExample "); | |
57 title.appendf(fType == kRaster_DeviceType ? "raster" : "opengl"); | |
58 INHERITED::setTitle(title.c_str()); | |
59 } | |
60 | |
61 bool SkExampleWindow::setUpBackend() { | |
62 this->setColorType(kRGBA_8888_SkColorType); | |
63 this->setVisibleP(true); | |
64 this->setClipToBounds(false); | |
65 | |
66 bool result = attach(kNativeGL_BackEndType, 0 /*msaa*/, &fAttachmentInfo); | |
67 if (false == result) { | |
68 SkDebugf("Not possible to create backend.\n"); | |
69 detach(); | |
70 return false; | |
71 } | |
72 | |
73 fInterface = GrGLCreateNativeInterface(); | |
74 | |
75 SkASSERT(NULL != fInterface); | |
76 | |
77 fContext = GrContext::Create(kOpenGL_GrBackend, (GrBackendContext)fInterface
); | |
78 SkASSERT(NULL != fContext); | |
79 | |
80 this->setUpRenderTarget(); | |
81 return true; | |
82 } | |
83 | |
84 void SkExampleWindow::setUpRenderTarget() { | |
85 SkSafeUnref(fRenderTarget); | |
86 fRenderTarget = this->renderTarget(fAttachmentInfo, fInterface, fContext); | |
87 } | |
88 | |
89 void SkExampleWindow::drawContents(SkCanvas* canvas) { | |
90 // Clear background | |
91 canvas->drawColor(SK_ColorWHITE); | |
92 | |
93 SkPaint paint; | |
94 paint.setColor(SK_ColorRED); | |
95 | |
96 // Draw a rectangle with red paint | |
97 SkRect rect = { | |
98 10, 10, | |
99 128, 128 | |
100 }; | |
101 canvas->drawRect(rect, paint); | |
102 | |
103 // Set up a linear gradient and draw a circle | |
104 { | |
105 SkPoint linearPoints[] = { | |
106 {0, 0}, | |
107 {300, 300} | |
108 }; | |
109 SkColor linearColors[] = {SK_ColorGREEN, SK_ColorBLACK}; | |
110 | |
111 SkShader* shader = SkGradientShader::CreateLinear( | |
112 linearPoints, linearColors, NULL, 2, | |
113 SkShader::kMirror_TileMode); | |
114 SkAutoUnref shader_deleter(shader); | |
115 | |
116 paint.setShader(shader); | |
117 paint.setFlags(SkPaint::kAntiAlias_Flag); | |
118 | |
119 canvas->drawCircle(200, 200, 64, paint); | |
120 | |
121 // Detach shader | |
122 paint.setShader(NULL); | |
123 } | |
124 | |
125 // Draw a message with a nice black paint. | |
126 paint.setFlags( | |
127 SkPaint::kAntiAlias_Flag | | |
128 SkPaint::kSubpixelText_Flag | // ... avoid waggly text when rotatin
g. | |
129 SkPaint::kUnderlineText_Flag); | |
130 paint.setColor(SK_ColorBLACK); | |
131 paint.setTextSize(20); | |
132 | |
133 canvas->save(); | |
134 | |
135 static const char message[] = "Hello Skia!!!"; | |
136 | |
137 // Translate and rotate | |
138 canvas->translate(300, 300); | |
139 fRotationAngle += 0.2f; | |
140 if (fRotationAngle > 360) { | |
141 fRotationAngle -= 360; | |
142 } | |
143 canvas->rotate(fRotationAngle); | |
144 | |
145 // Draw the text: | |
146 canvas->drawText(message, strlen(message), 0, 0, paint); | |
147 | |
148 canvas->restore(); | |
149 } | |
150 | |
151 void SkExampleWindow::draw(SkCanvas* canvas) { | |
152 drawContents(canvas); | |
153 // in case we have queued drawing calls | |
154 fContext->flush(); | |
155 // Invalidate the window to force a redraw. Poor man's animation mechanism. | |
156 this->inval(NULL); | |
157 | |
158 if (kRaster_DeviceType == fType) { | |
159 // need to send the raster bits to the (gpu) window | |
160 SkImage* snap = fSurface->newImageSnapshot(); | |
161 size_t rowBytes; | |
162 SkImageInfo info; | |
163 const void* pixels = snap->peekPixels(&info, &rowBytes); | |
164 fRenderTarget->writePixels(0, 0, snap->width(), snap->height(), | |
165 SkImageInfo2GrPixelConfig(info.colorType
(), | |
166 info.alphaType()
, | |
167 info.profileType
()), | |
168 pixels, | |
169 rowBytes, | |
170 GrContext::kFlushWrites_PixelOp); | |
171 SkSafeUnref(snap); | |
172 } | |
173 INHERITED::present(); | |
174 } | |
175 | |
176 void SkExampleWindow::onSizeChange() { | |
177 setUpRenderTarget(); | |
178 } | |
179 | |
180 bool SkExampleWindow::onHandleChar(SkUnichar unichar) { | |
181 if (' ' == unichar) { | |
182 fType = fType == kRaster_DeviceType ? kGPU_DeviceType: kRaster_DeviceTyp
e; | |
183 tearDownBackend(); | |
184 setUpBackend(); | |
185 this->setTitle(); | |
186 this->inval(NULL); | |
187 } | |
188 return true; | |
189 } | |
190 | |
191 SkOSWindow* create_sk_window(void* hwnd, int , char** ) { | |
192 return new SkExampleWindow(hwnd); | |
193 } | |
OLD | NEW |