add DeferredCanvas mode to SampleApp
BUG=skia:
Review URL: https://codereview.chromium.org/1129603002
diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp
index 9b5a972..82d42fd 100644
--- a/samplecode/SampleApp.cpp
+++ b/samplecode/SampleApp.cpp
@@ -15,6 +15,7 @@
#include "SkCanvas.h"
#include "SkCommandLineFlags.h"
#include "SkData.h"
+#include "SkDeferredCanvas.h"
#include "SkDevice.h"
#include "SkDocument.h"
#include "SkGPipe.h"
@@ -181,10 +182,9 @@
#if SK_SUPPORT_GPU
switch (win->getDeviceType()) {
- case kRaster_DeviceType:
- // fallthrough
- case kPicture_DeviceType:
- // fallthrough
+ case kRaster_DeviceType: // fallthrough
+ case kPicture_DeviceType: // fallthrough
+ case kDeferred_DeviceType: // fallthrough
case kGPU_DeviceType:
// all these guys use the native backend
fBackend = kNativeGL_BackEndType;
@@ -210,10 +210,9 @@
SkASSERT(NULL == fCurIntf);
SkAutoTUnref<const GrGLInterface> glInterface;
switch (win->getDeviceType()) {
- case kRaster_DeviceType:
- // fallthrough
- case kPicture_DeviceType:
- // fallthrough
+ case kRaster_DeviceType: // fallthrough
+ case kPicture_DeviceType: // fallthrough
+ case kDeferred_DeviceType: // fallthrough
case kGPU_DeviceType:
// all these guys use the native interface
glInterface.reset(GrGLCreateNativeInterface());
@@ -673,7 +672,8 @@
SampleWindow::kANGLE_DeviceType,
#endif // SK_ANGLE
#endif // SK_SUPPORT_GPU
- SampleWindow::kRaster_DeviceType
+ SampleWindow::kDeferred_DeviceType,
+ SampleWindow::kRaster_DeviceType,
};
SK_COMPILE_ASSERT(SK_ARRAY_COUNT(gCT) == SampleWindow::kDeviceTypeCnt, array_size_mismatch);
return gCT[ct];
@@ -829,7 +829,7 @@
int itemID;
itemID =fAppMenu->appendList("Device Type", "Device Type", sinkID, 0,
- "Raster", "Picture", "OpenGL",
+ "Raster", "Picture", "OpenGL", "Deferred",
#if SK_ANGLE
"ANGLE",
#endif
@@ -1196,6 +1196,12 @@
canvas = fPDFDocument->beginPage(this->width(), this->height());
} else if (kPicture_DeviceType == fDeviceType) {
canvas = fRecorder.beginRecording(9999, 9999, NULL, 0);
+ } else if (kDeferred_DeviceType == fDeviceType) {
+ fDeferredSurface.reset(canvas->newSurface(canvas->imageInfo()));
+ if (fDeferredSurface.get()) {
+ fDeferredCanvas.reset(SkDeferredCanvas::Create(fDeferredSurface));
+ canvas = fDeferredCanvas;
+ }
} else {
canvas = this->INHERITED::beforeChildren(canvas);
}
@@ -1284,6 +1290,13 @@
} else {
picture->playback(orig);
}
+ } else if (kDeferred_DeviceType == fDeviceType) {
+ SkAutoTUnref<SkImage> image(fDeferredCanvas->newImageSnapshot());
+ if (image) {
+ orig->drawImage(image, 0, 0, NULL);
+ }
+ fDeferredCanvas.reset(NULL);
+ fDeferredSurface.reset(NULL);
}
// Do this after presentGL and other finishing, rather than in afterChild
@@ -1858,6 +1871,7 @@
"angle: ",
#endif // SK_ANGLE
#endif // SK_SUPPORT_GPU
+ "deferred: ",
};
SK_COMPILE_ASSERT(SK_ARRAY_COUNT(gDeviceTypePrefix) == SampleWindow::kDeviceTypeCnt,
array_size_mismatch);