/* * jcmaster.c * * Copyright (C) 1991, 1992, 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); /* Downsampling of pixels */ jseldownsample(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 C_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 downsampled 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) { /* Init pass counts to 0 --- total_passes is adjusted in method selection */ cinfo->total_passes = 0; cinfo->completed_passes = 0; /* 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); (*cinfo->emethods->free_all) (); /* My, that was easy, wasn't it? */ }