tor-browser

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

jcomapi.c (3275B)


      1 /*
      2 * jcomapi.c
      3 *
      4 * This file was part of the Independent JPEG Group's software:
      5 * Copyright (C) 1994-1997, Thomas G. Lane.
      6 * libjpeg-turbo Modifications:
      7 * Copyright (C) 2024, D. R. Commander.
      8 * For conditions of distribution and use, see the accompanying README.ijg
      9 * file.
     10 *
     11 * This file contains application interface routines that are used for both
     12 * compression and decompression.
     13 */
     14 
     15 #define JPEG_INTERNALS
     16 #include "jinclude.h"
     17 #include "jpeglib.h"
     18 
     19 
     20 /*
     21 * Abort processing of a JPEG compression or decompression operation,
     22 * but don't destroy the object itself.
     23 *
     24 * For this, we merely clean up all the nonpermanent memory pools.
     25 * Note that temp files (virtual arrays) are not allowed to belong to
     26 * the permanent pool, so we will be able to close all temp files here.
     27 * Closing a data source or destination, if necessary, is the application's
     28 * responsibility.
     29 */
     30 
     31 GLOBAL(void)
     32 jpeg_abort(j_common_ptr cinfo)
     33 {
     34  int pool;
     35 
     36  /* Do nothing if called on a not-initialized or destroyed JPEG object. */
     37  if (cinfo->mem == NULL)
     38    return;
     39 
     40  /* Releasing pools in reverse order might help avoid fragmentation
     41   * with some (brain-damaged) malloc libraries.
     42   */
     43  for (pool = JPOOL_NUMPOOLS - 1; pool > JPOOL_PERMANENT; pool--) {
     44    (*cinfo->mem->free_pool) (cinfo, pool);
     45  }
     46 
     47  /* Reset overall state for possible reuse of object */
     48  if (cinfo->is_decompressor) {
     49    cinfo->global_state = DSTATE_START;
     50    /* Try to keep application from accessing now-deleted marker list.
     51     * A bit kludgy to do it here, but this is the most central place.
     52     */
     53    ((j_decompress_ptr)cinfo)->marker_list = NULL;
     54    ((j_decompress_ptr)cinfo)->master->marker_list_end = NULL;
     55  } else {
     56    cinfo->global_state = CSTATE_START;
     57  }
     58 }
     59 
     60 
     61 /*
     62 * Destruction of a JPEG object.
     63 *
     64 * Everything gets deallocated except the master jpeg_compress_struct itself
     65 * and the error manager struct.  Both of these are supplied by the application
     66 * and must be freed, if necessary, by the application.  (Often they are on
     67 * the stack and so don't need to be freed anyway.)
     68 * Closing a data source or destination, if necessary, is the application's
     69 * responsibility.
     70 */
     71 
     72 GLOBAL(void)
     73 jpeg_destroy(j_common_ptr cinfo)
     74 {
     75  /* We need only tell the memory manager to release everything. */
     76  /* NB: mem pointer is NULL if memory mgr failed to initialize. */
     77  if (cinfo->mem != NULL)
     78    (*cinfo->mem->self_destruct) (cinfo);
     79  cinfo->mem = NULL;            /* be safe if jpeg_destroy is called twice */
     80  cinfo->global_state = 0;      /* mark it destroyed */
     81 }
     82 
     83 
     84 /*
     85 * Convenience routines for allocating quantization and Huffman tables.
     86 * (Would jutils.c be a more reasonable place to put these?)
     87 */
     88 
     89 GLOBAL(JQUANT_TBL *)
     90 jpeg_alloc_quant_table(j_common_ptr cinfo)
     91 {
     92  JQUANT_TBL *tbl;
     93 
     94  tbl = (JQUANT_TBL *)
     95    (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, sizeof(JQUANT_TBL));
     96  tbl->sent_table = FALSE;      /* make sure this is false in any new table */
     97  return tbl;
     98 }
     99 
    100 
    101 GLOBAL(JHUFF_TBL *)
    102 jpeg_alloc_huff_table(j_common_ptr cinfo)
    103 {
    104  JHUFF_TBL *tbl;
    105 
    106  tbl = (JHUFF_TBL *)
    107    (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, sizeof(JHUFF_TBL));
    108  tbl->sent_table = FALSE;      /* make sure this is false in any new table */
    109  return tbl;
    110 }