]> Creatis software - gdcm.git/blob - src/gdcmjpeg/jdscale.c
ENH: Final -hopefully- change to jpeg lib. In order to match ITK structure, and be...
[gdcm.git] / src / gdcmjpeg / jdscale.c
1 /*
2  * jdscale.c
3  *
4  * Copyright (C) 1998, Thomas G. Lane.
5  * This file is part of the Independent JPEG Group's software.
6  * For conditions of distribution and use, see the accompanying README file.
7  *
8  * This file contains sample scaling for lossless JPEG.  This is a
9  * combination of upscaling the undifferenced sample by 2^Pt and downscaling
10  * the sample to fit into JSAMPLE.
11  */
12
13 #define JPEG_INTERNALS
14 #include "jinclude.h"
15 #include "jpeglib.h"
16 #include "jlossls.h"    /* Private declarations for lossless codec */
17
18
19 #ifdef D_LOSSLESS_SUPPORTED
20
21 /*
22  * Private scaler object for lossless decoding.
23  */
24
25 typedef struct {
26   int scale_factor;
27 } scaler;
28
29 typedef scaler * scaler_ptr;
30
31
32 /*
33  * Scalers for packing sample differences into JSAMPLEs.
34  */
35
36 METHODDEF(void)
37 simple_upscale(j_decompress_ptr cinfo,
38          JDIFFROW diff_buf, JSAMPROW output_buf,
39          JDIMENSION width)
40 {
41   j_lossless_d_ptr losslsd = (j_lossless_d_ptr) cinfo->codec;
42   scaler_ptr scaler = (scaler_ptr) losslsd->scaler_private;
43   int scale_factor = scaler->scale_factor;
44   unsigned int xindex;
45
46   for (xindex = 0; xindex < width; xindex++)
47     output_buf[xindex] = (JSAMPLE) (diff_buf[xindex] << scale_factor);
48 }
49
50 METHODDEF(void)
51 simple_downscale(j_decompress_ptr cinfo,
52      JDIFFROW diff_buf, JSAMPROW output_buf,
53      JDIMENSION width)
54 {
55   j_lossless_d_ptr losslsd = (j_lossless_d_ptr) cinfo->codec;
56   scaler_ptr scaler = (scaler_ptr) losslsd->scaler_private;
57   int scale_factor = scaler->scale_factor;
58   unsigned int xindex;
59   SHIFT_TEMPS
60
61   for (xindex = 0; xindex < width; xindex++)
62     output_buf[xindex] = (JSAMPLE) RIGHT_SHIFT(diff_buf[xindex], scale_factor);
63 }
64
65 METHODDEF(void)
66 noscale(j_decompress_ptr cinfo,
67   JDIFFROW diff_buf, JSAMPROW output_buf,
68   JDIMENSION width)
69 {
70   unsigned int xindex;
71   (void)cinfo;
72
73   for (xindex = 0; xindex < width; xindex++)
74     output_buf[xindex] = (JSAMPLE) diff_buf[xindex];
75 }
76
77
78 METHODDEF(void)
79 scaler_start_pass (j_decompress_ptr cinfo)
80 {
81   j_lossless_d_ptr losslsd = (j_lossless_d_ptr) cinfo->codec;
82   scaler_ptr scaler = (scaler_ptr) losslsd->scaler_private;
83   int downscale;
84
85   /*
86    * Downscale by the difference in the input vs. output precision.  If the
87    * output precision >= input precision, then do not downscale.
88    */
89   downscale = BITS_IN_JSAMPLE < cinfo->data_precision ?
90     cinfo->data_precision - BITS_IN_JSAMPLE : 0;
91
92   scaler->scale_factor = cinfo->Al - downscale;
93
94   /* Set scaler functions based on scale_factor (positive = left shift) */
95   if (scaler->scale_factor > 0)
96     losslsd->scaler_scale = simple_upscale;
97   else if (scaler->scale_factor < 0) {
98     scaler->scale_factor = -scaler->scale_factor;
99     losslsd->scaler_scale = simple_downscale;
100   }
101   else
102     losslsd->scaler_scale = noscale;
103 }
104
105
106 GLOBAL(void)
107 jinit_d_scaler (j_decompress_ptr cinfo)
108 {
109   j_lossless_d_ptr losslsd = (j_lossless_d_ptr) cinfo->codec;
110   scaler_ptr scaler;
111
112   scaler = (scaler_ptr)
113     (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
114         SIZEOF(scaler));
115   losslsd->scaler_private = (void *) scaler;
116   losslsd->scaler_start_pass = scaler_start_pass;
117 }
118
119 #endif /* D_LOSSLESS_SUPPORTED */
120