108 строки
2.2 KiB
C++
108 строки
2.2 KiB
C++
//========================================================================
|
|
//
|
|
// JpegWriter.cc
|
|
//
|
|
// This file is licensed under the GPLv2 or later
|
|
//
|
|
// Copyright (C) 2009 Stefan Thomas <thomas@eload24.com>
|
|
// Copyright (C) 2010 Adrian Johnson <ajohnson@redneon.com>
|
|
// Copyright (C) 2010 Harry Roberts <harry.roberts@midnight-labs.org>
|
|
//
|
|
//========================================================================
|
|
|
|
#include "JpegWriter.h"
|
|
|
|
#ifdef ENABLE_LIBJPEG
|
|
|
|
#include "poppler/Error.h"
|
|
|
|
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(-1, "%s", buffer);
|
|
}
|
|
|
|
JpegWriter::JpegWriter(int q, bool p)
|
|
: progressive(p), quality(q)
|
|
{
|
|
}
|
|
|
|
JpegWriter::JpegWriter()
|
|
: progressive(false), quality(-1)
|
|
{
|
|
}
|
|
|
|
JpegWriter::~JpegWriter()
|
|
{
|
|
// cleanup
|
|
jpeg_destroy_compress(&cinfo);
|
|
}
|
|
|
|
bool JpegWriter::init(FILE *f, int width, int height, int hDPI, int vDPI)
|
|
{
|
|
// Setup error handler
|
|
cinfo.err = jpeg_std_error(&jerr);
|
|
jerr.output_message = &outputMessage;
|
|
|
|
// Initialize libjpeg
|
|
jpeg_create_compress(&cinfo);
|
|
|
|
// Set destination file
|
|
jpeg_stdio_dest(&cinfo, f);
|
|
|
|
// Set libjpeg configuration
|
|
cinfo.image_width = width;
|
|
cinfo.image_height = height;
|
|
cinfo.density_unit = 1; // dots per inch
|
|
cinfo.X_density = hDPI;
|
|
cinfo.Y_density = vDPI;
|
|
cinfo.input_components = 3; /* # of color components per pixel */
|
|
cinfo.in_color_space = JCS_RGB; /* colorspace of input image */
|
|
jpeg_set_defaults(&cinfo);
|
|
|
|
// Set quality
|
|
if( quality >= 0 && quality <= 100 ) {
|
|
jpeg_set_quality(&cinfo, quality, true);
|
|
}
|
|
|
|
// Use progressive mode
|
|
if( progressive) {
|
|
jpeg_simple_progression(&cinfo);
|
|
}
|
|
|
|
// Get ready for data
|
|
jpeg_start_compress(&cinfo, TRUE);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool JpegWriter::writePointers(unsigned char **rowPointers, int rowCount)
|
|
{
|
|
// Write all rows to the file
|
|
jpeg_write_scanlines(&cinfo, rowPointers, rowCount);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool JpegWriter::writeRow(unsigned char **row)
|
|
{
|
|
// Write the row to the file
|
|
jpeg_write_scanlines(&cinfo, row, 1);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool JpegWriter::close()
|
|
{
|
|
jpeg_finish_compress(&cinfo);
|
|
|
|
return true;
|
|
}
|
|
|
|
#endif
|