зеркало из https://github.com/mozilla/moz-skia.git
150 строки
4.8 KiB
C++
150 строки
4.8 KiB
C++
#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);
|
|
} |