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 }