/* stretch.c - look up tables for doing fast bit stretching multiple pixels at a time * PUBLIC DOMAIN - Jon Mayo - April 5, 2009 */ #include #include #include "stretch.h" /* in: out: * 8 1bpp 4 8bpp * 4 2bpp 4 8bpp * 2 4bpp 2 8bpp */ /* 1 to 8 bits (8 way) */ const uint64_t bs_1bpp_to_8bpp[256] = { 0x0000000000000000ull, 0x00000000000000ffull, 0x000000000000ff00ull, 0x000000000000ffffull, 0x0000000000ff0000ull, 0x0000000000ff00ffull, 0x0000000000ffff00ull, 0x0000000000ffffffull, 0x00000000ff000000ull, 0x00000000ff0000ffull, 0x00000000ff00ff00ull, 0x00000000ff00ffffull, 0x00000000ffff0000ull, 0x00000000ffff00ffull, 0x00000000ffffff00ull, 0x00000000ffffffffull, 0x000000ff00000000ull, 0x000000ff000000ffull, 0x000000ff0000ff00ull, 0x000000ff0000ffffull, 0x000000ff00ff0000ull, 0x000000ff00ff00ffull, 0x000000ff00ffff00ull, 0x000000ff00ffffffull, 0x000000ffff000000ull, 0x000000ffff0000ffull, 0x000000ffff00ff00ull, 0x000000ffff00ffffull, 0x000000ffffff0000ull, 0x000000ffffff00ffull, 0x000000ffffffff00ull, 0x000000ffffffffffull, 0x0000ff0000000000ull, 0x0000ff00000000ffull, 0x0000ff000000ff00ull, 0x0000ff000000ffffull, 0x0000ff0000ff0000ull, 0x0000ff0000ff00ffull, 0x0000ff0000ffff00ull, 0x0000ff0000ffffffull, 0x0000ff00ff000000ull, 0x0000ff00ff0000ffull, 0x0000ff00ff00ff00ull, 0x0000ff00ff00ffffull, 0x0000ff00ffff0000ull, 0x0000ff00ffff00ffull, 0x0000ff00ffffff00ull, 0x0000ff00ffffffffull, 0x0000ffff00000000ull, 0x0000ffff000000ffull, 0x0000ffff0000ff00ull, 0x0000ffff0000ffffull, 0x0000ffff00ff0000ull, 0x0000ffff00ff00ffull, 0x0000ffff00ffff00ull, 0x0000ffff00ffffffull, 0x0000ffffff000000ull, 0x0000ffffff0000ffull, 0x0000ffffff00ff00ull, 0x0000ffffff00ffffull, 0x0000ffffffff0000ull, 0x0000ffffffff00ffull, 0x0000ffffffffff00ull, 0x0000ffffffffffffull, 0x00ff000000000000ull, 0x00ff0000000000ffull, 0x00ff00000000ff00ull, 0x00ff00000000ffffull, 0x00ff000000ff0000ull, 0x00ff000000ff00ffull, 0x00ff000000ffff00ull, 0x00ff000000ffffffull, 0x00ff0000ff000000ull, 0x00ff0000ff0000ffull, 0x00ff0000ff00ff00ull, 0x00ff0000ff00ffffull, 0x00ff0000ffff0000ull, 0x00ff0000ffff00ffull, 0x00ff0000ffffff00ull, 0x00ff0000ffffffffull, 0x00ff00ff00000000ull, 0x00ff00ff000000ffull, 0x00ff00ff0000ff00ull, 0x00ff00ff0000ffffull, 0x00ff00ff00ff0000ull, 0x00ff00ff00ff00ffull, 0x00ff00ff00ffff00ull, 0x00ff00ff00ffffffull, 0x00ff00ffff000000ull, 0x00ff00ffff0000ffull, 0x00ff00ffff00ff00ull, 0x00ff00ffff00ffffull, 0x00ff00ffffff0000ull, 0x00ff00ffffff00ffull, 0x00ff00ffffffff00ull, 0x00ff00ffffffffffull, 0x00ffff0000000000ull, 0x00ffff00000000ffull, 0x00ffff000000ff00ull, 0x00ffff000000ffffull, 0x00ffff0000ff0000ull, 0x00ffff0000ff00ffull, 0x00ffff0000ffff00ull, 0x00ffff0000ffffffull, 0x00ffff00ff000000ull, 0x00ffff00ff0000ffull, 0x00ffff00ff00ff00ull, 0x00ffff00ff00ffffull, 0x00ffff00ffff0000ull, 0x00ffff00ffff00ffull, 0x00ffff00ffffff00ull, 0x00ffff00ffffffffull, 0x00ffffff00000000ull, 0x00ffffff000000ffull, 0x00ffffff0000ff00ull, 0x00ffffff0000ffffull, 0x00ffffff00ff0000ull, 0x00ffffff00ff00ffull, 0x00ffffff00ffff00ull, 0x00ffffff00ffffffull, 0x00ffffffff000000ull, 0x00ffffffff0000ffull, 0x00ffffffff00ff00ull, 0x00ffffffff00ffffull, 0x00ffffffffff0000ull, 0x00ffffffffff00ffull, 0x00ffffffffffff00ull, 0x00ffffffffffffffull, 0xff00000000000000ull, 0xff000000000000ffull, 0xff0000000000ff00ull, 0xff0000000000ffffull, 0xff00000000ff0000ull, 0xff00000000ff00ffull, 0xff00000000ffff00ull, 0xff00000000ffffffull, 0xff000000ff000000ull, 0xff000000ff0000ffull, 0xff000000ff00ff00ull, 0xff000000ff00ffffull, 0xff000000ffff0000ull, 0xff000000ffff00ffull, 0xff000000ffffff00ull, 0xff000000ffffffffull, 0xff0000ff00000000ull, 0xff0000ff000000ffull, 0xff0000ff0000ff00ull, 0xff0000ff0000ffffull, 0xff0000ff00ff0000ull, 0xff0000ff00ff00ffull, 0xff0000ff00ffff00ull, 0xff0000ff00ffffffull, 0xff0000ffff000000ull, 0xff0000ffff0000ffull, 0xff0000ffff00ff00ull, 0xff0000ffff00ffffull, 0xff0000ffffff0000ull, 0xff0000ffffff00ffull, 0xff0000ffffffff00ull, 0xff0000ffffffffffull, 0xff00ff0000000000ull, 0xff00ff00000000ffull, 0xff00ff000000ff00ull, 0xff00ff000000ffffull, 0xff00ff0000ff0000ull, 0xff00ff0000ff00ffull, 0xff00ff0000ffff00ull, 0xff00ff0000ffffffull, 0xff00ff00ff000000ull, 0xff00ff00ff0000ffull, 0xff00ff00ff00ff00ull, 0xff00ff00ff00ffffull, 0xff00ff00ffff0000ull, 0xff00ff00ffff00ffull, 0xff00ff00ffffff00ull, 0xff00ff00ffffffffull, 0xff00ffff00000000ull, 0xff00ffff000000ffull, 0xff00ffff0000ff00ull, 0xff00ffff0000ffffull, 0xff00ffff00ff0000ull, 0xff00ffff00ff00ffull, 0xff00ffff00ffff00ull, 0xff00ffff00ffffffull, 0xff00ffffff000000ull, 0xff00ffffff0000ffull, 0xff00ffffff00ff00ull, 0xff00ffffff00ffffull, 0xff00ffffffff0000ull, 0xff00ffffffff00ffull, 0xff00ffffffffff00ull, 0xff00ffffffffffffull, 0xffff000000000000ull, 0xffff0000000000ffull, 0xffff00000000ff00ull, 0xffff00000000ffffull, 0xffff000000ff0000ull, 0xffff000000ff00ffull, 0xffff000000ffff00ull, 0xffff000000ffffffull, 0xffff0000ff000000ull, 0xffff0000ff0000ffull, 0xffff0000ff00ff00ull, 0xffff0000ff00ffffull, 0xffff0000ffff0000ull, 0xffff0000ffff00ffull, 0xffff0000ffffff00ull, 0xffff0000ffffffffull, 0xffff00ff00000000ull, 0xffff00ff000000ffull, 0xffff00ff0000ff00ull, 0xffff00ff0000ffffull, 0xffff00ff00ff0000ull, 0xffff00ff00ff00ffull, 0xffff00ff00ffff00ull, 0xffff00ff00ffffffull, 0xffff00ffff000000ull, 0xffff00ffff0000ffull, 0xffff00ffff00ff00ull, 0xffff00ffff00ffffull, 0xffff00ffffff0000ull, 0xffff00ffffff00ffull, 0xffff00ffffffff00ull, 0xffff00ffffffffffull, 0xffffff0000000000ull, 0xffffff00000000ffull, 0xffffff000000ff00ull, 0xffffff000000ffffull, 0xffffff0000ff0000ull, 0xffffff0000ff00ffull, 0xffffff0000ffff00ull, 0xffffff0000ffffffull, 0xffffff00ff000000ull, 0xffffff00ff0000ffull, 0xffffff00ff00ff00ull, 0xffffff00ff00ffffull, 0xffffff00ffff0000ull, 0xffffff00ffff00ffull, 0xffffff00ffffff00ull, 0xffffff00ffffffffull, 0xffffffff00000000ull, 0xffffffff000000ffull, 0xffffffff0000ff00ull, 0xffffffff0000ffffull, 0xffffffff00ff0000ull, 0xffffffff00ff00ffull, 0xffffffff00ffff00ull, 0xffffffff00ffffffull, 0xffffffffff000000ull, 0xffffffffff0000ffull, 0xffffffffff00ff00ull, 0xffffffffff00ffffull, 0xffffffffffff0000ull, 0xffffffffffff00ffull, 0xffffffffffffff00ull, 0xffffffffffffffffull, }; /* 2 to 8 bits (4 way) */ const uint32_t bs_2bpp_to_8bpp[256] = { 0x00000000ul, 0x00000055ul, 0x000000aaul, 0x000000fful, 0x00005500ul, 0x00005555ul, 0x000055aaul, 0x000055fful, 0x0000aa00ul, 0x0000aa55ul, 0x0000aaaaul, 0x0000aafful, 0x0000ff00ul, 0x0000ff55ul, 0x0000ffaaul, 0x0000fffful, 0x00550000ul, 0x00550055ul, 0x005500aaul, 0x005500fful, 0x00555500ul, 0x00555555ul, 0x005555aaul, 0x005555fful, 0x0055aa00ul, 0x0055aa55ul, 0x0055aaaaul, 0x0055aafful, 0x0055ff00ul, 0x0055ff55ul, 0x0055ffaaul, 0x0055fffful, 0x00aa0000ul, 0x00aa0055ul, 0x00aa00aaul, 0x00aa00fful, 0x00aa5500ul, 0x00aa5555ul, 0x00aa55aaul, 0x00aa55fful, 0x00aaaa00ul, 0x00aaaa55ul, 0x00aaaaaaul, 0x00aaaafful, 0x00aaff00ul, 0x00aaff55ul, 0x00aaffaaul, 0x00aafffful, 0x00ff0000ul, 0x00ff0055ul, 0x00ff00aaul, 0x00ff00fful, 0x00ff5500ul, 0x00ff5555ul, 0x00ff55aaul, 0x00ff55fful, 0x00ffaa00ul, 0x00ffaa55ul, 0x00ffaaaaul, 0x00ffaafful, 0x00ffff00ul, 0x00ffff55ul, 0x00ffffaaul, 0x00fffffful, 0x55000000ul, 0x55000055ul, 0x550000aaul, 0x550000fful, 0x55005500ul, 0x55005555ul, 0x550055aaul, 0x550055fful, 0x5500aa00ul, 0x5500aa55ul, 0x5500aaaaul, 0x5500aafful, 0x5500ff00ul, 0x5500ff55ul, 0x5500ffaaul, 0x5500fffful, 0x55550000ul, 0x55550055ul, 0x555500aaul, 0x555500fful, 0x55555500ul, 0x55555555ul, 0x555555aaul, 0x555555fful, 0x5555aa00ul, 0x5555aa55ul, 0x5555aaaaul, 0x5555aafful, 0x5555ff00ul, 0x5555ff55ul, 0x5555ffaaul, 0x5555fffful, 0x55aa0000ul, 0x55aa0055ul, 0x55aa00aaul, 0x55aa00fful, 0x55aa5500ul, 0x55aa5555ul, 0x55aa55aaul, 0x55aa55fful, 0x55aaaa00ul, 0x55aaaa55ul, 0x55aaaaaaul, 0x55aaaafful, 0x55aaff00ul, 0x55aaff55ul, 0x55aaffaaul, 0x55aafffful, 0x55ff0000ul, 0x55ff0055ul, 0x55ff00aaul, 0x55ff00fful, 0x55ff5500ul, 0x55ff5555ul, 0x55ff55aaul, 0x55ff55fful, 0x55ffaa00ul, 0x55ffaa55ul, 0x55ffaaaaul, 0x55ffaafful, 0x55ffff00ul, 0x55ffff55ul, 0x55ffffaaul, 0x55fffffful, 0xaa000000ul, 0xaa000055ul, 0xaa0000aaul, 0xaa0000fful, 0xaa005500ul, 0xaa005555ul, 0xaa0055aaul, 0xaa0055fful, 0xaa00aa00ul, 0xaa00aa55ul, 0xaa00aaaaul, 0xaa00aafful, 0xaa00ff00ul, 0xaa00ff55ul, 0xaa00ffaaul, 0xaa00fffful, 0xaa550000ul, 0xaa550055ul, 0xaa5500aaul, 0xaa5500fful, 0xaa555500ul, 0xaa555555ul, 0xaa5555aaul, 0xaa5555fful, 0xaa55aa00ul, 0xaa55aa55ul, 0xaa55aaaaul, 0xaa55aafful, 0xaa55ff00ul, 0xaa55ff55ul, 0xaa55ffaaul, 0xaa55fffful, 0xaaaa0000ul, 0xaaaa0055ul, 0xaaaa00aaul, 0xaaaa00fful, 0xaaaa5500ul, 0xaaaa5555ul, 0xaaaa55aaul, 0xaaaa55fful, 0xaaaaaa00ul, 0xaaaaaa55ul, 0xaaaaaaaaul, 0xaaaaaafful, 0xaaaaff00ul, 0xaaaaff55ul, 0xaaaaffaaul, 0xaaaafffful, 0xaaff0000ul, 0xaaff0055ul, 0xaaff00aaul, 0xaaff00fful, 0xaaff5500ul, 0xaaff5555ul, 0xaaff55aaul, 0xaaff55fful, 0xaaffaa00ul, 0xaaffaa55ul, 0xaaffaaaaul, 0xaaffaafful, 0xaaffff00ul, 0xaaffff55ul, 0xaaffffaaul, 0xaafffffful, 0xff000000ul, 0xff000055ul, 0xff0000aaul, 0xff0000fful, 0xff005500ul, 0xff005555ul, 0xff0055aaul, 0xff0055fful, 0xff00aa00ul, 0xff00aa55ul, 0xff00aaaaul, 0xff00aafful, 0xff00ff00ul, 0xff00ff55ul, 0xff00ffaaul, 0xff00fffful, 0xff550000ul, 0xff550055ul, 0xff5500aaul, 0xff5500fful, 0xff555500ul, 0xff555555ul, 0xff5555aaul, 0xff5555fful, 0xff55aa00ul, 0xff55aa55ul, 0xff55aaaaul, 0xff55aafful, 0xff55ff00ul, 0xff55ff55ul, 0xff55ffaaul, 0xff55fffful, 0xffaa0000ul, 0xffaa0055ul, 0xffaa00aaul, 0xffaa00fful, 0xffaa5500ul, 0xffaa5555ul, 0xffaa55aaul, 0xffaa55fful, 0xffaaaa00ul, 0xffaaaa55ul, 0xffaaaaaaul, 0xffaaaafful, 0xffaaff00ul, 0xffaaff55ul, 0xffaaffaaul, 0xffaafffful, 0xffff0000ul, 0xffff0055ul, 0xffff00aaul, 0xffff00fful, 0xffff5500ul, 0xffff5555ul, 0xffff55aaul, 0xffff55fful, 0xffffaa00ul, 0xffffaa55ul, 0xffffaaaaul, 0xffffaafful, 0xffffff00ul, 0xffffff55ul, 0xffffffaaul, 0xfffffffful, }; /* 4 to 8 bits (2 way) */ const uint16_t bs_4bpp_to_8bpp[256] = { 0x0000u, 0x0011u, 0x0022u, 0x0033u, 0x0044u, 0x0055u, 0x0066u, 0x0077u, 0x0088u, 0x0099u, 0x00aau, 0x00bbu, 0x00ccu, 0x00ddu, 0x00eeu, 0x00ffu, 0x1100u, 0x1111u, 0x1122u, 0x1133u, 0x1144u, 0x1155u, 0x1166u, 0x1177u, 0x1188u, 0x1199u, 0x11aau, 0x11bbu, 0x11ccu, 0x11ddu, 0x11eeu, 0x11ffu, 0x2200u, 0x2211u, 0x2222u, 0x2233u, 0x2244u, 0x2255u, 0x2266u, 0x2277u, 0x2288u, 0x2299u, 0x22aau, 0x22bbu, 0x22ccu, 0x22ddu, 0x22eeu, 0x22ffu, 0x3300u, 0x3311u, 0x3322u, 0x3333u, 0x3344u, 0x3355u, 0x3366u, 0x3377u, 0x3388u, 0x3399u, 0x33aau, 0x33bbu, 0x33ccu, 0x33ddu, 0x33eeu, 0x33ffu, 0x4400u, 0x4411u, 0x4422u, 0x4433u, 0x4444u, 0x4455u, 0x4466u, 0x4477u, 0x4488u, 0x4499u, 0x44aau, 0x44bbu, 0x44ccu, 0x44ddu, 0x44eeu, 0x44ffu, 0x5500u, 0x5511u, 0x5522u, 0x5533u, 0x5544u, 0x5555u, 0x5566u, 0x5577u, 0x5588u, 0x5599u, 0x55aau, 0x55bbu, 0x55ccu, 0x55ddu, 0x55eeu, 0x55ffu, 0x6600u, 0x6611u, 0x6622u, 0x6633u, 0x6644u, 0x6655u, 0x6666u, 0x6677u, 0x6688u, 0x6699u, 0x66aau, 0x66bbu, 0x66ccu, 0x66ddu, 0x66eeu, 0x66ffu, 0x7700u, 0x7711u, 0x7722u, 0x7733u, 0x7744u, 0x7755u, 0x7766u, 0x7777u, 0x7788u, 0x7799u, 0x77aau, 0x77bbu, 0x77ccu, 0x77ddu, 0x77eeu, 0x77ffu, 0x8800u, 0x8811u, 0x8822u, 0x8833u, 0x8844u, 0x8855u, 0x8866u, 0x8877u, 0x8888u, 0x8899u, 0x88aau, 0x88bbu, 0x88ccu, 0x88ddu, 0x88eeu, 0x88ffu, 0x9900u, 0x9911u, 0x9922u, 0x9933u, 0x9944u, 0x9955u, 0x9966u, 0x9977u, 0x9988u, 0x9999u, 0x99aau, 0x99bbu, 0x99ccu, 0x99ddu, 0x99eeu, 0x99ffu, 0xaa00u, 0xaa11u, 0xaa22u, 0xaa33u, 0xaa44u, 0xaa55u, 0xaa66u, 0xaa77u, 0xaa88u, 0xaa99u, 0xaaaau, 0xaabbu, 0xaaccu, 0xaaddu, 0xaaeeu, 0xaaffu, 0xbb00u, 0xbb11u, 0xbb22u, 0xbb33u, 0xbb44u, 0xbb55u, 0xbb66u, 0xbb77u, 0xbb88u, 0xbb99u, 0xbbaau, 0xbbbbu, 0xbbccu, 0xbbddu, 0xbbeeu, 0xbbffu, 0xcc00u, 0xcc11u, 0xcc22u, 0xcc33u, 0xcc44u, 0xcc55u, 0xcc66u, 0xcc77u, 0xcc88u, 0xcc99u, 0xccaau, 0xccbbu, 0xccccu, 0xccddu, 0xcceeu, 0xccffu, 0xdd00u, 0xdd11u, 0xdd22u, 0xdd33u, 0xdd44u, 0xdd55u, 0xdd66u, 0xdd77u, 0xdd88u, 0xdd99u, 0xddaau, 0xddbbu, 0xddccu, 0xddddu, 0xddeeu, 0xddffu, 0xee00u, 0xee11u, 0xee22u, 0xee33u, 0xee44u, 0xee55u, 0xee66u, 0xee77u, 0xee88u, 0xee99u, 0xeeaau, 0xeebbu, 0xeeccu, 0xeeddu, 0xeeeeu, 0xeeffu, 0xff00u, 0xff11u, 0xff22u, 0xff33u, 0xff44u, 0xff55u, 0xff66u, 0xff77u, 0xff88u, 0xff99u, 0xffaau, 0xffbbu, 0xffccu, 0xffddu, 0xffeeu, 0xffffu, }; #ifdef STAND_ALONE static void gen_table(const char *type, const char *name, unsigned size, unsigned bits, unsigned outbits) { unsigned i, j, orig, tmp; uint64_t expanded; const unsigned count=outbits/bits; printf("/* %d to %d bits (%d way) */\n", bits, outbits, count); printf("%s %s[%u] = {\n ", type, name, size); for(i=0;i>(j*bits))&((1<32)?"ull":(outbits*count>16)?"ul":"u"); i++; if(i