Coverage Report

Created: 2025-12-31 07:31

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