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