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