| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
| 3 * | 3 * |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 * | 7 * |
| 8 */ | 8 */ |
| 9 | 9 |
| 10 #include "HelloWorld.h" | 10 #include "HelloWorld.h" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 SkEvent::Init(); | 22 SkEvent::Init(); |
| 23 } | 23 } |
| 24 | 24 |
| 25 void application_term() { | 25 void application_term() { |
| 26 SkEvent::Term(); | 26 SkEvent::Term(); |
| 27 } | 27 } |
| 28 | 28 |
| 29 HelloWorldWindow::HelloWorldWindow(void* hwnd) | 29 HelloWorldWindow::HelloWorldWindow(void* hwnd) |
| 30 : INHERITED(hwnd) { | 30 : INHERITED(hwnd) { |
| 31 fType = kGPU_DeviceType; | 31 fType = kGPU_DeviceType; |
| 32 fRenderTarget = NULL; | |
| 33 fRotationAngle = 0; | 32 fRotationAngle = 0; |
| 34 this->setTitle(); | 33 this->setTitle(); |
| 35 this->setUpBackend(); | 34 this->setUpBackend(); |
| 36 } | 35 } |
| 37 | 36 |
| 38 HelloWorldWindow::~HelloWorldWindow() { | 37 HelloWorldWindow::~HelloWorldWindow() { |
| 39 tearDownBackend(); | 38 tearDownBackend(); |
| 40 } | 39 } |
| 41 | 40 |
| 42 void HelloWorldWindow::tearDownBackend() { | 41 void HelloWorldWindow::tearDownBackend() { |
| 43 SkSafeUnref(fContext); | 42 SkSafeUnref(fContext); |
| 44 fContext = NULL; | 43 fContext = NULL; |
| 45 | 44 |
| 46 SkSafeUnref(fInterface); | 45 SkSafeUnref(fInterface); |
| 47 fInterface = NULL; | 46 fInterface = NULL; |
| 48 | 47 |
| 49 SkSafeUnref(fRenderTarget); | 48 fGpuSurface = nullptr; |
| 50 fRenderTarget = NULL; | |
| 51 | 49 |
| 52 INHERITED::release(); | 50 INHERITED::release(); |
| 53 } | 51 } |
| 54 | 52 |
| 55 void HelloWorldWindow::setTitle() { | 53 void HelloWorldWindow::setTitle() { |
| 56 SkString title("Hello World "); | 54 SkString title("Hello World "); |
| 57 title.appendf(fType == kRaster_DeviceType ? "raster" : "opengl"); | 55 title.appendf(fType == kRaster_DeviceType ? "raster" : "opengl"); |
| 58 INHERITED::setTitle(title.c_str()); | 56 INHERITED::setTitle(title.c_str()); |
| 59 } | 57 } |
| 60 | 58 |
| 61 bool HelloWorldWindow::setUpBackend() { | 59 bool HelloWorldWindow::setUpBackend() { |
| 62 this->setVisibleP(true); | 60 this->setVisibleP(true); |
| 63 this->setClipToBounds(false); | 61 this->setClipToBounds(false); |
| 64 | 62 |
| 65 bool result = attach(kNativeGL_BackEndType, 0 /*msaa*/, false, &fAttachmentI
nfo); | 63 bool result = attach(kNativeGL_BackEndType, 0 /*msaa*/, false, &fAttachmentI
nfo); |
| 66 if (false == result) { | 64 if (false == result) { |
| 67 SkDebugf("Not possible to create backend.\n"); | 65 SkDebugf("Not possible to create backend.\n"); |
| 68 release(); | 66 release(); |
| 69 return false; | 67 return false; |
| 70 } | 68 } |
| 71 | 69 |
| 72 fInterface = GrGLCreateNativeInterface(); | 70 fInterface = GrGLCreateNativeInterface(); |
| 73 | |
| 74 SkASSERT(NULL != fInterface); | 71 SkASSERT(NULL != fInterface); |
| 75 | 72 |
| 76 fContext = GrContext::Create(kOpenGL_GrBackend, (GrBackendContext)fInterface
); | 73 fContext = GrContext::Create(kOpenGL_GrBackend, (GrBackendContext)fInterface
); |
| 77 SkASSERT(NULL != fContext); | 74 SkASSERT(NULL != fContext); |
| 78 | 75 |
| 79 this->setUpRenderTarget(); | 76 this->setUpGpuBackedSurface(); |
| 80 return true; | 77 return true; |
| 81 } | 78 } |
| 82 | 79 |
| 83 void HelloWorldWindow::setUpRenderTarget() { | 80 void HelloWorldWindow::setUpGpuBackedSurface() { |
| 84 SkSafeUnref(fRenderTarget); | 81 fGpuSurface = this->makeGpuBackedSurface(fAttachmentInfo, fInterface, fConte
xt); |
| 85 fRenderTarget = this->renderTarget(fAttachmentInfo, fInterface, fContext); | |
| 86 } | 82 } |
| 87 | 83 |
| 88 void HelloWorldWindow::drawContents(SkCanvas* canvas) { | 84 void HelloWorldWindow::drawContents(SkCanvas* canvas) { |
| 89 // Clear background | 85 // Clear background |
| 90 canvas->drawColor(SK_ColorWHITE); | 86 canvas->drawColor(SK_ColorWHITE); |
| 91 | 87 |
| 92 SkPaint paint; | 88 SkPaint paint; |
| 93 paint.setColor(SK_ColorRED); | 89 paint.setColor(SK_ColorRED); |
| 94 | 90 |
| 95 // Draw a rectangle with red paint | 91 // Draw a rectangle with red paint |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 135 } | 131 } |
| 136 canvas->rotate(fRotationAngle); | 132 canvas->rotate(fRotationAngle); |
| 137 | 133 |
| 138 // Draw the text: | 134 // Draw the text: |
| 139 canvas->drawText(message, strlen(message), 0, 0, paint); | 135 canvas->drawText(message, strlen(message), 0, 0, paint); |
| 140 | 136 |
| 141 canvas->restore(); | 137 canvas->restore(); |
| 142 } | 138 } |
| 143 | 139 |
| 144 void HelloWorldWindow::draw(SkCanvas* canvas) { | 140 void HelloWorldWindow::draw(SkCanvas* canvas) { |
| 145 drawContents(canvas); | 141 this->drawContents(canvas); |
| 146 // in case we have queued drawing calls | 142 // in case we have queued drawing calls |
| 147 fContext->flush(); | 143 fContext->flush(); |
| 148 // Invalidate the window to force a redraw. Poor man's animation mechanism. | 144 // Invalidate the window to force a redraw. Poor man's animation mechanism. |
| 149 this->inval(NULL); | 145 this->inval(NULL); |
| 150 | 146 |
| 151 if (kRaster_DeviceType == fType) { | 147 if (kRaster_DeviceType == fType) { |
| 152 // need to send the raster bits to the (gpu) window | 148 // need to send the raster bits to the (gpu) window |
| 153 sk_sp<SkImage> snap = fSurface->makeImageSnapshot(); | 149 sk_sp<SkImage> snap = fRasterSurface->makeImageSnapshot(); |
| 154 SkPixmap pmap; | 150 SkPixmap pmap; |
| 155 if (snap->peekPixels(&pmap)) { | 151 if (snap->peekPixels(&pmap)) { |
| 156 const SkImageInfo& info = pmap.info(); | 152 const SkImageInfo& info = pmap.info(); |
| 157 fRenderTarget->writePixels(0, 0, snap->width(), snap->height(), | 153 |
| 158 SkImageInfo2GrPixelConfig(info, *fContext
->caps()), | 154 SkCanvas* canvas = fGpuSurface->getCanvas(); |
| 159 pmap.addr(), pmap.rowBytes(), | 155 |
| 160 GrContext::kFlushWrites_PixelOp); | 156 canvas->writePixels(info, pmap.addr(), pmap.rowBytes(), 0, 0); |
| 157 canvas->flush(); |
| 161 } | 158 } |
| 162 } | 159 } |
| 163 INHERITED::present(); | 160 INHERITED::present(); |
| 164 } | 161 } |
| 165 | 162 |
| 166 void HelloWorldWindow::onSizeChange() { | 163 void HelloWorldWindow::onSizeChange() { |
| 167 setUpRenderTarget(); | 164 this->setUpGpuBackedSurface(); |
| 168 } | 165 } |
| 169 | 166 |
| 170 bool HelloWorldWindow::onHandleChar(SkUnichar unichar) { | 167 bool HelloWorldWindow::onHandleChar(SkUnichar unichar) { |
| 171 if (' ' == unichar) { | 168 if (' ' == unichar) { |
| 172 fType = fType == kRaster_DeviceType ? kGPU_DeviceType: kRaster_DeviceTyp
e; | 169 fType = fType == kRaster_DeviceType ? kGPU_DeviceType: kRaster_DeviceTyp
e; |
| 173 tearDownBackend(); | 170 tearDownBackend(); |
| 174 setUpBackend(); | 171 setUpBackend(); |
| 175 this->setTitle(); | 172 this->setTitle(); |
| 176 this->inval(NULL); | 173 this->inval(NULL); |
| 177 } | 174 } |
| 178 return true; | 175 return true; |
| 179 } | 176 } |
| 180 | 177 |
| 181 SkOSWindow* create_sk_window(void* hwnd, int , char** ) { | 178 SkOSWindow* create_sk_window(void* hwnd, int , char** ) { |
| 182 return new HelloWorldWindow(hwnd); | 179 return new HelloWorldWindow(hwnd); |
| 183 } | 180 } |
| OLD | NEW |