1 module CPUblit.composing.common;
2 
3 public import CPUblit.system;
4 public import CPUblit.colorspaces;
5 
6 
7 public import inteli.emmintrin;
8 ///All zeroes vector
9 package immutable __m128i SSE2_NULLVECT;
10 ///All ones vector
11 package immutable __m128i SSE2_FULLVECT = [0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF];
12 ///All ones vector for alpha-blending offset correction when doing it with integers
13 package immutable short8 ALPHABLEND_SSE2_CONST1 = [1,1,1,1,1,1,1,1];
14 ///All 256 vector for negative alpha blending
15 package immutable short8 ALPHABLEND_SSE2_CONST256 = [256,256,256,256,256,256,256,256];
16 ///All 255 vector for negative alpha blending
17 package immutable short8 ALPHABLEND_SSE2_CONST255 = [255,255,255,255,255,255,255,255];
18 	version (cpublit_revalpha) {
19 		///Alpha mask for extracting alpha values from BGRA and RGBA colorspaces
20 		//package immutable ubyte16 ALPHABLEND_SSE2_MASK = [0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255];
21 		package immutable __m128i ALPHABLEND_SSE2_AMASK = [0xFF000000,0xFF000000,0xFF000000,0xFF000000];
22 		version (cpublit_revrgb) {
23 			package immutable __m128i ALPHABLEND_SSE2_BMASK = [0x000000FF,0x000000FF,0x000000FF,0x000000FF];
24 			package immutable __m128i ALPHABLEND_SSE2_GMASK = [0x0000FF00,0x0000FF00,0x0000FF00,0x0000FF00];
25 			package immutable __m128i ALPHABLEND_SSE2_RMASK = [0x00FF0000,0x00FF0000,0x00FF0000,0x00FF0000];
26 		} else {
27 			package immutable __m128i ALPHABLEND_SSE2_RMASK = [0x000000FF,0x000000FF,0x000000FF,0x000000FF];
28 			package immutable __m128i ALPHABLEND_SSE2_GMASK = [0x0000FF00,0x0000FF00,0x0000FF00,0x0000FF00];
29 			package immutable __m128i ALPHABLEND_SSE2_BMASK = [0x00FF0000,0x00FF0000,0x00FF0000,0x00FF0000];
30 		}
31 	} else {
32 		///Alpha mask for extracting alpha values from ARGB and ABGR colorspaces
33 		//package immutable ubyte16 ALPHABLEND_SSE2_MASK = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0];
34 		package immutable __m128i ALPHABLEND_SSE2_AMASK = [0x000000FF,0x000000FF,0x000000FF,0x000000FF];
35 		version (cpublit_revrgb) {
36 			package immutable __m128i ALPHABLEND_SSE2_BMASK = [0x0000FF00,0x0000FF00,0x0000FF00,0x0000FF00];
37 			package immutable __m128i ALPHABLEND_SSE2_GMASK = [0x00FF0000,0x00FF0000,0x00FF0000,0x00FF0000];
38 			package immutable __m128i ALPHABLEND_SSE2_RMASK = [0xFF000000,0xFF000000,0xFF000000,0xFF000000];
39 		} else {
40 			package immutable __m128i ALPHABLEND_SSE2_RMASK = [0x0000FF00,0x0000FF00,0x0000FF00,0x0000FF00];
41 			package immutable __m128i ALPHABLEND_SSE2_GMASK = [0x00FF0000,0x00FF0000,0x00FF0000,0x00FF0000];
42 			package immutable __m128i ALPHABLEND_SSE2_BMASK = [0xFF000000,0xFF000000,0xFF000000,0xFF000000];
43 		}
44 	}
45 
46 
47 version (unittest) {
48 	void testArrayForValue(T)(T[] input, const T refVal = T.init) @safe {
49 		import std.conv : to;
50 		foreach (size_t pos, T val ; input) {
51 			assert(val == refVal, "Error at position " ~ to!string(pos) ~ " with value " ~ to!string(val));
52 		}
53    }
54    void fillWithSingleValue(T)(ref T[] array, const T value) @safe pure nothrow {
55 	   foreach (ref T i ; array) {
56 		   i = value;
57 	   }
58    }
59 }