Coverage Report

Created: 2026-08-14 06:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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