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 }