/* * 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; }