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 }