1 module skia.SKDocument;
2 
3 import skia.Definitions;
4 import skia.SKObject;
5 import skia.SkiaApi;
6 import skia.SKStream;
7 import skia.SKCanvas;
8 import skia.MathTypes;
9 import skia.Exceptions;
10 import skia.Definitions;
11 import skia.SKString;
12 
13 import std.datetime;
14 import std.typecons;
15 
16 class SKDocument : SKObject, ISKSkipObjectRegistration {
17 	enum float DefaultRasterDpi = 72.0f;
18 
19 	this(void* handle, bool owns) {
20 		super(handle, owns);
21 	}
22 
23 	protected override void Dispose(bool disposing) {
24 		return super.Dispose(disposing);
25 	}
26 
27 	void Abort() {
28 		SkiaApi.sk_document_abort(cast(sk_document_t*)Handle);
29 	}
30 
31 	SKCanvas BeginPage(float width, float height) {
32 		return OwnedBy(SKCanvas.GetObject(SkiaApi.sk_document_begin_page(cast(sk_document_t*)Handle,
33 				width, height, null), false), this);
34 	}
35 
36 	SKCanvas BeginPage(float width, float height, SKRect content) {
37 		return OwnedBy(SKCanvas.GetObject(SkiaApi.sk_document_begin_page(cast(sk_document_t*)Handle,
38 				width, height, &content), false), this);
39 	}
40 
41 	void EndPage() {
42 		return SkiaApi.sk_document_end_page(cast(sk_document_t*)Handle);
43 	}
44 
45 	void Close() {
46 		return SkiaApi.sk_document_close(cast(sk_document_t*)Handle);
47 	}
48 
49 	// CreateXps
50 
51 	static SKDocument CreateXps(string path) {
52 		return CreateXps(path, DefaultRasterDpi);
53 	}
54 
55 	// static SKDocument CreateXps(Stream stream) {
56 	// 	return CreateXps(stream, DefaultRasterDpi);
57 	// }
58 
59 	static SKDocument CreateXps(SKWStream stream) {
60 		return CreateXps(stream, DefaultRasterDpi);
61 	}
62 
63 	static SKDocument CreateXps(string path, float dpi) {
64 		if (path is null) {
65 			throw new ArgumentNullException(path.stringof);
66 		}
67 
68 		auto stream = SKFileWStream.OpenStream(path);
69 		return Owned(CreateXps(stream, dpi), stream);
70 	}
71 
72 	// static SKDocument CreateXps(Stream stream, float dpi) {
73 	// 	if (&stream is null) {
74 	// 		throw new ArgumentNullException(stream.stringof);
75 	// 	}
76 
77 	// 	auto managed = new SKManagedWStream(stream);
78 	// 	return Owned(CreateXps(managed, dpi), managed);
79 	// }
80 
81 	static SKDocument CreateXps(SKWStream stream, float dpi) {
82 		if (stream is null) {
83 			throw new ArgumentNullException(stream.stringof);
84 		}
85 
86 		return Referenced(GetObject(SkiaApi.sk_document_create_xps_from_stream(cast(sk_wstream_t*)stream.Handle,
87 				dpi)), stream);
88 	}
89 
90 	// CreatePdf
91 
92 	static SKDocument CreatePdf(SKWStream stream, SKDocumentPdfMetadata metadata, float dpi) {
93 		metadata.RasterDpi = dpi;
94 		return CreatePdf(stream, metadata);
95 	}
96 
97 	static SKDocument CreatePdf(string path) {
98 		if (path is null) {
99 			throw new ArgumentNullException(path.stringof);
100 		}
101 
102 		auto stream = SKFileWStream.OpenStream(path);
103 		return Owned(CreatePdf(stream), stream);
104 	}
105 
106 	// static SKDocument CreatePdf(Stream stream) {
107 	// 	if (stream is null) {
108 	// 		throw new ArgumentNullException(stream.stringof);
109 	// 	}
110 
111 	// 	auto managed = new SKManagedWStream(stream);
112 	// 	return Owned(CreatePdf(managed), managed);
113 	// }
114 
115 	static SKDocument CreatePdf(SKWStream stream) {
116 		if (stream is null) {
117 			throw new ArgumentNullException(stream.stringof);
118 		}
119 
120 		return Referenced(GetObject(SkiaApi.sk_document_create_pdf_from_stream(cast(sk_wstream_t*)stream.Handle)),
121 				stream);
122 	}
123 
124 	static SKDocument CreatePdf(string path, float dpi) {
125 		return CreatePdf(path, SKDocumentPdfMetadata(dpi));
126 	}
127 
128 	// static SKDocument CreatePdf(Stream stream, float dpi) {
129 	// 	return CreatePdf(stream, new SKDocumentPdfMetadata(dpi));
130 	// }
131 
132 	static SKDocument CreatePdf(SKWStream stream, float dpi) {
133 		return CreatePdf(stream, SKDocumentPdfMetadata(dpi));
134 	}
135 
136 	static SKDocument CreatePdf(string path, SKDocumentPdfMetadata metadata) {
137 		if (path is null) {
138 			throw new ArgumentNullException(path.stringof);
139 		}
140 
141 		auto stream = SKFileWStream.OpenStream(path);
142 		return Owned(CreatePdf(stream, metadata), stream);
143 	}
144 
145 	// static SKDocument CreatePdf(Stream stream, SKDocumentPdfMetadata metadata) {
146 	// 	if (&stream is null) {
147 	// 		throw new ArgumentNullException(stream.stringof);
148 	// 	}
149 
150 	// 	auto managed = new SKManagedWStream(stream);
151 	// 	return Owned(CreatePdf(managed, metadata), managed);
152 	// }
153 
154 	static SKDocument CreatePdf(SKWStream stream, SKDocumentPdfMetadata metadata) {
155 		if (&stream is null) {
156 			throw new ArgumentNullException(stream.stringof);
157 		}
158 
159 		auto title = SKString.Create(metadata.Title);
160 		auto author = SKString.Create(metadata.Author);
161 		auto subject = SKString.Create(metadata.Subject);
162 		auto keywords = SKString.Create(metadata.Keywords);
163 		auto creator = SKString.Create(metadata.Creator);
164 		auto producer = SKString.Create(metadata.Producer);
165 
166 		SKDocumentPdfMetadataInternal cmetadata =  SKDocumentPdfMetadataInternal();
167 		cmetadata.fTitle = cast(sk_string_t*)(title.Handle ? title.Handle : null);
168 		cmetadata.fAuthor = cast(sk_string_t*)(author.Handle ? author.Handle : null);
169 		cmetadata.fSubject = cast(sk_string_t*)(subject.Handle ? subject.Handle : null);
170 		cmetadata.fKeywords = cast(sk_string_t*)(keywords.Handle ? keywords.Handle : null);
171 		cmetadata.fCreator = cast(sk_string_t*)(creator.Handle ? creator.Handle : null);
172 		cmetadata.fProducer = cast(sk_string_t*)(producer.Handle ? producer.Handle : null);
173 		cmetadata.fRasterDPI = metadata.RasterDpi;
174 		cmetadata.fPDFA = metadata.PdfA ? cast(byte) 1 : cast(byte) 0;
175 		cmetadata.fEncodingQuality = metadata.EncodingQuality;
176 
177 
178 		Nullable!SysTime nullableCreation = metadata.Creation;
179 
180 		SKTimeDateTimeInternal creation;
181 		if (!nullableCreation.isNull) {
182 			creation = SKTimeDateTimeInternal.Create(nullableCreation.get());
183 			cmetadata.fCreation = &creation;
184 		}
185 
186 		Nullable!SysTime nullableModified = metadata.Modified;
187 
188 		SKTimeDateTimeInternal modified;
189 		if (!nullableModified.isNull) {
190 			modified = SKTimeDateTimeInternal.Create(nullableModified.get());
191 			cmetadata.fModified = &modified;
192 		}
193 
194 		return Referenced(GetObject(SkiaApi.sk_document_create_pdf_from_stream_with_metadata(cast(sk_wstream_t*)stream.Handle,
195 				&cmetadata)), stream);
196 
197 	}
198 
199 	static SKDocument GetObject(void* handle) {
200 		return handle is null ? null : new SKDocument(handle, true);
201 	}
202 
203 }