Skip to content

Commit 1cee9bf

Browse files
committed
Add preliminary brightness filter to be used later.
1 parent bc68000 commit 1cee9bf

File tree

5 files changed

+154
-0
lines changed

5 files changed

+154
-0
lines changed

SerialPrograms/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -766,6 +766,9 @@ file(GLOB MAIN_SOURCES
766766
Source/Kernels/ImageFilters/Kernels_ImageFilter_Basic_x64_AVX512.cpp
767767
Source/Kernels/ImageFilters/Kernels_ImageFilter_Basic_x64_SSE42.cpp
768768
Source/Kernels/ImageFilters/Kernels_ImageFilter_Green_Default.cpp
769+
Source/Kernels/ImageFilters/RGB32_Brightness/Kernels_ImageFilter_RGB32_Brightness.cpp
770+
Source/Kernels/ImageFilters/RGB32_Brightness/Kernels_ImageFilter_RGB32_Brightness.h
771+
Source/Kernels/ImageFilters/RGB32_Brightness/Kernels_ImageFilter_RGB32_Brightness_Default.cpp
769772
Source/Kernels/ImageFilters/RGB32_EuclideanDistance/Kernels_ImageFilter_RGB32_Euclidean.cpp
770773
Source/Kernels/ImageFilters/RGB32_EuclideanDistance/Kernels_ImageFilter_RGB32_Euclidean.h
771774
Source/Kernels/ImageFilters/RGB32_EuclideanDistance/Kernels_ImageFilter_RGB32_Euclidean_ARM64_NEON.cpp

SerialPrograms/SerialPrograms.pro

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,8 @@ SOURCES += \
374374
Source/Kernels/ImageFilters/Kernels_ImageFilter_Basic_x64_AVX512.cpp \
375375
Source/Kernels/ImageFilters/Kernels_ImageFilter_Basic_x64_SSE42.cpp \
376376
Source/Kernels/ImageFilters/Kernels_ImageFilter_Green_Default.cpp \
377+
Source/Kernels/ImageFilters/RGB32_Brightness/Kernels_ImageFilter_RGB32_Brightness.cpp \
378+
Source/Kernels/ImageFilters/RGB32_Brightness/Kernels_ImageFilter_RGB32_Brightness_Default.cpp \
377379
Source/Kernels/ImageFilters/RGB32_EuclideanDistance/Kernels_ImageFilter_RGB32_Euclidean.cpp \
378380
Source/Kernels/ImageFilters/RGB32_EuclideanDistance/Kernels_ImageFilter_RGB32_Euclidean_ARM64_NEON.cpp \
379381
Source/Kernels/ImageFilters/RGB32_EuclideanDistance/Kernels_ImageFilter_RGB32_Euclidean_Default.cpp \
@@ -1583,6 +1585,7 @@ HEADERS += \
15831585
Source/Kernels/BinaryMatrix/Kernels_SparseBinaryMatrixCore.h \
15841586
Source/Kernels/BinaryMatrix/Kernels_SparseBinaryMatrixCore.tpp \
15851587
Source/Kernels/ImageFilters/Kernels_ImageFilter_Basic.h \
1588+
Source/Kernels/ImageFilters/RGB32_Brightness/Kernels_ImageFilter_RGB32_Brightness.h \
15861589
Source/Kernels/ImageFilters/RGB32_EuclideanDistance/Kernels_ImageFilter_RGB32_Euclidean.h \
15871590
Source/Kernels/ImageFilters/RGB32_Range/Kernels_ImageFilter_RGB32_Range.h \
15881591
Source/Kernels/ImageFilters/RGB32_Range/Kernels_ImageFilter_RGB32_Range_Routines.h \
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/* Image Filters RGB32 Brightness
2+
*
3+
* From: https://github.com/PokemonAutomation/
4+
*
5+
*/
6+
7+
#include "Common/Cpp/Exceptions.h"
8+
#include "Common/Cpp/CpuId/CpuId.h"
9+
#include "Kernels_ImageFilter_RGB32_Brightness.h"
10+
11+
namespace PokemonAutomation{
12+
namespace Kernels{
13+
14+
15+
size_t filter_rgb32_brightness_Default(
16+
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
17+
uint32_t* out, size_t out_bytes_per_row,
18+
uint32_t replacement, bool replace_color_within_range,
19+
uint32_t min_brightness, uint32_t max_brightness
20+
);
21+
size_t filter_rgb32_brightness(
22+
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
23+
uint32_t* out, size_t out_bytes_per_row,
24+
uint32_t replacement, bool replace_color_within_range,
25+
uint32_t min_brightness, uint32_t max_brightness
26+
){
27+
if (width * height > 0xffffffff){
28+
throw InternalProgramError(nullptr, PA_CURRENT_FUNCTION, "Image is too large. more than 2^32 pixels.");
29+
}
30+
31+
return filter_rgb32_brightness_Default(
32+
in, in_bytes_per_row, width, height,
33+
out, out_bytes_per_row,
34+
replacement, replace_color_within_range,
35+
min_brightness, max_brightness
36+
);
37+
}
38+
39+
40+
41+
42+
}
43+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/* Image Filters RGB32 Brightness
2+
*
3+
* From: https://github.com/PokemonAutomation/
4+
*
5+
* Perform a filter over an image and replace pixels that match the filter.
6+
*
7+
*/
8+
9+
#ifndef PokemonAutomation_Kernels_ImageFilter_RGB32_Brightness_H
10+
#define PokemonAutomation_Kernels_ImageFilter_RGB32_Brightness_H
11+
12+
#include <stdint.h>
13+
#include <cstddef>
14+
15+
namespace PokemonAutomation{
16+
namespace Kernels{
17+
18+
19+
20+
size_t filter_rgb32_brightness(
21+
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
22+
uint32_t* out, size_t out_bytes_per_row,
23+
uint32_t replacement, bool replace_color_within_range,
24+
uint32_t min_brightness, uint32_t max_brightness
25+
);
26+
27+
28+
29+
30+
}
31+
}
32+
#endif
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
/* Image Filters RGB32 Brightness
2+
*
3+
* From: https://github.com/PokemonAutomation/
4+
*
5+
*/
6+
7+
#include <immintrin.h>
8+
#include "Kernels/ImageFilters/Kernels_ImageFilter_Basic_Routines.h"
9+
#include "Kernels_ImageFilter_RGB32_Brightness.h"
10+
11+
namespace PokemonAutomation{
12+
namespace Kernels{
13+
14+
15+
class ImageFilter_RgbBrightness_Default{
16+
public:
17+
static const size_t VECTOR_SIZE = 1;
18+
using Mask = size_t;
19+
20+
public:
21+
ImageFilter_RgbBrightness_Default(
22+
uint32_t min_brightness, uint32_t max_brightness,
23+
uint32_t replacement_color, bool replace_color_within_range
24+
)
25+
: m_replacement_color(replacement_color)
26+
, m_replace_color_within_range(replace_color_within_range ? 1 : 0)
27+
, m_min_brightness(min_brightness)
28+
, m_max_brightness(max_brightness)
29+
, m_count(0)
30+
{}
31+
32+
PA_FORCE_INLINE size_t count() const{
33+
return m_count;
34+
}
35+
36+
PA_FORCE_INLINE void process_full(uint32_t* out, const uint32_t* in){
37+
uint32_t pixel = in[0];
38+
uint32_t brightness = 0;
39+
brightness += ((pixel >> 0) & 0x000000ff);
40+
brightness += ((pixel >> 8) & 0x000000ff);
41+
brightness += ((pixel >> 16) & 0x000000ff);
42+
uint32_t ret = m_min_brightness <= brightness && brightness <= m_max_brightness;
43+
ret ^= m_replace_color_within_range;
44+
out[0] = ret ? pixel : m_replacement_color;
45+
}
46+
PA_FORCE_INLINE void process_partial(uint32_t* out, const uint32_t* in, size_t left){
47+
process_full(out, in);
48+
}
49+
50+
private:
51+
const uint32_t m_replacement_color;
52+
const uint32_t m_replace_color_within_range;
53+
uint32_t m_min_brightness;
54+
uint32_t m_max_brightness;
55+
size_t m_count;
56+
};
57+
size_t filter_rgb32_brightness_Default(
58+
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
59+
uint32_t* out, size_t out_bytes_per_row,
60+
uint32_t replacement, bool replace_color_within_range,
61+
uint32_t min_brightness, uint32_t max_brightness
62+
){
63+
ImageFilter_RgbBrightness_Default filter(replacement, replace_color_within_range, min_brightness, max_brightness);
64+
filter_per_pixel(in, in_bytes_per_row, width, height, filter, out, out_bytes_per_row);
65+
return filter.count();
66+
}
67+
68+
69+
70+
71+
72+
}
73+
}

0 commit comments

Comments
 (0)