summaryrefslogtreecommitdiff
path: root/jcmaster.c
diff options
context:
space:
mode:
Diffstat (limited to 'jcmaster.c')
-rw-r--r--jcmaster.c127
1 files changed, 127 insertions, 0 deletions
diff --git a/jcmaster.c b/jcmaster.c
new file mode 100644
index 0000000..b15217a
--- /dev/null
+++ b/jcmaster.c
@@ -0,0 +1,127 @@
+/*
+ * jcmaster.c
+ *
+ * Copyright (C) 1991, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains the main control for the JPEG compressor.
+ * The system-dependent (user interface) code should call jpeg_compress()
+ * after doing appropriate setup of the compress_info_struct parameter.
+ */
+
+#include "jinclude.h"
+
+
+METHODDEF void
+c_per_scan_method_selection (compress_info_ptr cinfo)
+/* Central point for per-scan method selection */
+{
+ /* Edge expansion */
+ jselexpand(cinfo);
+ /* Subsampling of pixels */
+ jselsubsample(cinfo);
+ /* MCU extraction */
+ jselcmcu(cinfo);
+}
+
+
+LOCAL void
+c_initial_method_selection (compress_info_ptr cinfo)
+/* Central point for initial method selection */
+{
+ /* Input image reading method selection is already done. */
+ /* So is output file header formatting (both are done by user interface). */
+
+ /* Gamma and color space conversion */
+ jselccolor(cinfo);
+ /* Entropy encoding: either Huffman or arithmetic coding. */
+#ifdef ARITH_CODING_SUPPORTED
+ jselcarithmetic(cinfo);
+#else
+ cinfo->arith_code = FALSE; /* force Huffman mode */
+#endif
+ jselchuffman(cinfo);
+ /* Pipeline control */
+ jselcpipeline(cinfo);
+ /* Overall control (that's me!) */
+ cinfo->methods->c_per_scan_method_selection = c_per_scan_method_selection;
+}
+
+
+LOCAL void
+initial_setup (compress_info_ptr cinfo)
+/* Do computations that are needed before initial method selection */
+{
+ short ci;
+ jpeg_component_info *compptr;
+
+ /* Compute maximum sampling factors; check factor validity */
+ cinfo->max_h_samp_factor = 1;
+ cinfo->max_v_samp_factor = 1;
+ for (ci = 0; ci < cinfo->num_components; ci++) {
+ compptr = &cinfo->comp_info[ci];
+ if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR ||
+ compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR)
+ ERREXIT(cinfo->emethods, "Bogus sampling factors");
+ cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor,
+ compptr->h_samp_factor);
+ cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor,
+ compptr->v_samp_factor);
+
+ }
+
+ /* Compute logical subsampled dimensions of components */
+ for (ci = 0; ci < cinfo->num_components; ci++) {
+ compptr = &cinfo->comp_info[ci];
+ compptr->true_comp_width = (cinfo->image_width * compptr->h_samp_factor
+ + cinfo->max_h_samp_factor - 1)
+ / cinfo->max_h_samp_factor;
+ compptr->true_comp_height = (cinfo->image_height * compptr->v_samp_factor
+ + cinfo->max_v_samp_factor - 1)
+ / cinfo->max_v_samp_factor;
+ }
+}
+
+
+/*
+ * This is the main entry point to the JPEG compressor.
+ */
+
+
+GLOBAL void
+jpeg_compress (compress_info_ptr cinfo)
+{
+ /* Read the input file header: determine image size & component count.
+ * NOTE: the user interface must have initialized the input_init method
+ * pointer (eg, by calling jselrppm) before calling me.
+ * The other file reading methods (get_input_row etc.) were probably
+ * set at the same time, but could be set up by input_init itself,
+ * or by c_ui_method_selection.
+ */
+ (*cinfo->methods->input_init) (cinfo);
+
+ /* Give UI a chance to adjust compression parameters and select */
+ /* output file format based on results of input_init. */
+ (*cinfo->methods->c_ui_method_selection) (cinfo);
+
+ /* Now select methods for compression steps. */
+ initial_setup(cinfo);
+ c_initial_method_selection(cinfo);
+
+ /* Initialize the output file & other modules as needed */
+ /* (entropy_encoder is inited by pipeline controller) */
+
+ (*cinfo->methods->colorin_init) (cinfo);
+ (*cinfo->methods->write_file_header) (cinfo);
+
+ /* And let the pipeline controller do the rest. */
+ (*cinfo->methods->c_pipeline_controller) (cinfo);
+
+ /* Finish output file, release working storage, etc */
+ (*cinfo->methods->write_file_trailer) (cinfo);
+ (*cinfo->methods->colorin_term) (cinfo);
+ (*cinfo->methods->input_term) (cinfo);
+
+ /* My, that was easy, wasn't it? */
+}