123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- /*
- * 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 "include/core/SkCanvas.h"
- #include "include/core/SkDocument.h"
- #include "include/core/SkStream.h"
- SkDocument::SkDocument(SkWStream* stream) : fStream(stream), fState(kBetweenPages_State) {}
- SkDocument::~SkDocument() {
- this->close();
- }
- static SkCanvas* trim(SkCanvas* canvas, SkScalar width, SkScalar height,
- const SkRect* content) {
- if (content && canvas) {
- SkRect inner = *content;
- if (!inner.intersect({0, 0, width, height})) {
- return nullptr;
- }
- canvas->clipRect(inner);
- canvas->translate(inner.x(), inner.y());
- }
- return canvas;
- }
- SkCanvas* SkDocument::beginPage(SkScalar width, SkScalar height,
- const SkRect* content) {
- if (width <= 0 || height <= 0 || kClosed_State == fState) {
- return nullptr;
- }
- if (kInPage_State == fState) {
- this->endPage();
- }
- SkASSERT(kBetweenPages_State == fState);
- fState = kInPage_State;
- return trim(this->onBeginPage(width, height), width, height, content);
- }
- void SkDocument::endPage() {
- if (kInPage_State == fState) {
- fState = kBetweenPages_State;
- this->onEndPage();
- }
- }
- void SkDocument::close() {
- for (;;) {
- switch (fState) {
- case kBetweenPages_State: {
- fState = kClosed_State;
- this->onClose(fStream);
- // we don't own the stream, but we mark it nullptr since we can
- // no longer write to it.
- fStream = nullptr;
- return;
- }
- case kInPage_State:
- this->endPage();
- break;
- case kClosed_State:
- return;
- }
- }
- }
- void SkDocument::abort() {
- this->onAbort();
- fState = kClosed_State;
- // we don't own the stream, but we mark it nullptr since we can
- // no longer write to it.
- fStream = nullptr;
- }
|