Skip to content

Commit 8fefae8

Browse files
committed
Add regular image filter for brightness.
1 parent 222b1e5 commit 8fefae8

13 files changed

+157
-32
lines changed

SerialPrograms/Source/CommonTools/Images/ImageFilter.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,22 @@ ImageRGB32 filter_rgb32_euclidean(
170170

171171

172172

173+
ImageRGB32 filter_rgb32_brightness(
174+
const ImageViewRGB32& image,
175+
Color replacement_color, bool replace_color_within_range,
176+
Kernels::Rgb32BrightnessWeights weights,
177+
uint32_t min_brightness, uint32_t max_brightness
178+
){
179+
ImageRGB32 ret(image.width(), image.height());
180+
Kernels::filter_rgb32_brightness(
181+
image.data(), image.bytes_per_row(), image.width(), image.height(),
182+
ret.data(), ret.bytes_per_row(),
183+
(uint32_t)replacement_color, replace_color_within_range,
184+
weights,
185+
min_brightness, max_brightness
186+
);
187+
return ret;
188+
}
173189
ImageRGB32 to_blackwhite_rgb32_brightness(
174190
const ImageViewRGB32& image,
175191
bool in_range_black,

SerialPrograms/Source/CommonTools/Images/ImageFilter.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,16 @@ ImageRGB32 filter_rgb32_euclidean(
128128

129129

130130

131+
// Similar to "filter_rgb32_range()". But instead of checking if each of
132+
// the RGB components are within a range, we check if the dot product of the
133+
// components and a set of weights is within a range. By selecting the weights,
134+
// you can pick which components to check the brightness of.
135+
ImageRGB32 filter_rgb32_brightness(
136+
const ImageViewRGB32& image,
137+
Color replacement_color, bool replace_color_within_range,
138+
Kernels::Rgb32BrightnessWeights weights,
139+
uint32_t min_brightness, uint32_t max_brightness
140+
);
131141
// Similar to "to_blackwhite_rgb32_range()". But instead of checking if each of
132142
// the RGB components are within a range, we check if the dot product of the
133143
// components and a set of weights is within a range. By selecting the weights,

SerialPrograms/Source/Kernels/ImageFilters/RGB32_Brightness/Kernels_ImageFilter_RGB32_Brightness.cpp

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,31 +12,82 @@ namespace PokemonAutomation{
1212
namespace Kernels{
1313

1414

15-
#if 0
15+
16+
size_t filter_rgb32_brightness_x64_AVX512VNNI(
17+
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
18+
uint32_t* out, size_t out_bytes_per_row,
19+
uint32_t replacement, bool replace_color_within_range,
20+
Rgb32BrightnessWeights weights,
21+
uint32_t min_brightness, uint32_t max_brightness
22+
);
23+
size_t filter_rgb32_brightness_x64_AVX2(
24+
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
25+
uint32_t* out, size_t out_bytes_per_row,
26+
uint32_t replacement, bool replace_color_within_range,
27+
Rgb32BrightnessWeights weights,
28+
uint32_t min_brightness, uint32_t max_brightness
29+
);
30+
size_t filter_rgb32_brightness_x64_SSE42(
31+
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
32+
uint32_t* out, size_t out_bytes_per_row,
33+
uint32_t replacement, bool replace_color_within_range,
34+
Rgb32BrightnessWeights weights,
35+
uint32_t min_brightness, uint32_t max_brightness
36+
);
1637
size_t filter_rgb32_brightness_Default(
1738
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
1839
uint32_t* out, size_t out_bytes_per_row,
1940
uint32_t replacement, bool replace_color_within_range,
41+
Rgb32BrightnessWeights weights,
2042
uint32_t min_brightness, uint32_t max_brightness
2143
);
2244
size_t filter_rgb32_brightness(
2345
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
2446
uint32_t* out, size_t out_bytes_per_row,
2547
uint32_t replacement, bool replace_color_within_range,
48+
Rgb32BrightnessWeights weights,
2649
uint32_t min_brightness, uint32_t max_brightness
2750
){
2851
if (width * height > 0xffffffff){
2952
throw InternalProgramError(nullptr, PA_CURRENT_FUNCTION, "Image is too large. more than 2^32 pixels.");
3053
}
31-
54+
#ifdef PA_AutoDispatch_x64_19_IceLake
55+
if (CPU_CAPABILITY_CURRENT.OK_19_IceLake){
56+
return filter_rgb32_brightness_x64_AVX512VNNI(
57+
in, in_bytes_per_row, width, height,
58+
out, out_bytes_per_row,
59+
replacement, replace_color_within_range,
60+
weights, min_brightness, max_brightness
61+
);
62+
}
63+
#endif
64+
#ifdef PA_AutoDispatch_x64_13_Haswell
65+
if (CPU_CAPABILITY_CURRENT.OK_13_Haswell){
66+
return filter_rgb32_brightness_x64_AVX2(
67+
in, in_bytes_per_row, width, height,
68+
out, out_bytes_per_row,
69+
replacement, replace_color_within_range,
70+
weights, min_brightness, max_brightness
71+
);
72+
}
73+
#endif
74+
#ifdef PA_AutoDispatch_x64_08_Nehalem
75+
if (CPU_CAPABILITY_CURRENT.OK_08_Nehalem){
76+
return filter_rgb32_brightness_x64_SSE42(
77+
in, in_bytes_per_row, width, height,
78+
out, out_bytes_per_row,
79+
replacement, replace_color_within_range,
80+
weights, min_brightness, max_brightness
81+
);
82+
}
83+
#endif
3284
return filter_rgb32_brightness_Default(
3385
in, in_bytes_per_row, width, height,
3486
out, out_bytes_per_row,
3587
replacement, replace_color_within_range,
36-
min_brightness, max_brightness
88+
weights, min_brightness, max_brightness
3789
);
3890
}
39-
#endif
4091

4192

4293

SerialPrograms/Source/Kernels/ImageFilters/RGB32_Brightness/Kernels_ImageFilter_RGB32_Brightness.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,13 @@ union Rgb32BrightnessWeights{
4646

4747

4848

49-
50-
#if 0
5149
size_t filter_rgb32_brightness(
5250
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
5351
uint32_t* out, size_t out_bytes_per_row,
5452
uint32_t replacement, bool replace_color_within_range,
53+
Rgb32BrightnessWeights weights,
5554
uint32_t min_brightness, uint32_t max_brightness
5655
);
57-
#endif
58-
5956

6057
size_t to_blackwhite_rgb32_brightness(
6158
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,

SerialPrograms/Source/Kernels/ImageFilters/RGB32_Brightness/Kernels_ImageFilter_RGB32_Brightness_Default.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,23 @@ class PixelTest_Rgb32Brightness_Default{
5252

5353

5454

55+
size_t filter_rgb32_brightness_Default(
56+
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
57+
uint32_t* out, size_t out_bytes_per_row,
58+
uint32_t replacement, bool replace_color_within_range,
59+
Rgb32BrightnessWeights weights,
60+
uint32_t min_brightness, uint32_t max_brightness
61+
){
62+
PixelTest_Rgb32Brightness_Default tester(
63+
weights,
64+
min_brightness, max_brightness
65+
);
66+
FilterImage_Rgb32_Default<PixelTest_Rgb32Brightness_Default> filter(
67+
tester, replacement, replace_color_within_range
68+
);
69+
filter_per_pixel(in, in_bytes_per_row, width, height, filter, out, out_bytes_per_row);
70+
return filter.count();
71+
}
5572
size_t to_blackwhite_rgb32_brightness_Default(
5673
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
5774
uint32_t* out, size_t out_bytes_per_row,

SerialPrograms/Source/Kernels/ImageFilters/RGB32_Brightness/Kernels_ImageFilter_RGB32_Brightness_x64_AVX2.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,23 @@ class PixelTest_Rgb32Brightness_x64_AVX2{
5959

6060

6161

62+
size_t filter_rgb32_brightness_x64_AVX2(
63+
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
64+
uint32_t* out, size_t out_bytes_per_row,
65+
uint32_t replacement, bool replace_color_within_range,
66+
Rgb32BrightnessWeights weights,
67+
uint32_t min_brightness, uint32_t max_brightness
68+
){
69+
PixelTest_Rgb32Brightness_x64_AVX2 tester(
70+
weights,
71+
min_brightness, max_brightness
72+
);
73+
FilterImage_Rgb32_x64_AVX2<PixelTest_Rgb32Brightness_x64_AVX2> filter(
74+
tester, replacement, replace_color_within_range
75+
);
76+
filter_per_pixel(in, in_bytes_per_row, width, height, filter, out, out_bytes_per_row);
77+
return filter.count();
78+
}
6279
size_t to_blackwhite_rgb32_brightness_x64_AVX2(
6380
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
6481
uint32_t* out, size_t out_bytes_per_row,

SerialPrograms/Source/Kernels/ImageFilters/RGB32_Brightness/Kernels_ImageFilter_RGB32_Brightness_x64_AVX512-VNNI.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,23 @@ class PixelTest_Rgb32Brightness_x64_AVX512VNNI{
5050

5151

5252

53+
size_t filter_rgb32_brightness_x64_AVX512VNNI(
54+
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
55+
uint32_t* out, size_t out_bytes_per_row,
56+
uint32_t replacement, bool replace_color_within_range,
57+
Rgb32BrightnessWeights weights,
58+
uint32_t min_brightness, uint32_t max_brightness
59+
){
60+
PixelTest_Rgb32Brightness_x64_AVX512VNNI tester(
61+
weights,
62+
min_brightness, max_brightness
63+
);
64+
FilterImage_Rgb32_x64_AVX512<PixelTest_Rgb32Brightness_x64_AVX512VNNI> filter(
65+
tester, replacement, replace_color_within_range
66+
);
67+
filter_per_pixel(in, in_bytes_per_row, width, height, filter, out, out_bytes_per_row);
68+
return filter.count();
69+
}
5370
size_t to_blackwhite_rgb32_brightness_x64_AVX512VNNI(
5471
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
5572
uint32_t* out, size_t out_bytes_per_row,

SerialPrograms/Source/Kernels/ImageFilters/RGB32_Brightness/Kernels_ImageFilter_RGB32_Brightness_x64_SSE42.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,23 @@ class PixelTest_Rgb32Brightness_x64_SSE42{
5959

6060

6161

62+
size_t filter_rgb32_brightness_x64_SSE42(
63+
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
64+
uint32_t* out, size_t out_bytes_per_row,
65+
uint32_t replacement, bool replace_color_within_range,
66+
Rgb32BrightnessWeights weights,
67+
uint32_t min_brightness, uint32_t max_brightness
68+
){
69+
PixelTest_Rgb32Brightness_x64_SSE42 tester(
70+
weights,
71+
min_brightness, max_brightness
72+
);
73+
FilterImage_Rgb32_x64_SSE42<PixelTest_Rgb32Brightness_x64_SSE42> filter(
74+
tester, replacement, replace_color_within_range
75+
);
76+
filter_per_pixel(in, in_bytes_per_row, width, height, filter, out, out_bytes_per_row);
77+
return filter.count();
78+
}
6279
size_t to_blackwhite_rgb32_brightness_x64_SSE42(
6380
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
6481
uint32_t* out, size_t out_bytes_per_row,

SerialPrograms/Source/Kernels/ImageFilters/RGB32_Range/Kernels_ImageFilter_RGB32_Range_Default.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,6 @@ size_t filter_rgb32_range_Default(
8888
filter_per_pixel(in, in_bytes_per_row, width, height, filter, out, out_bytes_per_row);
8989
return filter.count();
9090
}
91-
92-
93-
94-
95-
96-
9791
size_t to_blackwhite_rgb32_range_Default(
9892
const uint32_t* image, size_t in_bytes_per_row, size_t width, size_t height,
9993
uint32_t* out, size_t out_bytes_per_row,

SerialPrograms/Source/Kernels/ImageFilters/RGB32_Range/Kernels_ImageFilter_RGB32_Range_x64_AVX2.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,6 @@ size_t filter_rgb32_range_x64_AVX2(
7777
filter_per_pixel(in, in_bytes_per_row, width, height, filter, out, out_bytes_per_row);
7878
return filter.count();
7979
}
80-
81-
82-
83-
84-
8580
size_t to_blackwhite_rgb32_range_x64_AVX2(
8681
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
8782
uint32_t* out, size_t out_bytes_per_row,

0 commit comments

Comments
 (0)