KleidiCV Coverage Report


Directory: ./
File: kleidicv/include/kleidicv/filters/process_filter_2d.h
Date: 2025-09-25 14:13:34
Exec Total Coverage
Lines: 77 77 100.0%
Functions: 84 84 100.0%
Branches: 168 168 100.0%

Line Branch Exec Source
1 // SPDX-FileCopyrightText: 2025 Arm Limited and/or its affiliates <open-source-office@arm.com>
2 //
3 // SPDX-License-Identifier: Apache-2.0
4
5 #ifndef KLEIDICV_PROCESS_FILTERS_FILTER_2D_H
6 #define KLEIDICV_PROCESS_FILTERS_FILTER_2D_H
7
8 #include "kleidicv/kleidicv.h"
9 #include "kleidicv/types.h"
10 #include "kleidicv/workspace/border_types.h"
11
12 namespace KLEIDICV_TARGET_NAMESPACE {
13
14 // Primary Template for Filter 2D.
15 template <typename InnerFilterType, const size_t S>
16 class Filter2D;
17
18 template <typename FilterType>
19 4830 void process_filter2d(Rectangle rect, size_t y_begin, size_t y_end,
20 Rows<const typename FilterType::SourceType> src_rows,
21 Rows<typename FilterType::DestinationType> dst_rows,
22 typename FilterType::BorderType border_type,
23 FilterType filter) KLEIDICV_STREAMING {
24 // Border helper which calculates border offsets.
25 9660 typename FilterType::BorderInfoType vertical_border{rect.height(),
26 4830 border_type};
27 9660 typename FilterType::BorderInfoType horizontal_border{rect.width(),
28 4830 border_type};
29
30
42/42
✓ Branch 0 taken 198 times.
✓ Branch 1 taken 924 times.
✓ Branch 2 taken 192 times.
✓ Branch 3 taken 1248 times.
✓ Branch 4 taken 212 times.
✓ Branch 5 taken 882 times.
✓ Branch 6 taken 243 times.
✓ Branch 7 taken 2384 times.
✓ Branch 8 taken 234 times.
✓ Branch 9 taken 2314 times.
✓ Branch 10 taken 271 times.
✓ Branch 11 taken 820 times.
✓ Branch 12 taken 252 times.
✓ Branch 13 taken 2454 times.
✓ Branch 14 taken 225 times.
✓ Branch 15 taken 2244 times.
✓ Branch 16 taken 262 times.
✓ Branch 17 taken 380 times.
✓ Branch 18 taken 232 times.
✓ Branch 19 taken 2052 times.
✓ Branch 20 taken 216 times.
✓ Branch 21 taken 1804 times.
✓ Branch 22 taken 260 times.
✓ Branch 23 taken 488 times.
✓ Branch 24 taken 216 times.
✓ Branch 25 taken 1434 times.
✓ Branch 26 taken 203 times.
✓ Branch 27 taken 1580 times.
✓ Branch 28 taken 192 times.
✓ Branch 29 taken 96 times.
✓ Branch 30 taken 230 times.
✓ Branch 31 taken 652 times.
✓ Branch 32 taken 226 times.
✓ Branch 33 taken 868 times.
✓ Branch 34 taken 226 times.
✓ Branch 35 taken 100 times.
✓ Branch 36 taken 232 times.
✓ Branch 37 taken 1668 times.
✓ Branch 38 taken 214 times.
✓ Branch 39 taken 1528 times.
✓ Branch 40 taken 294 times.
✓ Branch 41 taken 108 times.
30858 for (size_t vertical_index = y_begin; vertical_index < y_end;
31 26028 ++vertical_index) {
32 26028 auto vertical_offsets = vertical_border.offsets_with_border(vertical_index);
33 26028 constexpr size_t kMargin = filter.kMargin;
34
35 // Process data affected by left border.
36 KLEIDICV_FORCE_LOOP_UNROLL
37
42/42
✓ Branch 0 taken 1848 times.
✓ Branch 1 taken 924 times.
✓ Branch 2 taken 3744 times.
✓ Branch 3 taken 1248 times.
✓ Branch 4 taken 1700 times.
✓ Branch 5 taken 882 times.
✓ Branch 6 taken 5516 times.
✓ Branch 7 taken 2384 times.
✓ Branch 8 taken 6124 times.
✓ Branch 9 taken 2314 times.
✓ Branch 10 taken 2316 times.
✓ Branch 11 taken 820 times.
✓ Branch 12 taken 4908 times.
✓ Branch 13 taken 2454 times.
✓ Branch 14 taken 6732 times.
✓ Branch 15 taken 2244 times.
✓ Branch 16 taken 688 times.
✓ Branch 17 taken 380 times.
✓ Branch 18 taken 4520 times.
✓ Branch 19 taken 2052 times.
✓ Branch 20 taken 5104 times.
✓ Branch 21 taken 1804 times.
✓ Branch 22 taken 1320 times.
✓ Branch 23 taken 488 times.
✓ Branch 24 taken 2868 times.
✓ Branch 25 taken 1434 times.
✓ Branch 26 taken 4740 times.
✓ Branch 27 taken 1580 times.
✓ Branch 28 taken 96 times.
✓ Branch 29 taken 96 times.
✓ Branch 30 taken 1268 times.
✓ Branch 31 taken 652 times.
✓ Branch 32 taken 2532 times.
✓ Branch 33 taken 868 times.
✓ Branch 34 taken 100 times.
✓ Branch 35 taken 100 times.
✓ Branch 36 taken 3304 times.
✓ Branch 37 taken 1668 times.
✓ Branch 38 taken 4520 times.
✓ Branch 39 taken 1528 times.
✓ Branch 40 taken 108 times.
✓ Branch 41 taken 108 times.
90084 for (size_t horizontal_index = 0; horizontal_index < kMargin;
38 64056 ++horizontal_index) {
39 64056 auto horizontal_offsets =
40 64056 horizontal_border.offsets_with_left_border(horizontal_index);
41 64056 filter.process_one_pixel_with_horizontal_borders(
42 64056 src_rows.at(vertical_index, horizontal_index),
43 64056 dst_rows.at(vertical_index, horizontal_index), vertical_offsets,
44 64056 horizontal_offsets);
45 64056 }
46
47 // Process data which is not affected by any borders in bulk.
48 26028 size_t width_without_borders = rect.width() - (2 * kMargin);
49 26028 auto horizontal_offsets = horizontal_border.offsets_without_border();
50 26028 filter.process_pixels_without_horizontal_borders(
51 26028 width_without_borders, src_rows.at(vertical_index, kMargin),
52 26028 dst_rows.at(vertical_index, kMargin), vertical_offsets,
53 26028 horizontal_offsets);
54
55 // Process data affected by right border.
56 KLEIDICV_FORCE_LOOP_UNROLL
57
42/42
✓ Branch 0 taken 1848 times.
✓ Branch 1 taken 924 times.
✓ Branch 2 taken 3744 times.
✓ Branch 3 taken 1248 times.
✓ Branch 4 taken 1700 times.
✓ Branch 5 taken 882 times.
✓ Branch 6 taken 5516 times.
✓ Branch 7 taken 2384 times.
✓ Branch 8 taken 6124 times.
✓ Branch 9 taken 2314 times.
✓ Branch 10 taken 2316 times.
✓ Branch 11 taken 820 times.
✓ Branch 12 taken 4908 times.
✓ Branch 13 taken 2454 times.
✓ Branch 14 taken 6732 times.
✓ Branch 15 taken 2244 times.
✓ Branch 16 taken 688 times.
✓ Branch 17 taken 380 times.
✓ Branch 18 taken 4520 times.
✓ Branch 19 taken 2052 times.
✓ Branch 20 taken 5104 times.
✓ Branch 21 taken 1804 times.
✓ Branch 22 taken 1320 times.
✓ Branch 23 taken 488 times.
✓ Branch 24 taken 2868 times.
✓ Branch 25 taken 1434 times.
✓ Branch 26 taken 4740 times.
✓ Branch 27 taken 1580 times.
✓ Branch 28 taken 96 times.
✓ Branch 29 taken 96 times.
✓ Branch 30 taken 1268 times.
✓ Branch 31 taken 652 times.
✓ Branch 32 taken 2532 times.
✓ Branch 33 taken 868 times.
✓ Branch 34 taken 100 times.
✓ Branch 35 taken 100 times.
✓ Branch 36 taken 3304 times.
✓ Branch 37 taken 1668 times.
✓ Branch 38 taken 4520 times.
✓ Branch 39 taken 1528 times.
✓ Branch 40 taken 108 times.
✓ Branch 41 taken 108 times.
90084 for (size_t horizontal_index = 0; horizontal_index < kMargin;
58 64056 ++horizontal_index) {
59 64056 size_t index = rect.width() - kMargin + horizontal_index;
60 64056 auto horizontal_offsets =
61 64056 horizontal_border.offsets_with_right_border(index);
62 64056 filter.process_one_pixel_with_horizontal_borders(
63 64056 src_rows.at(vertical_index, index),
64 64056 dst_rows.at(vertical_index, index), vertical_offsets,
65 64056 horizontal_offsets);
66 64056 }
67 26028 }
68 4830 }
69
70 template <typename FilterType>
71 1752 void process_filter2d_by_dual_rows(
72 Rectangle rect, size_t y_begin, size_t y_end,
73 Rows<const typename FilterType::SourceType> src_rows,
74 Rows<typename FilterType::DestinationType> dst_rows,
75 typename FilterType::BorderType border_type,
76 FilterType filter) KLEIDICV_STREAMING {
77 // Border helper which calculates border offsets.
78 3504 typename FilterType::BorderInfoType vertical_border{rect.height(),
79 1752 border_type};
80 3504 typename FilterType::BorderInfoType horizontal_border{rect.width(),
81 1752 border_type};
82 1752 constexpr size_t kMargin = filter.kMargin;
83 1752 size_t vertical_index = y_begin;
84
85
14/14
✓ Branch 0 taken 192 times.
✓ Branch 1 taken 192 times.
✓ Branch 2 taken 1560 times.
✓ Branch 3 taken 294 times.
✓ Branch 4 taken 1560 times.
✓ Branch 5 taken 294 times.
✓ Branch 6 taken 1560 times.
✓ Branch 7 taken 294 times.
✓ Branch 8 taken 192 times.
✓ Branch 9 taken 192 times.
✓ Branch 10 taken 192 times.
✓ Branch 11 taken 192 times.
✓ Branch 12 taken 1560 times.
✓ Branch 13 taken 294 times.
8568 for (; vertical_index < y_end - 1; vertical_index += 2) {
86 // Recalculate vertical border offsets.
87 6816 auto vertical_offsets_0 =
88 6816 vertical_border.offsets_with_border(vertical_index);
89 6816 auto vertical_offsets_1 =
90 6816 vertical_border.offsets_with_border(vertical_index + 1);
91
92 // Process data affected by left border.
93 KLEIDICV_FORCE_LOOP_UNROLL
94
14/14
✓ Branch 0 taken 192 times.
✓ Branch 1 taken 192 times.
✓ Branch 2 taken 1560 times.
✓ Branch 3 taken 1560 times.
✓ Branch 4 taken 1560 times.
✓ Branch 5 taken 1560 times.
✓ Branch 6 taken 1560 times.
✓ Branch 7 taken 1560 times.
✓ Branch 8 taken 192 times.
✓ Branch 9 taken 192 times.
✓ Branch 10 taken 192 times.
✓ Branch 11 taken 192 times.
✓ Branch 12 taken 1560 times.
✓ Branch 13 taken 1560 times.
13632 for (size_t horizontal_index = 0; horizontal_index < kMargin;
95 6816 ++horizontal_index) {
96 6816 auto horizontal_offsets =
97 6816 horizontal_border.offsets_with_left_border(horizontal_index);
98 6816 filter.process_two_pixels_with_horizontal_borders(
99 6816 src_rows.at(vertical_index, horizontal_index),
100 6816 dst_rows.at(vertical_index, horizontal_index), vertical_offsets_0,
101 6816 vertical_offsets_1, horizontal_offsets);
102 6816 }
103
104 // Process data which is not affected by any borders in bulk.
105 6816 size_t width_without_borders = rect.width() - (2 * kMargin);
106 6816 auto horizontal_offsets = horizontal_border.offsets_without_border();
107 6816 filter.process_pixels_of_dual_rows_without_horizontal_borders(
108 6816 width_without_borders, src_rows.at(vertical_index, kMargin),
109 6816 dst_rows.at(vertical_index, kMargin), vertical_offsets_0,
110 6816 vertical_offsets_1, horizontal_offsets);
111
112 // Process data affected by right border.
113 KLEIDICV_FORCE_LOOP_UNROLL
114
14/14
✓ Branch 0 taken 192 times.
✓ Branch 1 taken 192 times.
✓ Branch 2 taken 1560 times.
✓ Branch 3 taken 1560 times.
✓ Branch 4 taken 1560 times.
✓ Branch 5 taken 1560 times.
✓ Branch 6 taken 1560 times.
✓ Branch 7 taken 1560 times.
✓ Branch 8 taken 192 times.
✓ Branch 9 taken 192 times.
✓ Branch 10 taken 192 times.
✓ Branch 11 taken 192 times.
✓ Branch 12 taken 1560 times.
✓ Branch 13 taken 1560 times.
13632 for (size_t horizontal_index = 0; horizontal_index < kMargin;
115 6816 ++horizontal_index) {
116 6816 size_t index = rect.width() - kMargin + horizontal_index;
117 6816 auto horizontal_offsets =
118 6816 horizontal_border.offsets_with_right_border(index);
119
120 6816 filter.process_two_pixels_with_horizontal_borders(
121 6816 src_rows.at(vertical_index, index),
122 6816 dst_rows.at(vertical_index, index), vertical_offsets_0,
123 6816 vertical_offsets_1, horizontal_offsets);
124 6816 }
125 6816 }
126
127 3504 process_filter2d(rect, vertical_index, y_end, src_rows, dst_rows, border_type,
128 1752 filter);
129 1752 }
130
131 } // namespace KLEIDICV_TARGET_NAMESPACE
132
133 #endif // KLEIDICV_PROCESS_FILTERS_FILTER_2D_H
134