////////////////////////////////////////////////////////////////////////////// // // DITH666.H - full color dither (to a palette with 6 red, 6 green 6 blue // levels) // ////////////////////////////////////////////////////////////////////////////// #define HSIZE 4 // matrix size is 4x4 #define SEG666 _based(_segname("DITH666")) // segment containing tables #define SEGXXX _based(_segname("_CODE")) // segment containing init tables ////////////////////////////////////////////////////////////////////////////// // // dither table for 256 level dither (RGB 24 or 32) // // total table size is 12k // ////////////////////////////////////////////////////////////////////////////// #define DITH256(x,y,r,g,b) aTranslate666[ \ 1 * (r/51 + (r%51 > aHalftone4x4[x][y])) + \ 6 * (g/51 + (g%51 > aHalftone4x4[x][y])) + \ 36 * (b/51 + (b%51 > aHalftone4x4[x][y]))] #define DITH8(x,y,r,g,b) aTranslate666[ \ aHalftone8[0][(x)&3][(y)&3][(r)] +\ aHalftone8[1][(x)&3][(y)&3][(g)] +\ aHalftone8[2][(x)&3][(y)&3][(b)] ] char unsigned SEG666 aHalftone8[3][4][4][256] = {(BYTE)-1}; #if 1 static char unsigned const SEGXXX aHalftone4x4[4][4] = { 0, 25, 6, 31, 38, 12, 44, 19, 9, 35, 3, 28, 47, 22, 41, 15 }; #else static char unsigned const SEGXXX aHalftone4x4[4][4] = { 41, 3, 9, 28, 35, 15, 22, 47, 6, 25, 38, 0, 19, 44, 31, 12 }; #endif ////////////////////////////////////////////////////////////////////////////// // // dither table for 32 level dither (RGB 555 or 565) // // total table size is 12k // ////////////////////////////////////////////////////////////////////////////// #define d62(n) (((n) * 10) / 62) // n / 6.2 #define m62(n) ((n) * 1000 / 62 - d62(n) * 100) // n % 6.2 #define DITH31(x,y,r,g,b) aTranslate666[ \ 1 * (d62(r) + (m62(r) > (UINT)aHalftone2x2[x][y])) + \ 6 * (d62(g) + (m62(g) > (UINT)aHalftone2x2[x][y])) + \ 36 * (d62(b) + (m62(b) > (UINT)aHalftone2x2[x][y]))] static char SEGXXX aHalftone2x2[2][2] = { 0, 99, 66,33, }; #ifdef USE_C #define DITH5(x,y,rgb) aTranslate666[ \ aHalftone5[0][(x)&3][(y)&3][((rgb)>>8)&0xFF] +\ aHalftone5[1][(x)&3][(y)&3][((rgb)>>5)&0xFF] +\ aHalftone5[2][(x)&3][(y)&3][((rgb)>>0)&0xFF] ] char unsigned SEG666 aHalftone5[3][4][4][256] = {(BYTE)-1}; #if 0 static char unsigned const SEGXXX aHalftone4x4_5[4][4] = { 0,3,0,3, 4,1,4,1, 0,3,0,3, 4,1,4,1 }; #else static char SEGXXX aHalftone4x4_5[4][4] = { 0,3,2,3, 2,4,0,3, 2,0,4,1, 4,1,2,1 }; #endif #endif ////////////////////////////////////////////////////////////////////////////// // // translate table from a 666 index to a foreground palette index // ////////////////////////////////////////////////////////////////////////////// char unsigned SEG666 aTranslate666[216] = { 0, 29, 30, 31, 32, 249, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 250, 250, 57, 58, 59, 251, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 250, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 227, 112, 113, 114, 115, 116, 117, 118, 119, 151, 120, 121, 122, 123, 124, 228, 125, 126, 229, 133, 162, 135, 131, 132, 137, 166, 134, 140, 130, 136, 143, 138, 139, 174, 141, 142, 177, 129, 144, 145, 146, 147, 148, 149, 150, 157, 152, 153, 154, 155, 156, 192, 158, 159, 160, 161, 196, 163, 164, 165, 127, 199, 167, 168, 169, 170, 171, 172, 173, 207, 175, 176, 210, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 224, 193, 194, 195, 252, 252, 197, 198, 128, 253, 252, 200, 201, 202, 203, 204, 205, 206, 230, 208, 209, 231, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 254, 223, 232, 225, 226, 255, }; /*----------------------------------------------------------------------- | mspal.h | | Standard MS Apps Palette. v 1.01 | | #include this file in the same file as HPalCreateAppPalette | | WARNING: Generated File! DO NOT EDIT! | WARNING: Palette MUST be created with HpalCreateAppPalette | ---------------------------------------------------------------WESC----*/ unsigned char SEGXXX pal666[256][3] = { // R G B {0x00, 0x00, 0x00}, // 0 Sys Black gray 0 {0x80, 0x00, 0x00}, // 1 Sys Dk Red {0x00, 0x80, 0x00}, // 2 Sys Dk Green {0x80, 0x80, 0x00}, // 3 Sys Dk Yellow {0x00, 0x00, 0x80}, // 4 Sys Dk Blue {0x80, 0x00, 0x80}, // 5 Sys Dk Violet {0x00, 0x80, 0x80}, // 6 Sys Dk Cyan {0xc0, 0xc0, 0xc0}, // 7 Sys Lt Grey gray 192 {0xc0, 0xdc, 0xc0}, // 8 Sys 8 {0xa6, 0xca, 0xf0}, // 9 Sys 9 (the first 10 are fixed by Windows) {0x04, 0x04, 0x04}, // 10 gray 4 {0x08, 0x08, 0x08}, // 11 gray 8 {0x0c, 0x0c, 0x0c}, // 12 gray 12 {0x11, 0x11, 0x11}, // 13 gray 17 {0x16, 0x16, 0x16}, // 14 gray 22 {0x1c, 0x1c, 0x1c}, // 15 gray 28 {0x22, 0x22, 0x22}, // 16 gray 34 {0x29, 0x29, 0x29}, // 17 gray 41 {0x55, 0x55, 0x55}, // 18 swapped so inversions look good gray 85 {0x4d, 0x4d, 0x4d}, // 19 swapped so inversions look good gray 77 {0x42, 0x42, 0x42}, // 20 swapped so inversions look good gray 66 {0x39, 0x39, 0x39}, // 21 swapped so inversions look good gray 57 {0x81, 0x81, 0x81}, // 22 Sys Dk Grey repeat gray 128 {0x81, 0x00, 0x00}, // 23 Sys Dk Red repeat {0x00, 0x81, 0x00}, // 24 Sys Dk Green repeat {0x81, 0x81, 0x00}, // 25 Sys Dk Yellow repeat {0x00, 0x00, 0x81}, // 26 Sys Dk Blue repeat {0x81, 0x00, 0x81}, // 27 Sys Dk Violet repeat {0x00, 0x81, 0x81}, // 28 Sys Dk Cyan repeat {0x33, 0x00, 0x00}, // 29 {0x66, 0x00, 0x00}, // 30 {0x99, 0x00, 0x00}, // 31 {0xcc, 0x00, 0x00}, // 32 {0x00, 0x33, 0x00}, // 33 {0x33, 0x33, 0x00}, // 34 {0x66, 0x33, 0x00}, // 35 {0x99, 0x33, 0x00}, // 36 {0xcc, 0x33, 0x00}, // 37 {0xff, 0x33, 0x00}, // 38 {0x00, 0x66, 0x00}, // 39 {0x33, 0x66, 0x00}, // 40 {0x66, 0x66, 0x00}, // 41 {0x99, 0x66, 0x00}, // 42 {0xcc, 0x66, 0x00}, // 43 {0xff, 0x66, 0x00}, // 44 {0x00, 0x99, 0x00}, // 45 {0x33, 0x99, 0x00}, // 46 {0x66, 0x99, 0x00}, // 47 {0x99, 0x99, 0x00}, // 48 {0xcc, 0x99, 0x00}, // 49 {0xff, 0x99, 0x00}, // 50 {0x00, 0xcc, 0x00}, // 51 {0x33, 0xcc, 0x00}, // 52 {0x66, 0xcc, 0x00}, // 53 {0x99, 0xcc, 0x00}, // 54 {0xcc, 0xcc, 0x00}, // 55 {0xff, 0xcc, 0x00}, // 56 {0x66, 0xff, 0x00}, // 57 {0x99, 0xff, 0x00}, // 58 {0xcc, 0xff, 0x00}, // 59 {0x00, 0x00, 0x33}, // 60 {0x33, 0x00, 0x33}, // 61 {0x66, 0x00, 0x33}, // 62 {0x99, 0x00, 0x33}, // 63 {0xcc, 0x00, 0x33}, // 64 {0xff, 0x00, 0x33}, // 65 {0x00, 0x33, 0x33}, // 66 {0x33, 0x33, 0x33}, // 67 gray 51 {0x66, 0x33, 0x33}, // 68 {0x99, 0x33, 0x33}, // 69 {0xcc, 0x33, 0x33}, // 70 {0xff, 0x33, 0x33}, // 71 {0x00, 0x66, 0x33}, // 72 {0x33, 0x66, 0x33}, // 73 {0x66, 0x66, 0x33}, // 74 {0x99, 0x66, 0x33}, // 75 {0xcc, 0x66, 0x33}, // 76 {0xff, 0x66, 0x33}, // 77 {0x00, 0x99, 0x33}, // 78 {0x33, 0x99, 0x33}, // 79 {0x66, 0x99, 0x33}, // 80 {0x99, 0x99, 0x33}, // 81 {0xcc, 0x99, 0x33}, // 82 {0xff, 0x99, 0x33}, // 83 {0x00, 0xcc, 0x33}, // 84 {0x33, 0xcc, 0x33}, // 85 {0x66, 0xcc, 0x33}, // 86 {0x99, 0xcc, 0x33}, // 87 {0xcc, 0xcc, 0x33}, // 88 {0xff, 0xcc, 0x33}, // 89 {0x33, 0xff, 0x33}, // 90 {0x66, 0xff, 0x33}, // 91 {0x99, 0xff, 0x33}, // 92 {0xcc, 0xff, 0x33}, // 93 {0xff, 0xff, 0x33}, // 94 {0x00, 0x00, 0x66}, // 95 {0x33, 0x00, 0x66}, // 96 {0x66, 0x00, 0x66}, // 97 {0x99, 0x00, 0x66}, // 98 {0xcc, 0x00, 0x66}, // 99 {0xff, 0x00, 0x66}, // 100 {0x00, 0x33, 0x66}, // 101 {0x33, 0x33, 0x66}, // 102 {0x66, 0x33, 0x66}, // 103 {0x99, 0x33, 0x66}, // 104 {0xcc, 0x33, 0x66}, // 105 {0xff, 0x33, 0x66}, // 106 {0x00, 0x66, 0x66}, // 107 {0x33, 0x66, 0x66}, // 108 {0x66, 0x66, 0x66}, // 109 gray 102 {0x99, 0x66, 0x66}, // 110 {0xcc, 0x66, 0x66}, // 111 {0x00, 0x99, 0x66}, // 112 {0x33, 0x99, 0x66}, // 113 {0x66, 0x99, 0x66}, // 114 {0x99, 0x99, 0x66}, // 115 {0xcc, 0x99, 0x66}, // 116 {0xff, 0x99, 0x66}, // 117 {0x00, 0xcc, 0x66}, // 118 {0x33, 0xcc, 0x66}, // 119 {0x99, 0xcc, 0x66}, // 120 {0xcc, 0xcc, 0x66}, // 121 {0xff, 0xcc, 0x66}, // 122 {0x00, 0xff, 0x66}, // 123 {0x33, 0xff, 0x66}, // 124 {0x99, 0xff, 0x66}, // 125 {0xcc, 0xff, 0x66}, // 126 {0xff, 0x00, 0xcc}, // 127 {0xcc, 0x00, 0xff}, // 128 {0x00, 0x99, 0x99}, // 129 {0x99, 0x33, 0x99}, // 130 {0x99, 0x00, 0x99}, // 131 {0xcc, 0x00, 0x99}, // 132 {0x00, 0x00, 0x99}, // 133 {0x33, 0x33, 0x99}, // 134 {0x66, 0x00, 0x99}, // 135 {0xcc, 0x33, 0x99}, // 136 {0xff, 0x00, 0x99}, // 137 {0x00, 0x66, 0x99}, // 138 {0x33, 0x66, 0x99}, // 139 {0x66, 0x33, 0x99}, // 140 {0x99, 0x66, 0x99}, // 141 {0xcc, 0x66, 0x99}, // 142 {0xff, 0x33, 0x99}, // 143 {0x33, 0x99, 0x99}, // 144 {0x66, 0x99, 0x99}, // 145 {0x99, 0x99, 0x99}, // 146 gray 153 {0xcc, 0x99, 0x99}, // 147 {0xff, 0x99, 0x99}, // 148 {0x00, 0xcc, 0x99}, // 149 {0x33, 0xcc, 0x99}, // 150 {0x66, 0xcc, 0x66}, // 151 {0x99, 0xcc, 0x99}, // 152 {0xcc, 0xcc, 0x99}, // 153 {0xff, 0xcc, 0x99}, // 154 {0x00, 0xff, 0x99}, // 155 {0x33, 0xff, 0x99}, // 156 {0x66, 0xcc, 0x99}, // 157 {0x99, 0xff, 0x99}, // 158 {0xcc, 0xff, 0x99}, // 159 {0xff, 0xff, 0x99}, // 160 {0x00, 0x00, 0xcc}, // 161 {0x33, 0x00, 0x99}, // 162 {0x66, 0x00, 0xcc}, // 163 {0x99, 0x00, 0xcc}, // 164 {0xcc, 0x00, 0xcc}, // 165 {0x00, 0x33, 0x99}, // 166 {0x33, 0x33, 0xcc}, // 167 {0x66, 0x33, 0xcc}, // 168 {0x99, 0x33, 0xcc}, // 169 {0xcc, 0x33, 0xcc}, // 170 {0xff, 0x33, 0xcc}, // 171 {0x00, 0x66, 0xcc}, // 172 {0x33, 0x66, 0xcc}, // 173 {0x66, 0x66, 0x99}, // 174 {0x99, 0x66, 0xcc}, // 175 {0xcc, 0x66, 0xcc}, // 176 {0xff, 0x66, 0x99}, // 177 {0x00, 0x99, 0xcc}, // 178 {0x33, 0x99, 0xcc}, // 179 {0x66, 0x99, 0xcc}, // 180 {0x99, 0x99, 0xcc}, // 181 {0xcc, 0x99, 0xcc}, // 182 {0xff, 0x99, 0xcc}, // 183 {0x00, 0xcc, 0xcc}, // 184 {0x33, 0xcc, 0xcc}, // 185 {0x66, 0xcc, 0xcc}, // 186 {0x99, 0xcc, 0xcc}, // 187 {0xcc, 0xcc, 0xcc}, // 188 gray 204 {0xff, 0xcc, 0xcc}, // 189 {0x00, 0xff, 0xcc}, // 190 {0x33, 0xff, 0xcc}, // 191 {0x66, 0xff, 0x99}, // 192 {0x99, 0xff, 0xcc}, // 193 {0xcc, 0xff, 0xcc}, // 194 {0xff, 0xff, 0xcc}, // 195 {0x33, 0x00, 0xcc}, // 196 {0x66, 0x00, 0xff}, // 197 {0x99, 0x00, 0xff}, // 198 {0x00, 0x33, 0xcc}, // 199 {0x33, 0x33, 0xff}, // 200 {0x66, 0x33, 0xff}, // 201 {0x99, 0x33, 0xff}, // 202 {0xcc, 0x33, 0xff}, // 203 {0xff, 0x33, 0xff}, // 204 {0x00, 0x66, 0xff}, // 205 {0x33, 0x66, 0xff}, // 206 {0x66, 0x66, 0xcc}, // 207 {0x99, 0x66, 0xff}, // 208 {0xcc, 0x66, 0xff}, // 209 {0xff, 0x66, 0xcc}, // 210 {0x00, 0x99, 0xff}, // 211 {0x33, 0x99, 0xff}, // 212 {0x66, 0x99, 0xff}, // 213 {0x99, 0x99, 0xff}, // 214 {0xcc, 0x99, 0xff}, // 215 {0xff, 0x99, 0xff}, // 216 {0x00, 0xcc, 0xff}, // 217 {0x33, 0xcc, 0xff}, // 218 {0x66, 0xcc, 0xff}, // 219 {0x99, 0xcc, 0xff}, // 220 {0xcc, 0xcc, 0xff}, // 221 {0xff, 0xcc, 0xff}, // 222 {0x33, 0xff, 0xff}, // 223 {0x66, 0xff, 0xcc}, // 224 {0x99, 0xff, 0xff}, // 225 {0xcc, 0xff, 0xff}, // 226 {0xff, 0x66, 0x66}, // 227 {0x66, 0xff, 0x66}, // 228 {0xff, 0xff, 0x66}, // 229 {0x66, 0x66, 0xff}, // 230 {0xff, 0x66, 0xff}, // 231 {0x66, 0xff, 0xff}, // 232 {0xc1, 0xc1, 0xc1}, // 233 Sys Dk Grey repeat inversion gray 192 {0x5f, 0x5f, 0x5f}, // 234 gray 95 {0x77, 0x77, 0x77}, // 235 gray 119 {0x86, 0x86, 0x86}, // 236 gray 134 {0x96, 0x96, 0x96}, // 237 gray 150 {0xcb, 0xcb, 0xcb}, // 238 gray 203 {0xb2, 0xb2, 0xb2}, // 239 gray 178 {0xd7, 0xd7, 0xd7}, // 240 gray 215 {0xdd, 0xdd, 0xdd}, // 241 gray 221 {0xe3, 0xe3, 0xe3}, // 242 gray 227 {0xea, 0xea, 0xea}, // 243 gray 234 {0xf1, 0xf1, 0xf1}, // 244 gray 241 {0xf8, 0xf8, 0xf8}, // 245 gray 248 {0xff, 0xfb, 0xf0}, // 246 Sys Reserved {0xa0, 0xa0, 0xa4}, // 247 Sys Reserved {0x80, 0x80, 0x80}, // 248 Sys Lt Gray gray 128 {0xff, 0x00, 0x00}, // 249 Sys Red {0x00, 0xff, 0x00}, // 250 Sys Green {0xff, 0xff, 0x00}, // 251 Sys Yellow {0x00, 0x00, 0xff}, // 252 Sys Blue {0xff, 0x00, 0xff}, // 253 Sys Violet {0x00, 0xff, 0xff}, // 254 Sys Cyan {0xff, 0xff, 0xff} // 255 Sys White gray 255 };