| 40 | |
| 41 | template <typename T> |
| 42 | void EmitImageStream(PDFDocumentImpl* doc, PDFIndirectReference ref, T writeStream, ISize size, |
| 43 | PDFUnion&& colorSpace, PDFIndirectReference sMask, int length, |
| 44 | PDFStreamFormat format) { |
| 45 | auto pdfDict = PDFDictionary::Make("XObject"); |
| 46 | pdfDict->insertName("Subtype", "Image"); |
| 47 | pdfDict->insertInt("Width", size.width); |
| 48 | pdfDict->insertInt("Height", size.height); |
| 49 | pdfDict->insertUnion("ColorSpace", std::move(colorSpace)); |
| 50 | if (sMask) { |
| 51 | pdfDict->insertRef("SMask", sMask); |
| 52 | } |
| 53 | pdfDict->insertInt("BitsPerComponent", 8); |
| 54 | |
| 55 | switch (format) { |
| 56 | case PDFStreamFormat::DCT: |
| 57 | pdfDict->insertName("Filter", "DCTDecode"); |
| 58 | break; |
| 59 | case PDFStreamFormat::Flate: |
| 60 | pdfDict->insertName("Filter", "FlateDecode"); |
| 61 | break; |
| 62 | case PDFStreamFormat::Uncompressed: |
| 63 | break; |
| 64 | } |
| 65 | |
| 66 | if (format == PDFStreamFormat::DCT) { |
| 67 | pdfDict->insertInt("ColorTransform", 0); |
| 68 | } |
| 69 | pdfDict->insertInt("Length", length); |
| 70 | doc->emitStream(*pdfDict, std::move(writeStream), ref); |
| 71 | } |
| 72 | |
| 73 | void FillStream(WriteStream* out, char value, size_t n) { |
| 74 | char buffer[4096]; |
no test coverage detected