1 /* Copyright (C) 2001-2019 Artifex Software, Inc.
2 All Rights Reserved.
3
4 This software is provided AS-IS with no warranty, either express or
5 implied.
6
7 This software is distributed under license and may not be copied,
8 modified or distributed except as expressly authorized under the terms
9 of the license contained in the file LICENSE in this distribution.
10
11 Refer to licensing information at http://www.artifex.com or contact
12 Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
13 CA 94945, U.S.A., +1(415)492-9861, for further information.
14 */
15
16
17 /* Code common to DCT encoding and decoding streams */
18 #include "stdio_.h"
19 #include "jpeglib_.h"
20 #include "strimpl.h"
21 #include "sdct.h"
22 #include "sjpeg.h"
23
24 extern const stream_template s_DCTE_template;
25 extern const stream_template s_DCTD_template;
26
27 static void stream_dct_finalize(const gs_memory_t *cmem, void *vptr);
28
29 public_st_DCT_state();
30
31 /* Set the defaults for the DCT filters. */
32 void
s_DCT_set_defaults(stream_state * st)33 s_DCT_set_defaults(stream_state * st)
34 {
35 stream_DCT_state *const ss = (stream_DCT_state *) st;
36
37 ss->jpeg_memory = ss->memory->non_gc_memory;
38 ss->data.common = 0;
39 /****************
40 ss->data.common->Picky = 0;
41 ss->data.common->Relax = 0;
42 ****************/
43 ss->ColorTransform = -1;
44 ss->QFactor = 1.0;
45 /* Clear pointers */
46 ss->Markers.data = 0;
47 ss->Markers.size = 0;
48 }
49
50 static void
stream_dct_finalize(const gs_memory_t * cmem,void * vptr)51 stream_dct_finalize(const gs_memory_t *cmem, void *vptr)
52 {
53 stream_state *const st = vptr;
54 stream_DCT_state *const ss = (stream_DCT_state *) st;
55 (void)cmem; /* unused */
56
57 if (st->templat->process == s_DCTE_template.process) {
58 gs_jpeg_destroy(ss);
59 if (ss->data.compress != NULL) {
60 gs_free_object(ss->data.common->memory, ss->data.compress,
61 "s_DCTE_release");
62 ss->data.compress = NULL;
63 }
64 /* Switch the template pointer back in case we still need it. */
65 st->templat = &s_DCTE_template;
66 }
67 else {
68 gs_jpeg_destroy(ss);
69 if (ss->data.decompress != NULL) {
70 if (ss->data.decompress->scanline_buffer != NULL) {
71 gs_free_object(gs_memory_stable(ss->data.common->memory),
72 ss->data.decompress->scanline_buffer,
73 "s_DCTD_release(scanline_buffer)");
74 ss->data.decompress->scanline_buffer = NULL;
75 }
76 gs_free_object(ss->data.common->memory, ss->data.decompress,
77 "s_DCTD_release");
78 ss->data.decompress = NULL;
79 }
80 /* Switch the template pointer back in case we still need it. */
81 st->templat = &s_DCTD_template;
82 }
83 }
84
85 void
stream_dct_end_passthrough(jpeg_decompress_data * jddp)86 stream_dct_end_passthrough(jpeg_decompress_data *jddp)
87 {
88 char EOI[2] = {0xff, 0xD9};
89
90 if (jddp->PassThrough && jddp->PassThroughfn) {
91 (jddp->PassThroughfn)(jddp->device, (byte *)EOI, 2);
92 (jddp->PassThroughfn)(jddp->device, NULL, 0);
93 jddp->PassThrough = 0;
94 jddp->PassThroughfn = NULL;
95 }
96 }
97