/src/dcmtk/dcmjpeg/libijg16/jdscale.c
Line | Count | Source |
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 "jinclude16.h" |
15 | | #include "jpeglib16.h" |
16 | | #include "jlossls16.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 | | const 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 scale = (scaler_ptr) losslsd->scaler_private; |
43 | | int scale_factor = scale->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 | | const 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 scale = (scaler_ptr) losslsd->scaler_private; |
57 | | int scale_factor = scale->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 | | const JDIFFROW diff_buf, JSAMPROW output_buf, |
68 | | JDIMENSION width) |
69 | | { |
70 | | (void)cinfo; |
71 | | unsigned int xindex; |
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 scale = (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 | | scale->scale_factor = cinfo->Al - downscale; |
93 | | |
94 | | /* Set scaler functions based on scale_factor (positive = left shift) */ |
95 | | if (scale->scale_factor > 0) |
96 | | losslsd->scaler_scale = simple_upscale; |
97 | | else if (scale->scale_factor < 0) { |
98 | | scale->scale_factor = -scale->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 | 0 | { |
109 | 0 | j_lossless_d_ptr losslsd = (j_lossless_d_ptr) cinfo->codec; |
110 | 0 | scaler_ptr scale; |
111 | |
|
112 | 0 | scale = (scaler_ptr) |
113 | 0 | (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, |
114 | 0 | SIZEOF(scaler)); |
115 | 0 | losslsd->scaler_private = (void *) scale; |
116 | 0 | losslsd->scaler_start_pass = scaler_start_pass; |
117 | 0 | } |
118 | | |
119 | | #endif /* D_LOSSLESS_SUPPORTED */ |
120 | | |