Coverage Report

Created: 2025-06-24 07:01

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