KleidiCV Coverage Report


Directory: ./
File: kleidicv/include/kleidicv/filters/process_filter_2d.h
Date: 2026-01-20 20:58:59
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 6952 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 13904 typename FilterType::BorderInfoType vertical_border{rect.height(),
26 6952 border_type};
27 13904 typename FilterType::BorderInfoType horizontal_border{rect.width(),
28 6952 border_type};
29
30
42/42
✓ Branch 0 taken 264 times.
✓ Branch 1 taken 1232 times.
✓ Branch 2 taken 256 times.
✓ Branch 3 taken 1664 times.
✓ Branch 4 taken 286 times.
✓ Branch 5 taken 914 times.
✓ Branch 6 taken 366 times.
✓ Branch 7 taken 3202 times.
✓ Branch 8 taken 346 times.
✓ Branch 9 taken 3062 times.
✓ Branch 10 taken 417 times.
✓ Branch 11 taken 892 times.
✓ Branch 12 taken 376 times.
✓ Branch 13 taken 3272 times.
✓ Branch 14 taken 336 times.
✓ Branch 15 taken 2992 times.
✓ Branch 16 taken 399 times.
✓ Branch 17 taken 452 times.
✓ Branch 18 taken 346 times.
✓ Branch 19 taken 2870 times.
✓ Branch 20 taken 318 times.
✓ Branch 21 taken 2552 times.
✓ Branch 22 taken 397 times.
✓ Branch 23 taken 560 times.
✓ Branch 24 taken 292 times.
✓ Branch 25 taken 1742 times.
✓ Branch 26 taken 276 times.
✓ Branch 27 taken 1996 times.
✓ Branch 28 taken 256 times.
✓ Branch 29 taken 128 times.
✓ Branch 30 taken 309 times.
✓ Branch 31 taken 972 times.
✓ Branch 32 taken 303 times.
✓ Branch 33 taken 1296 times.
✓ Branch 34 taken 303 times.
✓ Branch 35 taken 144 times.
✓ Branch 36 taken 346 times.
✓ Branch 37 taken 2486 times.
✓ Branch 38 taken 316 times.
✓ Branch 39 taken 2276 times.
✓ Branch 40 taken 444 times.
✓ Branch 41 taken 192 times.
41848 for (size_t vertical_index = y_begin; vertical_index < y_end;
31 34896 ++vertical_index) {
32 34896 auto vertical_offsets = vertical_border.offsets_with_border(vertical_index);
33 34896 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 2464 times.
✓ Branch 1 taken 1232 times.
✓ Branch 2 taken 4992 times.
✓ Branch 3 taken 1664 times.
✓ Branch 4 taken 1732 times.
✓ Branch 5 taken 914 times.
✓ Branch 6 taken 7152 times.
✓ Branch 7 taken 3202 times.
✓ Branch 8 taken 8368 times.
✓ Branch 9 taken 3062 times.
✓ Branch 10 taken 2388 times.
✓ Branch 11 taken 892 times.
✓ Branch 12 taken 6544 times.
✓ Branch 13 taken 3272 times.
✓ Branch 14 taken 8976 times.
✓ Branch 15 taken 2992 times.
✓ Branch 16 taken 760 times.
✓ Branch 17 taken 452 times.
✓ Branch 18 taken 6156 times.
✓ Branch 19 taken 2870 times.
✓ Branch 20 taken 7348 times.
✓ Branch 21 taken 2552 times.
✓ Branch 22 taken 1392 times.
✓ Branch 23 taken 560 times.
✓ Branch 24 taken 3484 times.
✓ Branch 25 taken 1742 times.
✓ Branch 26 taken 5988 times.
✓ Branch 27 taken 1996 times.
✓ Branch 28 taken 128 times.
✓ Branch 29 taken 128 times.
✓ Branch 30 taken 1896 times.
✓ Branch 31 taken 972 times.
✓ Branch 32 taken 3792 times.
✓ Branch 33 taken 1296 times.
✓ Branch 34 taken 144 times.
✓ Branch 35 taken 144 times.
✓ Branch 36 taken 4940 times.
✓ Branch 37 taken 2486 times.
✓ Branch 38 taken 6764 times.
✓ Branch 39 taken 2276 times.
✓ Branch 40 taken 192 times.
✓ Branch 41 taken 192 times.
120496 for (size_t horizontal_index = 0; horizontal_index < kMargin;
38 85600 ++horizontal_index) {
39 85600 auto horizontal_offsets =
40 85600 horizontal_border.offsets_with_left_border(horizontal_index);
41 85600 filter.process_one_pixel_with_horizontal_borders(
42 85600 src_rows.at(vertical_index, horizontal_index),
43 85600 dst_rows.at(vertical_index, horizontal_index), vertical_offsets,
44 85600 horizontal_offsets);
45 85600 }
46
47 // Process data which is not affected by any borders in bulk.
48 34896 size_t width_without_borders = rect.width() - (2 * kMargin);
49 34896 auto horizontal_offsets = horizontal_border.offsets_without_border();
50 34896 filter.process_pixels_without_horizontal_borders(
51 34896 width_without_borders, src_rows.at(vertical_index, kMargin),
52 34896 dst_rows.at(vertical_index, kMargin), vertical_offsets,
53 34896 horizontal_offsets);
54
55 // Process data affected by right border.
56 KLEIDICV_FORCE_LOOP_UNROLL
57
42/42
✓ Branch 0 taken 2464 times.
✓ Branch 1 taken 1232 times.
✓ Branch 2 taken 4992 times.
✓ Branch 3 taken 1664 times.
✓ Branch 4 taken 1732 times.
✓ Branch 5 taken 914 times.
✓ Branch 6 taken 7152 times.
✓ Branch 7 taken 3202 times.
✓ Branch 8 taken 8368 times.
✓ Branch 9 taken 3062 times.
✓ Branch 10 taken 2388 times.
✓ Branch 11 taken 892 times.
✓ Branch 12 taken 6544 times.
✓ Branch 13 taken 3272 times.
✓ Branch 14 taken 8976 times.
✓ Branch 15 taken 2992 times.
✓ Branch 16 taken 760 times.
✓ Branch 17 taken 452 times.
✓ Branch 18 taken 6156 times.
✓ Branch 19 taken 2870 times.
✓ Branch 20 taken 7348 times.
✓ Branch 21 taken 2552 times.
✓ Branch 22 taken 1392 times.
✓ Branch 23 taken 560 times.
✓ Branch 24 taken 3484 times.
✓ Branch 25 taken 1742 times.
✓ Branch 26 taken 5988 times.
✓ Branch 27 taken 1996 times.
✓ Branch 28 taken 128 times.
✓ Branch 29 taken 128 times.
✓ Branch 30 taken 1896 times.
✓ Branch 31 taken 972 times.
✓ Branch 32 taken 3792 times.
✓ Branch 33 taken 1296 times.
✓ Branch 34 taken 144 times.
✓ Branch 35 taken 144 times.
✓ Branch 36 taken 4940 times.
✓ Branch 37 taken 2486 times.
✓ Branch 38 taken 6764 times.
✓ Branch 39 taken 2276 times.
✓ Branch 40 taken 192 times.
✓ Branch 41 taken 192 times.
120496 for (size_t horizontal_index = 0; horizontal_index < kMargin;
58 85600 ++horizontal_index) {
59 85600 size_t index = rect.width() - kMargin + horizontal_index;
60 85600 auto horizontal_offsets =
61 85600 horizontal_border.offsets_with_right_border(index);
62 85600 filter.process_one_pixel_with_horizontal_borders(
63 85600 src_rows.at(vertical_index, index),
64 85600 dst_rows.at(vertical_index, index), vertical_offsets,
65 85600 horizontal_offsets);
66 85600 }
67 34896 }
68 6952 }
69
70 template <typename FilterType>
71 2544 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 5088 typename FilterType::BorderInfoType vertical_border{rect.height(),
79 2544 border_type};
80 5088 typename FilterType::BorderInfoType horizontal_border{rect.width(),
81 2544 border_type};
82 2544 constexpr size_t kMargin = filter.kMargin;
83 2544 size_t vertical_index = y_begin;
84
85
14/14
✓ Branch 0 taken 256 times.
✓ Branch 1 taken 256 times.
✓ Branch 2 taken 2056 times.
✓ Branch 3 taken 444 times.
✓ Branch 4 taken 2056 times.
✓ Branch 5 taken 444 times.
✓ Branch 6 taken 2056 times.
✓ Branch 7 taken 444 times.
✓ Branch 8 taken 256 times.
✓ Branch 9 taken 256 times.
✓ Branch 10 taken 256 times.
✓ Branch 11 taken 256 times.
✓ Branch 12 taken 2056 times.
✓ Branch 13 taken 444 times.
11536 for (; vertical_index < y_end - 1; vertical_index += 2) {
86 // Recalculate vertical border offsets.
87 8992 auto vertical_offsets_0 =
88 8992 vertical_border.offsets_with_border(vertical_index);
89 8992 auto vertical_offsets_1 =
90 8992 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 256 times.
✓ Branch 1 taken 256 times.
✓ Branch 2 taken 2056 times.
✓ Branch 3 taken 2056 times.
✓ Branch 4 taken 2056 times.
✓ Branch 5 taken 2056 times.
✓ Branch 6 taken 2056 times.
✓ Branch 7 taken 2056 times.
✓ Branch 8 taken 256 times.
✓ Branch 9 taken 256 times.
✓ Branch 10 taken 256 times.
✓ Branch 11 taken 256 times.
✓ Branch 12 taken 2056 times.
✓ Branch 13 taken 2056 times.
17984 for (size_t horizontal_index = 0; horizontal_index < kMargin;
95 8992 ++horizontal_index) {
96 8992 auto horizontal_offsets =
97 8992 horizontal_border.offsets_with_left_border(horizontal_index);
98 8992 filter.process_two_pixels_with_horizontal_borders(
99 8992 src_rows.at(vertical_index, horizontal_index),
100 8992 dst_rows.at(vertical_index, horizontal_index), vertical_offsets_0,
101 8992 vertical_offsets_1, horizontal_offsets);
102 8992 }
103
104 // Process data which is not affected by any borders in bulk.
105 8992 size_t width_without_borders = rect.width() - (2 * kMargin);
106 8992 auto horizontal_offsets = horizontal_border.offsets_without_border();
107 8992 filter.process_pixels_of_dual_rows_without_horizontal_borders(
108 8992 width_without_borders, src_rows.at(vertical_index, kMargin),
109 8992 dst_rows.at(vertical_index, kMargin), vertical_offsets_0,
110 8992 vertical_offsets_1, horizontal_offsets);
111
112 // Process data affected by right border.
113 KLEIDICV_FORCE_LOOP_UNROLL
114
14/14
✓ Branch 0 taken 256 times.
✓ Branch 1 taken 256 times.
✓ Branch 2 taken 2056 times.
✓ Branch 3 taken 2056 times.
✓ Branch 4 taken 2056 times.
✓ Branch 5 taken 2056 times.
✓ Branch 6 taken 2056 times.
✓ Branch 7 taken 2056 times.
✓ Branch 8 taken 256 times.
✓ Branch 9 taken 256 times.
✓ Branch 10 taken 256 times.
✓ Branch 11 taken 256 times.
✓ Branch 12 taken 2056 times.
✓ Branch 13 taken 2056 times.
17984 for (size_t horizontal_index = 0; horizontal_index < kMargin;
115 8992 ++horizontal_index) {
116 8992 size_t index = rect.width() - kMargin + horizontal_index;
117 8992 auto horizontal_offsets =
118 8992 horizontal_border.offsets_with_right_border(index);
119
120 8992 filter.process_two_pixels_with_horizontal_borders(
121 8992 src_rows.at(vertical_index, index),
122 8992 dst_rows.at(vertical_index, index), vertical_offsets_0,
123 8992 vertical_offsets_1, horizontal_offsets);
124 8992 }
125 8992 }
126
127 5088 process_filter2d(rect, vertical_index, y_end, src_rows, dst_rows, border_type,
128 2544 filter);
129 2544 }
130
131 } // namespace KLEIDICV_TARGET_NAMESPACE
132
133 #endif // KLEIDICV_PROCESS_FILTERS_FILTER_2D_H
134