| #include "SkDebuggerViews.h" |
| #include <stdio.h> |
| |
| SkContentView::SkContentView(SkEventSinkID clID, SkEventSinkID ipID) : |
| fDumper(this->getSinkID(), clID, ipID) { |
| fBGColor = 0xFFDDDDDD; |
| fAtomsToRead = 0; |
| fDisplayClip = false; |
| } |
| |
| SkContentView::~SkContentView() { |
| fAtomBounds.clear(); |
| fFrameBounds.clear(); |
| } |
| |
| void SkContentView::reinit(const char* filename) { |
| fFilePath.set(filename); |
| fAtomsToRead = 0; |
| this->init(); |
| } |
| |
| bool SkContentView::onEvent(const SkEvent& evt) { |
| return this->INHERITED::onEvent(evt); |
| } |
| |
| //Read file atom by atom and record attom bounds |
| void SkContentView::init() { |
| fDumper.unload(); |
| fAtomBounds.clear(); |
| fFrameBounds.clear(); |
| |
| SkDumpCanvasM* dumpCanvas = new SkDumpCanvasM(&fDumper); |
| SkGPipeReader* dumpReader = new SkGPipeReader(dumpCanvas); |
| |
| FILE* f = fopen(fFilePath.c_str(), "rb"); |
| SkASSERT(f != NULL); |
| fseek(f, 0, SEEK_END); |
| int fileSize = ftell(f) * sizeof(char); |
| fseek(f, 0, SEEK_SET); |
| if (fileSize > 0) { |
| char* block = (char*)sk_malloc_throw(fileSize); |
| fread(block, 1, fileSize, f); |
| int offset = 0; |
| int frameBound = 0; |
| size_t bytesRead; |
| while (offset < fileSize) { |
| SkGPipeReader::Status s = dumpReader->playback(block + offset, |
| fileSize - offset, |
| &bytesRead, true); |
| SkASSERT(SkGPipeReader::kError_Status != s); |
| offset += bytesRead; |
| if (SkGPipeReader::kDone_Status == s) { |
| fDumper.dump(dumpCanvas,SkDumpCanvasM::kNULL_Verb, |
| "End of Frame", NULL); |
| delete dumpReader; |
| delete dumpCanvas; |
| dumpCanvas = new SkDumpCanvasM(&fDumper); |
| dumpReader = new SkGPipeReader(dumpCanvas); |
| frameBound = offset; |
| } |
| fAtomBounds.push_back(offset); |
| fFrameBounds.push_back(frameBound); |
| } |
| sk_free(block); |
| } |
| |
| fclose(f); |
| |
| delete dumpReader; |
| delete dumpCanvas; |
| |
| fDumper.load(); |
| } |
| |
| void SkContentView::goToAtom(int atom) { |
| if (atom != fAtomsToRead) { |
| fAtomsToRead = atom; |
| this->inval(NULL); |
| } |
| } |
| |
| void SkContentView::toggleClip() { |
| fDisplayClip = !fDisplayClip; |
| this->inval(NULL); |
| } |
| |
| void SkContentView::onDraw(SkCanvas* canvas) { |
| canvas->drawColor(fBGColor); |
| |
| SkAutoCanvasRestore acr(canvas, true); |
| |
| int lastFrameBound = fFrameBounds[fAtomsToRead]; |
| int toBeRead = fAtomBounds[fAtomsToRead] - lastFrameBound; |
| int firstChunk = (fAtomsToRead > 0) ? fAtomBounds[fAtomsToRead - 1] - |
| lastFrameBound: 0; |
| if (toBeRead > 0) { |
| SkDumpCanvasM* dumpCanvas = new SkDumpCanvasM(&fDumper); |
| SkGPipeReader* dumpReader = new SkGPipeReader(dumpCanvas); |
| SkGPipeReader* reader = new SkGPipeReader(canvas); |
| fDumper.disable(); |
| |
| FILE* f = fopen(fFilePath.c_str(), "rb"); |
| SkASSERT(f != NULL); |
| fseek(f, lastFrameBound, SEEK_SET); |
| char* block = (char*)sk_malloc_throw(toBeRead); |
| fread(block, 1, toBeRead, f); |
| int offset = 0; |
| size_t bytesRead; |
| SkGPipeReader::Status s; |
| //Read the first chunk |
| if (offset < firstChunk && firstChunk < toBeRead) { |
| s = dumpReader->playback(block + offset, firstChunk - offset, NULL, false); |
| SkASSERT(SkGPipeReader::kError_Status != s); |
| s = reader->playback(block + offset, firstChunk - offset, &bytesRead, false); |
| SkASSERT(SkGPipeReader::kError_Status != s); |
| if (SkGPipeReader::kDone_Status == s){ |
| delete dumpReader; |
| delete dumpCanvas; |
| dumpCanvas = new SkDumpCanvasM(&fDumper); |
| dumpReader = new SkGPipeReader(dumpCanvas); |
| delete reader; |
| reader = new SkGPipeReader(canvas); |
| } |
| offset += bytesRead; |
| } |
| SkASSERT(offset == firstChunk); |
| //Then read the current atom |
| fDumper.enable(); |
| s = dumpReader->playback(block + offset, toBeRead - offset, NULL, true); |
| SkASSERT(SkGPipeReader::kError_Status != s); |
| s = reader->playback(block + offset, toBeRead - offset, &bytesRead, true); |
| SkASSERT(SkGPipeReader::kError_Status != s); |
| |
| sk_free(block); |
| fclose(f); |
| |
| delete reader; |
| delete dumpReader; |
| delete dumpCanvas; |
| |
| if (fDisplayClip) { |
| SkPaint p; |
| p.setColor(0x440000AA); |
| SkPath path; |
| canvas->getTotalClip().getBoundaryPath(&path); |
| canvas->drawPath(path, p); |
| } |
| } |
| this->INHERITED::onDraw(canvas); |
| } |