blob: 8846826f3f6d0b6ecf1544dd3eb3b31fa13470b2 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
yangsu@google.coma8a42e22011-06-16 20:49:55 +00008#include "SkDebuggerViews.h"
9#include <stdio.h>
10
11SkContentView::SkContentView(SkEventSinkID clID, SkEventSinkID ipID) :
12 fDumper(this->getSinkID(), clID, ipID) {
13 fBGColor = 0xFFDDDDDD;
14 fAtomsToRead = 0;
15 fDisplayClip = false;
16}
17
18SkContentView::~SkContentView() {
19 fAtomBounds.clear();
20 fFrameBounds.clear();
21}
22
23void SkContentView::reinit(const char* filename) {
24 fFilePath.set(filename);
25 fAtomsToRead = 0;
26 this->init();
27}
28
29bool SkContentView::onEvent(const SkEvent& evt) {
30 return this->INHERITED::onEvent(evt);
31}
32
33//Read file atom by atom and record attom bounds
34void SkContentView::init() {
35 fDumper.unload();
36 fAtomBounds.clear();
37 fFrameBounds.clear();
38
39 SkDumpCanvasM* dumpCanvas = new SkDumpCanvasM(&fDumper);
40 SkGPipeReader* dumpReader = new SkGPipeReader(dumpCanvas);
41
42 FILE* f = fopen(fFilePath.c_str(), "rb");
43 SkASSERT(f != NULL);
44 fseek(f, 0, SEEK_END);
45 int fileSize = ftell(f) * sizeof(char);
46 fseek(f, 0, SEEK_SET);
47 if (fileSize > 0) {
48 char* block = (char*)sk_malloc_throw(fileSize);
49 fread(block, 1, fileSize, f);
50 int offset = 0;
51 int frameBound = 0;
52 size_t bytesRead;
53 while (offset < fileSize) {
54 SkGPipeReader::Status s = dumpReader->playback(block + offset,
55 fileSize - offset,
56 &bytesRead, true);
57 SkASSERT(SkGPipeReader::kError_Status != s);
58 offset += bytesRead;
59 if (SkGPipeReader::kDone_Status == s) {
60 fDumper.dump(dumpCanvas,SkDumpCanvasM::kNULL_Verb,
61 "End of Frame", NULL);
62 delete dumpReader;
63 delete dumpCanvas;
64 dumpCanvas = new SkDumpCanvasM(&fDumper);
65 dumpReader = new SkGPipeReader(dumpCanvas);
66 frameBound = offset;
67 }
68 fAtomBounds.push_back(offset);
69 fFrameBounds.push_back(frameBound);
70 }
71 sk_free(block);
72 }
73
74 fclose(f);
75
76 delete dumpReader;
77 delete dumpCanvas;
78
79 fDumper.load();
80}
81
82void SkContentView::goToAtom(int atom) {
83 if (atom != fAtomsToRead) {
84 fAtomsToRead = atom;
85 this->inval(NULL);
86 }
87}
88
89void SkContentView::toggleClip() {
90 fDisplayClip = !fDisplayClip;
91 this->inval(NULL);
92}
93
94void SkContentView::onDraw(SkCanvas* canvas) {
95 canvas->drawColor(fBGColor);
96
97 SkAutoCanvasRestore acr(canvas, true);
98
99 int lastFrameBound = fFrameBounds[fAtomsToRead];
100 int toBeRead = fAtomBounds[fAtomsToRead] - lastFrameBound;
101 int firstChunk = (fAtomsToRead > 0) ? fAtomBounds[fAtomsToRead - 1] -
102 lastFrameBound: 0;
103 if (toBeRead > 0) {
104 SkDumpCanvasM* dumpCanvas = new SkDumpCanvasM(&fDumper);
105 SkGPipeReader* dumpReader = new SkGPipeReader(dumpCanvas);
106 SkGPipeReader* reader = new SkGPipeReader(canvas);
107 fDumper.disable();
108
109 FILE* f = fopen(fFilePath.c_str(), "rb");
110 SkASSERT(f != NULL);
111 fseek(f, lastFrameBound, SEEK_SET);
112 char* block = (char*)sk_malloc_throw(toBeRead);
113 fread(block, 1, toBeRead, f);
114 int offset = 0;
115 size_t bytesRead;
116 SkGPipeReader::Status s;
117 //Read the first chunk
118 if (offset < firstChunk && firstChunk < toBeRead) {
119 s = dumpReader->playback(block + offset, firstChunk - offset, NULL, false);
120 SkASSERT(SkGPipeReader::kError_Status != s);
121 s = reader->playback(block + offset, firstChunk - offset, &bytesRead, false);
122 SkASSERT(SkGPipeReader::kError_Status != s);
123 if (SkGPipeReader::kDone_Status == s){
124 delete dumpReader;
125 delete dumpCanvas;
126 dumpCanvas = new SkDumpCanvasM(&fDumper);
127 dumpReader = new SkGPipeReader(dumpCanvas);
128 delete reader;
129 reader = new SkGPipeReader(canvas);
130 }
131 offset += bytesRead;
132 }
133 SkASSERT(offset == firstChunk);
134 //Then read the current atom
135 fDumper.enable();
136 s = dumpReader->playback(block + offset, toBeRead - offset, NULL, true);
137 SkASSERT(SkGPipeReader::kError_Status != s);
138 s = reader->playback(block + offset, toBeRead - offset, &bytesRead, true);
139 SkASSERT(SkGPipeReader::kError_Status != s);
140
141 sk_free(block);
142 fclose(f);
143
144 delete reader;
145 delete dumpReader;
146 delete dumpCanvas;
147
148 if (fDisplayClip) {
149 SkPaint p;
150 p.setColor(0x440000AA);
151 SkPath path;
152 canvas->getTotalClip().getBoundaryPath(&path);
153 canvas->drawPath(path, p);
154 }
155 }
156 this->INHERITED::onDraw(canvas);
157}