]> granicus.if.org Git - libjpeg-turbo/commitdiff
Enable the use of separate luminance/chrominance quality scaling with libjpeg v6b...
authorDRC <dcommander@users.sourceforge.net>
Mon, 11 Oct 2010 23:36:04 +0000 (23:36 +0000)
committerDRC <dcommander@users.sourceforge.net>
Mon, 11 Oct 2010 23:36:04 +0000 (23:36 +0000)
git-svn-id: svn+ssh://svn.code.sf.net/p/libjpeg-turbo/code/trunk@251 632fc199-4ca6-4c93-a231-07263d6284db

rdswitch.c

index d34b4007d3a373ad1a3b586c339ad565edf21392..d40675594e7f3d111e35ade423504d633a41b4e6 100644 (file)
@@ -2,6 +2,7 @@
  * rdswitch.c
  *
  * Copyright (C) 1991-1996, Thomas G. Lane.
+ * Copyright (C) 2010, D. R. Commander.
  * This file is part of the Independent JPEG Group's software.
  * For conditions of distribution and use, see the accompanying README file.
  *
@@ -71,7 +72,7 @@ read_text_integer (FILE * file, long * result, int * termchar)
 
 
 #if JPEG_LIB_VERSION < 70
-static int q_scale_factor = 100;
+static int q_scale_factor[NUM_QUANT_TBLS] = {100, 100, 100, 100};
 #endif
 
 GLOBAL(boolean)
@@ -116,7 +117,8 @@ read_quant_tables (j_compress_ptr cinfo, char * filename, boolean force_baseline
     jpeg_add_quant_table(cinfo, tblno, table, cinfo->q_scale_factor[tblno],
                         force_baseline);
 #else
-    jpeg_add_quant_table(cinfo, tblno, table, q_scale_factor, force_baseline);
+    jpeg_add_quant_table(cinfo, tblno, table, q_scale_factor[tblno],
+                         force_baseline);
 #endif
     tblno++;
   }
@@ -271,6 +273,44 @@ bogus:
 #endif /* C_MULTISCAN_FILES_SUPPORTED */
 
 
+#if JPEG_LIB_VERSION < 70
+/* These are the sample quantization tables given in JPEG spec section K.1.
+ * The spec says that the values given produce "good" quality, and
+ * when divided by 2, "very good" quality.
+ */
+static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = {
+  16,  11,  10,  16,  24,  40,  51,  61,
+  12,  12,  14,  19,  26,  58,  60,  55,
+  14,  13,  16,  24,  40,  57,  69,  56,
+  14,  17,  22,  29,  51,  87,  80,  62,
+  18,  22,  37,  56,  68, 109, 103,  77,
+  24,  35,  55,  64,  81, 104, 113,  92,
+  49,  64,  78,  87, 103, 121, 120, 101,
+  72,  92,  95,  98, 112, 100, 103,  99
+};
+static const unsigned int std_chrominance_quant_tbl[DCTSIZE2] = {
+  17,  18,  24,  47,  99,  99,  99,  99,
+  18,  21,  26,  66,  99,  99,  99,  99,
+  24,  26,  56,  99,  99,  99,  99,  99,
+  47,  66,  99,  99,  99,  99,  99,  99,
+  99,  99,  99,  99,  99,  99,  99,  99,
+  99,  99,  99,  99,  99,  99,  99,  99,
+  99,  99,  99,  99,  99,  99,  99,  99,
+  99,  99,  99,  99,  99,  99,  99,  99
+};
+
+
+LOCAL(void)
+jpeg_default_qtables (j_compress_ptr cinfo, boolean force_baseline)
+{
+  jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl,
+                      q_scale_factor[0], force_baseline);
+  jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl,
+                      q_scale_factor[1], force_baseline);
+}
+#endif
+
+
 GLOBAL(boolean)
 set_quality_ratings (j_compress_ptr cinfo, char *arg, boolean force_baseline)
 /* Process a quality-ratings parameter string, of the form
@@ -292,6 +332,8 @@ set_quality_ratings (j_compress_ptr cinfo, char *arg, boolean force_baseline)
       /* Convert user 0-100 rating to percentage scaling */
 #if JPEG_LIB_VERSION >= 70
       cinfo->q_scale_factor[tblno] = jpeg_quality_scaling(val);
+#else
+      q_scale_factor[tblno] = jpeg_quality_scaling(val);
 #endif
       while (*arg && *arg++ != ',') /* advance to next segment of arg string */
        ;
@@ -299,14 +341,12 @@ set_quality_ratings (j_compress_ptr cinfo, char *arg, boolean force_baseline)
       /* reached end of parameter, set remaining factors to last value */
 #if JPEG_LIB_VERSION >= 70
       cinfo->q_scale_factor[tblno] = jpeg_quality_scaling(val);
+#else
+      q_scale_factor[tblno] = jpeg_quality_scaling(val);
 #endif
     }
   }
-#if JPEG_LIB_VERSION >= 70
   jpeg_default_qtables(cinfo, force_baseline);
-#else
-  jpeg_set_quality(cinfo, val, force_baseline);
-#endif
   return TRUE;
 }