xref: /aosp_15_r20/external/skia/src/core/SkDocument.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 /*
2  * Copyright 2013 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 #include "include/core/SkDocument.h"
8 
9 #include "include/core/SkCanvas.h"
10 #include "include/core/SkRect.h"
11 #include "include/private/base/SkAssert.h"
12 
SkDocument(SkWStream * stream)13 SkDocument::SkDocument(SkWStream* stream) : fStream(stream), fState(kBetweenPages_State) {}
14 
~SkDocument()15 SkDocument::~SkDocument() {
16     this->close();
17 }
18 
trim(SkCanvas * canvas,SkScalar width,SkScalar height,const SkRect * content)19 static SkCanvas* trim(SkCanvas* canvas, SkScalar width, SkScalar height,
20                       const SkRect* content) {
21     if (content && canvas) {
22         SkRect inner = *content;
23         if (!inner.intersect({0, 0, width, height})) {
24             return nullptr;
25         }
26         canvas->clipRect(inner);
27         canvas->translate(inner.x(), inner.y());
28     }
29     return canvas;
30 }
31 
beginPage(SkScalar width,SkScalar height,const SkRect * content)32 SkCanvas* SkDocument::beginPage(SkScalar width, SkScalar height,
33                                 const SkRect* content) {
34     if (width <= 0 || height <= 0 || kClosed_State == fState) {
35         return nullptr;
36     }
37     if (kInPage_State == fState) {
38         this->endPage();
39     }
40     SkASSERT(kBetweenPages_State == fState);
41     fState = kInPage_State;
42     return trim(this->onBeginPage(width, height), width, height, content);
43 }
44 
endPage()45 void SkDocument::endPage() {
46     if (kInPage_State == fState) {
47         fState = kBetweenPages_State;
48         this->onEndPage();
49     }
50 }
51 
close()52 void SkDocument::close() {
53     for (;;) {
54         switch (fState) {
55             case kBetweenPages_State: {
56                 fState = kClosed_State;
57                 this->onClose(fStream);
58                 // we don't own the stream, but we mark it nullptr since we can
59                 // no longer write to it.
60                 fStream = nullptr;
61                 return;
62             }
63             case kInPage_State:
64                 this->endPage();
65                 break;
66             case kClosed_State:
67                 return;
68         }
69     }
70 }
71 
abort()72 void SkDocument::abort() {
73     this->onAbort();
74 
75     fState = kClosed_State;
76     // we don't own the stream, but we mark it nullptr since we can
77     // no longer write to it.
78     fStream = nullptr;
79 }
80