Coverage Report

Created: 2026-10-28 08:05

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ghostpdl/obj/jcomapi.c
Line
Count
Source
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
11.2k
{
32
11.2k
  int pool;
33
34
  /* Do nothing if called on a not-initialized or destroyed JPEG object. */
35
11.2k
  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
22.5k
  for (pool = JPOOL_NUMPOOLS-1; pool > JPOOL_PERMANENT; pool--) {
42
11.2k
    (*cinfo->mem->free_pool) (cinfo, pool);
43
11.2k
  }
44
45
  /* Reset overall state for possible reuse of object */
46
11.2k
  if (cinfo->is_decompressor) {
47
7.39k
    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
7.39k
    ((j_decompress_ptr) cinfo)->marker_list = NULL;
52
7.39k
  } else {
53
3.89k
    cinfo->global_state = CSTATE_START;
54
3.89k
  }
55
11.2k
}
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
19.8k
{
72
  /* We need only tell the memory manager to release everything. */
73
  /* NB: mem pointer is NULL if memory mgr failed to initialize. */
74
19.8k
  if (cinfo->mem != NULL)
75
19.8k
    (*cinfo->mem->self_destruct) (cinfo);
76
19.8k
  cinfo->mem = NULL;   /* be safe if jpeg_destroy is called twice */
77
19.8k
  cinfo->global_state = 0;  /* mark it destroyed */
78
19.8k
}
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
34.0k
{
89
34.0k
  JQUANT_TBL *tbl;
90
91
34.0k
  tbl = (JQUANT_TBL *)
92
34.0k
    (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JQUANT_TBL));
93
34.0k
  tbl->sent_table = FALSE;  /* make sure this is false in any new table */
94
34.0k
  return tbl;
95
34.0k
}
96
97
98
GLOBAL(JHUFF_TBL *)
99
jpeg_alloc_huff_table (j_common_ptr cinfo)
100
58.3k
{
101
58.3k
  JHUFF_TBL *tbl;
102
103
58.3k
  tbl = (JHUFF_TBL *)
104
58.3k
    (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JHUFF_TBL));
105
58.3k
  tbl->sent_table = FALSE;  /* make sure this is false in any new table */
106
58.3k
  return tbl;
107
58.3k
}
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
23.3k
{
119
23.3k
  JHUFF_TBL **htblptr, *htbl;
120
23.3k
  const UINT8 *bits, *val;
121
23.3k
  int nsymbols, len;
122
123
23.3k
  static const UINT8 bits_dc_luminance[17] =
124
23.3k
    { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
125
23.3k
  static const UINT8 val_dc_luminance[] =
126
23.3k
    { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
127
128
23.3k
  static const UINT8 bits_dc_chrominance[17] =
129
23.3k
    { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
130
23.3k
  static const UINT8 val_dc_chrominance[] =
131
23.3k
    { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
132
133
23.3k
  static const UINT8 bits_ac_luminance[17] =
134
23.3k
    { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
135
23.3k
  static const UINT8 val_ac_luminance[] =
136
23.3k
    { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
137
23.3k
      0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
138
23.3k
      0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
139
23.3k
      0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
140
23.3k
      0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
141
23.3k
      0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
142
23.3k
      0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
143
23.3k
      0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
144
23.3k
      0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
145
23.3k
      0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
146
23.3k
      0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
147
23.3k
      0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
148
23.3k
      0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
149
23.3k
      0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
150
23.3k
      0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
151
23.3k
      0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
152
23.3k
      0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
153
23.3k
      0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
154
23.3k
      0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
155
23.3k
      0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
156
23.3k
      0xf9, 0xfa };
157
158
23.3k
  static const UINT8 bits_ac_chrominance[17] =
159
23.3k
    { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
160
23.3k
  static const UINT8 val_ac_chrominance[] =
161
23.3k
    { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
162
23.3k
      0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
163
23.3k
      0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
164
23.3k
      0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
165
23.3k
      0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
166
23.3k
      0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
167
23.3k
      0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
168
23.3k
      0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
169
23.3k
      0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
170
23.3k
      0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
171
23.3k
      0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
172
23.3k
      0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
173
23.3k
      0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
174
23.3k
      0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
175
23.3k
      0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
176
23.3k
      0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
177
23.3k
      0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
178
23.3k
      0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
179
23.3k
      0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
180
23.3k
      0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
181
23.3k
      0xf9, 0xfa };
182
183
23.3k
  if (cinfo->is_decompressor) {
184
71
    if (isDC)
185
20
      htblptr = ((j_decompress_ptr) cinfo)->dc_huff_tbl_ptrs;
186
51
    else
187
51
      htblptr = ((j_decompress_ptr) cinfo)->ac_huff_tbl_ptrs;
188
23.2k
  } else {
189
23.2k
    if (isDC)
190
11.6k
      htblptr = ((j_compress_ptr) cinfo)->dc_huff_tbl_ptrs;
191
11.6k
    else
192
11.6k
      htblptr = ((j_compress_ptr) cinfo)->ac_huff_tbl_ptrs;
193
23.2k
  }
194
195
23.3k
  switch (tblno) {
196
15.3k
  case 0:
197
15.3k
    if (isDC) {
198
7.68k
      bits = bits_dc_luminance;
199
7.68k
      val = val_dc_luminance;
200
7.70k
    } else {
201
7.70k
      bits = bits_ac_luminance;
202
7.70k
      val = val_ac_luminance;
203
7.70k
    }
204
15.3k
    break;
205
7.93k
  case 1:
206
7.93k
    if (isDC) {
207
3.96k
      bits = bits_dc_chrominance;
208
3.96k
      val = val_dc_chrominance;
209
3.97k
    } else {
210
3.97k
      bits = bits_ac_chrominance;
211
3.97k
      val = val_ac_chrominance;
212
3.97k
    }
213
7.93k
    break;
214
0
  default:
215
0
    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
216
0
    return NULL; /* avoid compiler warnings for uninitialized variables */
217
23.3k
  }
218
219
23.3k
  if (htblptr[tblno] == NULL)
220
23.3k
    htblptr[tblno] = jpeg_alloc_huff_table(cinfo);
221
222
23.3k
  htbl = htblptr[tblno];
223
224
  /* Copy the number-of-symbols-of-each-code-length counts */
225
23.3k
  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
23.3k
  nsymbols = 0;
232
396k
  for (len = 1; len <= 16; len++)
233
373k
    nsymbols += bits[len];
234
23.3k
  if (nsymbols > 256)
235
0
    ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
236
237
23.3k
  if (nsymbols > 0)
238
23.3k
    MEMCOPY(htbl->huffval, val, nsymbols * SIZEOF(UINT8));
239
240
  /* Initialize sent_table FALSE so table will be written to JPEG file. */
241
23.3k
  htbl->sent_table = FALSE;
242
243
23.3k
  return htbl;
244
23.3k
}