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