Added FileReaderApp to experimental and it's corresponding gyp file


git-svn-id: http://skia.googlecode.com/svn/trunk@1641 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/experimental/FileReaderApp/ReaderView.cpp b/experimental/FileReaderApp/ReaderView.cpp
new file mode 100644
index 0000000..efdc7be
--- /dev/null
+++ b/experimental/FileReaderApp/ReaderView.cpp
@@ -0,0 +1,68 @@
+#include "ReaderView.h"
+#include "SkGPipe.h"
+#include "SkCanvas.h"
+
+#include <stdio.h>
+
+#define FILE_PATH   "/Users/yangsu/Code/test/test.a"
+ReaderView::ReaderView() {
+    fBGColor = 0xFFDDDDDD;
+    fFilePos = 0;
+    fBufferBitmaps[0].setConfig(SkBitmap::kARGB_8888_Config, 640, 480);
+    fBufferBitmaps[0].allocPixels(NULL);
+    fBufferBitmaps[1].setConfig(SkBitmap::kARGB_8888_Config, 640, 480);
+    fBufferBitmaps[1].allocPixels(NULL);
+    fFront  = 0;
+    fBack   = 1;
+}
+
+void ReaderView::draw(SkCanvas* canvas) {
+    canvas->drawColor(fBGColor);
+    
+    SkAutoCanvasRestore acr(canvas, true);
+    
+    //Create a temporary canvas and reader object that draws into the back 
+    //bitmap so that the incremental changes or incomplete reads are not shown
+    //on screen
+    SkCanvas bufferCanvas(fBufferBitmaps[fBack]);
+    SkGPipeReader reader(&bufferCanvas);
+    
+    //The file specified by FILE_PATH MUST exist
+    FILE* f = fopen(FILE_PATH, "rb");
+    SkASSERT(f != NULL);
+    
+    fseek(f, 0, SEEK_END);
+    int size = ftell(f) * sizeof(char);
+    if (size <= fFilePos) {
+        fFilePos = 0;
+    }
+    
+    //Resume from the last read location
+    fseek(f, fFilePos, SEEK_SET);
+    int toBeRead = size - fFilePos;
+    if (size > 0 && toBeRead > 0) {
+        void* block = sk_malloc_throw(toBeRead);
+        fread(block, 1, toBeRead, f);
+        
+        size_t bytesRead;
+        SkGPipeReader::Status fStatus = reader.playback(block, toBeRead, &bytesRead);
+        SkASSERT(SkGPipeReader::kError_Status != fStatus);
+        SkASSERT(toBeRead >= bytesRead);
+        
+        //if the reader reaches a done verb, a frame is complete. 
+        //Update the file location and swap the front and back bitmaps to show
+        //the new frame
+        if (SkGPipeReader::kDone_Status == fStatus) {
+            fFilePos += bytesRead;
+            fFront = fFront ^ 0x1;
+            fBack = fBack ^ 0x1;
+        }
+        sk_free(block);
+    }
+    
+    fclose(f);
+    
+    //the front bitmap is always drawn
+    canvas->drawBitmap(fBufferBitmaps[fFront], 0, 0, NULL);
+    this->inval(NULL);
+}
\ No newline at end of file