always use grcontext to get the bits to the screen



git-svn-id: http://skia.googlecode.com/svn/trunk@1802 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp
index 55b1e48..a0dd99a 100644
--- a/samplecode/SampleApp.cpp
+++ b/samplecode/SampleApp.cpp
@@ -3,7 +3,6 @@
 #include "SkData.h"
 #include "SkCanvas.h"
 #include "SkDevice.h"
-#include "SkGpuCanvas.h"
 #include "SkGpuDevice.h"
 #include "SkGraphics.h"
 #include "SkImageEncoder.h"
@@ -82,7 +81,7 @@
     #define SK_USE_SHADERS
 #endif
 
-#ifdef SK_BUILD_FOR_MAC
+#if 0
 #include <CoreFoundation/CoreFoundation.h>
 #include <CoreFoundation/CFURLAccess.h>
 
@@ -363,9 +362,9 @@
 #endif
      
     fPicture = NULL;
-    fGpuCanvas = NULL;
 
     fGrContext = NULL;
+    fGrRenderTarget = NULL;
 
 #ifdef DEFAULT_TO_GPU
     fCanvasType = kGPU_CanvasType;
@@ -434,19 +433,17 @@
     }
     
     fPDFData = NULL;
-#ifdef SK_BUILD_FOR_MAC
-    testpdf();
-#endif
+
+    this-make3DReady();
 }
 
 SampleWindow::~SampleWindow() {
     delete fPicture;
-    delete fGpuCanvas;
     delete fPdfCanvas;
-    if (NULL != fGrContext) {
-        fGrContext->unref();
-    }
     fTypeface->unref();
+
+    SkSafeUnref(fGrRenderTarget);
+    SkSafeUnref(fGrContext);
 }
 
 static SkBitmap capture_bitmap(SkCanvas* canvas) {
@@ -498,6 +495,11 @@
 #define YCLIP_N  8
 
 void SampleWindow::draw(SkCanvas* canvas) {
+    if (fGrContext && (kGPU_CanvasType == fCanvasType)) {
+        canvas->setDevice(new SkGpuDevice(fGrContext,
+                                          fGrRenderTarget))->unref();
+    }
+
     // update the animation time
     gAnimTimePrev = gAnimTime;
     gAnimTime = SkTime::GetMSecs();
@@ -588,6 +590,17 @@
         // Instead, we call it inside afterChildren.
         showZoomer(canvas);
     }
+
+    // do this last
+    if (fGrContext && (fCanvasType != kGPU_CanvasType)) {
+        fGrContext->setRenderTarget(fGrRenderTarget);
+        // need to send the bits to the (gpu) window
+        const SkBitmap& bm = this->getBitmap();
+        fGrContext->writePixels(0, 0, bm.width(), bm.height(),
+                                kRGBA_8888_GrPixelConfig, bm.getPixels(),
+                                bm.rowBytes());
+    }
+    presentGL();
 }
 
 void SampleWindow::showZoomer(SkCanvas* canvas) {
@@ -706,12 +719,6 @@
 }
 
 SkCanvas* SampleWindow::beforeChildren(SkCanvas* canvas) {
-    if (kGPU_CanvasType != fCanvasType) {
-#ifdef SK_SUPPORT_GL
-        detachGL();
-#endif
-    }
-
     if (fSaveToPdf) {
         const SkBitmap& bmp = canvas->getDevice()->accessBitmap(false);
         SkISize size = SkISize::Make(bmp.width(), bmp.height());
@@ -723,46 +730,13 @@
     } else {
         switch (fCanvasType) {
             case kRaster_CanvasType:
+            case kGPU_CanvasType:
                 canvas = this->INHERITED::beforeChildren(canvas);
                 break;
             case kPicture_CanvasType:
                 fPicture = new SkPicture;
                 canvas = fPicture->beginRecording(9999, 9999);
                 break;
-            case kGPU_CanvasType: {
-                if (make3DReady()) {
-                    SkDevice* device = canvas->getDevice();
-                    const SkBitmap& bitmap = device->accessBitmap(true);
-
-                    GrRenderTarget* renderTarget;
-
-                    GrPlatformSurfaceDesc desc;
-                    desc.reset();
-                    desc.fSurfaceType = kRenderTarget_GrPlatformSurfaceType;
-                    desc.fWidth = bitmap.width();
-                    desc.fHeight = bitmap.height();
-                    desc.fConfig = kRGBA_8888_GrPixelConfig;
-                    desc.fStencilBits = 8;
-                    GrGLint buffer;
-                    GR_GL_GetIntegerv(GR_GL_FRAMEBUFFER_BINDING, &buffer);
-                    desc.fPlatformRenderTarget = buffer;
-
-                    renderTarget = static_cast<GrRenderTarget*>(
-                            fGrContext->createPlatformSurface(desc));
-                    fGpuCanvas = new SkGpuCanvas(fGrContext, renderTarget);
-                    renderTarget->unref();
-
-                    device = new SkGpuDevice(fGrContext, renderTarget);
-                    fGpuCanvas->setDevice(device)->unref();
-
-                    fGpuCanvas->concat(canvas->getTotalMatrix());
-                    canvas = fGpuCanvas;
-
-                } else {
-                    canvas = this->INHERITED::beforeChildren(canvas);
-                }
-                break;
-            }
         }
     }
 
@@ -823,8 +797,7 @@
     if (fRequestGrabImage) {
         fRequestGrabImage = false;
 
-        SkCanvas* canvas = fGpuCanvas ? fGpuCanvas : orig;
-        SkDevice* device = canvas->getDevice();
+        SkDevice* device = orig->getDevice();
         SkBitmap bmp;
         if (device->accessBitmap(false).copyTo(&bmp, SkBitmap::kARGB_8888_Config)) {
             static int gSampleGrabCounter;
@@ -861,12 +834,9 @@
             break;
 #ifdef SK_SUPPORT_GL
         case kGPU_CanvasType:
-            if (fShowZoomer && fGpuCanvas) {
-                this->showZoomer(fGpuCanvas);
+            if (fShowZoomer) {
+                this->showZoomer(orig);
             }
-            delete fGpuCanvas;
-            fGpuCanvas = NULL;
-            presentGL();
             break;
 #endif
     }
@@ -1036,6 +1006,10 @@
         SkEvent evt(gFastTextEvtName);
         return curr_view(this)->doQuery(&evt);
     }
+    if (query->isType("ignore-window-bitmap")) {
+        query->setFast32(this->getGrContext() != NULL);
+        return true;
+    }
     return this->INHERITED::onQuery(query);
 }
 
@@ -1418,6 +1392,25 @@
 void SampleWindow::onSizeChange() {
     this->INHERITED::onSizeChange();
 
+    if (fGrContext) {
+        this->attachGL();
+
+        GrPlatformSurfaceDesc desc;
+        desc.reset();
+        desc.fSurfaceType = kRenderTarget_GrPlatformSurfaceType;
+        desc.fWidth = SkScalarRound(this->width());
+        desc.fHeight = SkScalarRound(this->height());
+        desc.fConfig = kRGBA_8888_GrPixelConfig;
+        desc.fStencilBits = 8;
+        GrGLint buffer;
+        GR_GL_GetIntegerv(GR_GL_FRAMEBUFFER_BINDING, &buffer);
+        desc.fPlatformRenderTarget = buffer;
+
+        SkSafeUnref(fGrRenderTarget);
+        fGrRenderTarget = static_cast<GrRenderTarget*>(
+                                      fGrContext->createPlatformSurface(desc));
+    }
+    
     SkView::F2BIter iter(this);
     SkView* view = iter.next();
     view->setSize(this->width(), this->height());