diff options
Diffstat (limited to 'experimental/CocoaDebugger/SkContentView.cpp')
-rw-r--r-- | experimental/CocoaDebugger/SkContentView.cpp | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/experimental/CocoaDebugger/SkContentView.cpp b/experimental/CocoaDebugger/SkContentView.cpp new file mode 100644 index 0000000000..0c3351f710 --- /dev/null +++ b/experimental/CocoaDebugger/SkContentView.cpp @@ -0,0 +1,150 @@ +#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); +}
\ No newline at end of file |