Chromium Code Reviews| Index: src/doc/SkDocument.cpp |
| diff --git a/src/doc/SkDocument.cpp b/src/doc/SkDocument.cpp |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..4298b3f595c8c3ee45c3ed5b64c2cbfbb1deec26 |
| --- /dev/null |
| +++ b/src/doc/SkDocument.cpp |
| @@ -0,0 +1,83 @@ |
| +/* |
| + * 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*)) { |
| + 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; |
| + } |
| + } |
| + SkASSERT(!"never get here"); |
| + return NULL; |
| +} |
| + |
| +void SkDocument::endPage() { |
|
wrong vandebo
2013/06/10 16:41:12
It seems like this method isn't strictly needed an
|
| + if (kInPage_State == fState) { |
| + fState = kBetweenPages_State; |
| + this->onEndPage(); |
| + } |
| +} |
| + |
| +void SkDocument::close() { |
| + for (;;) { |
| + switch (fState) { |
| + case kBetweenPages_State: |
| + fState = kClosed_State; |
| + this->onClose(fStream); |
| + |
| + if (fDoneProc) { |
| + fDoneProc(fStream); |
| + } |
| + // we don't own the stream, but we mark it NULL since we can |
| + // no longer write to it. |
| + fStream = NULL; |
| + return; |
| + case kInPage_State: |
| + this->endPage(); |
| + break; |
| + case kClosed_State: |
| + return; |
| + } |
| + } |
| +} |
| + |