OLD | NEW |
| (Empty) |
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 | |
8 #include "SkDocument.h" | |
9 #include "SkStream.h" | |
10 | |
11 SkDocument::SkDocument(SkWStream* stream, void (*doneProc)(SkWStream*, bool)) { | |
12 fStream = stream; // we do not own this object. | |
13 fDoneProc = doneProc; | |
14 fState = kBetweenPages_State; | |
15 } | |
16 | |
17 SkDocument::~SkDocument() { | |
18 this->close(); | |
19 } | |
20 | |
21 SkCanvas* SkDocument::beginPage(SkScalar width, SkScalar height, | |
22 const SkRect* content) { | |
23 if (width <= 0 || height <= 0) { | |
24 return nullptr; | |
25 } | |
26 | |
27 SkRect outer = SkRect::MakeWH(width, height); | |
28 SkRect inner; | |
29 if (content) { | |
30 inner = *content; | |
31 if (!inner.intersect(outer)) { | |
32 return nullptr; | |
33 } | |
34 } else { | |
35 inner = outer; | |
36 } | |
37 | |
38 for (;;) { | |
39 switch (fState) { | |
40 case kBetweenPages_State: | |
41 fState = kInPage_State; | |
42 return this->onBeginPage(width, height, inner); | |
43 case kInPage_State: | |
44 this->endPage(); | |
45 break; | |
46 case kClosed_State: | |
47 return nullptr; | |
48 } | |
49 } | |
50 SkDEBUGFAIL("never get here"); | |
51 return nullptr; | |
52 } | |
53 | |
54 void SkDocument::endPage() { | |
55 if (kInPage_State == fState) { | |
56 fState = kBetweenPages_State; | |
57 this->onEndPage(); | |
58 } | |
59 } | |
60 | |
61 bool SkDocument::close() { | |
62 for (;;) { | |
63 switch (fState) { | |
64 case kBetweenPages_State: { | |
65 fState = kClosed_State; | |
66 bool success = this->onClose(fStream); | |
67 | |
68 if (fDoneProc) { | |
69 fDoneProc(fStream, false); | |
70 } | |
71 // we don't own the stream, but we mark it nullptr since we can | |
72 // no longer write to it. | |
73 fStream = nullptr; | |
74 return success; | |
75 } | |
76 case kInPage_State: | |
77 this->endPage(); | |
78 break; | |
79 case kClosed_State: | |
80 return false; | |
81 } | |
82 } | |
83 } | |
84 | |
85 void SkDocument::abort() { | |
86 this->onAbort(); | |
87 | |
88 fState = kClosed_State; | |
89 if (fDoneProc) { | |
90 fDoneProc(fStream, true); | |
91 } | |
92 // we don't own the stream, but we mark it nullptr since we can | |
93 // no longer write to it. | |
94 fStream = nullptr; | |
95 } | |
OLD | NEW |