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. |
22 | enum 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. |
33 | enum 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 | |
47 | BL_HIDDEN extern const BLFormatInfo blPixelConverterFormatInfo[BL_PIXEL_CONVERTER_FORMAT_COUNT]; |
48 | BL_HIDDEN extern const BLPixelConverterOptions blPixelConverterDefaultOptions; |
49 | |
50 | //! Internal data used by `BLPixelConverter`. |
51 | struct 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 | |
94 | static_assert(sizeof(BLPixelConverterData) <= sizeof(BLPixelConverterCore) - sizeof(void*), |
95 | "BLPixelConverterData cannot be longer than BLPixelConverterCore::data" ); |
96 | |
97 | static BL_INLINE BLPixelConverterData* blPixelConverterGetData(BLPixelConverterCore* self) noexcept { |
98 | return reinterpret_cast<BLPixelConverterData*>(self->data); |
99 | } |
100 | |
101 | static BL_INLINE const BLPixelConverterData* blPixelConverterGetData(const BLPixelConverterCore* self) noexcept { |
102 | return reinterpret_cast<const BLPixelConverterData*>(self->data); |
103 | } |
104 | |
105 | static 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 |
117 | BL_HIDDEN bool blPixelConverterInitNativeFromXRGB_SSE2(BLPixelConverterCore* self, uint32_t dstFormat, const BLFormatInfo& srcInfo) noexcept; |
118 | #endif |
119 | |
120 | #ifdef BL_BUILD_OPT_SSSE3 |
121 | BL_HIDDEN bool blPixelConverterInitNativeFromXRGB_SSSE3(BLPixelConverterCore* self, uint32_t dstFormat, const BLFormatInfo& srcInfo) noexcept; |
122 | #endif |
123 | |
124 | #ifdef BL_BUILD_OPT_AVX2 |
125 | BL_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 | |