aboutsummaryrefslogtreecommitdiffhomepage
path: root/experimental/CocoaDebugger/SkContentView.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'experimental/CocoaDebugger/SkContentView.cpp')
-rw-r--r--experimental/CocoaDebugger/SkContentView.cpp150
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