diff options
Diffstat (limited to 'Build/source/libs/poppler/poppler-0.24.0/goo/JpegWriter.cc')
-rw-r--r-- | Build/source/libs/poppler/poppler-0.24.0/goo/JpegWriter.cc | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/Build/source/libs/poppler/poppler-0.24.0/goo/JpegWriter.cc b/Build/source/libs/poppler/poppler-0.24.0/goo/JpegWriter.cc new file mode 100644 index 00000000000..9b7c5051838 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.24.0/goo/JpegWriter.cc @@ -0,0 +1,184 @@ +//======================================================================== +// +// JpegWriter.cc +// +// This file is licensed under the GPLv2 or later +// +// Copyright (C) 2009 Stefan Thomas <thomas@eload24.com> +// Copyright (C) 2010, 2012 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2010 Harry Roberts <harry.roberts@midnight-labs.org> +// Copyright (C) 2011 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2013 Peter Breitenlohner <peb@mppmu.mpg.de> +// +//======================================================================== + +#include "JpegWriter.h" + +#ifdef ENABLE_LIBJPEG + +extern "C" { +#include <jpeglib.h> +} + +#include "poppler/Error.h" + +struct JpegWriterPrivate { + bool progressive; + int quality; + JpegWriter::Format format; + struct jpeg_compress_struct cinfo; + struct jpeg_error_mgr jerr; +}; + +void outputMessage(j_common_ptr cinfo) +{ + char buffer[JMSG_LENGTH_MAX]; + + // Create the message + (*cinfo->err->format_message) (cinfo, buffer); + + // Send it to poppler's error handler + error(errInternal, -1, "{0:s}", buffer); +} + +JpegWriter::JpegWriter(int q, bool p, Format formatA) +{ + priv = new JpegWriterPrivate; + priv->progressive = p; + priv->quality = q; + priv->format = formatA; +} + +JpegWriter::JpegWriter(Format formatA) +{ + priv = new JpegWriterPrivate; + priv->progressive = false; + priv->quality = -1; + priv->format = formatA; +} + +JpegWriter::~JpegWriter() +{ + // cleanup + jpeg_destroy_compress(&priv->cinfo); + delete priv; +} + +bool JpegWriter::init(FILE *f, int width, int height, int hDPI, int vDPI) +{ + // Setup error handler + priv->cinfo.err = jpeg_std_error(&priv->jerr); + priv->jerr.output_message = &outputMessage; + + // Initialize libjpeg + jpeg_create_compress(&priv->cinfo); + + // First set colorspace and call jpeg_set_defaults() since + // jpeg_set_defaults() sets default values for all fields in + // cinfo based on the colorspace. + switch (priv->format) { + case RGB: + priv->cinfo.in_color_space = JCS_RGB; + break; + case GRAY: + priv->cinfo.in_color_space = JCS_GRAYSCALE; + break; + case CMYK: + priv->cinfo.in_color_space = JCS_CMYK; + break; + default: + return false; + } + jpeg_set_defaults(&priv->cinfo); + + // Set destination file + jpeg_stdio_dest(&priv->cinfo, f); + + // Set libjpeg configuration + priv->cinfo.image_width = width; + priv->cinfo.image_height = height; + priv->cinfo.density_unit = 1; // dots per inch + priv->cinfo.X_density = hDPI; + priv->cinfo.Y_density = vDPI; + switch (priv->format) { + case GRAY: + priv->cinfo.input_components = 1; + break; + case RGB: + priv->cinfo.input_components = 3; + break; + case CMYK: + priv->cinfo.input_components = 4; + jpeg_set_colorspace(&priv->cinfo, JCS_YCCK); + priv->cinfo.write_JFIF_header = TRUE; + break; + default: + return false; + } + + // Set quality + if (priv->quality >= 0 && priv->quality <= 100) { + jpeg_set_quality(&priv->cinfo, priv->quality, TRUE); + } + + // Use progressive mode + if (priv->progressive) { + jpeg_simple_progression(&priv->cinfo); + } + + // Get ready for data + jpeg_start_compress(&priv->cinfo, TRUE); + + return true; +} + +bool JpegWriter::writePointers(unsigned char **rowPointers, int rowCount) +{ + if (priv->format == CMYK) { + for (int y = 0; y < rowCount; y++) { + unsigned char *row = rowPointers[y]; + for (unsigned int x = 0; x < priv->cinfo.image_width; x++) { + for (int n = 0; n < 4; n++) { + *row = 0xff - *row; + row++; + } + } + } + } + // Write all rows to the file + jpeg_write_scanlines(&priv->cinfo, rowPointers, rowCount); + + return true; +} + +bool JpegWriter::writeRow(unsigned char **rowPointer) +{ + if (priv->format == CMYK) { + unsigned char *row = rowPointer[0]; + for (unsigned int x = 0; x < priv->cinfo.image_width; x++) { + for (int n = 0; n < 4; n++) { + *row = 0xff - *row; + row++; + } + } + } + // Write the row to the file + jpeg_write_scanlines(&priv->cinfo, rowPointer, 1); + + return true; +} + +bool JpegWriter::close() +{ + jpeg_finish_compress(&priv->cinfo); + + return true; +} + +bool JpegWriter::supportCMYK() +{ + return priv->format == CMYK; +} + + +#endif |