tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

jcinit.c (5186B)


      1 /*
      2 * jcinit.c
      3 *
      4 * This file was part of the Independent JPEG Group's software:
      5 * Copyright (C) 1991-1997, Thomas G. Lane.
      6 * Lossless JPEG Modifications:
      7 * Copyright (C) 1999, Ken Murchison.
      8 * libjpeg-turbo Modifications:
      9 * Copyright (C) 2020, 2022, D. R. Commander.
     10 * For conditions of distribution and use, see the accompanying README.ijg
     11 * file.
     12 *
     13 * This file contains initialization logic for the JPEG compressor.
     14 * This routine is in charge of selecting the modules to be executed and
     15 * making an initialization call to each one.
     16 *
     17 * Logically, this code belongs in jcmaster.c.  It's split out because
     18 * linking this routine implies linking the entire compression library.
     19 * For a transcoding-only application, we want to be able to use jcmaster.c
     20 * without linking in the whole library.
     21 */
     22 
     23 #define JPEG_INTERNALS
     24 #include "jinclude.h"
     25 #include "jpeglib.h"
     26 #include "jpegapicomp.h"
     27 
     28 
     29 /*
     30 * Master selection of compression modules.
     31 * This is done once at the start of processing an image.  We determine
     32 * which modules will be used and give them appropriate initialization calls.
     33 */
     34 
     35 GLOBAL(void)
     36 jinit_compress_master(j_compress_ptr cinfo)
     37 {
     38  /* Initialize master control (includes parameter checking/processing) */
     39  jinit_c_master_control(cinfo, FALSE /* full compression */);
     40 
     41  /* Preprocessing */
     42  if (!cinfo->raw_data_in) {
     43    if (cinfo->data_precision == 16) {
     44 #ifdef C_LOSSLESS_SUPPORTED
     45      j16init_color_converter(cinfo);
     46      j16init_downsampler(cinfo);
     47      j16init_c_prep_controller(cinfo,
     48                                FALSE /* never need full buffer here */);
     49 #else
     50      ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
     51 #endif
     52    } else if (cinfo->data_precision == 12) {
     53      j12init_color_converter(cinfo);
     54      j12init_downsampler(cinfo);
     55      j12init_c_prep_controller(cinfo,
     56                                FALSE /* never need full buffer here */);
     57    } else {
     58      jinit_color_converter(cinfo);
     59      jinit_downsampler(cinfo);
     60      jinit_c_prep_controller(cinfo, FALSE /* never need full buffer here */);
     61    }
     62  }
     63 
     64  if (cinfo->master->lossless) {
     65 #ifdef C_LOSSLESS_SUPPORTED
     66    /* Prediction, sample differencing, and point transform */
     67    if (cinfo->data_precision == 16)
     68      j16init_lossless_compressor(cinfo);
     69    else if (cinfo->data_precision == 12)
     70      j12init_lossless_compressor(cinfo);
     71    else
     72      jinit_lossless_compressor(cinfo);
     73    /* Entropy encoding: either Huffman or arithmetic coding. */
     74    if (cinfo->arith_code) {
     75      ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
     76    } else {
     77      jinit_lhuff_encoder(cinfo);
     78    }
     79 
     80    /* Need a full-image difference buffer in any multi-pass mode. */
     81    if (cinfo->data_precision == 16)
     82      j16init_c_diff_controller(cinfo, (boolean)(cinfo->num_scans > 1 ||
     83                                                 cinfo->optimize_coding));
     84    else if (cinfo->data_precision == 12)
     85      j12init_c_diff_controller(cinfo, (boolean)(cinfo->num_scans > 1 ||
     86                                                 cinfo->optimize_coding));
     87    else
     88      jinit_c_diff_controller(cinfo, (boolean)(cinfo->num_scans > 1 ||
     89                                               cinfo->optimize_coding));
     90 #else
     91    ERREXIT(cinfo, JERR_NOT_COMPILED);
     92 #endif
     93  } else {
     94    if (cinfo->data_precision == 16)
     95      ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
     96    /* Forward DCT */
     97    if (cinfo->data_precision == 12)
     98      j12init_forward_dct(cinfo);
     99    else
    100      jinit_forward_dct(cinfo);
    101    /* Entropy encoding: either Huffman or arithmetic coding. */
    102    if (cinfo->arith_code) {
    103 #ifdef C_ARITH_CODING_SUPPORTED
    104      jinit_arith_encoder(cinfo);
    105 #else
    106      ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
    107 #endif
    108    } else {
    109      if (cinfo->progressive_mode) {
    110 #ifdef C_PROGRESSIVE_SUPPORTED
    111        jinit_phuff_encoder(cinfo);
    112 #else
    113        ERREXIT(cinfo, JERR_NOT_COMPILED);
    114 #endif
    115      } else
    116        jinit_huff_encoder(cinfo);
    117    }
    118 
    119    /* Need a full-image coefficient buffer in any multi-pass mode. */
    120    if (cinfo->data_precision == 12)
    121      j12init_c_coef_controller(cinfo, (boolean)(cinfo->num_scans > 1 ||
    122                                                 cinfo->optimize_coding));
    123    else
    124      jinit_c_coef_controller(cinfo, (boolean)(cinfo->num_scans > 1 ||
    125                                               cinfo->optimize_coding));
    126  }
    127 
    128  if (cinfo->data_precision == 16)
    129 #ifdef C_LOSSLESS_SUPPORTED
    130    j16init_c_main_controller(cinfo, FALSE /* never need full buffer here */);
    131 #else
    132    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
    133 #endif
    134  else if (cinfo->data_precision == 12)
    135    j12init_c_main_controller(cinfo, FALSE /* never need full buffer here */);
    136  else
    137    jinit_c_main_controller(cinfo, FALSE /* never need full buffer here */);
    138 
    139  jinit_marker_writer(cinfo);
    140 
    141  /* We can now tell the memory manager to allocate virtual arrays. */
    142  (*cinfo->mem->realize_virt_arrays) ((j_common_ptr)cinfo);
    143 
    144  /* Write the datastream header (SOI) immediately.
    145   * Frame and scan headers are postponed till later.
    146   * This lets application insert special markers after the SOI.
    147   */
    148  (*cinfo->marker->write_file_header) (cinfo);
    149 }