[poppler] goo/JpegWriter.cc goo/JpegWriter.h splash/SplashBitmap.cc splash/SplashBitmap.h utils/pdftocairo.1 utils/pdftocairo.cc utils/pdftoppm.1 utils/pdftoppm.cc
Albert Astals Cid
aacid at kemper.freedesktop.org
Fri Jul 20 21:43:03 UTC 2018
goo/JpegWriter.cc | 12 ++++++++++++
goo/JpegWriter.h | 2 ++
splash/SplashBitmap.cc | 2 ++
splash/SplashBitmap.h | 2 ++
utils/pdftocairo.1 | 6 ++++++
utils/pdftocairo.cc | 11 +++++++++++
utils/pdftoppm.1 | 6 ++++++
utils/pdftoppm.cc | 11 +++++++++++
8 files changed, 52 insertions(+)
New commits:
commit 0b4ad184b479e24b13b0453b89859b75b699b131
Author: Martin Packman <gzlist at googlemail.com>
Date: Fri Jul 20 23:34:37 2018 +0200
Add -jpegopt optimize option support to utils
New option 'optimize=y' for utils that take a -jpegopt param,
pdftocairo and pdftoppm. This corresponds to the cjpeg -optimize
flag, and slightly reduces the size of the output jpeg but uses
additional cpu and memory.
New jpegOptimize boolean in splash/SplashBitmap WriteImgParams.
New setOptimize method on goo/JpegWriter taking a boolean.
Update manpages for new option.
diff --git a/goo/JpegWriter.cc b/goo/JpegWriter.cc
index 37c15c2a..ff15fce5 100644
--- a/goo/JpegWriter.cc
+++ b/goo/JpegWriter.cc
@@ -10,6 +10,7 @@
// Copyright (C) 2011 Thomas Freitag <Thomas.Freitag at alfa.de>
// Copyright (C) 2013 Peter Breitenlohner <peb at mppmu.mpg.de>
// Copyright (C) 2017 Albert Astals Cid <aacid at kde.org>
+// Copyright (C) 2018 Martin Packman <gzlist at googlemail.com>
//
//========================================================================
@@ -25,6 +26,7 @@ extern "C" {
struct JpegWriterPrivate {
bool progressive;
+ bool optimize;
int quality;
JpegWriter::Format format;
struct jpeg_compress_struct cinfo;
@@ -46,6 +48,7 @@ JpegWriter::JpegWriter(int q, bool p, Format formatA)
{
priv = new JpegWriterPrivate;
priv->progressive = p;
+ priv->optimize = false;
priv->quality = q;
priv->format = formatA;
}
@@ -54,6 +57,7 @@ JpegWriter::JpegWriter(Format formatA)
{
priv = new JpegWriterPrivate;
priv->progressive = false;
+ priv->optimize = false;
priv->quality = -1;
priv->format = formatA;
}
@@ -75,6 +79,11 @@ void JpegWriter::setProgressive(bool progressive)
priv->progressive = progressive;
}
+void JpegWriter::setOptimize(bool optimize)
+{
+ priv->optimize = optimize;
+}
+
bool JpegWriter::init(FILE *f, int width, int height, int hDPI, int vDPI)
{
// Setup error handler
@@ -137,6 +146,9 @@ bool JpegWriter::init(FILE *f, int width, int height, int hDPI, int vDPI)
jpeg_simple_progression(&priv->cinfo);
}
+ // Set whether to compute optimal Huffman coding tables
+ priv->cinfo.optimize_coding = priv->optimize;
+
// Get ready for data
jpeg_start_compress(&priv->cinfo, TRUE);
diff --git a/goo/JpegWriter.h b/goo/JpegWriter.h
index 9a68bcc9..40de0ec2 100644
--- a/goo/JpegWriter.h
+++ b/goo/JpegWriter.h
@@ -11,6 +11,7 @@
// Copyright (C) 2010 Brian Cameron <brian.cameron at oracle.com>
// Copyright (C) 2011 Albert Astals Cid <aacid at kde.org>
// Copyright (C) 2011 Thomas Freitag <Thomas.Freitag at alfa.de>
+// Copyright (C) 2018 Martin Packman <gzlist at googlemail.com>
//
//========================================================================
@@ -41,6 +42,7 @@ public:
void setQuality(int quality);
void setProgressive(bool progressive);
+ void setOptimize(bool optimize);
bool init(FILE *f, int width, int height, int hDPI, int vDPI) override;
bool writePointers(unsigned char **rowPointers, int rowCount) override;
diff --git a/splash/SplashBitmap.cc b/splash/SplashBitmap.cc
index 2bec9f93..cc4b6155 100644
--- a/splash/SplashBitmap.cc
+++ b/splash/SplashBitmap.cc
@@ -23,6 +23,7 @@
// Copyright (C) 2012 Anthony Wesley <awesley at smartnetworks.com.au>
// Copyright (C) 2015 Adam Reichold <adamreichold at myopera.com>
// Copyright (C) 2016 Kenji Uno <ku at digitaldolphins.jp>
+// Copyright (C) 2018 Martin Packman <gzlist at googlemail.com>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -356,6 +357,7 @@ void SplashBitmap::setJpegParams(ImgWriter *writer, WriteImgParams* params)
#ifdef ENABLE_LIBJPEG
if (params) {
static_cast<JpegWriter*>(writer)->setProgressive(params->jpegProgressive);
+ static_cast<JpegWriter*>(writer)->setOptimize(params->jpegOptimize);
if (params->jpegQuality >= 0)
static_cast<JpegWriter*>(writer)->setQuality(params->jpegQuality);
}
diff --git a/splash/SplashBitmap.h b/splash/SplashBitmap.h
index 092bd4cf..01c972c3 100644
--- a/splash/SplashBitmap.h
+++ b/splash/SplashBitmap.h
@@ -22,6 +22,7 @@
// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag at alfa.de>
// Copyright (C) 2015 Adam Reichold <adamreichold at myopera.com>
// Copyright (C) 2016 Kenji Uno <ku at digitaldolphins.jp>
+// Copyright (C) 2018 Martin Packman <gzlist at googlemail.com>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -81,6 +82,7 @@ public:
int jpegQuality = -1;
GBool jpegProgressive = gFalse;
GooString tiffCompression;
+ GBool jpegOptimize = gFalse;
};
SplashError writeImgFile(SplashImageFileFormat format, char *fileName, int hDPI, int vDPI, WriteImgParams* params = nullptr);
diff --git a/utils/pdftocairo.1 b/utils/pdftocairo.1
index 3a60b73e..8de23925 100644
--- a/utils/pdftocairo.1
+++ b/utils/pdftocairo.1
@@ -310,6 +310,12 @@ Selects the JPEG quality value. The value must be an integer between 0 and 100.
.BI progressive
Select progressive JPEG output. The possible values are "y", "n",
indicating progressive (yes) or non-progressive (no), respectively.
+.TP
+.BI optimize
+Sets whether to compute optimal Huffman coding tables for the JPEG output, which
+will create smaller files but make an extra pass over the data. The value must
+be "y" or "n", with "y" performing optimization, otherwise the default Huffman
+tables are used.
.SH WINDOWS PRINTER OPTIONS
In Windows, you can use the \-print option to print directly to a system printer. Additionally, you can use the \-printopt
option to configure the printer. It takes a string of the form "<opt>=<val>[,<opt>=<val>]". Currently the available options are:
diff --git a/utils/pdftocairo.cc b/utils/pdftocairo.cc
index 05ceaa3b..670afcf0 100644
--- a/utils/pdftocairo.cc
+++ b/utils/pdftocairo.cc
@@ -30,6 +30,7 @@
// Copyright (C) 2013, 2017 Suzuki Toshiya <mpsuzuki at hiroshima-u.ac.jp>
// Copyright (C) 2014 Rodrigo Rivas Costa <rodrigorivascosta at gmail.com>
// Copyright (C) 2016 Jason Crain <jason at aquaticape.us>
+// Copyright (C) 2018 Martin Packman <gzlist at googlemail.com>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -129,6 +130,7 @@ static GBool printHelp = gFalse;
static GooString jpegOpt;
static int jpegQuality = -1;
static bool jpegProgressive = false;
+static bool jpegOptimize = false;
static GooString printer;
static GooString printOpt;
@@ -369,6 +371,14 @@ static GBool parseJpegOptions()
fprintf(stderr, "jpeg progressive option must be \"y\" or \"n\"\n");
return gFalse;
}
+ } else if (opt.cmp("optimize") == 0 || opt.cmp("optimise") == 0) {
+ jpegOptimize = gFalse;
+ if (value.cmp("y") == 0) {
+ jpegOptimize = gTrue;
+ } else if (value.cmp("n") != 0) {
+ fprintf(stderr, "jpeg optimize option must be \"y\" or \"n\"\n");
+ return gFalse;
+ }
} else {
fprintf(stderr, "Unknown jpeg option \"%s\"\n", opt.getCString());
return gFalse;
@@ -415,6 +425,7 @@ static void writePageImage(GooString *filename)
else
writer = new JpegWriter(JpegWriter::RGB);
+ static_cast<JpegWriter*>(writer)->setOptimize(jpegOptimize);
static_cast<JpegWriter*>(writer)->setProgressive(jpegProgressive);
if (jpegQuality >= 0)
static_cast<JpegWriter*>(writer)->setQuality(jpegQuality);
diff --git a/utils/pdftoppm.1 b/utils/pdftoppm.1
index b489e025..75a4f473 100644
--- a/utils/pdftoppm.1
+++ b/utils/pdftoppm.1
@@ -171,6 +171,12 @@ Selects the JPEG quality value. The value must be an integer between 0 and 100.
.BI progressive
Select progressive JPEG output. The possible values are "y", "n",
indicating progressive (yes) or non-progressive (no), respectively.
+.TP
+.BI optimize
+Sets whether to compute optimal Huffman coding tables for the JPEG output, which
+will create smaller files but make an extra pass over the data. The value must
+be "y" or "n", with "y" performing optimization, otherwise the default Huffman
+tables are used.
.SH AUTHOR
The pdftoppm software and documentation are copyright 1996-2011 Glyph
& Cog, LLC.
diff --git a/utils/pdftoppm.cc b/utils/pdftoppm.cc
index 4d567bd4..0a441327 100644
--- a/utils/pdftoppm.cc
+++ b/utils/pdftoppm.cc
@@ -27,6 +27,7 @@
// Copyright (C) 2013, 2015 Adam Reichold <adamreichold at myopera.com>
// Copyright (C) 2013 Suzuki Toshiya <mpsuzuki at hiroshima-u.ac.jp>
// Copyright (C) 2015 William Bader <williambader at hotmail.com>
+// Copyright (C) 2018 Martin Packman <gzlist at googlemail.com>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -92,6 +93,7 @@ static GBool tiff = gFalse;
static GooString jpegOpt;
static int jpegQuality = -1;
static bool jpegProgressive = false;
+static bool jpegOptimize = false;
#ifdef SPLASH_CMYK
static GBool overprint = gFalse;
#endif
@@ -257,6 +259,14 @@ static GBool parseJpegOptions()
fprintf(stderr, "jpeg progressive option must be \"y\" or \"n\"\n");
return gFalse;
}
+ } else if (opt.cmp("optimize") == 0 || opt.cmp("optimise") == 0) {
+ jpegOptimize = gFalse;
+ if (value.cmp("y") == 0) {
+ jpegOptimize = gTrue;
+ } else if (value.cmp("n") != 0) {
+ fprintf(stderr, "jpeg optimize option must be \"y\" or \"n\"\n");
+ return gFalse;
+ }
} else {
fprintf(stderr, "Unknown jpeg option \"%s\"\n", opt.getCString());
return gFalse;
@@ -286,6 +296,7 @@ static void savePageSlice(PDFDoc *doc,
SplashBitmap::WriteImgParams params;
params.jpegQuality = jpegQuality;
params.jpegProgressive = jpegProgressive;
+ params.jpegOptimize = jpegOptimize;
params.tiffCompression.Set(TiffCompressionStr);
if (ppmFile != nullptr) {
More information about the poppler
mailing list