On 24/06/2018, Albert Astals Cid <aa...@kde.org> wrote:
>
> Not an English native speaker myself, but are you sure of the
> Selects vs Select change?

Struggling to find a documentation style guide that actually states
it, but think in general imperative is preferred over simple present.
See for instance `man grep` -w and -x (and in fact the whole file).
The pdftoppm man page is not consistent, both tenses are used, compare
-x/-y -opw/-upw or -png -jpeg.

> So if Select is the correct one should we change that one too?

Probably. I don't want to rewrite the whole manpage as part of this
change, it seems unrelated.

I've changed the print ones in pdftocairo, see amended patch also with
other wording tweaks attached.

Martin
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.

Signed-off-by: Martin Packman <gzl...@googlemail.com>
---
 goo/JpegWriter.cc      | 11 +++++++++++
 goo/JpegWriter.h       |  1 +
 splash/SplashBitmap.cc |  1 +
 splash/SplashBitmap.h  |  1 +
 utils/pdftocairo.1     | 17 ++++++++++++-----
 utils/pdftocairo.cc    | 10 ++++++++++
 utils/pdftoppm.1       | 13 ++++++++++---
 utils/pdftoppm.cc      | 10 ++++++++++
 8 files changed, 56 insertions(+), 8 deletions(-)

diff --git a/goo/JpegWriter.cc b/goo/JpegWriter.cc
index 37c15c2a..9ac9b63b 100644
--- a/goo/JpegWriter.cc
+++ b/goo/JpegWriter.cc
@@ -25,6 +25,7 @@ extern "C" {
 
 struct JpegWriterPrivate {
   bool progressive;
+  bool optimize;
   int quality;
   JpegWriter::Format format;
   struct jpeg_compress_struct cinfo;
@@ -46,6 +47,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 +56,7 @@ JpegWriter::JpegWriter(Format formatA)
 {
   priv = new JpegWriterPrivate;
   priv->progressive = false;
+  priv->optimize = false;
   priv->quality = -1;
   priv->format = formatA;
 }
@@ -75,6 +78,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 +145,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..bb87b949 100644
--- a/goo/JpegWriter.h
+++ b/goo/JpegWriter.h
@@ -41,6 +41,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..6f5e4cf8 100644
--- a/splash/SplashBitmap.cc
+++ b/splash/SplashBitmap.cc
@@ -356,6 +356,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..9756164f 100644
--- a/splash/SplashBitmap.h
+++ b/splash/SplashBitmap.h
@@ -81,6 +81,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..6be3c410 100644
--- a/utils/pdftocairo.1
+++ b/utils/pdftocairo.1
@@ -305,21 +305,28 @@ When JPEG output is specified, the \-jpegopt option can be used to control the J
 It takes a string of the form "<opt>=<val>[,<opt>=<val>]". Currently the available options are:
 .TP
 .BI quality
-Selects the JPEG quality value. The value must be an integer between 0 and 100.
+Select the JPEG quality. The value must be an integer between 0 and 100.
 .TP
 .BI progressive
-Select progressive JPEG output. The possible values are "y", "n",
-indicating progressive (yes) or non-progressive (no), respectively.
+Select whether to write the JPEG as multiple scans of increasing quality. The
+value must be "y" or "n", with "y" indicating a progressive image, otherwise a
+single-scan image is created.
+.TP
+.BI optimize
+Set 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:
 .TP
 .BI source
-Selects the source paper tray to be used (bin). The possible values are "upper", "onlyone", "lower", "middle", "manual", "envelope",
+Select the source paper tray to be used (bin). The possible values are "upper", "onlyone", "lower", "middle", "manual", "envelope",
 "envmanual", "auto", "tractor", "smallfmt", "largefmt", "largecapacity", "formsource", or a numeric value to choose a driver specific source.
 .TP
 .BI duplex
-Sets the duplex mode of the printer. The possible values are "off", "short" or "long",
+Set the duplex mode of the printer. The possible values are "off", "short" or "long",
 indicating no duplexing, short-edge binding, or long-edge binding, respectively.
 General option \-duplex is a synonym of "duplex=long". If both options are specified,
 \-printopt has priority.
diff --git a/utils/pdftocairo.cc b/utils/pdftocairo.cc
index 05ceaa3b..e5e49a19 100644
--- a/utils/pdftocairo.cc
+++ b/utils/pdftocairo.cc
@@ -129,6 +129,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 +370,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 +424,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..6594f540 100644
--- a/utils/pdftoppm.1
+++ b/utils/pdftoppm.1
@@ -166,11 +166,18 @@ When JPEG output is specified, the \-jpegopt option can be used to control the J
 It takes a string of the form "<opt>=<val>[,<opt>=<val>]". Currently the available options are:
 .TP
 .BI quality
-Selects the JPEG quality value. The value must be an integer between 0 and 100.
+Select the JPEG quality. The value must be an integer between 0 and 100.
 .TP
 .BI progressive
-Select progressive JPEG output. The possible values are "y", "n",
-indicating progressive (yes) or non-progressive (no), respectively.
+Select whether to write the JPEG as multiple scans of increasing quality. The
+value must be "y" or "n", with "y" indicating a progressive image, otherwise a
+single-scan image is created.
+.TP
+.BI optimize
+Set 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..8ea81d04 100644
--- a/utils/pdftoppm.cc
+++ b/utils/pdftoppm.cc
@@ -92,6 +92,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 +258,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 +295,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) {
-- 
2.17.1

_______________________________________________
poppler mailing list
poppler@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/poppler

Reply via email to