|
|
1.1 ! root 1: #include <u.h> ! 2: #include <libc.h> ! 3: ! 4: int table(int n); ! 5: int in, lin; ! 6: int ou, lou; ! 7: int b; ! 8: int lendian; ! 9: ! 10: main(int argc, char *argv[]) ! 11: { ! 12: int i, osiz, osizb; ! 13: ulong v; ! 14: ! 15: ARGBEGIN{ ! 16: case 'l': ! 17: lendian = 1; ! 18: break; ! 19: default: ! 20: fprint(2, "Usage: %s [-l] in-ldepth out-ldepth\n", argv0); ! 21: exits("usage"); ! 22: }ARGEND ! 23: if(argc != 2) { ! 24: fprint(2, "Usage: %s [-l] in-ldepth out-ldepth\n", argv0); ! 25: exits("usage"); ! 26: } ! 27: lin = atol(argv[0]); ! 28: lou = atol(argv[1]); ! 29: if(in < 0 || in > 5 || ou < 0 || ou > 5) { ! 30: fprint(2, "ldepths must be in range [0,5]\n"); ! 31: exits("ldepth range"); ! 32: } ! 33: in = 1<<lin; ! 34: ou = 1<<lou; ! 35: if(ou > in){ ! 36: osizb = 0; ! 37: if(ou/in <= 4) { ! 38: b = 8; ! 39: osiz = (2*ou)/in; ! 40: } else { ! 41: b = (32*in)/ou; ! 42: osiz = 8; ! 43: } ! 44: } else { ! 45: if(in/ou > 8) { ! 46: fprint(2, "too big a contraction table\n"); ! 47: exits("toobig"); ! 48: } ! 49: if(in == ou) { ! 50: fprint(2, "identity\n"); ! 51: exits("identity"); ! 52: } ! 53: b = 8; ! 54: osiz = lendian? 0 : 1; ! 55: osizb = 8 >> (lin-lou); ! 56: } ! 57: if(lendian) ! 58: print("static ulong "); ! 59: else if(osiz <= 2) ! 60: print("static uchar "); ! 61: else if(osiz <= 4) ! 62: print("static ushort "); ! 63: else ! 64: print("static ulong "); ! 65: print("tab%d%d[%d] =\n{\n", lin, lou, (1<<b)); ! 66: for(i=0; i<(1<<b); i++) { ! 67: v = table(i); ! 68: if(lendian){ ! 69: v <<= 32 - 4*osiz - osizb; ! 70: print(" 0x%.8ux,", v); ! 71: } else ! 72: print(" 0x%.*ux,", osiz, v); ! 73: if(lendian || osiz==8) { ! 74: if(i%4 == 3) ! 75: print("\n"); ! 76: } else { ! 77: if(i%8 == 7) ! 78: print("\n"); ! 79: } ! 80: } ! 81: print("};\n"); ! 82: exits(0); ! 83: } ! 84: ! 85: /* ! 86: * Byte n of size b bits contains pixels with in bits/pixel. ! 87: * Convert each pixel to a pixel with ou bits/pixel, ! 88: * and assemble into an int. ! 89: * When expanding, a 0 pixel goes to 0, an all 1's pixel ! 90: * goes to all 1's, and the other input pixels equally divide ! 91: * the output pixel maximum. (E.g., in=2, ou=8: 0->0, 1->255/3, ! 92: * 2-> 255/3 * 2, 3-> 255). You get this effect by just ! 93: * duplicating the input pixel as many times as necessary. ! 94: * This works even if lendian is true. ! 95: */ ! 96: int ! 97: table(int n) ! 98: { ! 99: int i, j, x, t; ! 100: ! 101: x = 0; ! 102: for(i=0; i<b/in; i++) { ! 103: t = n >> (b-in); ! 104: n <<= in; ! 105: t &= (1<<in) - 1; ! 106: x <<= ou; ! 107: if(ou > in) { ! 108: for(j=0; j<ou/in; j++) { ! 109: x |= t; ! 110: t <<= in; ! 111: } ! 112: } else { ! 113: x |= t >> (in-ou); ! 114: } ! 115: } ! 116: return x; ! 117: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.