1 module CPUblit.colorlookup;
2 /**
3  * CPUblit
4  * Color look-up and planar to chunky (coming soon) conversion functions.
5  */
6 
7 
8 public import CPUblit.colorspaces;
9 import bitleveld.datatypes;
10 /**
11  * Converts an indexed image of type T (eg. ubyte, ushort) into an unindexed type of U (eg. Pixel16Bit, Pixel32Bit).
12  */
13 public void colorLookup(T, U)(T* src, U* dest, U* palette, size_t length) @nogc pure nothrow {
14 	while(length){
15 		*dest = palette[*src];
16 		src++;
17 		dest++;
18 		length--;
19 	}
20 }
21 /**
22  * Converts a 4 Bit indexed image into an unindexed type of U (eg. Pixel16Bit, Pixel32Bit).
23  * Word order is: 0xF0 even, 0x0F odd.
24  */
25 public void colorLookup4Bit(U)(ubyte* src, U* dest, U* palette, size_t length, int offset = 0) @nogc pure nothrow {
26 	colorLookup4Bit!(NibbleArray)(NibbleArray(src[0..length>>>1], length), dest, palette, offset);
27 }
28 /**
29  * Converts a 4 Bit indexed image into an unindexed type of U (eg. Pixel16Bit, Pixel32Bit).
30  * Uses a NibbleArray as a backend.
31  */
32 public void colorLookup4Bit(T,U)(T src, U* dest, U* palette, int offset = 0) @nogc pure nothrow
33 		if(T.mangleof == NibbleArray.mangleof || T.mangleof == NibbleArrayR.mangleof) {
34 	for ( ; offset < src.length ; offset++) {
35 		*dest = palette[src[offset]];
36 		dest++;
37 	}
38 }
39 /**
40  * Converts a 2 Bit indexed image into an unindexed type of U (eg. Pixel16Bit, Pixel32Bit).
41  * Word order is: 0: 0b11_00_00_00 1: 0b00_11_00_00 2: 0b00_00_11_00 3: 0b00_00_00_11
42  */
43 public void colorLookup2Bit(U)(ubyte* src, U* dest, U* palette, size_t length, int offset = 0) @nogc pure nothrow {
44 	colorLookup2Bit!(QuadArray)(QuadArray(src[0..length>>>2]), dest, palette, offset);
45 }
46 /**
47  * Converts a 2 Bit indexed image into an unindexed type of U (eg. Pixel16Bit, Pixel32Bit).
48  * Uses a QuadArray as a backend.
49  */
50 public void colorLookup2Bit(T,U)(T src, U* dest, U* palette, int offset = 0) @nogc pure nothrow 
51 		if(T.mangleof == QuadArray.mangleof || T.mangleof == QuadArrayR.mangleof){
52 	for ( ; offset < src.length ; offset++){
53 		*dest = palette[src[offset]];
54 		dest++;
55 	}
56 }
57 @nogc pure nothrow unittest {
58 	ubyte[256] a, b;
59 	uint[256] c, d;
60 	ushort[256] e;
61 	colorLookup(a.ptr, c.ptr, d.ptr, 255);
62 	colorLookup(e.ptr, c.ptr, d.ptr, 255);
63 	colorLookup2Bit(a.ptr, c.ptr, d.ptr, 255, 1);
64 	colorLookup2Bit(a.ptr, c.ptr, d.ptr, 255, 0);
65 	colorLookup4Bit(a.ptr, c.ptr, d.ptr, 254, 1);
66 	colorLookup4Bit(a.ptr, c.ptr, d.ptr, 254, 0);
67 }