GCC Code Coverage Report


Directory: avs_core/
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 28.6% 428 / 0 / 1496
Functions: 33.3% 8 / 0 / 24
Branches: 24.6% 296 / 0 / 1201

filters/convolution.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
36 #include <cstdint>
37 #include <cstdlib>
38 #include <cmath>
39
40 // Avisynth filter: general convolution
41 // by Richard Berg (avisynth-dev@richardberg.net)
42 // adapted from General Convolution 3D for VDub by Gunnar Thalin (guth@home.se)
43 // avs+: all color spaces, 8-32 bits, 7x7, 9x9, luma/chroma/alpha option
44
45 #include "convolution.h"
46 #include "../core/internal.h"
47
48 #include <regex>
49 #include <iostream>
50 #include <iterator>
51 #include <string>
52
53 /********************************************************************
54 ***** Declare index of new filters for Avisynth's filter engine *****
55 ********************************************************************/
56
57 extern const AVSFunction Convolution_filters[] = {
58 // Please when adding parameters try not to break the legacy order - IanB July 2004
59 { "GeneralConvolution", BUILTIN_FUNC_PREFIX, "c[bias]f[matrix]s[divisor]f[auto]b[luma]b[chroma]b[alpha]b", GeneralConvolution::Create },
60 /**
61 * GeneralConvolution(PClip clip, int divisor=1, int bias=0, string matrix)
62 * clip = input video
63 * bias = additive bias to adjust the total output intensity
64 * matrix = the kernel (3x3 or 5x5). any kind of whitespace is ok, see example
65 * divisor = divides the output of the convolution (calculated before adding bias)
66 * auto = automaticly scale the result based on the sum of the matrix elements
67 * luma = apply on luma (if applicable) avs+
68 * chroma = apply on chroma (if applicable) avs+
69 * alpha = apply on alpha (if applicable e.g. RGB32 converted to planar RGBA) avs+
70 *
71 * clip.GeneralConvolution(matrix = "1 2 3
72 * 4 5 6
73 * 7 8 9")
74 **/
75
76 { 0 }
77 };
78
79 template<int mi, int ma>
80 AVS_FORCEINLINE int static_clip(int value) {
81 if (value < mi) {
82 return mi;
83 }
84 if (value > ma) {
85 return ma;
86 }
87 return value;
88 }
89
90 /*****************************************
91 ****** General Convolution 2D filter *****
92 *****************************************/
93
94 // safe_int_t is int or int64_t. Int is faster but for larger bitdepth int32 overflows
95 template<typename pixel_t, int matrix_size, typename safe_int_t>
96 5 static void do_conv_integer(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel)
97 {
98 5 pixel_t *dstp = reinterpret_cast<pixel_t *>(dstp8);
99 5 const pixel_t *srcp = reinterpret_cast<const pixel_t *>(srcp8);
100 5 dst_pitch /= sizeof(pixel_t);
101 5 src_pitch /= sizeof(pixel_t);
102
103 5 constexpr int limit = (matrix_size - 1) / 2; // +-1, +-2, +-3
104 5 const int max_pixel_value = (1 << bits_per_pixel) - 1;
105
106 5 std::vector<const pixel_t*> src_lineptrs;
107
3/32
void do_conv_integer<unsigned char, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 3 → 4 taken 3 times.
✗ Branch 3 → 71 not taken.
void do_conv_integer<unsigned char, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 71 not taken.
void do_conv_integer<unsigned char, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 71 not taken.
void do_conv_integer<unsigned char, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 71 not taken.
void do_conv_integer<unsigned char, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 74 not taken.
void do_conv_integer<unsigned char, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 74 not taken.
void do_conv_integer<unsigned char, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 74 not taken.
void do_conv_integer<unsigned char, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 74 not taken.
void do_conv_integer<unsigned short, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 71 not taken.
void do_conv_integer<unsigned short, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 71 not taken.
void do_conv_integer<unsigned short, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 71 not taken.
void do_conv_integer<unsigned short, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 71 not taken.
void do_conv_integer<unsigned short, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 74 not taken.
void do_conv_integer<unsigned short, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 74 not taken.
void do_conv_integer<unsigned short, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 74 not taken.
void do_conv_integer<unsigned short, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 74 not taken.
5 src_lineptrs.resize(limit + height + limit);
108
109 // prefill line pointers
110
6/32
void do_conv_integer<unsigned char, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 14 → 5 taken 23 times.
✓ Branch 14 → 15 taken 3 times.
void do_conv_integer<unsigned char, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 14 → 5 not taken.
✗ Branch 14 → 15 not taken.
void do_conv_integer<unsigned char, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 14 → 5 not taken.
✗ Branch 14 → 15 not taken.
void do_conv_integer<unsigned char, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 14 → 5 not taken.
✗ Branch 14 → 15 not taken.
void do_conv_integer<unsigned char, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 14 → 5 not taken.
✗ Branch 14 → 15 not taken.
void do_conv_integer<unsigned char, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 14 → 5 not taken.
✗ Branch 14 → 15 not taken.
void do_conv_integer<unsigned char, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 14 → 5 not taken.
✗ Branch 14 → 15 not taken.
void do_conv_integer<unsigned char, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 14 → 5 not taken.
✗ Branch 14 → 15 not taken.
void do_conv_integer<unsigned short, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 14 → 5 not taken.
✗ Branch 14 → 15 not taken.
void do_conv_integer<unsigned short, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 14 → 5 not taken.
✗ Branch 14 → 15 not taken.
void do_conv_integer<unsigned short, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 14 → 5 taken 8 times.
✓ Branch 14 → 15 taken 1 time.
void do_conv_integer<unsigned short, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 14 → 5 not taken.
✗ Branch 14 → 15 not taken.
void do_conv_integer<unsigned short, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 14 → 5 not taken.
✗ Branch 14 → 15 not taken.
void do_conv_integer<unsigned short, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 14 → 5 taken 12 times.
✓ Branch 14 → 15 taken 1 time.
void do_conv_integer<unsigned short, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 14 → 5 not taken.
✗ Branch 14 → 15 not taken.
void do_conv_integer<unsigned short, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 14 → 5 not taken.
✗ Branch 14 → 15 not taken.
48 for (int y = -limit; y < height + limit; y++)
111 {
112
6/32
void do_conv_integer<unsigned char, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 5 → 6 taken 3 times.
✓ Branch 5 → 8 taken 20 times.
void do_conv_integer<unsigned char, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 8 not taken.
void do_conv_integer<unsigned char, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 8 not taken.
void do_conv_integer<unsigned char, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 8 not taken.
void do_conv_integer<unsigned char, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 8 not taken.
void do_conv_integer<unsigned char, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 8 not taken.
void do_conv_integer<unsigned char, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 8 not taken.
void do_conv_integer<unsigned char, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 8 not taken.
void do_conv_integer<unsigned short, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 8 not taken.
void do_conv_integer<unsigned short, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 8 not taken.
void do_conv_integer<unsigned short, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 5 → 6 taken 2 times.
✓ Branch 5 → 8 taken 6 times.
void do_conv_integer<unsigned short, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 8 not taken.
void do_conv_integer<unsigned short, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 8 not taken.
void do_conv_integer<unsigned short, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 5 → 6 taken 3 times.
✓ Branch 5 → 8 taken 9 times.
void do_conv_integer<unsigned short, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 8 not taken.
void do_conv_integer<unsigned short, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 8 not taken.
43 if (y < 0)
113 8 src_lineptrs[y + limit] = srcp + src_pitch * 0; // duplicate top
114
6/32
void do_conv_integer<unsigned char, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 8 → 9 taken 17 times.
✓ Branch 8 → 11 taken 3 times.
void do_conv_integer<unsigned char, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 11 not taken.
void do_conv_integer<unsigned char, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 11 not taken.
void do_conv_integer<unsigned char, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 11 not taken.
void do_conv_integer<unsigned char, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 11 not taken.
void do_conv_integer<unsigned char, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 11 not taken.
void do_conv_integer<unsigned char, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 11 not taken.
void do_conv_integer<unsigned char, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 11 not taken.
void do_conv_integer<unsigned short, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 11 not taken.
void do_conv_integer<unsigned short, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 11 not taken.
void do_conv_integer<unsigned short, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 8 → 9 taken 4 times.
✓ Branch 8 → 11 taken 2 times.
void do_conv_integer<unsigned short, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 11 not taken.
void do_conv_integer<unsigned short, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 11 not taken.
void do_conv_integer<unsigned short, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 8 → 9 taken 6 times.
✓ Branch 8 → 11 taken 3 times.
void do_conv_integer<unsigned short, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 11 not taken.
void do_conv_integer<unsigned short, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 11 not taken.
35 else if (y < height)
115 27 src_lineptrs[y + limit] = srcp + src_pitch * y;
116 else
117 8 src_lineptrs[y + limit] = srcp + src_pitch * (height - 1); // duplicate bottom
118 }
119
120
3/32
void do_conv_integer<unsigned char, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 17 → 18 taken 3 times.
✗ Branch 17 → 68 not taken.
void do_conv_integer<unsigned char, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 68 not taken.
void do_conv_integer<unsigned char, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 68 not taken.
void do_conv_integer<unsigned char, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 68 not taken.
void do_conv_integer<unsigned char, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 71 not taken.
void do_conv_integer<unsigned char, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 71 not taken.
void do_conv_integer<unsigned char, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 71 not taken.
void do_conv_integer<unsigned char, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 71 not taken.
void do_conv_integer<unsigned short, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 68 not taken.
void do_conv_integer<unsigned short, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 68 not taken.
void do_conv_integer<unsigned short, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 17 → 18 taken 1 time.
✗ Branch 17 → 68 not taken.
void do_conv_integer<unsigned short, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 68 not taken.
void do_conv_integer<unsigned short, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 71 not taken.
void do_conv_integer<unsigned short, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 17 → 18 taken 1 time.
✗ Branch 17 → 71 not taken.
void do_conv_integer<unsigned short, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 71 not taken.
void do_conv_integer<unsigned short, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 71 not taken.
5 std::vector<const pixel_t *> src_current_lineptrs(matrix_size); // +/-limit => 2*limit + 1
121
122 5 constexpr safe_int_t rounder = 1 << (20 - 1);
123
124
6/32
void do_conv_integer<unsigned char, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 64 → 20 taken 17 times.
✓ Branch 64 → 65 taken 3 times.
void do_conv_integer<unsigned char, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 64 → 20 not taken.
✗ Branch 64 → 65 not taken.
void do_conv_integer<unsigned char, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 64 → 20 not taken.
✗ Branch 64 → 65 not taken.
void do_conv_integer<unsigned char, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 64 → 20 not taken.
✗ Branch 64 → 65 not taken.
void do_conv_integer<unsigned char, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 67 → 20 not taken.
✗ Branch 67 → 68 not taken.
void do_conv_integer<unsigned char, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 67 → 20 not taken.
✗ Branch 67 → 68 not taken.
void do_conv_integer<unsigned char, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 67 → 20 not taken.
✗ Branch 67 → 68 not taken.
void do_conv_integer<unsigned char, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 67 → 20 not taken.
✗ Branch 67 → 68 not taken.
void do_conv_integer<unsigned short, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 64 → 20 not taken.
✗ Branch 64 → 65 not taken.
void do_conv_integer<unsigned short, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 64 → 20 not taken.
✗ Branch 64 → 65 not taken.
void do_conv_integer<unsigned short, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 64 → 20 taken 4 times.
✓ Branch 64 → 65 taken 1 time.
void do_conv_integer<unsigned short, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 64 → 20 not taken.
✗ Branch 64 → 65 not taken.
void do_conv_integer<unsigned short, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 67 → 20 not taken.
✗ Branch 67 → 68 not taken.
void do_conv_integer<unsigned short, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 67 → 20 taken 6 times.
✓ Branch 67 → 68 taken 1 time.
void do_conv_integer<unsigned short, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 67 → 20 not taken.
✗ Branch 67 → 68 not taken.
void do_conv_integer<unsigned short, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 67 → 20 not taken.
✗ Branch 67 → 68 not taken.
32 for (int y = 0; y < height; ++y) {
125 // prefill current vertical line pointers
126
6/32
void do_conv_integer<unsigned char, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 24 → 21 taken 51 times.
✓ Branch 24 → 25 taken 17 times.
void do_conv_integer<unsigned char, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 24 → 21 not taken.
✗ Branch 24 → 25 not taken.
void do_conv_integer<unsigned char, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 24 → 21 not taken.
✗ Branch 24 → 25 not taken.
void do_conv_integer<unsigned char, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 24 → 21 not taken.
✗ Branch 24 → 25 not taken.
void do_conv_integer<unsigned char, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 24 → 21 not taken.
✗ Branch 24 → 25 not taken.
void do_conv_integer<unsigned char, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 24 → 21 not taken.
✗ Branch 24 → 25 not taken.
void do_conv_integer<unsigned char, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 24 → 21 not taken.
✗ Branch 24 → 25 not taken.
void do_conv_integer<unsigned char, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 24 → 21 not taken.
✗ Branch 24 → 25 not taken.
void do_conv_integer<unsigned short, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 24 → 21 not taken.
✗ Branch 24 → 25 not taken.
void do_conv_integer<unsigned short, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 24 → 21 not taken.
✗ Branch 24 → 25 not taken.
void do_conv_integer<unsigned short, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 24 → 21 taken 20 times.
✓ Branch 24 → 25 taken 4 times.
void do_conv_integer<unsigned short, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 24 → 21 not taken.
✗ Branch 24 → 25 not taken.
void do_conv_integer<unsigned short, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 24 → 21 not taken.
✗ Branch 24 → 25 not taken.
void do_conv_integer<unsigned short, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 24 → 21 taken 42 times.
✓ Branch 24 → 25 taken 6 times.
void do_conv_integer<unsigned short, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 24 → 21 not taken.
✗ Branch 24 → 25 not taken.
void do_conv_integer<unsigned short, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 24 → 21 not taken.
✗ Branch 24 → 25 not taken.
140 for (int yy = -limit; yy <= limit; yy++) {
127 113 src_current_lineptrs[yy + limit] = src_lineptrs[limit + (y + yy)];
128 }
129 27 int x = 0;
130 // left area: check valid x
131
6/32
void do_conv_integer<unsigned char, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 39 → 26 taken 17 times.
✓ Branch 39 → 40 taken 17 times.
void do_conv_integer<unsigned char, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 39 → 26 not taken.
✗ Branch 39 → 40 not taken.
void do_conv_integer<unsigned char, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 39 → 26 not taken.
✗ Branch 39 → 40 not taken.
void do_conv_integer<unsigned char, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 39 → 26 not taken.
✗ Branch 39 → 40 not taken.
void do_conv_integer<unsigned char, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 39 → 26 not taken.
✗ Branch 39 → 40 not taken.
void do_conv_integer<unsigned char, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 39 → 26 not taken.
✗ Branch 39 → 40 not taken.
void do_conv_integer<unsigned char, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 39 → 26 not taken.
✗ Branch 39 → 40 not taken.
void do_conv_integer<unsigned char, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 39 → 26 not taken.
✗ Branch 39 → 40 not taken.
void do_conv_integer<unsigned short, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 39 → 26 not taken.
✗ Branch 39 → 40 not taken.
void do_conv_integer<unsigned short, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 39 → 26 not taken.
✗ Branch 39 → 40 not taken.
void do_conv_integer<unsigned short, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 39 → 26 taken 8 times.
✓ Branch 39 → 40 taken 4 times.
void do_conv_integer<unsigned short, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 39 → 26 not taken.
✗ Branch 39 → 40 not taken.
void do_conv_integer<unsigned short, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 39 → 26 not taken.
✗ Branch 39 → 40 not taken.
void do_conv_integer<unsigned short, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 39 → 26 taken 18 times.
✓ Branch 39 → 40 taken 6 times.
void do_conv_integer<unsigned short, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 39 → 26 not taken.
✗ Branch 39 → 40 not taken.
void do_conv_integer<unsigned short, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 39 → 26 not taken.
✗ Branch 39 → 40 not taken.
70 for (; x < limit; x++)
132 {
133 43 safe_int_t sum = 0; // int or int64_t!!!
134 43 const int *current_matrix = matrix + limit; // center of the matrix line
135
6/32
void do_conv_integer<unsigned char, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 36 → 27 taken 51 times.
✓ Branch 36 → 37 taken 17 times.
void do_conv_integer<unsigned char, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 36 → 27 not taken.
✗ Branch 36 → 37 not taken.
void do_conv_integer<unsigned char, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 36 → 27 not taken.
✗ Branch 36 → 37 not taken.
void do_conv_integer<unsigned char, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 36 → 27 not taken.
✗ Branch 36 → 37 not taken.
void do_conv_integer<unsigned char, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 36 → 27 not taken.
✗ Branch 36 → 37 not taken.
void do_conv_integer<unsigned char, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 36 → 27 not taken.
✗ Branch 36 → 37 not taken.
void do_conv_integer<unsigned char, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 36 → 27 not taken.
✗ Branch 36 → 37 not taken.
void do_conv_integer<unsigned char, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 36 → 27 not taken.
✗ Branch 36 → 37 not taken.
void do_conv_integer<unsigned short, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 36 → 27 not taken.
✗ Branch 36 → 37 not taken.
void do_conv_integer<unsigned short, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 36 → 27 not taken.
✗ Branch 36 → 37 not taken.
void do_conv_integer<unsigned short, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 36 → 27 taken 40 times.
✓ Branch 36 → 37 taken 8 times.
void do_conv_integer<unsigned short, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 36 → 27 not taken.
✗ Branch 36 → 37 not taken.
void do_conv_integer<unsigned short, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 36 → 27 not taken.
✗ Branch 36 → 37 not taken.
void do_conv_integer<unsigned short, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 36 → 27 taken 126 times.
✓ Branch 36 → 37 taken 18 times.
void do_conv_integer<unsigned short, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 36 → 27 not taken.
✗ Branch 36 → 37 not taken.
void do_conv_integer<unsigned short, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 36 → 27 not taken.
✗ Branch 36 → 37 not taken.
260 for (int yy = 0; yy < matrix_size; yy++) { // 0..limit * 2 + 1
136 217 const pixel_t *current_line = src_current_lineptrs[yy];
137
6/32
void do_conv_integer<unsigned char, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 34 → 29 taken 153 times.
✓ Branch 34 → 35 taken 51 times.
void do_conv_integer<unsigned char, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 34 → 29 not taken.
✗ Branch 34 → 35 not taken.
void do_conv_integer<unsigned char, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 34 → 29 not taken.
✗ Branch 34 → 35 not taken.
void do_conv_integer<unsigned char, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 34 → 29 not taken.
✗ Branch 34 → 35 not taken.
void do_conv_integer<unsigned char, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 34 → 29 not taken.
✗ Branch 34 → 35 not taken.
void do_conv_integer<unsigned char, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 34 → 29 not taken.
✗ Branch 34 → 35 not taken.
void do_conv_integer<unsigned char, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 34 → 29 not taken.
✗ Branch 34 → 35 not taken.
void do_conv_integer<unsigned char, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 34 → 29 not taken.
✗ Branch 34 → 35 not taken.
void do_conv_integer<unsigned short, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 34 → 29 not taken.
✗ Branch 34 → 35 not taken.
void do_conv_integer<unsigned short, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 34 → 29 not taken.
✗ Branch 34 → 35 not taken.
void do_conv_integer<unsigned short, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 34 → 29 taken 200 times.
✓ Branch 34 → 35 taken 40 times.
void do_conv_integer<unsigned short, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 34 → 29 not taken.
✗ Branch 34 → 35 not taken.
void do_conv_integer<unsigned short, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 34 → 29 not taken.
✗ Branch 34 → 35 not taken.
void do_conv_integer<unsigned short, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 34 → 29 taken 882 times.
✓ Branch 34 → 35 taken 126 times.
void do_conv_integer<unsigned short, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 34 → 29 not taken.
✗ Branch 34 → 35 not taken.
void do_conv_integer<unsigned short, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 34 → 29 not taken.
✗ Branch 34 → 35 not taken.
1452 for (int xx = -limit; xx <= limit; xx++) {
138 1235 int current_x = x + xx;
139
6/32
void do_conv_integer<unsigned char, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 29 → 30 taken 51 times.
✓ Branch 29 → 31 taken 102 times.
void do_conv_integer<unsigned char, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 31 not taken.
void do_conv_integer<unsigned char, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 31 not taken.
void do_conv_integer<unsigned char, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 31 not taken.
void do_conv_integer<unsigned char, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 31 not taken.
void do_conv_integer<unsigned char, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 31 not taken.
void do_conv_integer<unsigned char, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 31 not taken.
void do_conv_integer<unsigned char, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 31 not taken.
void do_conv_integer<unsigned short, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 31 not taken.
void do_conv_integer<unsigned short, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 31 not taken.
void do_conv_integer<unsigned short, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 29 → 30 taken 60 times.
✓ Branch 29 → 31 taken 140 times.
void do_conv_integer<unsigned short, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 31 not taken.
void do_conv_integer<unsigned short, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 31 not taken.
void do_conv_integer<unsigned short, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 29 → 30 taken 252 times.
✓ Branch 29 → 31 taken 630 times.
void do_conv_integer<unsigned short, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 31 not taken.
void do_conv_integer<unsigned short, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 31 not taken.
1235 if (current_x < 0) current_x = 0;
140
3/32
void do_conv_integer<unsigned char, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 31 → 32 not taken.
✓ Branch 31 → 33 taken 102 times.
void do_conv_integer<unsigned char, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 33 not taken.
void do_conv_integer<unsigned char, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 33 not taken.
void do_conv_integer<unsigned char, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 33 not taken.
void do_conv_integer<unsigned char, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 33 not taken.
void do_conv_integer<unsigned char, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 33 not taken.
void do_conv_integer<unsigned char, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 33 not taken.
void do_conv_integer<unsigned char, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 33 not taken.
void do_conv_integer<unsigned short, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 33 not taken.
void do_conv_integer<unsigned short, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 33 not taken.
void do_conv_integer<unsigned short, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 31 → 32 not taken.
✓ Branch 31 → 33 taken 140 times.
void do_conv_integer<unsigned short, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 33 not taken.
void do_conv_integer<unsigned short, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 33 not taken.
void do_conv_integer<unsigned short, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 31 → 32 not taken.
✓ Branch 31 → 33 taken 630 times.
void do_conv_integer<unsigned short, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 33 not taken.
void do_conv_integer<unsigned short, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 33 not taken.
872 else if (current_x >= width) current_x = width - 1;
141 1235 const int current_pixel = current_line[current_x];
142 1235 const int current_weight = current_matrix[xx];
143 1235 sum += current_pixel * current_weight;
144 }
145 217 current_matrix += matrix_size; // next matrix line
146 }
147 43 int result = (int)((sum * iCountDiv + rounder) >> 20) + iBias;
148 43 dstp[x] = clamp(result, 0, max_pixel_value);
149 }
150 // middle area: no x check: fast!
151
6/32
void do_conv_integer<unsigned char, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 47 → 41 taken 97 times.
✓ Branch 47 → 48 taken 17 times.
void do_conv_integer<unsigned char, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 47 → 41 not taken.
✗ Branch 47 → 48 not taken.
void do_conv_integer<unsigned char, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 47 → 41 not taken.
✗ Branch 47 → 48 not taken.
void do_conv_integer<unsigned char, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 47 → 41 not taken.
✗ Branch 47 → 48 not taken.
void do_conv_integer<unsigned char, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 50 → 41 not taken.
✗ Branch 50 → 51 not taken.
void do_conv_integer<unsigned char, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 50 → 41 not taken.
✗ Branch 50 → 51 not taken.
void do_conv_integer<unsigned char, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 50 → 41 not taken.
✗ Branch 50 → 51 not taken.
void do_conv_integer<unsigned char, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 50 → 41 not taken.
✗ Branch 50 → 51 not taken.
void do_conv_integer<unsigned short, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 47 → 41 not taken.
✗ Branch 47 → 48 not taken.
void do_conv_integer<unsigned short, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 47 → 41 not taken.
✗ Branch 47 → 48 not taken.
void do_conv_integer<unsigned short, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 47 → 41 taken 8 times.
✓ Branch 47 → 48 taken 4 times.
void do_conv_integer<unsigned short, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 47 → 41 not taken.
✗ Branch 47 → 48 not taken.
void do_conv_integer<unsigned short, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 50 → 41 not taken.
✗ Branch 50 → 51 not taken.
void do_conv_integer<unsigned short, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 50 → 41 taken 12 times.
✓ Branch 50 → 51 taken 6 times.
void do_conv_integer<unsigned short, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 50 → 41 not taken.
✗ Branch 50 → 51 not taken.
void do_conv_integer<unsigned short, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 50 → 41 not taken.
✗ Branch 50 → 51 not taken.
144 for (; x < width - limit; x++) {
152 117 safe_int_t sum = 0;
153 117 const int *current_matrix = matrix + limit; // center of the matrix line
154
6/32
void do_conv_integer<unsigned char, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 44 → 42 taken 291 times.
✓ Branch 44 → 45 taken 97 times.
void do_conv_integer<unsigned char, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 44 → 42 not taken.
✗ Branch 44 → 45 not taken.
void do_conv_integer<unsigned char, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 44 → 42 not taken.
✗ Branch 44 → 45 not taken.
void do_conv_integer<unsigned char, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 44 → 42 not taken.
✗ Branch 44 → 45 not taken.
void do_conv_integer<unsigned char, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 47 → 42 not taken.
✗ Branch 47 → 48 not taken.
void do_conv_integer<unsigned char, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 47 → 42 not taken.
✗ Branch 47 → 48 not taken.
void do_conv_integer<unsigned char, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 47 → 42 not taken.
✗ Branch 47 → 48 not taken.
void do_conv_integer<unsigned char, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 47 → 42 not taken.
✗ Branch 47 → 48 not taken.
void do_conv_integer<unsigned short, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 44 → 42 not taken.
✗ Branch 44 → 45 not taken.
void do_conv_integer<unsigned short, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 44 → 42 not taken.
✗ Branch 44 → 45 not taken.
void do_conv_integer<unsigned short, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 44 → 42 taken 40 times.
✓ Branch 44 → 45 taken 8 times.
void do_conv_integer<unsigned short, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 44 → 42 not taken.
✗ Branch 44 → 45 not taken.
void do_conv_integer<unsigned short, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 47 → 42 not taken.
✗ Branch 47 → 48 not taken.
void do_conv_integer<unsigned short, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 47 → 42 taken 84 times.
✓ Branch 47 → 48 taken 12 times.
void do_conv_integer<unsigned short, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 47 → 42 not taken.
✗ Branch 47 → 48 not taken.
void do_conv_integer<unsigned short, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 47 → 42 not taken.
✗ Branch 47 → 48 not taken.
532 for (int yy = 0; yy < matrix_size; yy++) { // 0..limit * 2 + 1
155 415 const pixel_t *current_line = src_current_lineptrs[yy];
156 // compilers are smart nowadays but let's help them
157 if constexpr (matrix_size == 3) {
158 291 sum +=
159 291 current_line[x - 1] * current_matrix[-1] +
160 291 current_line[x + 0] * current_matrix[0] +
161 291 current_line[x + 1] * current_matrix[1];
162 }
163 else if constexpr (matrix_size == 5) {
164 40 sum +=
165 40 current_line[x - 2] * current_matrix[-2] +
166 40 current_line[x - 1] * current_matrix[-1] +
167 40 current_line[x + 0] * current_matrix[0] +
168 40 current_line[x + 1] * current_matrix[1] +
169 40 current_line[x + 2] * current_matrix[2];
170 }
171 else {
172
2/16
void do_conv_integer<unsigned char, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 45 → 44 not taken.
✗ Branch 45 → 46 not taken.
void do_conv_integer<unsigned char, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 45 → 44 not taken.
✗ Branch 45 → 46 not taken.
void do_conv_integer<unsigned char, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 45 → 44 not taken.
✗ Branch 45 → 46 not taken.
void do_conv_integer<unsigned char, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 45 → 44 not taken.
✗ Branch 45 → 46 not taken.
void do_conv_integer<unsigned short, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 45 → 44 not taken.
✗ Branch 45 → 46 not taken.
void do_conv_integer<unsigned short, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 45 → 44 taken 588 times.
✓ Branch 45 → 46 taken 84 times.
void do_conv_integer<unsigned short, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 45 → 44 not taken.
✗ Branch 45 → 46 not taken.
void do_conv_integer<unsigned short, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 45 → 44 not taken.
✗ Branch 45 → 46 not taken.
672 for (int xx = -limit; xx <= limit; xx++) {
173 588 int current_x = x + xx;
174 // no checking!
175 /*if (current_x < 0) current_x = 0;
176 else if (current_x >= width) current_x = width - 1;*/
177 588 const int current_pixel = current_line[current_x];
178 588 const int current_weight = current_matrix[xx];
179 588 sum += current_pixel * current_weight;
180 }
181 }
182 415 current_matrix += matrix_size; // next matrix line
183 }
184 117 int result = (int)((sum * iCountDiv + rounder) >> 20) + iBias;
185 117 dstp[x] = clamp(result, 0, max_pixel_value);
186 }
187 // right area: check valid x
188
6/32
void do_conv_integer<unsigned char, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 62 → 49 taken 17 times.
✓ Branch 62 → 63 taken 17 times.
void do_conv_integer<unsigned char, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 62 → 49 not taken.
✗ Branch 62 → 63 not taken.
void do_conv_integer<unsigned char, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 62 → 49 not taken.
✗ Branch 62 → 63 not taken.
void do_conv_integer<unsigned char, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 62 → 49 not taken.
✗ Branch 62 → 63 not taken.
void do_conv_integer<unsigned char, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 65 → 52 not taken.
✗ Branch 65 → 66 not taken.
void do_conv_integer<unsigned char, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 65 → 52 not taken.
✗ Branch 65 → 66 not taken.
void do_conv_integer<unsigned char, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 65 → 52 not taken.
✗ Branch 65 → 66 not taken.
void do_conv_integer<unsigned char, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 65 → 52 not taken.
✗ Branch 65 → 66 not taken.
void do_conv_integer<unsigned short, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 62 → 49 not taken.
✗ Branch 62 → 63 not taken.
void do_conv_integer<unsigned short, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 62 → 49 not taken.
✗ Branch 62 → 63 not taken.
void do_conv_integer<unsigned short, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 62 → 49 taken 8 times.
✓ Branch 62 → 63 taken 4 times.
void do_conv_integer<unsigned short, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 62 → 49 not taken.
✗ Branch 62 → 63 not taken.
void do_conv_integer<unsigned short, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 65 → 52 not taken.
✗ Branch 65 → 66 not taken.
void do_conv_integer<unsigned short, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 65 → 52 taken 18 times.
✓ Branch 65 → 66 taken 6 times.
void do_conv_integer<unsigned short, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 65 → 52 not taken.
✗ Branch 65 → 66 not taken.
void do_conv_integer<unsigned short, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 65 → 52 not taken.
✗ Branch 65 → 66 not taken.
70 for (; x < width; x++)
189 {
190 43 safe_int_t sum = 0;
191 43 const int *current_matrix = matrix + limit; // center of the matrix line
192
6/32
void do_conv_integer<unsigned char, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 59 → 50 taken 51 times.
✓ Branch 59 → 60 taken 17 times.
void do_conv_integer<unsigned char, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 59 → 50 not taken.
✗ Branch 59 → 60 not taken.
void do_conv_integer<unsigned char, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 59 → 50 not taken.
✗ Branch 59 → 60 not taken.
void do_conv_integer<unsigned char, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 59 → 50 not taken.
✗ Branch 59 → 60 not taken.
void do_conv_integer<unsigned char, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 62 → 53 not taken.
✗ Branch 62 → 63 not taken.
void do_conv_integer<unsigned char, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 62 → 53 not taken.
✗ Branch 62 → 63 not taken.
void do_conv_integer<unsigned char, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 62 → 53 not taken.
✗ Branch 62 → 63 not taken.
void do_conv_integer<unsigned char, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 62 → 53 not taken.
✗ Branch 62 → 63 not taken.
void do_conv_integer<unsigned short, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 59 → 50 not taken.
✗ Branch 59 → 60 not taken.
void do_conv_integer<unsigned short, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 59 → 50 not taken.
✗ Branch 59 → 60 not taken.
void do_conv_integer<unsigned short, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 59 → 50 taken 40 times.
✓ Branch 59 → 60 taken 8 times.
void do_conv_integer<unsigned short, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 59 → 50 not taken.
✗ Branch 59 → 60 not taken.
void do_conv_integer<unsigned short, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 62 → 53 not taken.
✗ Branch 62 → 63 not taken.
void do_conv_integer<unsigned short, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 62 → 53 taken 126 times.
✓ Branch 62 → 63 taken 18 times.
void do_conv_integer<unsigned short, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 62 → 53 not taken.
✗ Branch 62 → 63 not taken.
void do_conv_integer<unsigned short, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 62 → 53 not taken.
✗ Branch 62 → 63 not taken.
260 for (int yy = 0; yy < matrix_size; yy++) { // 0..limit * 2 + 1
193 217 const pixel_t *current_line = src_current_lineptrs[yy];
194
6/32
void do_conv_integer<unsigned char, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 57 → 52 taken 153 times.
✓ Branch 57 → 58 taken 51 times.
void do_conv_integer<unsigned char, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 57 → 52 not taken.
✗ Branch 57 → 58 not taken.
void do_conv_integer<unsigned char, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 57 → 52 not taken.
✗ Branch 57 → 58 not taken.
void do_conv_integer<unsigned char, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 57 → 52 not taken.
✗ Branch 57 → 58 not taken.
void do_conv_integer<unsigned char, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 60 → 55 not taken.
✗ Branch 60 → 61 not taken.
void do_conv_integer<unsigned char, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 60 → 55 not taken.
✗ Branch 60 → 61 not taken.
void do_conv_integer<unsigned char, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 60 → 55 not taken.
✗ Branch 60 → 61 not taken.
void do_conv_integer<unsigned char, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 60 → 55 not taken.
✗ Branch 60 → 61 not taken.
void do_conv_integer<unsigned short, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 57 → 52 not taken.
✗ Branch 57 → 58 not taken.
void do_conv_integer<unsigned short, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 57 → 52 not taken.
✗ Branch 57 → 58 not taken.
void do_conv_integer<unsigned short, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 57 → 52 taken 200 times.
✓ Branch 57 → 58 taken 40 times.
void do_conv_integer<unsigned short, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 57 → 52 not taken.
✗ Branch 57 → 58 not taken.
void do_conv_integer<unsigned short, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 60 → 55 not taken.
✗ Branch 60 → 61 not taken.
void do_conv_integer<unsigned short, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 60 → 55 taken 882 times.
✓ Branch 60 → 61 taken 126 times.
void do_conv_integer<unsigned short, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 60 → 55 not taken.
✗ Branch 60 → 61 not taken.
void do_conv_integer<unsigned short, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 60 → 55 not taken.
✗ Branch 60 → 61 not taken.
1452 for (int xx = -limit; xx <= limit; xx++) {
195 1235 int current_x = x + xx;
196
3/32
void do_conv_integer<unsigned char, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 52 → 53 not taken.
✓ Branch 52 → 54 taken 153 times.
void do_conv_integer<unsigned char, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 52 → 53 not taken.
✗ Branch 52 → 54 not taken.
void do_conv_integer<unsigned char, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 52 → 53 not taken.
✗ Branch 52 → 54 not taken.
void do_conv_integer<unsigned char, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 52 → 53 not taken.
✗ Branch 52 → 54 not taken.
void do_conv_integer<unsigned char, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 55 → 56 not taken.
✗ Branch 55 → 57 not taken.
void do_conv_integer<unsigned char, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 55 → 56 not taken.
✗ Branch 55 → 57 not taken.
void do_conv_integer<unsigned char, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 55 → 56 not taken.
✗ Branch 55 → 57 not taken.
void do_conv_integer<unsigned char, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 55 → 56 not taken.
✗ Branch 55 → 57 not taken.
void do_conv_integer<unsigned short, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 52 → 53 not taken.
✗ Branch 52 → 54 not taken.
void do_conv_integer<unsigned short, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 52 → 53 not taken.
✗ Branch 52 → 54 not taken.
void do_conv_integer<unsigned short, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 52 → 53 not taken.
✓ Branch 52 → 54 taken 200 times.
void do_conv_integer<unsigned short, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 52 → 53 not taken.
✗ Branch 52 → 54 not taken.
void do_conv_integer<unsigned short, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 55 → 56 not taken.
✗ Branch 55 → 57 not taken.
void do_conv_integer<unsigned short, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 55 → 56 not taken.
✓ Branch 55 → 57 taken 882 times.
void do_conv_integer<unsigned short, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 55 → 56 not taken.
✗ Branch 55 → 57 not taken.
void do_conv_integer<unsigned short, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 55 → 56 not taken.
✗ Branch 55 → 57 not taken.
1235 if (current_x < 0) current_x = 0;
197
6/32
void do_conv_integer<unsigned char, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 54 → 55 taken 51 times.
✓ Branch 54 → 56 taken 102 times.
void do_conv_integer<unsigned char, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 54 → 55 not taken.
✗ Branch 54 → 56 not taken.
void do_conv_integer<unsigned char, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 54 → 55 not taken.
✗ Branch 54 → 56 not taken.
void do_conv_integer<unsigned char, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 54 → 55 not taken.
✗ Branch 54 → 56 not taken.
void do_conv_integer<unsigned char, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 57 → 58 not taken.
✗ Branch 57 → 59 not taken.
void do_conv_integer<unsigned char, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 57 → 58 not taken.
✗ Branch 57 → 59 not taken.
void do_conv_integer<unsigned char, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 57 → 58 not taken.
✗ Branch 57 → 59 not taken.
void do_conv_integer<unsigned char, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 57 → 58 not taken.
✗ Branch 57 → 59 not taken.
void do_conv_integer<unsigned short, 3, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 54 → 55 not taken.
✗ Branch 54 → 56 not taken.
void do_conv_integer<unsigned short, 3, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 54 → 55 not taken.
✗ Branch 54 → 56 not taken.
void do_conv_integer<unsigned short, 5, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 54 → 55 taken 60 times.
✓ Branch 54 → 56 taken 140 times.
void do_conv_integer<unsigned short, 5, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 54 → 55 not taken.
✗ Branch 54 → 56 not taken.
void do_conv_integer<unsigned short, 7, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 57 → 58 not taken.
✗ Branch 57 → 59 not taken.
void do_conv_integer<unsigned short, 7, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✓ Branch 57 → 58 taken 252 times.
✓ Branch 57 → 59 taken 630 times.
void do_conv_integer<unsigned short, 9, int>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 57 → 58 not taken.
✗ Branch 57 → 59 not taken.
void do_conv_integer<unsigned short, 9, long>(unsigned char*, int, unsigned char const*, int, int, int, int const*, int, int, int):
✗ Branch 57 → 58 not taken.
✗ Branch 57 → 59 not taken.
1235 else if (current_x >= width) current_x = width - 1;
198 1235 const int current_pixel = current_line[current_x];
199 1235 const int current_weight = current_matrix[xx];
200 1235 sum += current_pixel * current_weight;
201 }
202 217 current_matrix += matrix_size; // next matrix line
203 }
204 43 int result = (int)((sum * iCountDiv + rounder) >> 20) + iBias;
205 43 dstp[x] = clamp(result, 0, max_pixel_value);
206 }
207 27 dstp += dst_pitch;
208 27 srcp += src_pitch;
209 }
210 5 }
211
212 // instantiate for 8 bit 3,5,7 and 9
213 template void do_conv_integer<uint8_t, 3, int>(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel);
214 template void do_conv_integer<uint8_t, 5, int>(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel);
215 template void do_conv_integer<uint8_t, 7, int>(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel);
216 template void do_conv_integer<uint8_t, 9, int>(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel);
217 template void do_conv_integer<uint8_t, 3, int64_t>(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel);
218 template void do_conv_integer<uint8_t, 5, int64_t>(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel);
219 template void do_conv_integer<uint8_t, 7, int64_t>(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel);
220 template void do_conv_integer<uint8_t, 9, int64_t>(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel);
221
222 template void do_conv_integer<uint16_t, 3, int>(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel);
223 template void do_conv_integer<uint16_t, 5, int>(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel);
224 template void do_conv_integer<uint16_t, 7, int>(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel);
225 template void do_conv_integer<uint16_t, 9, int>(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel);
226 template void do_conv_integer<uint16_t, 3, int64_t>(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel);
227 template void do_conv_integer<uint16_t, 5, int64_t>(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel);
228 template void do_conv_integer<uint16_t, 7, int64_t>(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel);
229 template void do_conv_integer<uint16_t, 9, int64_t>(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const int *matrix, int iCountDiv, int iBias, int bits_per_pixel);
230
231 template<int matrix_size>
232 4 static void do_conv_float(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const float *matrix, float fCountDiv, float fBias)
233 {
234 4 float *dstp = reinterpret_cast<float *>(dstp8);
235 4 const float *srcp = reinterpret_cast<const float *>(srcp8);
236 4 dst_pitch /= sizeof(float);
237 4 src_pitch /= sizeof(float);
238
239 4 constexpr int limit = (matrix_size - 1) / 2; // +-1, +-2, +-3
240
241 4 std::vector<const float*> src_lineptrs;
242
2/8
void do_conv_float<3>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 68 not taken.
void do_conv_float<5>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 68 not taken.
void do_conv_float<7>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 71 not taken.
void do_conv_float<9>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 3 → 4 taken 3 times.
✗ Branch 3 → 71 not taken.
4 src_lineptrs.resize(limit + height + limit);
243
244 // prefill line pointers
245
4/8
void do_conv_float<3>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 14 → 5 taken 6 times.
✓ Branch 14 → 15 taken 1 time.
void do_conv_float<5>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 14 → 5 not taken.
✗ Branch 14 → 15 not taken.
void do_conv_float<7>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 14 → 5 not taken.
✗ Branch 14 → 15 not taken.
void do_conv_float<9>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 14 → 5 taken 36 times.
✓ Branch 14 → 15 taken 3 times.
46 for (int y = -limit; y < height + limit; y++)
246 {
247
4/8
void do_conv_float<3>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 5 → 6 taken 1 time.
✓ Branch 5 → 8 taken 5 times.
void do_conv_float<5>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 8 not taken.
void do_conv_float<7>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 8 not taken.
void do_conv_float<9>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 5 → 6 taken 12 times.
✓ Branch 5 → 8 taken 24 times.
42 if (y < 0)
248 13 src_lineptrs[y + limit] = srcp + src_pitch * 0;
249
4/8
void do_conv_float<3>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 8 → 9 taken 4 times.
✓ Branch 8 → 11 taken 1 time.
void do_conv_float<5>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 11 not taken.
void do_conv_float<7>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 11 not taken.
void do_conv_float<9>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 8 → 9 taken 12 times.
✓ Branch 8 → 11 taken 12 times.
29 else if (y < height)
250 16 src_lineptrs[y + limit] = srcp + src_pitch * y;
251 else
252 13 src_lineptrs[y + limit] = srcp + src_pitch * (height - 1);
253 }
254
255
2/8
void do_conv_float<3>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 17 → 18 taken 1 time.
✗ Branch 17 → 65 not taken.
void do_conv_float<5>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 65 not taken.
void do_conv_float<7>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 68 not taken.
void do_conv_float<9>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 17 → 18 taken 3 times.
✗ Branch 17 → 68 not taken.
4 std::vector<const float *> src_current_lineptrs(matrix_size); // +/-limit => 2*limit + 1
256
257
4/8
void do_conv_float<3>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 61 → 20 taken 4 times.
✓ Branch 61 → 62 taken 1 time.
void do_conv_float<5>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 61 → 20 not taken.
✗ Branch 61 → 62 not taken.
void do_conv_float<7>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 64 → 20 not taken.
✗ Branch 64 → 65 not taken.
void do_conv_float<9>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 64 → 20 taken 12 times.
✓ Branch 64 → 65 taken 3 times.
20 for (int y = 0; y < height; ++y) {
258 // prefill current vertical line pointers
259
4/8
void do_conv_float<3>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 24 → 21 taken 12 times.
✓ Branch 24 → 25 taken 4 times.
void do_conv_float<5>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 24 → 21 not taken.
✗ Branch 24 → 25 not taken.
void do_conv_float<7>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 24 → 21 not taken.
✗ Branch 24 → 25 not taken.
void do_conv_float<9>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 24 → 21 taken 108 times.
✓ Branch 24 → 25 taken 12 times.
136 for (int yy = -limit; yy <= limit; yy++) {
260 120 src_current_lineptrs[yy + limit] = src_lineptrs[limit + (y + yy)];
261 }
262 16 int x = 0;
263 // left area: check valid x
264
4/8
void do_conv_float<3>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 38 → 26 taken 4 times.
✓ Branch 38 → 39 taken 4 times.
void do_conv_float<5>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 38 → 26 not taken.
✗ Branch 38 → 39 not taken.
void do_conv_float<7>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 38 → 26 not taken.
✗ Branch 38 → 39 not taken.
void do_conv_float<9>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 38 → 26 taken 48 times.
✓ Branch 38 → 39 taken 12 times.
68 for (; x < limit; x++)
265 {
266 52 float sum = 0.0f;
267 52 const float *current_matrix = matrix + limit; // center of the matrix line
268
4/8
void do_conv_float<3>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 36 → 27 taken 12 times.
✓ Branch 36 → 37 taken 4 times.
void do_conv_float<5>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 36 → 27 not taken.
✗ Branch 36 → 37 not taken.
void do_conv_float<7>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 36 → 27 not taken.
✗ Branch 36 → 37 not taken.
void do_conv_float<9>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 36 → 27 taken 432 times.
✓ Branch 36 → 37 taken 48 times.
496 for (int yy = 0; yy < matrix_size; yy++) { // 0..limit * 2 + 1
269 444 const float *current_line = src_current_lineptrs[yy];
270
4/8
void do_conv_float<3>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 34 → 29 taken 36 times.
✓ Branch 34 → 35 taken 12 times.
void do_conv_float<5>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 34 → 29 not taken.
✗ Branch 34 → 35 not taken.
void do_conv_float<7>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 34 → 29 not taken.
✗ Branch 34 → 35 not taken.
void do_conv_float<9>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 34 → 29 taken 3888 times.
✓ Branch 34 → 35 taken 432 times.
4368 for (int xx = -limit; xx <= limit; xx++) {
271 3924 int current_x = x + xx;
272
4/8
void do_conv_float<3>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 29 → 30 taken 12 times.
✓ Branch 29 → 31 taken 24 times.
void do_conv_float<5>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 31 not taken.
void do_conv_float<7>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 31 not taken.
void do_conv_float<9>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 29 → 30 taken 1080 times.
✓ Branch 29 → 31 taken 2808 times.
3924 if (current_x < 0) current_x = 0;
273
3/8
void do_conv_float<3>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 31 → 32 not taken.
✓ Branch 31 → 33 taken 24 times.
void do_conv_float<5>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 33 not taken.
void do_conv_float<7>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 33 not taken.
void do_conv_float<9>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 31 → 32 taken 648 times.
✓ Branch 31 → 33 taken 2160 times.
2832 else if (current_x >= width) current_x = width - 1;
274 3924 const float current_pixel = current_line[current_x];
275 3924 const float current_weight = current_matrix[xx];
276 3924 sum += current_pixel * current_weight;
277 }
278 444 current_matrix += matrix_size; // next matrix line
279 }
280 52 float result = sum * fCountDiv + fBias;
281 52 dstp[x] = result; // no clipping for float
282 }
283 // middle area: no x check: fast!
284
3/8
void do_conv_float<3>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 45 → 40 taken 12 times.
✓ Branch 45 → 46 taken 4 times.
void do_conv_float<5>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 45 → 40 not taken.
✗ Branch 45 → 46 not taken.
void do_conv_float<7>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 48 → 40 not taken.
✗ Branch 48 → 49 not taken.
void do_conv_float<9>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 48 → 40 not taken.
✓ Branch 48 → 49 taken 12 times.
28 for (; x < width - limit; x++) {
285 12 float sum = 0.0f;
286 12 const float *current_matrix = matrix + limit; // center of the matrix line
287
2/8
void do_conv_float<3>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 43 → 41 taken 36 times.
✓ Branch 43 → 44 taken 12 times.
void do_conv_float<5>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 43 → 41 not taken.
✗ Branch 43 → 44 not taken.
void do_conv_float<7>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 46 → 41 not taken.
✗ Branch 46 → 47 not taken.
void do_conv_float<9>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 46 → 41 not taken.
✗ Branch 46 → 47 not taken.
48 for (int yy = 0; yy < matrix_size; yy++) { // 0..limit * 2 + 1
288 36 const float *current_line = src_current_lineptrs[yy];
289 // compilers are smart nowadays but let's help them
290 if constexpr (matrix_size == 3) {
291 36 sum +=
292 36 current_line[x - 1] * current_matrix[-1] +
293 36 current_line[x + 0] * current_matrix[0] +
294 36 current_line[x + 1] * current_matrix[1];
295 }
296 else if constexpr (matrix_size == 5) {
297 sum +=
298 current_line[x - 2] * current_matrix[-2] +
299 current_line[x - 1] * current_matrix[-1] +
300 current_line[x + 0] * current_matrix[0] +
301 current_line[x + 1] * current_matrix[1] +
302 current_line[x + 2] * current_matrix[2];
303 }
304 else {
305 // surprise: even MSVC unrolls this loop for 7 and 9
306 for (int xx = -limit; xx <= limit; xx++) {
307 int current_x = x + xx;
308 // no checking!
309 /*if (current_x < 0) current_x = 0;
310 else if (current_x >= width) current_x = width - 1;*/
311 const float current_pixel = current_line[current_x];
312 const float current_weight = current_matrix[xx];
313 sum += current_pixel * current_weight;
314 }
315 }
316 36 current_matrix += matrix_size; // next matrix line
317 }
318 12 float result = sum * fCountDiv + fBias;
319 12 dstp[x] = result; // no clipping for float
320 }
321 // right area: check valid x
322
4/8
void do_conv_float<3>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 59 → 47 taken 4 times.
✓ Branch 59 → 60 taken 4 times.
void do_conv_float<5>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 59 → 47 not taken.
✗ Branch 59 → 60 not taken.
void do_conv_float<7>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 62 → 50 not taken.
✗ Branch 62 → 63 not taken.
void do_conv_float<9>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 62 → 50 taken 12 times.
✓ Branch 62 → 63 taken 12 times.
32 for (; x < width; x++)
323 {
324 16 float sum = 0.0f;
325 16 const float *current_matrix = matrix + limit; // center of the matrix line
326
4/8
void do_conv_float<3>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 57 → 48 taken 12 times.
✓ Branch 57 → 58 taken 4 times.
void do_conv_float<5>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 57 → 48 not taken.
✗ Branch 57 → 58 not taken.
void do_conv_float<7>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 60 → 51 not taken.
✗ Branch 60 → 61 not taken.
void do_conv_float<9>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 60 → 51 taken 108 times.
✓ Branch 60 → 61 taken 12 times.
136 for (int yy = 0; yy < matrix_size; yy++) { // 0..limit * 2 + 1
327 120 const float *current_line = src_current_lineptrs[yy];
328
4/8
void do_conv_float<3>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 55 → 50 taken 36 times.
✓ Branch 55 → 56 taken 12 times.
void do_conv_float<5>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 55 → 50 not taken.
✗ Branch 55 → 56 not taken.
void do_conv_float<7>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 58 → 53 not taken.
✗ Branch 58 → 59 not taken.
void do_conv_float<9>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 58 → 53 taken 972 times.
✓ Branch 58 → 59 taken 108 times.
1128 for (int xx = -limit; xx <= limit; xx++) {
329 1008 int current_x = x + xx;
330
2/8
void do_conv_float<3>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 50 → 51 not taken.
✓ Branch 50 → 52 taken 36 times.
void do_conv_float<5>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 50 → 51 not taken.
✗ Branch 50 → 52 not taken.
void do_conv_float<7>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 53 → 54 not taken.
✗ Branch 53 → 55 not taken.
void do_conv_float<9>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 53 → 54 not taken.
✓ Branch 53 → 55 taken 972 times.
1008 if (current_x < 0) current_x = 0;
331
4/8
void do_conv_float<3>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 52 → 53 taken 12 times.
✓ Branch 52 → 54 taken 24 times.
void do_conv_float<5>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 52 → 53 not taken.
✗ Branch 52 → 54 not taken.
void do_conv_float<7>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✗ Branch 55 → 56 not taken.
✗ Branch 55 → 57 not taken.
void do_conv_float<9>(unsigned char*, int, unsigned char const*, int, int, int, float const*, float, float):
✓ Branch 55 → 56 taken 432 times.
✓ Branch 55 → 57 taken 540 times.
1008 else if (current_x >= width) current_x = width - 1;
332 1008 const float current_pixel = current_line[current_x];
333 1008 const float current_weight = current_matrix[xx];
334 1008 sum += current_pixel * current_weight;
335 }
336 120 current_matrix += matrix_size; // next matrix line
337 }
338 16 float result = sum * fCountDiv + fBias;
339 16 dstp[x] = result; // no clipping for float
340 }
341 16 dstp += dst_pitch;
342 16 srcp += src_pitch;
343 }
344 4 }
345
346 template void do_conv_float<3>(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const float *matrix, float fCountDiv, float fBias);
347 template void do_conv_float<5>(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const float *matrix, float fCountDiv, float fBias);
348 template void do_conv_float<7>(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const float *matrix, float fCountDiv, float fBias);
349 template void do_conv_float<9>(BYTE* dstp8, int dst_pitch, const BYTE *srcp8, int src_pitch, int width, int height, const float *matrix, float fCountDiv, float fBias);
350
351 /***** Setup stuff ****/
352
353 10 GeneralConvolution::GeneralConvolution(PClip _child, double _divisor, float _nBias, const char * _matrix,
354 10 bool _autoscale, bool _luma, bool _chroma, bool _alpha, IScriptEnvironment* _env)
355
2/4
✓ Branch 2 → 3 taken 10 times.
✗ Branch 2 → 102 not taken.
✓ Branch 3 → 4 taken 10 times.
✗ Branch 3 → 100 not taken.
10 : GenericVideoFilter(_child), divisor(_divisor), nBias((int)_nBias), fBias(_nBias), autoscale(_autoscale), luma(_luma), chroma(_chroma), alpha(_alpha)
356 {
357
9/14
✓ Branch 7 → 8 taken 10 times.
✗ Branch 7 → 103 not taken.
✓ Branch 8 → 9 taken 8 times.
✓ Branch 8 → 13 taken 2 times.
✓ Branch 9 → 10 taken 8 times.
✗ Branch 9 → 103 not taken.
✓ Branch 10 → 11 taken 8 times.
✗ Branch 10 → 13 not taken.
✓ Branch 11 → 12 taken 8 times.
✗ Branch 11 → 103 not taken.
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 14 taken 8 times.
✓ Branch 15 → 16 taken 2 times.
✓ Branch 15 → 19 taken 8 times.
10 if (vi.Is420() || vi.Is422() || vi.IsYV411()) {
358
2/4
✓ Branch 16 → 17 taken 2 times.
✗ Branch 16 → 19 not taken.
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 19 taken 2 times.
2 if (luma && chroma)
359 _env->ThrowError("GeneralConvolution: both luma and chroma cannot be set for subsampled video formats");
360 }
361
8/14
✓ Branch 19 → 20 taken 10 times.
✗ Branch 19 → 103 not taken.
✓ Branch 20 → 21 taken 10 times.
✗ Branch 20 → 26 not taken.
✓ Branch 21 → 22 taken 10 times.
✗ Branch 21 → 103 not taken.
✓ Branch 22 → 23 taken 1 time.
✓ Branch 22 → 26 taken 9 times.
✓ Branch 23 → 24 taken 1 time.
✗ Branch 23 → 103 not taken.
✗ Branch 24 → 25 not taken.
✓ Branch 24 → 26 taken 1 time.
✗ Branch 27 → 28 not taken.
✓ Branch 27 → 29 taken 10 times.
10 if (!vi.IsRGB() && !vi.IsYUV() && !vi.IsYUVA())
362 _env->ThrowError("GeneralConvolution requires RGB (planar or packed), greyscale or YUV(A) input");
363
1/2
✗ Branch 29 → 30 not taken.
✓ Branch 29 → 31 taken 10 times.
10 if (divisor == 0.0)
364 _env->ThrowError("GeneralConvolution: divisor cannot be zero");
365
2/4
✓ Branch 31 → 32 taken 10 times.
✗ Branch 31 → 103 not taken.
✓ Branch 32 → 33 taken 10 times.
✗ Branch 32 → 103 not taken.
10 setMatrix(_matrix, vi.BitsPerComponent() < 32, _env); // float: todo
366
367
3/4
✓ Branch 33 → 34 taken 10 times.
✗ Branch 33 → 103 not taken.
✓ Branch 34 → 35 taken 8 times.
✓ Branch 34 → 85 taken 2 times.
10 if (vi.BitsPerComponent() <= 16) {
368 // precompute divisor
369 int iCountT;
370
1/2
✗ Branch 35 → 36 not taken.
✓ Branch 35 → 37 taken 8 times.
8 if (autoscale) {
371 iCountT = iNormalizeSum;
372 }
373 else {
374 8 iCountT = 0;
375 }
376
377 // Truncate instead of round - keep in the spirit of the original code
378 // 3.6.3: we do introduce rounding before scaling back from +20 bit range
379 // 0x100000: 20 bit precision integer arithmetic
380 // todo: check overflow for matrices larger than 5x5
381
1/2
✓ Branch 38 → 39 taken 8 times.
✗ Branch 38 → 40 not taken.
8 iCountDiv = (int)(0x100000 / (iCountT == 0 ? divisor : iCountT * divisor));
382
2/2
✓ Branch 41 → 42 taken 1 time.
✓ Branch 41 → 43 taken 7 times.
8 if (iCountDiv == 0)
383
1/2
✗ Branch 42 → 43 not taken.
✓ Branch 42 → 103 taken 1 time.
1 _env->ThrowError("GeneralConvolution: normalizing factor is zero, check for too large elements or divisor value");
384
385 // safety check
386 7 int64needed = false;
387
388 // check possible overflow:
389 // Worst case: maximum pixel values, matrix multiplications will overflow either on positive or negative direction
390 // When max_pixel_value * sum(max(weight_pos, -weight_neg)) * iCountDiv > 1 << 31 = > int64_t needed(safe_int_t is int64_t)
391
1/2
✓ Branch 43 → 44 taken 7 times.
✗ Branch 43 → 103 not taken.
7 const int max_pixel_value = (1 << vi.BitsPerComponent()) - 1;
392 7 const int maxWeightSum = max(iWeightSumPositives, -iWeightSumNegatives);
393
2/2
✓ Branch 46 → 47 taken 1 time.
✓ Branch 46 → 48 taken 6 times.
7 if ((int64_t)max_pixel_value * maxWeightSum * std::abs(iCountDiv) >= std::numeric_limits<int>::max())
394 1 int64needed = true;
395
396
3/5
✓ Branch 48 → 49 taken 7 times.
✗ Branch 48 → 103 not taken.
✓ Branch 49 → 50 taken 5 times.
✓ Branch 49 → 67 taken 2 times.
✗ Branch 49 → 84 not taken.
7 switch (vi.BitsPerComponent()) {
397
398 5 case 8:
399
1/2
✓ Branch 50 → 51 taken 5 times.
✗ Branch 50 → 54 not taken.
5 if (nSize == 3 * 3) {
400
1/2
✗ Branch 51 → 52 not taken.
✓ Branch 51 → 53 taken 5 times.
5 if (int64needed) conversionFnPtr = do_conv_integer<uint8_t, 3, int64_t>;
401 5 else conversionFnPtr = do_conv_integer<uint8_t, 3, int>;
402 }
403 else if (nSize == 5 * 5) {
404 if (int64needed) conversionFnPtr = do_conv_integer<uint8_t, 5, int64_t>;
405 else conversionFnPtr = do_conv_integer<uint8_t, 5, int>;
406 }
407 else if (nSize == 7 * 7) {
408 if (int64needed) conversionFnPtr = do_conv_integer<uint8_t, 7, int64_t>;
409 else conversionFnPtr = do_conv_integer<uint8_t, 7, int>;
410 }
411 else if (nSize == 9 * 9) {
412 if (int64needed) conversionFnPtr = do_conv_integer<uint8_t, 9, int64_t>;
413 else conversionFnPtr = do_conv_integer<uint8_t, 9, int>;
414 }
415 5 break;
416
417 2 case 10:
418 case 12:
419 case 14:
420 case 16:
421
1/2
✗ Branch 67 → 68 not taken.
✓ Branch 67 → 71 taken 2 times.
2 if (nSize == 3 * 3) {
422 if (int64needed) conversionFnPtr = do_conv_integer<uint16_t, 3, int64_t>;
423 else conversionFnPtr = do_conv_integer<uint16_t, 3, int>;
424 }
425
2/2
✓ Branch 71 → 72 taken 1 time.
✓ Branch 71 → 75 taken 1 time.
2 else if (nSize == 5 * 5) {
426
1/2
✗ Branch 72 → 73 not taken.
✓ Branch 72 → 74 taken 1 time.
1 if (int64needed) conversionFnPtr = do_conv_integer<uint16_t, 5, int64_t>;
427 1 else conversionFnPtr = do_conv_integer<uint16_t, 5, int>;
428 }
429
1/2
✓ Branch 75 → 76 taken 1 time.
✗ Branch 75 → 79 not taken.
1 else if (nSize == 7 * 7) {
430
1/2
✓ Branch 76 → 77 taken 1 time.
✗ Branch 76 → 78 not taken.
1 if (int64needed) conversionFnPtr = do_conv_integer<uint16_t, 7, int64_t>;
431 else conversionFnPtr = do_conv_integer<uint16_t, 7, int>;
432 }
433 else if (nSize == 9 * 9) {
434 if (int64needed) conversionFnPtr = do_conv_integer<uint16_t, 9, int64_t>;
435 else conversionFnPtr = do_conv_integer<uint16_t, 9, int>;
436 }
437 2 break;
438 }
439 }
440 else {
441 // 32 bit float clip
442 // precompute divisor
443 float fCountT;
444
1/2
✗ Branch 85 → 86 not taken.
✓ Branch 85 → 87 taken 2 times.
2 if (autoscale) {
445 fCountT = fNormalizeSum;
446 }
447 else {
448 2 fCountT = 0.0f;
449 }
450
451
1/2
✓ Branch 88 → 89 taken 2 times.
✗ Branch 88 → 90 not taken.
2 fCountDiv = (float)(1.0f / (fCountT == 0 ? divisor : fCountT * divisor));
452
453
2/2
✓ Branch 91 → 92 taken 1 time.
✓ Branch 91 → 93 taken 1 time.
2 if (nSize == 3 * 3)
454 1 FconversionFnPtr = do_conv_float<3>;
455
1/2
✗ Branch 93 → 94 not taken.
✓ Branch 93 → 95 taken 1 time.
1 else if (nSize == 5 * 5)
456 FconversionFnPtr = do_conv_float<5>;
457
1/2
✗ Branch 95 → 96 not taken.
✓ Branch 95 → 97 taken 1 time.
1 else if (nSize == 7 * 7)
458 FconversionFnPtr = do_conv_float<7>;
459
1/2
✓ Branch 97 → 98 taken 1 time.
✗ Branch 97 → 99 not taken.
1 else if (nSize == 9 * 9)
460 1 FconversionFnPtr = do_conv_float<9>;
461 }
462 12 }
463
464 AVSValue __cdecl GeneralConvolution::Create(AVSValue args, void*, IScriptEnvironment* env)
465 {
466 const VideoInfo& vi_orig = args[0].AsClip()->GetVideoInfo();
467
468 // convert old RGB format to planar RGB
469 AVSValue new_args[1] = { args[0].AsClip() };
470 PClip clip;
471 if (vi_orig.IsRGB24() || vi_orig.IsRGB48()) {
472 clip = env->Invoke("ConvertToPlanarRGB", AVSValue(new_args, 1)).AsClip();
473 }
474 else if (vi_orig.IsRGB32() || vi_orig.IsRGB64()) {
475 clip = env->Invoke("ConvertToPlanarRGBA", AVSValue(new_args, 1)).AsClip();
476 }
477 else if (vi_orig.IsYUY2()) {
478 clip = env->Invoke("ConvertToYV16", AVSValue(new_args, 1)).AsClip();
479 }
480 else {
481 clip = args[0].AsClip();
482 }
483
484 GeneralConvolution* Result = new GeneralConvolution(clip, args[3].AsFloat(1.0f), args[1].AsFloatf(0.0f),
485 args[2].AsString("0 0 0 0 1 0 0 0 0"), args[4].AsBool(true),
486 args[5].AsBool(true), args[6].AsBool(true), args[7].AsBool(true), // luma, chroma, alpha, when n/a then ignored
487 env);
488
489 AVSValue new_args2[1] = { Result };
490 if (vi_orig.IsRGB24()) {
491 return env->Invoke("ConvertToRGB24", AVSValue(new_args2, 1)).AsClip();
492 }
493 else if (vi_orig.IsRGB48()) {
494 return env->Invoke("ConvertToRGB48", AVSValue(new_args2, 1)).AsClip();
495 }
496 else if (vi_orig.IsRGB32()) {
497 return env->Invoke("ConvertToRGB32", AVSValue(new_args2, 1)).AsClip();
498 }
499 else if (vi_orig.IsRGB64()) {
500 return env->Invoke("ConvertToRGB64", AVSValue(new_args2, 1)).AsClip();
501 }
502 else if (vi_orig.IsYUY2()) {
503 return env->Invoke("ConvertToYUY2", AVSValue(new_args2, 1)).AsClip();
504 }
505
506 return Result;
507 }
508
509
510 10 void GeneralConvolution::setMatrix(const char * _matrix, bool _isInteger, IScriptEnvironment* env)
511 {
512 10 char delimiter[] = "([ \t\n\r]+)";
513
1/2
✓ Branch 2 → 3 taken 10 times.
✗ Branch 2 → 89 not taken.
10 std::regex regex(delimiter);
514
1/2
✓ Branch 5 → 6 taken 10 times.
✗ Branch 5 → 66 not taken.
20 std::string str(_matrix);
515 std::vector<std::string> out(
516
1/2
✓ Branch 18 → 19 taken 10 times.
✗ Branch 18 → 71 not taken.
40 std::sregex_token_iterator(str.begin(), str.end(), regex, -1),
517
1/2
✓ Branch 9 → 10 taken 10 times.
✗ Branch 9 → 78 not taken.
20 std::sregex_token_iterator()
518
1/2
✓ Branch 19 → 20 taken 10 times.
✗ Branch 19 → 69 not taken.
10 );
519
520 10 fNormalizeSum = 0.0f;
521 10 iNormalizeSum = 0;
522 10 iWeightSumPositives = 0; // for int32 overflow decision
523 10 iWeightSumNegatives = 0;
524 10 const int MAX_DIMENSION = 9; // 9 is the max matrix size which is templated
525
526 10 nSize = 0;
527 10 int dim = 3;
528 10 int maxsize = dim * dim;
529
2/2
✓ Branch 23 → 24 taken 8 times.
✓ Branch 23 → 25 taken 2 times.
10 if (_isInteger)
530
1/2
✓ Branch 24 → 26 taken 8 times.
✗ Branch 24 → 83 not taken.
8 iMatrix.resize(maxsize);
531 else
532
1/2
✓ Branch 25 → 26 taken 2 times.
✗ Branch 25 → 83 not taken.
2 fMatrix.resize(maxsize);
533
2/2
✓ Branch 57 → 28 taken 218 times.
✓ Branch 57 → 58 taken 10 times.
238 for (auto &s : out) {
534
1/2
✗ Branch 31 → 32 not taken.
✓ Branch 31 → 33 taken 218 times.
218 if (s.length() == 0) continue; // first string can be empty is matrix string is starting with separators
535
536
2/2
✓ Branch 33 → 34 taken 6 times.
✓ Branch 33 → 39 taken 212 times.
218 if (nSize == maxsize) {
537
1/2
✗ Branch 34 → 35 not taken.
✓ Branch 34 → 36 taken 6 times.
6 if (dim == MAX_DIMENSION) {
538 env->ThrowError("GeneralConvolution: matrix too big, maximum %dx%d elements allowed", MAX_DIMENSION, MAX_DIMENSION);
539 }
540 6 dim += 2;
541 6 maxsize = dim * dim;
542
2/2
✓ Branch 36 → 37 taken 3 times.
✓ Branch 36 → 38 taken 3 times.
6 if (_isInteger)
543
1/2
✓ Branch 37 → 39 taken 3 times.
✗ Branch 37 → 82 not taken.
3 iMatrix.resize(maxsize);
544 else
545
1/2
✓ Branch 38 → 39 taken 3 times.
✗ Branch 38 → 82 not taken.
3 fMatrix.resize(maxsize);
546 }
547
2/2
✓ Branch 39 → 40 taken 128 times.
✓ Branch 39 → 45 taken 90 times.
218 if (_isInteger) {
548 128 const double val = atof(s.c_str());
549 128 const int ival = (int)std::lround(val);
550 128 iNormalizeSum += ival;
551 128 iMatrix[nSize++] = ival;
552
1/2
✓ Branch 42 → 43 taken 128 times.
✗ Branch 42 → 44 not taken.
128 if (ival >= 0)
553 128 iWeightSumPositives += ival;
554 else
555 iWeightSumNegatives += ival;
556 }
557 else {
558 90 const float val = (float)atof(s.c_str());
559 90 fNormalizeSum += val;
560 90 fMatrix[nSize++] = val;
561 }
562
563 }
564
565
1/2
✗ Branch 58 → 59 not taken.
✓ Branch 58 → 60 taken 10 times.
10 if (nSize < 9)
566 env->ThrowError("GeneralConvolution: matrix too small, need at least 3x3 elements");
567
1/2
✗ Branch 60 → 61 not taken.
✓ Branch 60 → 62 taken 10 times.
10 else if (nSize != maxsize)
568 env->ThrowError("GeneralConvolution: matrix incomplete, possible size %dx%d but element count %d", dim, dim, nSize);
569 10 }
570
571 6 PVideoFrame __stdcall GeneralConvolution::GetFrame(int n, IScriptEnvironment* env)
572 {
573 6 int h = vi.height;
574 6 int w = vi.width;
575
576
1/2
✓ Branch 3 → 4 taken 6 times.
✗ Branch 3 → 71 not taken.
6 PVideoFrame src = child->GetFrame(n, env);
577
1/2
✓ Branch 4 → 5 taken 6 times.
✗ Branch 4 → 69 not taken.
6 PVideoFrame dst = env->NewVideoFrameP(vi, &src);
578
579 6 const int *matrix = iMatrix.data();
580 6 const float *matrixf = fMatrix.data();
581
582 6 int planes_y[4] = { PLANAR_Y, PLANAR_U, PLANAR_V, PLANAR_A };
583 6 int planes_r[4] = { PLANAR_G, PLANAR_B, PLANAR_R, PLANAR_A };
584
5/8
✓ Branch 7 → 8 taken 6 times.
✗ Branch 7 → 67 not taken.
✓ Branch 8 → 9 taken 1 time.
✓ Branch 8 → 11 taken 5 times.
✓ Branch 9 → 10 taken 1 time.
✗ Branch 9 → 67 not taken.
✓ Branch 10 → 11 taken 1 time.
✗ Branch 10 → 12 not taken.
6 int *planes = (vi.IsYUV() || vi.IsYUVA()) ? planes_y : planes_r;
585
3/4
✓ Branch 62 → 63 taken 21 times.
✗ Branch 62 → 67 not taken.
✓ Branch 63 → 14 taken 15 times.
✓ Branch 63 → 64 taken 6 times.
21 for (int p = 0; p < vi.NumComponents(); ++p) {
586 15 const int plane = planes[p];
587
5/6
✓ Branch 14 → 15 taken 6 times.
✓ Branch 14 → 16 taken 9 times.
✓ Branch 15 → 16 taken 6 times.
✗ Branch 15 → 21 not taken.
✓ Branch 16 → 17 taken 11 times.
✓ Branch 16 → 18 taken 4 times.
15 if ((plane == PLANAR_Y && !luma) ||
588
6/6
✓ Branch 17 → 18 taken 4 times.
✓ Branch 17 → 19 taken 7 times.
✓ Branch 18 → 19 taken 2 times.
✓ Branch 18 → 21 taken 6 times.
✓ Branch 19 → 20 taken 1 time.
✓ Branch 19 → 35 taken 8 times.
15 ((plane == PLANAR_U || plane == PLANAR_V) && !chroma) ||
589
1/2
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 35 taken 1 time.
1 (plane == PLANAR_A && !alpha))
590 {
591
7/14
✓ Branch 22 → 23 taken 6 times.
✗ Branch 22 → 67 not taken.
✓ Branch 24 → 25 taken 6 times.
✗ Branch 24 → 67 not taken.
✓ Branch 26 → 27 taken 6 times.
✗ Branch 26 → 67 not taken.
✓ Branch 28 → 29 taken 6 times.
✗ Branch 28 → 67 not taken.
✓ Branch 30 → 31 taken 6 times.
✗ Branch 30 → 67 not taken.
✓ Branch 32 → 33 taken 6 times.
✗ Branch 32 → 67 not taken.
✓ Branch 33 → 34 taken 6 times.
✗ Branch 33 → 67 not taken.
6 env->BitBlt(dst->GetWritePtr(plane), dst->GetPitch(plane), src->GetReadPtr(plane), src->GetPitch(plane), src->GetRowSize(plane), src->GetHeight(plane));
592 6 continue;
593 }
594
595 9 int width = w;
596 9 int height = h;
597
4/4
✓ Branch 35 → 36 taken 8 times.
✓ Branch 35 → 37 taken 1 time.
✓ Branch 36 → 37 taken 1 time.
✓ Branch 36 → 40 taken 7 times.
9 if (plane == PLANAR_U || plane == PLANAR_V) {
598
1/2
✓ Branch 37 → 38 taken 2 times.
✗ Branch 37 → 67 not taken.
2 width >>= vi.GetPlaneWidthSubsampling(plane);
599
1/2
✓ Branch 38 → 39 taken 2 times.
✗ Branch 38 → 67 not taken.
2 height >>= vi.GetPlaneHeightSubsampling(plane);
600 }
601
602
3/4
✓ Branch 40 → 41 taken 9 times.
✗ Branch 40 → 67 not taken.
✓ Branch 41 → 42 taken 5 times.
✓ Branch 41 → 52 taken 4 times.
9 if(vi.BitsPerComponent() <= 16)
603
6/12
✓ Branch 42 → 43 taken 5 times.
✗ Branch 42 → 67 not taken.
✓ Branch 44 → 45 taken 5 times.
✗ Branch 44 → 67 not taken.
✓ Branch 46 → 47 taken 5 times.
✗ Branch 46 → 67 not taken.
✓ Branch 48 → 49 taken 5 times.
✗ Branch 48 → 67 not taken.
✓ Branch 50 → 51 taken 5 times.
✗ Branch 50 → 67 not taken.
✓ Branch 51 → 61 taken 5 times.
✗ Branch 51 → 67 not taken.
5 conversionFnPtr(dst->GetWritePtr(plane), dst->GetPitch(plane), src->GetReadPtr(plane), src->GetPitch(plane), width, height, matrix, iCountDiv, nBias, vi.BitsPerComponent());
604 else
605
5/10
✓ Branch 53 → 54 taken 4 times.
✗ Branch 53 → 67 not taken.
✓ Branch 55 → 56 taken 4 times.
✗ Branch 55 → 67 not taken.
✓ Branch 57 → 58 taken 4 times.
✗ Branch 57 → 67 not taken.
✓ Branch 59 → 60 taken 4 times.
✗ Branch 59 → 67 not taken.
✓ Branch 60 → 61 taken 4 times.
✗ Branch 60 → 67 not taken.
4 FconversionFnPtr(dst->GetWritePtr(plane), dst->GetPitch(plane), src->GetReadPtr(plane), src->GetPitch(plane), width, height, matrixf, fCountDiv, fBias);
606 }
607 6 return dst;
608 // really, not other case left... packed RGB was converted to planar RGB, YUY2 to YV16
609 6 }
610