Coverage Report

Created: 2025-06-10 07:27

/src/ghostpdl/obj/jcomapi.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * jcomapi.c
3
 *
4
 * Copyright (C) 1994-1997, Thomas G. Lane.
5
 * Modified 2019 by Guido Vollbeding.
6
 * This file is part of the Independent JPEG Group's software.
7
 * For conditions of distribution and use, see the accompanying README file.
8
 *
9
 * This file contains application interface routines that are used for both
10
 * compression and decompression.
11
 */
12
13
#define JPEG_INTERNALS
14
#include "jinclude.h"
15
#include "jpeglib.h"
16
17
18
/*
19
 * Abort processing of a JPEG compression or decompression operation,
20
 * but don't destroy the object itself.
21
 *
22
 * For this, we merely clean up all the nonpermanent memory pools.
23
 * Note that temp files (virtual arrays) are not allowed to belong to
24
 * the permanent pool, so we will be able to close all temp files here.
25
 * Closing a data source or destination, if necessary, is the application's
26
 * responsibility.
27
 */
28
29
GLOBAL(void)
30
jpeg_abort (j_common_ptr cinfo)
31
20.6k
{
32
20.6k
  int pool;
33
34
  /* Do nothing if called on a not-initialized or destroyed JPEG object. */
35
20.6k
  if (cinfo->mem == NULL)
36
0
    return;
37
38
  /* Releasing pools in reverse order might help avoid fragmentation
39
   * with some (brain-damaged) malloc libraries.
40
   */
41
41.3k
  for (pool = JPOOL_NUMPOOLS-1; pool > JPOOL_PERMANENT; pool--) {
42
20.6k
    (*cinfo->mem->free_pool) (cinfo, pool);
43
20.6k
  }
44
45
  /* Reset overall state for possible reuse of object */
46
20.6k
  if (cinfo->is_decompressor) {
47
9.90k
    cinfo->global_state = DSTATE_START;
48
    /* Try to keep application from accessing now-deleted marker list.
49
     * A bit kludgy to do it here, but this is the most central place.
50
     */
51
9.90k
    ((j_decompress_ptr) cinfo)->marker_list = NULL;
52
10.7k
  } else {
53
10.7k
    cinfo->global_state = CSTATE_START;
54
10.7k
  }
55
20.6k
}
56
57
58
/*
59
 * Destruction of a JPEG object.
60
 *
61
 * Everything gets deallocated except the master jpeg_compress_struct itself
62
 * and the error manager struct.  Both of these are supplied by the application
63
 * and must be freed, if necessary, by the application.  (Often they are on
64
 * the stack and so don't need to be freed anyway.)
65
 * Closing a data source or destination, if necessary, is the application's
66
 * responsibility.
67
 */
68
69
GLOBAL(void)
70
jpeg_destroy (j_common_ptr cinfo)
71
25.5k
{
72
  /* We need only tell the memory manager to release everything. */
73
  /* NB: mem pointer is NULL if memory mgr failed to initialize. */
74
25.5k
  if (cinfo->mem != NULL)
75
25.5k
    (*cinfo->mem->self_destruct) (cinfo);
76
25.5k
  cinfo->mem = NULL;    /* be safe if jpeg_destroy is called twice */
77
25.5k
  cinfo->global_state = 0;  /* mark it destroyed */
78
25.5k
}
79
80
81
/*
82
 * Convenience routines for allocating quantization and Huffman tables.
83
 * (Would jutils.c be a more reasonable place to put these?)
84
 */
85
86
GLOBAL(JQUANT_TBL *)
87
jpeg_alloc_quant_table (j_common_ptr cinfo)
88
45.5k
{
89
45.5k
  JQUANT_TBL *tbl;
90
91
45.5k
  tbl = (JQUANT_TBL *)
92
45.5k
    (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JQUANT_TBL));
93
45.5k
  tbl->sent_table = FALSE;  /* make sure this is false in any new table */
94
45.5k
  return tbl;
95
45.5k
}
96
97
98
GLOBAL(JHUFF_TBL *)
99
jpeg_alloc_huff_table (j_common_ptr cinfo)
100
79.7k
{
101
79.7k
  JHUFF_TBL *tbl;
102
103
79.7k
  tbl = (JHUFF_TBL *)
104
79.7k
    (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JHUFF_TBL));
105
79.7k
  tbl->sent_table = FALSE;  /* make sure this is false in any new table */
106
79.7k
  return tbl;
107
79.7k
}
108
109
110
/*
111
 * Set up the standard Huffman tables (cf. JPEG standard section K.3).
112
 * IMPORTANT: these are only valid for 8-bit data precision!
113
 * (Would jutils.c be a more reasonable place to put this?)
114
 */
115
116
GLOBAL(JHUFF_TBL *)
117
jpeg_std_huff_table (j_common_ptr cinfo, boolean isDC, int tblno)
118
35.0k
{
119
35.0k
  JHUFF_TBL **htblptr, *htbl;
120
35.0k
  const UINT8 *bits, *val;
121
35.0k
  int nsymbols, len;
122
123
35.0k
  static const UINT8 bits_dc_luminance[17] =
124
35.0k
    { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
125
35.0k
  static const UINT8 val_dc_luminance[] =
126
35.0k
    { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
127
128
35.0k
  static const UINT8 bits_dc_chrominance[17] =
129
35.0k
    { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
130
35.0k
  static const UINT8 val_dc_chrominance[] =
131
35.0k
    { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
132
133
35.0k
  static const UINT8 bits_ac_luminance[17] =
134
35.0k
    { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
135
35.0k
  static const UINT8 val_ac_luminance[] =
136
35.0k
    { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
137
35.0k
      0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
138
35.0k
      0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
139
35.0k
      0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
140
35.0k
      0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
141
35.0k
      0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
142
35.0k
      0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
143
35.0k
      0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
144
35.0k
      0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
145
35.0k
      0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
146
35.0k
      0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
147
35.0k
      0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
148
35.0k
      0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
149
35.0k
      0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
150
35.0k
      0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
151
35.0k
      0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
152
35.0k
      0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
153
35.0k
      0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
154
35.0k
      0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
155
35.0k
      0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
156
35.0k
      0xf9, 0xfa };
157
158
35.0k
  static const UINT8 bits_ac_chrominance[17] =
159
35.0k
    { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
160
35.0k
  static const UINT8 val_ac_chrominance[] =
161
35.0k
    { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
162
35.0k
      0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
163
35.0k
      0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
164
35.0k
      0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
165
35.0k
      0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
166
35.0k
      0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
167
35.0k
      0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
168
35.0k
      0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
169
35.0k
      0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
170
35.0k
      0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
171
35.0k
      0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
172
35.0k
      0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
173
35.0k
      0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
174
35.0k
      0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
175
35.0k
      0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
176
35.0k
      0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
177
35.0k
      0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
178
35.0k
      0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
179
35.0k
      0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
180
35.0k
      0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
181
35.0k
      0xf9, 0xfa };
182
183
35.0k
  if (cinfo->is_decompressor) {
184
93
    if (isDC)
185
32
      htblptr = ((j_decompress_ptr) cinfo)->dc_huff_tbl_ptrs;
186
61
    else
187
61
      htblptr = ((j_decompress_ptr) cinfo)->ac_huff_tbl_ptrs;
188
34.9k
  } else {
189
34.9k
    if (isDC)
190
17.4k
      htblptr = ((j_compress_ptr) cinfo)->dc_huff_tbl_ptrs;
191
17.4k
    else
192
17.4k
      htblptr = ((j_compress_ptr) cinfo)->ac_huff_tbl_ptrs;
193
34.9k
  }
194
195
35.0k
  switch (tblno) {
196
22.8k
  case 0:
197
22.8k
    if (isDC) {
198
11.3k
      bits = bits_dc_luminance;
199
11.3k
      val = val_dc_luminance;
200
11.4k
    } else {
201
11.4k
      bits = bits_ac_luminance;
202
11.4k
      val = val_ac_luminance;
203
11.4k
    }
204
22.8k
    break;
205
12.1k
  case 1:
206
12.1k
    if (isDC) {
207
6.09k
      bits = bits_dc_chrominance;
208
6.09k
      val = val_dc_chrominance;
209
6.10k
    } else {
210
6.10k
      bits = bits_ac_chrominance;
211
6.10k
      val = val_ac_chrominance;
212
6.10k
    }
213
12.1k
    break;
214
0
  default:
215
0
    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
216
0
    return NULL; /* avoid compiler warnings for uninitialized variables */
217
35.0k
  }
218
219
35.0k
  if (htblptr[tblno] == NULL)
220
35.0k
    htblptr[tblno] = jpeg_alloc_huff_table(cinfo);
221
222
35.0k
  htbl = htblptr[tblno];
223
224
  /* Copy the number-of-symbols-of-each-code-length counts */
225
35.0k
  MEMCOPY(htbl->bits, bits, SIZEOF(htbl->bits));
226
227
  /* Validate the counts.  We do this here mainly so we can copy the right
228
   * number of symbols from the val[] array, without risking marching off
229
   * the end of memory.  jxhuff.c will do a more thorough test later.
230
   */
231
35.0k
  nsymbols = 0;
232
595k
  for (len = 1; len <= 16; len++)
233
560k
    nsymbols += bits[len];
234
35.0k
  if (nsymbols > 256)
235
0
    ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
236
237
35.0k
  if (nsymbols > 0)
238
35.0k
    MEMCOPY(htbl->huffval, val, nsymbols * SIZEOF(UINT8));
239
240
  /* Initialize sent_table FALSE so table will be written to JPEG file. */
241
35.0k
  htbl->sent_table = FALSE;
242
243
35.0k
  return htbl;
244
35.0k
}