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