1// [Blend2D]
2// 2D Vector Graphics Powered by a JIT Compiler.
3//
4// [License]
5// Zlib - See LICENSE.md file in the package.
6
7#ifndef BLEND2D_BLPIXELCONVERTER_P_H
8#define BLEND2D_BLPIXELCONVERTER_P_H
9
10#include "./blapi-internal_p.h"
11#include "./blpixelconverter.h"
12
13//! \cond INTERNAL
14//! \addtogroup blend2d_internal
15//! \{
16
17// ============================================================================
18// [Constants]
19// ============================================================================
20
21//! Native pixel formats for pixel converter.
22enum BLPixelConverterFormat : uint32_t {
23 BL_PIXEL_CONVERTER_FORMAT_NONE = 0,
24 BL_PIXEL_CONVERTER_FORMAT_PRGB32 = BL_FORMAT_PRGB32,
25 BL_PIXEL_CONVERTER_FORMAT_XRGB32 = BL_FORMAT_XRGB32,
26 BL_PIXEL_CONVERTER_FORMAT_A8 = BL_FORMAT_A8,
27 BL_PIXEL_CONVERTER_FORMAT_ARGB32 = BL_FORMAT_COUNT + 0,
28
29 BL_PIXEL_CONVERTER_FORMAT_COUNT = BL_FORMAT_COUNT + 1
30};
31
32//! Strategy used by BLPixelConverter.
33enum BLPixelConverterStrategy : uint32_t {
34 //! None - this means that the converter is not initialized.
35 BL_PIXEL_CONVERTER_STRATEGY_NONE,
36 BL_PIXEL_CONVERTER_STRATEGY_LOOKUP_TABLE,
37 BL_PIXEL_CONVERTER_STRATEGY_SHUFFLE_BYTE,
38 BL_PIXEL_CONVERTER_STRATEGY_XRGB32_FROM_XRGB_ANY,
39 BL_PIXEL_CONVERTER_STRATEGY_PRGB32_FROM_ARGB_ANY,
40 BL_PIXEL_CONVERTER_STRATEGY_PRGB32_FROM_PRGB_ANY
41};
42
43// ============================================================================
44// [BLPixelConverter - Globals]
45// ============================================================================
46
47BL_HIDDEN extern const BLFormatInfo blPixelConverterFormatInfo[BL_PIXEL_CONVERTER_FORMAT_COUNT];
48BL_HIDDEN extern const BLPixelConverterOptions blPixelConverterDefaultOptions;
49
50//! Internal data used by `BLPixelConverter`.
51struct BLPixelConverterData {
52 //! Data used by lookup table strategy.
53 struct LookupTable {
54 uint8_t strategy;
55 uint8_t reserved[sizeof(void*) - 3];
56 const uint32_t* table;
57 };
58
59 //! Data used by shuffle bytes strategy.
60 struct ShuffleByte {
61 uint8_t strategy;
62 uint8_t reserved[3];
63 };
64
65 //! Data used by strategies for converting ANY pixel format to native XRGB/PRGB.
66 struct NativeFromExternal {
67 uint8_t strategy;
68 uint8_t reserved[3];
69 uint32_t fillMask;
70 uint8_t shifts[4];
71 uint32_t masks[4];
72 uint32_t scale[4];
73 uint32_t simdData[4];
74 };
75
76 struct ExternalFromNative {
77 uint8_t strategy;
78 uint8_t reserved[3];
79 uint32_t fillMask;
80 uint8_t shifts[4];
81 uint32_t masks[4];
82 uint32_t simdData[4];
83 };
84
85 union {
86 uint8_t strategy;
87 LookupTable lookupTable;
88 ShuffleByte shuffleByte;
89 NativeFromExternal nativeFromExternal;
90 ExternalFromNative externalFromNative;
91 };
92};
93
94static_assert(sizeof(BLPixelConverterData) <= sizeof(BLPixelConverterCore) - sizeof(void*),
95 "BLPixelConverterData cannot be longer than BLPixelConverterCore::data");
96
97static BL_INLINE BLPixelConverterData* blPixelConverterGetData(BLPixelConverterCore* self) noexcept {
98 return reinterpret_cast<BLPixelConverterData*>(self->data);
99}
100
101static BL_INLINE const BLPixelConverterData* blPixelConverterGetData(const BLPixelConverterCore* self) noexcept {
102 return reinterpret_cast<const BLPixelConverterData*>(self->data);
103}
104
105static BL_INLINE uint8_t* blPixelConverterFillGap(uint8_t* data, size_t size) noexcept {
106 uint8_t* end = data + size;
107 while (data != end)
108 *data++ = 0;
109 return data;
110}
111
112// ============================================================================
113// [BLPixelConverter - Create]
114// ============================================================================
115
116#ifdef BL_BUILD_OPT_SSE2
117BL_HIDDEN bool blPixelConverterInitNativeFromXRGB_SSE2(BLPixelConverterCore* self, uint32_t dstFormat, const BLFormatInfo& srcInfo) noexcept;
118#endif
119
120#ifdef BL_BUILD_OPT_SSSE3
121BL_HIDDEN bool blPixelConverterInitNativeFromXRGB_SSSE3(BLPixelConverterCore* self, uint32_t dstFormat, const BLFormatInfo& srcInfo) noexcept;
122#endif
123
124#ifdef BL_BUILD_OPT_AVX2
125BL_HIDDEN bool blPixelConverterInitNativeFromXRGB_AVX2(BLPixelConverterCore* self, uint32_t dstFormat, const BLFormatInfo& srcInfo) noexcept;
126#endif
127
128//! \}
129//! \endcond
130
131#endif // BLEND2D_BLPIXELCONVERTER_P_H
132