1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 8026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com#include "ReaderView.h" 9026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com#include "SkGPipe.h" 10026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com#include "SkCanvas.h" 11026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com 12026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com#include <stdio.h> 13026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com 14026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com#define FILE_PATH "/Users/yangsu/Code/test/test.a" 15026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.comReaderView::ReaderView() { 16026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com fBGColor = 0xFFDDDDDD; 17026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com fFilePos = 0; 18026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com fBufferBitmaps[0].setConfig(SkBitmap::kARGB_8888_Config, 640, 480); 19026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com fBufferBitmaps[0].allocPixels(NULL); 20026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com fBufferBitmaps[1].setConfig(SkBitmap::kARGB_8888_Config, 640, 480); 21026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com fBufferBitmaps[1].allocPixels(NULL); 22026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com fFront = 0; 23026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com fBack = 1; 24026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com} 25026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com 26026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.comvoid ReaderView::draw(SkCanvas* canvas) { 27026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com canvas->drawColor(fBGColor); 28d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 29026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com SkAutoCanvasRestore acr(canvas, true); 30d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 31d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com //Create a temporary canvas and reader object that draws into the back 32026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com //bitmap so that the incremental changes or incomplete reads are not shown 33026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com //on screen 34026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com SkCanvas bufferCanvas(fBufferBitmaps[fBack]); 35026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com SkGPipeReader reader(&bufferCanvas); 36d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 37026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com //The file specified by FILE_PATH MUST exist 38026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com FILE* f = fopen(FILE_PATH, "rb"); 39026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com SkASSERT(f != NULL); 40d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 41026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com fseek(f, 0, SEEK_END); 42026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com int size = ftell(f) * sizeof(char); 43026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com if (size <= fFilePos) { 44026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com fFilePos = 0; 45026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com } 46d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 47026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com //Resume from the last read location 48026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com fseek(f, fFilePos, SEEK_SET); 49026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com int toBeRead = size - fFilePos; 50026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com if (size > 0 && toBeRead > 0) { 51026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com void* block = sk_malloc_throw(toBeRead); 52026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com fread(block, 1, toBeRead, f); 53d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 54026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com size_t bytesRead; 55026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com SkGPipeReader::Status fStatus = reader.playback(block, toBeRead, &bytesRead); 56026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com SkASSERT(SkGPipeReader::kError_Status != fStatus); 57026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com SkASSERT(toBeRead >= bytesRead); 58d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 59d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com //if the reader reaches a done verb, a frame is complete. 60026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com //Update the file location and swap the front and back bitmaps to show 61026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com //the new frame 62026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com if (SkGPipeReader::kDone_Status == fStatus) { 63026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com fFilePos += bytesRead; 64026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com fFront = fFront ^ 0x1; 65026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com fBack = fBack ^ 0x1; 66026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com } 67026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com sk_free(block); 68026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com } 69d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 70026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com fclose(f); 71d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 72026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com //the front bitmap is always drawn 73026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com canvas->drawBitmap(fBufferBitmaps[fFront], 0, 0, NULL); 74026427654f7a8d968c3a150c5f9ec9a6596fd40dyangsu@google.com this->inval(NULL); 75bda03db28935eef7f9a3aae05fdedca57cd984adrmistry@google.com} 76