Coverage Report

Created: 2026-03-12 08:02

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libjpeg-turbo.main/src/jdmrgext.c
Line
Count
Source
1
/*
2
 * jdmrgext.c
3
 *
4
 * This file was part of the Independent JPEG Group's software:
5
 * Copyright (C) 1994-1996, Thomas G. Lane.
6
 * libjpeg-turbo Modifications:
7
 * Copyright (C) 2011, 2015, 2020, 2022-2023, D. R. Commander.
8
 * For conditions of distribution and use, see the accompanying README.ijg
9
 * file.
10
 *
11
 * This file contains code for merged upsampling/color conversion.
12
 */
13
14
15
/* This file is included by jdmerge.c */
16
17
18
/*
19
 * Upsample and color convert for the case of 2:1 horizontal and 1:1 vertical.
20
 */
21
22
INLINE
23
LOCAL(void)
24
h2v1_merged_upsample_internal(j_decompress_ptr cinfo, _JSAMPIMAGE input_buf,
25
                              JDIMENSION in_row_group_ctr,
26
                              _JSAMPARRAY output_buf)
27
166k
{
28
166k
  my_merged_upsample_ptr upsample = (my_merged_upsample_ptr)cinfo->upsample;
29
166k
  register int y, cred, cgreen, cblue;
30
166k
  int cb, cr;
31
166k
  register _JSAMPROW outptr;
32
166k
  _JSAMPROW inptr0, inptr1, inptr2;
33
166k
  JDIMENSION col;
34
  /* copy these pointers into registers if possible */
35
166k
  register _JSAMPLE *range_limit = (_JSAMPLE *)cinfo->sample_range_limit;
36
166k
  int *Crrtab = upsample->Cr_r_tab;
37
166k
  int *Cbbtab = upsample->Cb_b_tab;
38
166k
  JLONG *Crgtab = upsample->Cr_g_tab;
39
166k
  JLONG *Cbgtab = upsample->Cb_g_tab;
40
166k
  SHIFT_TEMPS
41
42
166k
  inptr0 = input_buf[0][in_row_group_ctr];
43
166k
  inptr1 = input_buf[1][in_row_group_ctr];
44
166k
  inptr2 = input_buf[2][in_row_group_ctr];
45
166k
  outptr = output_buf[0];
46
  /* Loop for each pair of output pixels */
47
3.09M
  for (col = cinfo->output_width >> 1; col > 0; col--) {
48
    /* Do the chroma part of the calculation */
49
2.93M
    cb = *inptr1++;
50
2.93M
    cr = *inptr2++;
51
2.93M
    cred = Crrtab[cr];
52
2.93M
    cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
53
2.93M
    cblue = Cbbtab[cb];
54
    /* Fetch 2 Y values and emit 2 pixels */
55
2.93M
    y  = *inptr0++;
56
2.93M
    outptr[RGB_RED] =   range_limit[y + cred];
57
2.93M
    outptr[RGB_GREEN] = range_limit[y + cgreen];
58
2.93M
    outptr[RGB_BLUE] =  range_limit[y + cblue];
59
#ifdef RGB_ALPHA
60
0
    outptr[RGB_ALPHA] = _MAXJSAMPLE;
61
#endif
62
2.93M
    outptr += RGB_PIXELSIZE;
63
2.93M
    y  = *inptr0++;
64
2.93M
    outptr[RGB_RED] =   range_limit[y + cred];
65
2.93M
    outptr[RGB_GREEN] = range_limit[y + cgreen];
66
2.93M
    outptr[RGB_BLUE] =  range_limit[y + cblue];
67
#ifdef RGB_ALPHA
68
0
    outptr[RGB_ALPHA] = _MAXJSAMPLE;
69
#endif
70
2.93M
    outptr += RGB_PIXELSIZE;
71
2.93M
  }
72
  /* If image width is odd, do the last output column separately */
73
166k
  if (cinfo->output_width & 1) {
74
148k
    cb = *inptr1;
75
148k
    cr = *inptr2;
76
148k
    cred = Crrtab[cr];
77
148k
    cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
78
148k
    cblue = Cbbtab[cb];
79
148k
    y  = *inptr0;
80
148k
    outptr[RGB_RED] =   range_limit[y + cred];
81
148k
    outptr[RGB_GREEN] = range_limit[y + cgreen];
82
148k
    outptr[RGB_BLUE] =  range_limit[y + cblue];
83
#ifdef RGB_ALPHA
84
0
    outptr[RGB_ALPHA] = _MAXJSAMPLE;
85
#endif
86
148k
  }
87
166k
}
Unexecuted instantiation: jdmerge-8.c:extrgb_h2v1_merged_upsample_internal
Unexecuted instantiation: jdmerge-8.c:extrgbx_h2v1_merged_upsample_internal
Unexecuted instantiation: jdmerge-8.c:extbgr_h2v1_merged_upsample_internal
Unexecuted instantiation: jdmerge-8.c:extbgrx_h2v1_merged_upsample_internal
Unexecuted instantiation: jdmerge-8.c:extxbgr_h2v1_merged_upsample_internal
Unexecuted instantiation: jdmerge-8.c:extxrgb_h2v1_merged_upsample_internal
Unexecuted instantiation: jdmerge-8.c:h2v1_merged_upsample_internal
jdmerge-12.c:extrgb_h2v1_merged_upsample_internal
Line
Count
Source
27
166k
{
28
166k
  my_merged_upsample_ptr upsample = (my_merged_upsample_ptr)cinfo->upsample;
29
166k
  register int y, cred, cgreen, cblue;
30
166k
  int cb, cr;
31
166k
  register _JSAMPROW outptr;
32
166k
  _JSAMPROW inptr0, inptr1, inptr2;
33
166k
  JDIMENSION col;
34
  /* copy these pointers into registers if possible */
35
166k
  register _JSAMPLE *range_limit = (_JSAMPLE *)cinfo->sample_range_limit;
36
166k
  int *Crrtab = upsample->Cr_r_tab;
37
166k
  int *Cbbtab = upsample->Cb_b_tab;
38
166k
  JLONG *Crgtab = upsample->Cr_g_tab;
39
166k
  JLONG *Cbgtab = upsample->Cb_g_tab;
40
166k
  SHIFT_TEMPS
41
42
166k
  inptr0 = input_buf[0][in_row_group_ctr];
43
166k
  inptr1 = input_buf[1][in_row_group_ctr];
44
166k
  inptr2 = input_buf[2][in_row_group_ctr];
45
166k
  outptr = output_buf[0];
46
  /* Loop for each pair of output pixels */
47
3.09M
  for (col = cinfo->output_width >> 1; col > 0; col--) {
48
    /* Do the chroma part of the calculation */
49
2.93M
    cb = *inptr1++;
50
2.93M
    cr = *inptr2++;
51
2.93M
    cred = Crrtab[cr];
52
2.93M
    cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
53
2.93M
    cblue = Cbbtab[cb];
54
    /* Fetch 2 Y values and emit 2 pixels */
55
2.93M
    y  = *inptr0++;
56
2.93M
    outptr[RGB_RED] =   range_limit[y + cred];
57
2.93M
    outptr[RGB_GREEN] = range_limit[y + cgreen];
58
2.93M
    outptr[RGB_BLUE] =  range_limit[y + cblue];
59
#ifdef RGB_ALPHA
60
    outptr[RGB_ALPHA] = _MAXJSAMPLE;
61
#endif
62
2.93M
    outptr += RGB_PIXELSIZE;
63
2.93M
    y  = *inptr0++;
64
2.93M
    outptr[RGB_RED] =   range_limit[y + cred];
65
2.93M
    outptr[RGB_GREEN] = range_limit[y + cgreen];
66
2.93M
    outptr[RGB_BLUE] =  range_limit[y + cblue];
67
#ifdef RGB_ALPHA
68
    outptr[RGB_ALPHA] = _MAXJSAMPLE;
69
#endif
70
2.93M
    outptr += RGB_PIXELSIZE;
71
2.93M
  }
72
  /* If image width is odd, do the last output column separately */
73
166k
  if (cinfo->output_width & 1) {
74
148k
    cb = *inptr1;
75
148k
    cr = *inptr2;
76
148k
    cred = Crrtab[cr];
77
148k
    cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
78
148k
    cblue = Cbbtab[cb];
79
148k
    y  = *inptr0;
80
148k
    outptr[RGB_RED] =   range_limit[y + cred];
81
148k
    outptr[RGB_GREEN] = range_limit[y + cgreen];
82
148k
    outptr[RGB_BLUE] =  range_limit[y + cblue];
83
#ifdef RGB_ALPHA
84
    outptr[RGB_ALPHA] = _MAXJSAMPLE;
85
#endif
86
148k
  }
87
166k
}
Unexecuted instantiation: jdmerge-12.c:extrgbx_h2v1_merged_upsample_internal
Unexecuted instantiation: jdmerge-12.c:extbgr_h2v1_merged_upsample_internal
Unexecuted instantiation: jdmerge-12.c:extbgrx_h2v1_merged_upsample_internal
Unexecuted instantiation: jdmerge-12.c:extxbgr_h2v1_merged_upsample_internal
Unexecuted instantiation: jdmerge-12.c:extxrgb_h2v1_merged_upsample_internal
Unexecuted instantiation: jdmerge-12.c:h2v1_merged_upsample_internal
88
89
90
/*
91
 * Upsample and color convert for the case of 2:1 horizontal and 2:1 vertical.
92
 */
93
94
INLINE
95
LOCAL(void)
96
h2v2_merged_upsample_internal(j_decompress_ptr cinfo, _JSAMPIMAGE input_buf,
97
                              JDIMENSION in_row_group_ctr,
98
                              _JSAMPARRAY output_buf)
99
436k
{
100
436k
  my_merged_upsample_ptr upsample = (my_merged_upsample_ptr)cinfo->upsample;
101
436k
  register int y, cred, cgreen, cblue;
102
436k
  int cb, cr;
103
436k
  register _JSAMPROW outptr0, outptr1;
104
436k
  _JSAMPROW inptr00, inptr01, inptr1, inptr2;
105
436k
  JDIMENSION col;
106
  /* copy these pointers into registers if possible */
107
436k
  register _JSAMPLE *range_limit = (_JSAMPLE *)cinfo->sample_range_limit;
108
436k
  int *Crrtab = upsample->Cr_r_tab;
109
436k
  int *Cbbtab = upsample->Cb_b_tab;
110
436k
  JLONG *Crgtab = upsample->Cr_g_tab;
111
436k
  JLONG *Cbgtab = upsample->Cb_g_tab;
112
436k
  SHIFT_TEMPS
113
114
436k
  inptr00 = input_buf[0][in_row_group_ctr * 2];
115
436k
  inptr01 = input_buf[0][in_row_group_ctr * 2 + 1];
116
436k
  inptr1 = input_buf[1][in_row_group_ctr];
117
436k
  inptr2 = input_buf[2][in_row_group_ctr];
118
436k
  outptr0 = output_buf[0];
119
436k
  outptr1 = output_buf[1];
120
  /* Loop for each group of output pixels */
121
8.35M
  for (col = cinfo->output_width >> 1; col > 0; col--) {
122
    /* Do the chroma part of the calculation */
123
7.92M
    cb = *inptr1++;
124
7.92M
    cr = *inptr2++;
125
7.92M
    cred = Crrtab[cr];
126
7.92M
    cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
127
7.92M
    cblue = Cbbtab[cb];
128
    /* Fetch 4 Y values and emit 4 pixels */
129
7.92M
    y  = *inptr00++;
130
7.92M
    outptr0[RGB_RED] =   range_limit[y + cred];
131
7.92M
    outptr0[RGB_GREEN] = range_limit[y + cgreen];
132
7.92M
    outptr0[RGB_BLUE] =  range_limit[y + cblue];
133
#ifdef RGB_ALPHA
134
0
    outptr0[RGB_ALPHA] = _MAXJSAMPLE;
135
#endif
136
7.92M
    outptr0 += RGB_PIXELSIZE;
137
7.92M
    y  = *inptr00++;
138
7.92M
    outptr0[RGB_RED] =   range_limit[y + cred];
139
7.92M
    outptr0[RGB_GREEN] = range_limit[y + cgreen];
140
7.92M
    outptr0[RGB_BLUE] =  range_limit[y + cblue];
141
#ifdef RGB_ALPHA
142
0
    outptr0[RGB_ALPHA] = _MAXJSAMPLE;
143
#endif
144
7.92M
    outptr0 += RGB_PIXELSIZE;
145
7.92M
    y  = *inptr01++;
146
7.92M
    outptr1[RGB_RED] =   range_limit[y + cred];
147
7.92M
    outptr1[RGB_GREEN] = range_limit[y + cgreen];
148
7.92M
    outptr1[RGB_BLUE] =  range_limit[y + cblue];
149
#ifdef RGB_ALPHA
150
0
    outptr1[RGB_ALPHA] = _MAXJSAMPLE;
151
#endif
152
7.92M
    outptr1 += RGB_PIXELSIZE;
153
7.92M
    y  = *inptr01++;
154
7.92M
    outptr1[RGB_RED] =   range_limit[y + cred];
155
7.92M
    outptr1[RGB_GREEN] = range_limit[y + cgreen];
156
7.92M
    outptr1[RGB_BLUE] =  range_limit[y + cblue];
157
#ifdef RGB_ALPHA
158
0
    outptr1[RGB_ALPHA] = _MAXJSAMPLE;
159
#endif
160
7.92M
    outptr1 += RGB_PIXELSIZE;
161
7.92M
  }
162
  /* If image width is odd, do the last output column separately */
163
436k
  if (cinfo->output_width & 1) {
164
409k
    cb = *inptr1;
165
409k
    cr = *inptr2;
166
409k
    cred = Crrtab[cr];
167
409k
    cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
168
409k
    cblue = Cbbtab[cb];
169
409k
    y  = *inptr00;
170
409k
    outptr0[RGB_RED] =   range_limit[y + cred];
171
409k
    outptr0[RGB_GREEN] = range_limit[y + cgreen];
172
409k
    outptr0[RGB_BLUE] =  range_limit[y + cblue];
173
#ifdef RGB_ALPHA
174
0
    outptr0[RGB_ALPHA] = _MAXJSAMPLE;
175
#endif
176
409k
    y  = *inptr01;
177
409k
    outptr1[RGB_RED] =   range_limit[y + cred];
178
409k
    outptr1[RGB_GREEN] = range_limit[y + cgreen];
179
409k
    outptr1[RGB_BLUE] =  range_limit[y + cblue];
180
#ifdef RGB_ALPHA
181
0
    outptr1[RGB_ALPHA] = _MAXJSAMPLE;
182
#endif
183
409k
  }
184
436k
}
Unexecuted instantiation: jdmerge-8.c:extrgb_h2v2_merged_upsample_internal
Unexecuted instantiation: jdmerge-8.c:extrgbx_h2v2_merged_upsample_internal
Unexecuted instantiation: jdmerge-8.c:extbgr_h2v2_merged_upsample_internal
Unexecuted instantiation: jdmerge-8.c:extbgrx_h2v2_merged_upsample_internal
Unexecuted instantiation: jdmerge-8.c:extxbgr_h2v2_merged_upsample_internal
Unexecuted instantiation: jdmerge-8.c:extxrgb_h2v2_merged_upsample_internal
Unexecuted instantiation: jdmerge-8.c:h2v2_merged_upsample_internal
jdmerge-12.c:extrgb_h2v2_merged_upsample_internal
Line
Count
Source
99
436k
{
100
436k
  my_merged_upsample_ptr upsample = (my_merged_upsample_ptr)cinfo->upsample;
101
436k
  register int y, cred, cgreen, cblue;
102
436k
  int cb, cr;
103
436k
  register _JSAMPROW outptr0, outptr1;
104
436k
  _JSAMPROW inptr00, inptr01, inptr1, inptr2;
105
436k
  JDIMENSION col;
106
  /* copy these pointers into registers if possible */
107
436k
  register _JSAMPLE *range_limit = (_JSAMPLE *)cinfo->sample_range_limit;
108
436k
  int *Crrtab = upsample->Cr_r_tab;
109
436k
  int *Cbbtab = upsample->Cb_b_tab;
110
436k
  JLONG *Crgtab = upsample->Cr_g_tab;
111
436k
  JLONG *Cbgtab = upsample->Cb_g_tab;
112
436k
  SHIFT_TEMPS
113
114
436k
  inptr00 = input_buf[0][in_row_group_ctr * 2];
115
436k
  inptr01 = input_buf[0][in_row_group_ctr * 2 + 1];
116
436k
  inptr1 = input_buf[1][in_row_group_ctr];
117
436k
  inptr2 = input_buf[2][in_row_group_ctr];
118
436k
  outptr0 = output_buf[0];
119
436k
  outptr1 = output_buf[1];
120
  /* Loop for each group of output pixels */
121
8.35M
  for (col = cinfo->output_width >> 1; col > 0; col--) {
122
    /* Do the chroma part of the calculation */
123
7.92M
    cb = *inptr1++;
124
7.92M
    cr = *inptr2++;
125
7.92M
    cred = Crrtab[cr];
126
7.92M
    cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
127
7.92M
    cblue = Cbbtab[cb];
128
    /* Fetch 4 Y values and emit 4 pixels */
129
7.92M
    y  = *inptr00++;
130
7.92M
    outptr0[RGB_RED] =   range_limit[y + cred];
131
7.92M
    outptr0[RGB_GREEN] = range_limit[y + cgreen];
132
7.92M
    outptr0[RGB_BLUE] =  range_limit[y + cblue];
133
#ifdef RGB_ALPHA
134
    outptr0[RGB_ALPHA] = _MAXJSAMPLE;
135
#endif
136
7.92M
    outptr0 += RGB_PIXELSIZE;
137
7.92M
    y  = *inptr00++;
138
7.92M
    outptr0[RGB_RED] =   range_limit[y + cred];
139
7.92M
    outptr0[RGB_GREEN] = range_limit[y + cgreen];
140
7.92M
    outptr0[RGB_BLUE] =  range_limit[y + cblue];
141
#ifdef RGB_ALPHA
142
    outptr0[RGB_ALPHA] = _MAXJSAMPLE;
143
#endif
144
7.92M
    outptr0 += RGB_PIXELSIZE;
145
7.92M
    y  = *inptr01++;
146
7.92M
    outptr1[RGB_RED] =   range_limit[y + cred];
147
7.92M
    outptr1[RGB_GREEN] = range_limit[y + cgreen];
148
7.92M
    outptr1[RGB_BLUE] =  range_limit[y + cblue];
149
#ifdef RGB_ALPHA
150
    outptr1[RGB_ALPHA] = _MAXJSAMPLE;
151
#endif
152
7.92M
    outptr1 += RGB_PIXELSIZE;
153
7.92M
    y  = *inptr01++;
154
7.92M
    outptr1[RGB_RED] =   range_limit[y + cred];
155
7.92M
    outptr1[RGB_GREEN] = range_limit[y + cgreen];
156
7.92M
    outptr1[RGB_BLUE] =  range_limit[y + cblue];
157
#ifdef RGB_ALPHA
158
    outptr1[RGB_ALPHA] = _MAXJSAMPLE;
159
#endif
160
7.92M
    outptr1 += RGB_PIXELSIZE;
161
7.92M
  }
162
  /* If image width is odd, do the last output column separately */
163
436k
  if (cinfo->output_width & 1) {
164
409k
    cb = *inptr1;
165
409k
    cr = *inptr2;
166
409k
    cred = Crrtab[cr];
167
409k
    cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
168
409k
    cblue = Cbbtab[cb];
169
409k
    y  = *inptr00;
170
409k
    outptr0[RGB_RED] =   range_limit[y + cred];
171
409k
    outptr0[RGB_GREEN] = range_limit[y + cgreen];
172
409k
    outptr0[RGB_BLUE] =  range_limit[y + cblue];
173
#ifdef RGB_ALPHA
174
    outptr0[RGB_ALPHA] = _MAXJSAMPLE;
175
#endif
176
409k
    y  = *inptr01;
177
409k
    outptr1[RGB_RED] =   range_limit[y + cred];
178
409k
    outptr1[RGB_GREEN] = range_limit[y + cgreen];
179
409k
    outptr1[RGB_BLUE] =  range_limit[y + cblue];
180
#ifdef RGB_ALPHA
181
    outptr1[RGB_ALPHA] = _MAXJSAMPLE;
182
#endif
183
409k
  }
184
436k
}
Unexecuted instantiation: jdmerge-12.c:extrgbx_h2v2_merged_upsample_internal
Unexecuted instantiation: jdmerge-12.c:extbgr_h2v2_merged_upsample_internal
Unexecuted instantiation: jdmerge-12.c:extbgrx_h2v2_merged_upsample_internal
Unexecuted instantiation: jdmerge-12.c:extxbgr_h2v2_merged_upsample_internal
Unexecuted instantiation: jdmerge-12.c:extxrgb_h2v2_merged_upsample_internal
Unexecuted instantiation: jdmerge-12.c:h2v2_merged_upsample_internal