GCC Code Coverage Report


Directory: avs_core/
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 34.9% 157 / 0 / 450
Functions: 50.0% 5 / 0 / 10
Branches: 24.3% 35 / 0 / 144

filters/overlay/OF_difference.cpp
Line Branch Exec Source
1 // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al.
2 // http://avisynth.nl
3
4 // This program is free software; you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation; either version 2 of the License, or
7 // (at your option) any later version.
8 //
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with this program; if not, write to the Free Software
16 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit
17 // http://www.gnu.org/copyleft/gpl.html .
18 //
19 // Linking Avisynth statically or dynamically with other modules is making a
20 // combined work based on Avisynth. Thus, the terms and conditions of the GNU
21 // General Public License cover the whole combination.
22 //
23 // As a special exception, the copyright holders of Avisynth give you
24 // permission to link Avisynth with independent modules that communicate with
25 // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license
26 // terms of these independent modules, and to copy and distribute the
27 // resulting combined work under terms of your choice, provided that
28 // every copy of the combined work is accompanied by a complete copy of
29 // the source code of Avisynth (the version of Avisynth used to produce the
30 // combined work), being distributed under the terms of the GNU General
31 // Public License plus this exception. An independent module is a module
32 // which is not derived from or based on Avisynth, such as 3rd-party filters,
33 // import and export plugins, or graphical user interfaces.
34
35 // Overlay (c) 2003, 2004 by Klaus Post
36
37 #include "overlayfunctions.h"
38 #include "blend_common.h"
39 #include <cmath>
40 #include <avs/minmax.h>
41
42 #include <stdint.h>
43 #include <type_traits>
44
45 1 void OL_DifferenceImage::DoBlendImageMask(ImageOverlayInternal* base, ImageOverlayInternal* overlay, ImageOverlayInternal* mask) {
46 1 const bool fullOpacity = (opacity_f == 1.0f); // becomes a template switch
47
1/2
✓ Branch 2 → 3 taken 1 time.
✗ Branch 2 → 6 not taken.
1 if (bits_per_pixel == 8) {
48
1/2
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 5 not taken.
1 if (fullOpacity) BlendImageMask<uint8_t, true, true>(base, overlay, mask);
49 else BlendImageMask<uint8_t, true, false>(base, overlay, mask);
50 } else if(bits_per_pixel <= 16) {
51 if (fullOpacity) BlendImageMask<uint16_t, true, true>(base, overlay, mask);
52 else BlendImageMask<uint16_t, true, false>(base, overlay, mask);
53 }
54 //else if(bits_per_pixel == 32)
55 // BlendImageMask<float>(base, overlay, mask);
56 1 }
57
58 3 void OL_DifferenceImage::DoBlendImage(ImageOverlayInternal* base, ImageOverlayInternal* overlay) {
59 3 const bool fullOpacity = (opacity_f == 1.0f); // becomes a template switch
60
1/2
✓ Branch 2 → 3 taken 3 times.
✗ Branch 2 → 6 not taken.
3 if (bits_per_pixel == 8) {
61
2/2
✓ Branch 3 → 4 taken 2 times.
✓ Branch 3 → 5 taken 1 time.
3 if (fullOpacity) BlendImageMask<uint8_t, false, true>(base, overlay, nullptr);
62 1 else BlendImageMask<uint8_t, false, false>(base, overlay, nullptr);
63 } else if(bits_per_pixel <= 16) {
64 if (fullOpacity) BlendImageMask<uint16_t, false, true>(base, overlay, nullptr);
65 else BlendImageMask<uint16_t, false, false>(base, overlay, nullptr);
66 }
67 //else if(bits_per_pixel == 32)
68 // BlendImage<float>(base, overlay);
69 3 }
70
71 // no float support
72 template<typename pixel_t, bool maskMode, bool fullOpacity>
73 4 void OL_DifferenceImage::BlendImageMask(ImageOverlayInternal* base, ImageOverlayInternal* overlay, ImageOverlayInternal* mask) {
74 4 pixel_t* baseY = reinterpret_cast<pixel_t*>(base->GetPtr(PLANAR_Y));
75 4 pixel_t* baseU = reinterpret_cast<pixel_t*>(base->GetPtr(PLANAR_U));
76 4 pixel_t* baseV = reinterpret_cast<pixel_t*>(base->GetPtr(PLANAR_V));
77
78 4 pixel_t* ovY = reinterpret_cast<pixel_t*>(overlay->GetPtr(PLANAR_Y));
79 4 pixel_t* ovU = reinterpret_cast<pixel_t*>(overlay->GetPtr(PLANAR_U));
80 4 pixel_t* ovV = reinterpret_cast<pixel_t*>(overlay->GetPtr(PLANAR_V));
81
82 pixel_t* maskY;
83 pixel_t* maskU;
84 pixel_t* maskV;
85 if constexpr (maskMode) {
86 1 maskY = reinterpret_cast<pixel_t*>(mask->GetPtr(PLANAR_Y));
87 1 maskU = reinterpret_cast<pixel_t*>(mask->GetPtr(PLANAR_U));
88 1 maskV = reinterpret_cast<pixel_t*>(mask->GetPtr(PLANAR_V));
89 }
90 else {
91 3 maskY = nullptr;
92 3 maskU = nullptr;
93 3 maskV = nullptr;
94 }
95
96 4 const int half_pixel_value = (sizeof(pixel_t) == 1) ? 128 : (1 << (bits_per_pixel - 1));
97 4 const int max_pixel_value = (sizeof(pixel_t) == 1) ? 255 : (1 << bits_per_pixel) - 1;
98 4 const int pixel_range = max_pixel_value + 1;
99 4 const int SHIFT = (sizeof(pixel_t) == 1) ? 5 : 5 + (bits_per_pixel - 8);
100 4 const int over32 = (1 << SHIFT); // 32
101 4 const int basepitch = (base->pitch) / sizeof(pixel_t);
102 4 const int overlaypitch = (overlay->pitch) / sizeof(pixel_t);
103 int maskpitch;
104 if constexpr (maskMode) {
105 1 maskpitch = (mask->pitch) / sizeof(pixel_t);
106 }
107 else {
108 3 maskpitch = 0;
109 }
110
111 // "Difference" formula: base+ov-2*min(base,ov) == abs(base-ov)+half_pixel_value.
112 4 const MagicDiv magic = get_magic_div(bits_per_pixel);
113
114 // fullOpacity is a template parameter (based on opacity_f==1.0f check)
115 // Formulas below containing opacity_i are hopefully compiler optimized.
116 // opacity_i on the max_pixel_value scale gives finer opacity granularity at >8-bit
117 // than the old fixed 0..256 scale.
118 4 const int opacity_i = fullOpacity ? max_pixel_value : (int)(opacity_f * max_pixel_value + 0.5f);
119 4 const int rounder = max_pixel_value / 2;
120
121 4 int w = base->w();
122 4 int h = base->h();
123
124
6/16
void OL_DifferenceImage::BlendImageMask<unsigned char, false, false>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✓ Branch 46 → 12 taken 3 times.
✓ Branch 46 → 47 taken 1 time.
void OL_DifferenceImage::BlendImageMask<unsigned char, false, true>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✓ Branch 46 → 12 taken 5 times.
✓ Branch 46 → 47 taken 2 times.
void OL_DifferenceImage::BlendImageMask<unsigned char, true, false>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 55 → 15 not taken.
✗ Branch 55 → 56 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned char, true, true>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✓ Branch 49 → 15 taken 2 times.
✓ Branch 49 → 50 taken 1 time.
void OL_DifferenceImage::BlendImageMask<unsigned short, false, false>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 46 → 12 not taken.
✗ Branch 46 → 47 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned short, false, true>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 46 → 12 not taken.
✗ Branch 46 → 47 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned short, true, false>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 55 → 15 not taken.
✗ Branch 55 → 56 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned short, true, true>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 49 → 15 not taken.
✗ Branch 49 → 50 not taken.
14 for (int y = 0; y < h; y++) {
125
6/16
void OL_DifferenceImage::BlendImageMask<unsigned char, false, false>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✓ Branch 44 → 13 taken 15 times.
✓ Branch 44 → 45 taken 3 times.
void OL_DifferenceImage::BlendImageMask<unsigned char, false, true>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✓ Branch 44 → 13 taken 23 times.
✓ Branch 44 → 45 taken 5 times.
void OL_DifferenceImage::BlendImageMask<unsigned char, true, false>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 53 → 16 not taken.
✗ Branch 53 → 54 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned char, true, true>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✓ Branch 47 → 16 taken 8 times.
✓ Branch 47 → 48 taken 2 times.
void OL_DifferenceImage::BlendImageMask<unsigned short, false, false>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 44 → 13 not taken.
✗ Branch 44 → 45 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned short, false, true>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 44 → 13 not taken.
✗ Branch 44 → 45 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned short, true, false>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 53 → 16 not taken.
✗ Branch 53 → 54 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned short, true, true>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 47 → 16 not taken.
✗ Branch 47 → 48 not taken.
56 for (int x = 0; x < w; x++) {
126 46 int Y = abs((int)baseY[x] - (int)ovY[x]) + half_pixel_value;
127 46 int U = abs((int)baseU[x] - (int)ovU[x]) + half_pixel_value;
128 46 int V = abs((int)baseV[x] - (int)ovV[x]) + half_pixel_value;
129 if constexpr (!(fullOpacity && !maskMode)) {
130 // eff on the max_pixel_value scale; mask == max_pixel_value when absent.
131 int64_t effY, effU, effV; // effective masks/opacity/their combinations
132 if constexpr (maskMode) {
133 if constexpr (fullOpacity) {
134 8 effY = maskY[x];
135 8 effU = maskU[x];
136 8 effV = maskV[x];
137 }
138 else {
139 effY = magic_div_rt<pixel_t>((uint32_t)maskY[x] * (uint32_t)opacity_i + rounder, magic);
140 effU = magic_div_rt<pixel_t>((uint32_t)maskU[x] * (uint32_t)opacity_i + rounder, magic);
141 effV = magic_div_rt<pixel_t>((uint32_t)maskV[x] * (uint32_t)opacity_i + rounder, magic);
142 }
143 }
144 else {
145 15 effY = opacity_i;
146 15 effU = opacity_i;
147 15 effV = opacity_i;
148 }
149 // Y/U/V can exceed max_pixel_value (abs(diff)+half, up to ~1.5*max_pixel_value)
150 // Must stay at int64_t, but no sign problems here unlike at OF_softhardlight
151 23 Y = (int)(((int64_t)Y * effY + (max_pixel_value - effY) * (int64_t)baseY[x] + rounder) / max_pixel_value);
152 23 U = (int)(((int64_t)U * effU + (max_pixel_value - effU) * (int64_t)baseU[x] + rounder) / max_pixel_value);
153 23 V = (int)(((int64_t)V * effV + (max_pixel_value - effV) * (int64_t)baseV[x] + rounder) / max_pixel_value);
154 }
155
5/16
void OL_DifferenceImage::BlendImageMask<unsigned char, false, false>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✓ Branch 13 → 14 taken 3 times.
✓ Branch 13 → 20 taken 12 times.
void OL_DifferenceImage::BlendImageMask<unsigned char, false, true>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✓ Branch 13 → 14 taken 20 times.
✓ Branch 13 → 20 taken 3 times.
void OL_DifferenceImage::BlendImageMask<unsigned char, true, false>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 29 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned char, true, true>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✓ Branch 16 → 17 taken 8 times.
✗ Branch 16 → 23 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned short, false, false>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 20 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned short, false, true>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 20 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned short, true, false>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 29 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned short, true, true>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 23 not taken.
46 if (Y > max_pixel_value) { // Apply overbrightness to UV
156
4/16
void OL_DifferenceImage::BlendImageMask<unsigned char, false, false>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✓ Branch 14 → 15 taken 3 times.
✗ Branch 14 → 16 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned char, false, true>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✓ Branch 14 → 15 taken 6 times.
✓ Branch 14 → 16 taken 14 times.
void OL_DifferenceImage::BlendImageMask<unsigned char, true, false>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned char, true, true>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 19 taken 8 times.
void OL_DifferenceImage::BlendImageMask<unsigned short, false, false>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 16 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned short, false, true>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 16 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned short, true, false>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned short, true, true>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 19 not taken.
31 int multiplier = max(0, pixel_range + over32 - Y); // 0 to 32
157 31 U = ((U * (multiplier)) + (half_pixel_value * (over32 - multiplier))) >> SHIFT;
158 31 V = ((V * (multiplier)) + (half_pixel_value * (over32 - multiplier))) >> SHIFT;
159 31 Y = max_pixel_value;
160 }
161
2/16
void OL_DifferenceImage::BlendImageMask<unsigned char, false, false>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 27 taken 12 times.
void OL_DifferenceImage::BlendImageMask<unsigned char, false, true>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 27 taken 3 times.
void OL_DifferenceImage::BlendImageMask<unsigned char, true, false>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 36 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned char, true, true>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 30 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned short, false, false>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 27 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned short, false, true>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 27 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned short, true, false>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 36 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned short, true, true>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 30 not taken.
15 else if (Y < 0) { // Apply superdark to UV
162 int multiplier = min(-Y, over32); // 0 to 32
163 U = ((U * (over32 - multiplier)) + (half_pixel_value * (multiplier))) >> SHIFT;
164 V = ((V * (over32 - multiplier)) + (half_pixel_value * (multiplier))) >> SHIFT;
165 Y = 0;
166 }
167
3/16
void OL_DifferenceImage::BlendImageMask<unsigned char, false, false>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 27 → 28 not taken.
✓ Branch 27 → 29 taken 15 times.
void OL_DifferenceImage::BlendImageMask<unsigned char, false, true>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 27 → 28 not taken.
✓ Branch 27 → 29 taken 23 times.
void OL_DifferenceImage::BlendImageMask<unsigned char, true, false>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 36 → 37 not taken.
✗ Branch 36 → 38 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned char, true, true>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 32 taken 8 times.
void OL_DifferenceImage::BlendImageMask<unsigned short, false, false>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 27 → 28 not taken.
✗ Branch 27 → 29 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned short, false, true>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 27 → 28 not taken.
✗ Branch 27 → 29 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned short, true, false>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 36 → 37 not taken.
✗ Branch 36 → 38 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned short, true, true>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 30 → 31 not taken.
✗ Branch 30 → 32 not taken.
46 baseY[x] = (pixel_t)Y;
168
4/16
void OL_DifferenceImage::BlendImageMask<unsigned char, false, false>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✓ Branch 35 → 36 taken 3 times.
✓ Branch 35 → 37 taken 12 times.
void OL_DifferenceImage::BlendImageMask<unsigned char, false, true>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 35 → 36 not taken.
✓ Branch 35 → 37 taken 23 times.
void OL_DifferenceImage::BlendImageMask<unsigned char, true, false>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 44 → 45 not taken.
✗ Branch 44 → 46 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned char, true, true>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 38 → 39 not taken.
✓ Branch 38 → 40 taken 8 times.
void OL_DifferenceImage::BlendImageMask<unsigned short, false, false>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 35 → 36 not taken.
✗ Branch 35 → 37 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned short, false, true>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 35 → 36 not taken.
✗ Branch 35 → 37 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned short, true, false>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 44 → 45 not taken.
✗ Branch 44 → 46 not taken.
void OL_DifferenceImage::BlendImageMask<unsigned short, true, true>(ImageOverlayInternal*, ImageOverlayInternal*, ImageOverlayInternal*):
✗ Branch 38 → 39 not taken.
✗ Branch 38 → 40 not taken.
46 baseU[x] = (pixel_t)clamp(U, 0, max_pixel_value);
169 46 baseV[x] = (pixel_t)clamp(V, 0, max_pixel_value);
170 }
171 10 baseY += basepitch;
172 10 baseU += basepitch;
173 10 baseV += basepitch;
174
175 10 ovY += overlaypitch;
176 10 ovU += overlaypitch;
177 10 ovV += overlaypitch;
178
179 if constexpr (maskMode) {
180 2 maskY += maskpitch;
181 2 maskU += maskpitch;
182 2 maskV += maskpitch;
183 }
184 }
185 4 }
186
187