diff -r 000000000000 -r 6474c204b198 gfx/skia/trunk/src/doc/SkDocument.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/skia/trunk/src/doc/SkDocument.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,95 @@ +/* + * Copyright 2013 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "SkDocument.h" +#include "SkStream.h" + +SkDocument::SkDocument(SkWStream* stream, void (*doneProc)(SkWStream*, bool)) { + fStream = stream; // we do not own this object. + fDoneProc = doneProc; + fState = kBetweenPages_State; +} + +SkDocument::~SkDocument() { + this->close(); +} + +SkCanvas* SkDocument::beginPage(SkScalar width, SkScalar height, + const SkRect* content) { + if (width <= 0 || height <= 0) { + return NULL; + } + + SkRect outer = SkRect::MakeWH(width, height); + SkRect inner; + if (content) { + inner = *content; + if (!inner.intersect(outer)) { + return NULL; + } + } else { + inner = outer; + } + + for (;;) { + switch (fState) { + case kBetweenPages_State: + fState = kInPage_State; + return this->onBeginPage(width, height, inner); + case kInPage_State: + this->endPage(); + break; + case kClosed_State: + return NULL; + } + } + SkDEBUGFAIL("never get here"); + return NULL; +} + +void SkDocument::endPage() { + if (kInPage_State == fState) { + fState = kBetweenPages_State; + this->onEndPage(); + } +} + +bool SkDocument::close() { + for (;;) { + switch (fState) { + case kBetweenPages_State: { + fState = kClosed_State; + bool success = this->onClose(fStream); + + if (fDoneProc) { + fDoneProc(fStream, false); + } + // we don't own the stream, but we mark it NULL since we can + // no longer write to it. + fStream = NULL; + return success; + } + case kInPage_State: + this->endPage(); + break; + case kClosed_State: + return false; + } + } +} + +void SkDocument::abort() { + this->onAbort(); + + fState = kClosed_State; + if (fDoneProc) { + fDoneProc(fStream, true); + } + // we don't own the stream, but we mark it NULL since we can + // no longer write to it. + fStream = NULL; +}