Index: experimental/SkiaExamples/SkExample.cpp |
diff --git a/experimental/SkiaExamples/SkExample.cpp b/experimental/SkiaExamples/SkExample.cpp |
index 637ec9df538f2e180eb23dfc56edabb6b498a47f..e17ba703d2d596d3bc20b8c3215235ed32fb2ae2 100644 |
--- a/experimental/SkiaExamples/SkExample.cpp |
+++ b/experimental/SkiaExamples/SkExample.cpp |
@@ -9,13 +9,11 @@ |
#include "SkExample.h" |
-#include "gl/GrGLUtil.h" |
-#include "gl/GrGLDefines.h" |
#include "gl/GrGLInterface.h" |
#include "SkApplication.h" |
#include "SkCommandLineFlags.h" |
-#include "SkGpuDevice.h" |
#include "SkGraphics.h" |
+#include "SkGr.h" |
DEFINE_string2(match, m, NULL, "[~][^]substring[$] [...] of test name to run.\n" \ |
"Multiple matches may be separated by spaces.\n" \ |
@@ -40,7 +38,8 @@ SkExampleWindow::SkExampleWindow(void* hwnd) |
: INHERITED(hwnd) { |
fRegistry = SkExample::Registry::Head(); |
fCurrExample = fRegistry->factory()(this); |
- |
+ fType = SkExampleWindow::kGPU_DeviceType; |
+ fRenderTarget = NULL; |
if (FLAGS_match.count()) { |
// Start with the a matching sample if possible. |
bool found = this->findNextMatch(); |
@@ -48,26 +47,34 @@ SkExampleWindow::SkExampleWindow(void* hwnd) |
SkDebugf("No matching SkExample found.\n"); |
} |
} |
+ this->setTitle(); |
+ this->setUpBackend(); |
+} |
+ |
+SkExampleWindow::~SkExampleWindow() { |
+ tearDownBackend(); |
} |
void SkExampleWindow::tearDownBackend() { |
- if (kGPU_DeviceType == fType) { |
- SkSafeUnref(fContext); |
- fContext = NULL; |
+ SkSafeUnref(fContext); |
+ fContext = NULL; |
- SkSafeUnref(fInterface); |
- fInterface = NULL; |
+ SkSafeUnref(fInterface); |
+ fInterface = NULL; |
- SkSafeUnref(fRenderTarget); |
- fRenderTarget = NULL; |
+ SkSafeUnref(fRenderTarget); |
+ fRenderTarget = NULL; |
- detach(); |
- } |
+ INHERITED::detach(); |
} |
-bool SkExampleWindow::setupBackend(DeviceType type) { |
- fType = type; |
+void SkExampleWindow::setTitle() { |
+ SkString title = fCurrExample->getName(); |
+ title.appendf(fType == kRaster_DeviceType ? " raster" : " opengl"); |
+ INHERITED::setTitle(title.c_str()); |
+} |
+bool SkExampleWindow::setUpBackend() { |
this->setColorType(kRGBA_8888_SkColorType); |
this->setVisibleP(true); |
this->setClipToBounds(false); |
@@ -86,76 +93,43 @@ bool SkExampleWindow::setupBackend(DeviceType type) { |
fContext = GrContext::Create(kOpenGL_GrBackend, (GrBackendContext)fInterface); |
SkASSERT(NULL != fContext); |
- setupRenderTarget(); |
- |
+ this->setUpRenderTarget(); |
return true; |
} |
-void SkExampleWindow::setupRenderTarget() { |
- GrBackendRenderTargetDesc desc; |
- desc.fWidth = SkScalarRoundToInt(width()); |
- desc.fHeight = SkScalarRoundToInt(height()); |
- desc.fConfig = kSkia8888_GrPixelConfig; |
- desc.fOrigin = kBottomLeft_GrSurfaceOrigin; |
- desc.fSampleCnt = fAttachmentInfo.fSampleCount; |
- desc.fStencilBits = fAttachmentInfo.fStencilBits; |
- |
- GrGLint buffer; |
- GR_GL_GetIntegerv(fInterface, GR_GL_FRAMEBUFFER_BINDING, &buffer); |
- desc.fRenderTargetHandle = buffer; |
- |
- fRenderTarget = fContext->wrapBackendRenderTarget(desc); |
- |
- fContext->setRenderTarget(fRenderTarget); |
-} |
- |
-SkCanvas* SkExampleWindow::createCanvas() { |
- if (fType == kGPU_DeviceType) { |
- if (NULL != fContext && NULL != fRenderTarget) { |
- SkAutoTUnref<SkBaseDevice> device(new SkGpuDevice(fContext, fRenderTarget)); |
- return new SkCanvas(device); |
- } |
- tearDownBackend(); |
- setupBackend(kRaster_DeviceType); |
- } |
- return INHERITED::createCanvas(); |
+void SkExampleWindow::setUpRenderTarget() { |
+ SkSafeUnref(fRenderTarget); |
+ fRenderTarget = this->renderTarget(fAttachmentInfo, fInterface, fContext); |
} |
void SkExampleWindow::draw(SkCanvas* canvas) { |
if (NULL != fCurrExample) { |
fCurrExample->draw(canvas); |
} |
- if (fType == kGPU_DeviceType) { |
+ // in case we have queued drawing calls |
+ fContext->flush(); |
- SkASSERT(NULL != fContext); |
- fContext->flush(); |
- } |
- if (fType == kRaster_DeviceType) { |
+ if (kRaster_DeviceType == fType) { |
// need to send the raster bits to the (gpu) window |
- fContext->setRenderTarget(fRenderTarget); |
- const SkBitmap& bm = getBitmap(); |
- fRenderTarget->writePixels(0, 0, bm.width(), bm.height(), |
- kSkia8888_GrPixelConfig, |
- bm.getPixels(), |
- bm.rowBytes()); |
+ SkImage* snap = fSurface->newImageSnapshot(); |
+ size_t rowBytes; |
+ SkImageInfo info; |
+ const void* pixels = snap->peekPixels(&info, &rowBytes); |
+ fRenderTarget->writePixels(0, 0, snap->width(), snap->height(), |
+ SkImageInfo2GrPixelConfig(info.colorType(), |
+ info.alphaType(), |
+ info.profileType()), |
+ pixels, |
+ rowBytes, |
+ GrContext::kFlushWrites_PixelOp); |
+ SkSafeUnref(snap); |
} |
INHERITED::present(); |
} |
void SkExampleWindow::onSizeChange() { |
- setupRenderTarget(); |
-} |
- |
-#ifdef SK_BUILD_FOR_WIN |
-void SkExampleWindow::onHandleInval(const SkIRect& rect) { |
- RECT winRect; |
- winRect.top = rect.top(); |
- winRect.bottom = rect.bottom(); |
- winRect.right = rect.right(); |
- winRect.left = rect.left(); |
- InvalidateRect((HWND)this->getHWND(), &winRect, false); |
+ setUpRenderTarget(); |
} |
-#endif |
bool SkExampleWindow::findNextMatch() { |
bool found = false; |
@@ -185,6 +159,13 @@ bool SkExampleWindow::onHandleChar(SkUnichar unichar) { |
SkDebugf("No SkExample that matches your query\n"); |
} |
} |
+ if (' ' == unichar) { |
+ fType = fType == kRaster_DeviceType ? kGPU_DeviceType: kRaster_DeviceType; |
+ tearDownBackend(); |
+ setUpBackend(); |
+ } |
+ this->setTitle(); |
+ this->inval(NULL); |
return true; |
} |