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/32void 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/32void 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/32void 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/32void 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/32void 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/32void 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/32void 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/32void 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/32void 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/32void 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/32void 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/32void 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/32void 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/32void 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/16void 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/32void 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/32void 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/32void 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/32void 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/32void 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/8void 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/8void 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/8void 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/8void 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/8void 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/8void 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/8void 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/8void 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/8void 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/8void 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/8void 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/8void 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/8void 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/8void 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/8void 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/8void 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/8void 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/8void 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/8void 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 |