summaryrefslogtreecommitdiff
path: root/Build/source/libs/poppler/poppler-0.31.0/goo/TiffWriter.cc
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/poppler/poppler-0.31.0/goo/TiffWriter.cc')
-rw-r--r--Build/source/libs/poppler/poppler-0.31.0/goo/TiffWriter.cc236
1 files changed, 236 insertions, 0 deletions
diff --git a/Build/source/libs/poppler/poppler-0.31.0/goo/TiffWriter.cc b/Build/source/libs/poppler/poppler-0.31.0/goo/TiffWriter.cc
new file mode 100644
index 00000000000..316008778b1
--- /dev/null
+++ b/Build/source/libs/poppler/poppler-0.31.0/goo/TiffWriter.cc
@@ -0,0 +1,236 @@
+//========================================================================
+//
+// TiffWriter.cc
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright (C) 2010, 2012 William Bader <williambader@hotmail.com>
+// Copyright (C) 2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2012 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2012 Pino Toscano <pino@kde.org>
+// Copyright (C) 2014 Steven Lee <roc.sky@gmail.com>
+//
+//========================================================================
+
+#include "TiffWriter.h"
+
+#if ENABLE_LIBTIFF
+
+#include <string.h>
+
+#ifdef _WIN32
+#include <io.h>
+#endif
+
+extern "C" {
+#include <tiffio.h>
+}
+
+struct TiffWriterPrivate {
+ TIFF *f; // LibTiff file context
+ int numRows; // number of rows in the image
+ int curRow; // number of rows written
+ const char *compressionString; // compression type
+ TiffWriter::Format format; // format of image data
+};
+
+TiffWriter::~TiffWriter()
+{
+ delete priv;
+}
+
+TiffWriter::TiffWriter(Format formatA)
+{
+ priv = new TiffWriterPrivate;
+ priv->f = NULL;
+ priv->numRows = 0;
+ priv->curRow = 0;
+ priv->compressionString = NULL;
+ priv->format = formatA;
+}
+
+// Set the compression type
+
+void TiffWriter::setCompressionString(const char *compressionStringArg)
+{
+ priv->compressionString = compressionStringArg;
+}
+
+// Write a TIFF file.
+
+bool TiffWriter::init(FILE *openedFile, int width, int height, int hDPI, int vDPI)
+{
+ unsigned int compression;
+ uint16 photometric = 0;
+ uint32 rowsperstrip = (uint32) -1;
+ int bitspersample;
+ uint16 samplesperpixel = 0;
+ const struct compression_name_tag {
+ const char *compressionName; // name of the compression option from the command line
+ unsigned int compressionCode; // internal libtiff code
+ const char *compressionDescription; // descriptive name
+ } compressionList[] = {
+ { "none", COMPRESSION_NONE, "no compression" },
+ { "ccittrle", COMPRESSION_CCITTRLE, "CCITT modified Huffman RLE" },
+ { "ccittfax3", COMPRESSION_CCITTFAX3,"CCITT Group 3 fax encoding" },
+ { "ccittt4", COMPRESSION_CCITT_T4, "CCITT T.4 (TIFF 6 name)" },
+ { "ccittfax4", COMPRESSION_CCITTFAX4, "CCITT Group 4 fax encoding" },
+ { "ccittt6", COMPRESSION_CCITT_T6, "CCITT T.6 (TIFF 6 name)" },
+ { "lzw", COMPRESSION_LZW, "Lempel-Ziv & Welch" },
+ { "ojpeg", COMPRESSION_OJPEG, "!6.0 JPEG" },
+ { "jpeg", COMPRESSION_JPEG, "%JPEG DCT compression" },
+ { "next", COMPRESSION_NEXT, "NeXT 2-bit RLE" },
+ { "packbits", COMPRESSION_PACKBITS, "Macintosh RLE" },
+ { "ccittrlew", COMPRESSION_CCITTRLEW, "CCITT modified Huffman RLE w/ word alignment" },
+ { "deflate", COMPRESSION_DEFLATE, "Deflate compression" },
+ { "adeflate", COMPRESSION_ADOBE_DEFLATE, "Deflate compression, as recognized by Adobe" },
+ { "dcs", COMPRESSION_DCS, "Kodak DCS encoding" },
+ { "jbig", COMPRESSION_JBIG, "ISO JBIG" },
+ { "jp2000", COMPRESSION_JP2000, "Leadtools JPEG2000" },
+ { NULL, 0, NULL }
+ };
+
+ // Initialize
+
+ priv->f = NULL;
+ priv->curRow = 0;
+
+ // Store the number of rows
+
+ priv->numRows = height;
+
+ // Set the compression
+
+ compression = COMPRESSION_NONE;
+
+ if (priv->compressionString == NULL || strcmp(priv->compressionString, "") == 0) {
+ compression = COMPRESSION_NONE;
+ } else {
+ int i;
+ for (i = 0; compressionList[i].compressionName != NULL; i++) {
+ if (strcmp(priv->compressionString, compressionList[i].compressionName) == 0) {
+ compression = compressionList[i].compressionCode;
+ break;
+ }
+ }
+ if (compressionList[i].compressionName == NULL) {
+ fprintf(stderr, "TiffWriter: Unknown compression type '%.10s', using 'none'.\n", priv->compressionString);
+ fprintf(stderr, "Known compression types (the tiff library might not support every type)\n");
+ for (i = 0; compressionList[i].compressionName != NULL; i++) {
+ fprintf(stderr, "%10s %s\n", compressionList[i].compressionName, compressionList[i].compressionDescription);
+ }
+ }
+ }
+
+ // Set bits per sample, samples per pixel, and photometric type from format
+
+ bitspersample = (priv->format == MONOCHROME ? 1 : 8);
+
+ switch (priv->format) {
+ case MONOCHROME:
+ case GRAY:
+ samplesperpixel = 1;
+ photometric = PHOTOMETRIC_MINISBLACK;
+ break;
+
+ case RGB:
+ samplesperpixel = 3;
+ photometric = PHOTOMETRIC_RGB;
+ break;
+
+ case RGBA_PREMULTIPLIED:
+ samplesperpixel = 4;
+ photometric = PHOTOMETRIC_RGB;
+ break;
+
+ case CMYK:
+ samplesperpixel = 4;
+ photometric = PHOTOMETRIC_SEPARATED;
+ break;
+ }
+
+ // Open the file
+
+ if (openedFile == NULL) {
+ fprintf(stderr, "TiffWriter: No output file given.\n");
+ return false;
+ }
+
+#ifdef _WIN32
+ //Convert C Library handle to Win32 Handle
+ priv->f = TIFFFdOpen(_get_osfhandle(fileno(openedFile)), "-", "w");
+#else
+ priv->f = TIFFFdOpen(fileno(openedFile), "-", "w");
+#endif
+
+
+ if (!priv->f) {
+ return false;
+ }
+
+ // Set TIFF tags
+
+ TIFFSetField(priv->f, TIFFTAG_IMAGEWIDTH, width);
+ TIFFSetField(priv->f, TIFFTAG_IMAGELENGTH, height);
+ TIFFSetField(priv->f, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
+ TIFFSetField(priv->f, TIFFTAG_SAMPLESPERPIXEL, samplesperpixel);
+ TIFFSetField(priv->f, TIFFTAG_BITSPERSAMPLE, bitspersample);
+ TIFFSetField(priv->f, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
+ TIFFSetField(priv->f, TIFFTAG_PHOTOMETRIC, photometric);
+ TIFFSetField(priv->f, TIFFTAG_COMPRESSION, (uint16) compression);
+ TIFFSetField(priv->f, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(priv->f, rowsperstrip));
+ TIFFSetField(priv->f, TIFFTAG_XRESOLUTION, (double) hDPI);
+ TIFFSetField(priv->f, TIFFTAG_YRESOLUTION, (double) vDPI);
+ TIFFSetField(priv->f, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH);
+
+ if (priv->format == RGBA_PREMULTIPLIED) {
+ uint16 extra = EXTRASAMPLE_ASSOCALPHA;
+ TIFFSetField(priv->f, TIFFTAG_EXTRASAMPLES, 1, &extra);
+ }
+
+ if (priv->format == CMYK) {
+ TIFFSetField(priv->f, TIFFTAG_INKSET, INKSET_CMYK);
+ TIFFSetField(priv->f, TIFFTAG_NUMBEROFINKS, 4);
+ }
+
+ return true;
+}
+
+bool TiffWriter::writePointers(unsigned char **rowPointers, int rowCount)
+{
+ // Write all rows to the file
+
+ for (int row = 0; row < rowCount; row++) {
+ if (TIFFWriteScanline(priv->f, rowPointers[row], row, 0) < 0) {
+ fprintf(stderr, "TiffWriter: Error writing tiff row %d\n", row);
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool TiffWriter::writeRow(unsigned char **rowData)
+{
+ // Add a single row
+
+ if (TIFFWriteScanline(priv->f, *rowData, priv->curRow, 0) < 0) {
+ fprintf(stderr, "TiffWriter: Error writing tiff row %d\n", priv->curRow);
+ return false;
+ }
+
+ priv->curRow++;
+
+ return true;
+}
+
+bool TiffWriter::close()
+{
+ // Close the file
+
+ TIFFClose(priv->f);
+
+ return true;
+}
+
+#endif