int main () { if (div1 (-(1 << 7)) != 1 << 7) abort (); if (div2 (-(1 << 15)) != 1 << 15) abort (); if (div3 (-(1 << 7), -1) != 1 << 7) abort (); if (div4 (-(1 << 15), -1) != 1 << 15) abort (); if (mod1 (-(1 << 7)) != 0) abort (); if (mod2 (-(1 << 15)) != 0) abort (); if (mod3 (-(1 << 7), -1) != 0) abort (); if (mod4 (-(1 << 15), -1) != 0) abort (); if (mod5 (0x50000000, 2) != 0) abort (); if (mod6 (0x50000000, 2) != 0) abort (); exit (0); }
/*...sgbm_ht_VGA_2x2 \45\ halftone by 2x2 to default VGA palette:0:*/ void gbm_ht_VGA_2x2(const GBM *gbm, const byte *src24, byte *dest4) { int stride24 = ((gbm->w * 3 + 3) & ~3); int stride4 = ((gbm->w * 4 + 31) / 32) * 4; int x, y; init(); src24 -= stride24; dest4 -= stride4; for ( y = 0; y < gbm->h - 1; y += 2 ) { const byte *src24a = (src24 += stride24); const byte *src24b = (src24 += stride24); byte *dest4a = (dest4 += stride4); byte *dest4b = (dest4 += stride4); for ( x = 0; x < gbm->w - 1; x += 2 ) /*...s2x2 case:24:*/ { word r,g,b; byte inx; byte *tmp; b = *src24a++; g = *src24a++; r = *src24a++; b += *src24a++; g += *src24a++; r += *src24a++; b += *src24b++; g += *src24b++; r += *src24b++; b += *src24b++; g += *src24b++; r += *src24b++; inx = takefrom(div4(r), div4(g), div4(b)); *dest4a = (inx << 4); b -= gbmrgb_vga[inx].b; g -= gbmrgb_vga[inx].g; r -= gbmrgb_vga[inx].r; inx = takefrom(div3(r), div3(g), div3(b)); *dest4a++ |= inx; b -= gbmrgb_vga[inx].b; g -= gbmrgb_vga[inx].g; r -= gbmrgb_vga[inx].r; inx = takefrom(div2(r), div2(g), div2(b)); *dest4b = (inx << 4); b -= gbmrgb_vga[inx].b; g -= gbmrgb_vga[inx].g; r -= gbmrgb_vga[inx].r; inx = takefrom(r , g , b ); *dest4b++ |= inx; tmp = dest4a; dest4a = dest4b; dest4b = tmp; } /*...e*/ if ( x < gbm->w ) /*...s1x2 case:24:*/ { word r,g,b; byte inx; b = *src24a++; g = *src24a++; r = *src24a; b += *src24b++; g += *src24b++; r += *src24b; inx = takefrom(div2(r), div2(g), div2(b)); *dest4a = (inx << 4); b -= gbmrgb_vga[inx].b; g -= gbmrgb_vga[inx].g; r -= gbmrgb_vga[inx].r; inx = takefrom(r , g , b ); *dest4b = (inx << 4); } /*...e*/ } if ( y < gbm->h ) { const byte *src24a = src24 + stride24; byte *dest4a = dest4 + stride4; for ( x = 0; x < gbm->w - 1; x += 2 ) /*...s2x1 case:24:*/ { word r,g,b; byte inx; b = *src24a++; g = *src24a++; r = *src24a++; b += *src24a++; g += *src24a++; r += *src24a++; inx = takefrom(div2(r), div2(g), div2(b)); *dest4a = (inx << 4); b -= gbmrgb_vga[inx].b; g -= gbmrgb_vga[inx].g; r -= gbmrgb_vga[inx].r; inx = takefrom(r , g , b ); *dest4a++ |= inx; } /*...e*/ if ( x < gbm->w ) /*...s1x1 case:24:*/ { word r, g, b; byte inx; b = *src24a++; g = *src24a++; r = *src24a; inx = takefrom(r, g, b); *dest4a = (inx << 4); } /*...e*/ } }
void gbm_ht_4R4G4B_2x2(const GBM *gbm, const byte *src24, byte *dest8) { int stride24 = ((gbm->w * 3 + 3) & ~3); int stride8 = ((gbm->w + 3) & ~3); int x, y; init(); src24 -= stride24; dest8 -= stride8; for ( y = 0; y < gbm->h - 1; y += 2 ) { const byte *src24a = (src24 += stride24); const byte *src24b = (src24 += stride24); byte *dest8a = (dest8 += stride8); byte *dest8b = (dest8 += stride8); for ( x = 0; x < gbm->w - 1; x += 2 ) /*...s2x2 case:24:*/ { word r,g,b; byte ri,gi,bi; byte *tmp; b = *src24a++; g = *src24a++; r = *src24a++; b += *src24a++; g += *src24a++; r += *src24a++; b += *src24b++; g += *src24b++; r += *src24b++; b += *src24b++; g += *src24b++; r += *src24b++; bi = index4[div4(b)]; gi = index4[div4(g)]; ri = index4[div4(r)]; *dest8a++ = PIX444(ri,gi,bi); b -= scale4[bi]; g -= scale8[gi]; r -= scale7[ri]; bi = index4[div3(b)]; gi = index4[div3(g)]; ri = index4[div3(r)]; *dest8a++ = PIX444(ri,gi,bi); b -= scale4[bi]; g -= scale8[gi]; r -= scale7[ri]; bi = index4[div2(b)]; gi = index4[div2(g)]; ri = index4[div2(r)]; *dest8b++ = PIX444(ri,gi,bi); b -= scale4[bi]; g -= scale8[gi]; r -= scale7[ri]; bi = index4[b ]; gi = index4[g ]; ri = index4[r ]; *dest8b++ = PIX444(ri,gi,bi); tmp = dest8a; dest8a = dest8b; dest8b = tmp; } /*...e*/ if ( x < gbm->w ) /*...s1x2 case:24:*/ { word r,g,b; byte ri, gi, bi; b = *src24a++; g = *src24a++; r = *src24a; b += *src24b++; g += *src24b++; r += *src24b; bi = index4[div2(b)]; gi = index4[div2(g)]; ri = index4[div2(r)]; *dest8a = PIX444(ri,gi,bi); b -= scale4[bi]; g -= scale8[gi]; r -= scale7[ri]; bi = index4[b ]; gi = index4[g ]; ri = index4[r ]; *dest8b = PIX444(ri,gi,bi); } /*...e*/ } if ( y < gbm->h ) { const byte *src24a = src24 + stride24; byte *dest8a = dest8 + stride8; for ( x = 0; x < gbm->w - 1; x += 2 ) /*...s2x1 case:24:*/ { word r,g,b; byte ri, gi, bi; b = *src24a++; g = *src24a++; r = *src24a++; b += *src24a++; g += *src24a++; r += *src24a++; bi = index4[div2(b)]; gi = index4[div2(g)]; ri = index4[div2(r)]; *dest8a++ = PIX444(ri,gi,bi); b -= scale4[bi]; g -= scale8[gi]; r -= scale7[ri]; bi = index4[b ]; gi = index4[g ]; ri = index4[r ]; *dest8a++ = PIX444(ri,gi,bi); } /*...e*/ if ( x < gbm->w ) /*...s1x1 case:24:*/ { byte ri, gi, bi; bi = index4[*src24a++]; gi = index4[*src24a++]; ri = index4[*src24a]; *dest8a = PIX444(ri,gi,bi); } /*...e*/ } }
/*...sgbm_ht_24_2x2 \45\ halftone by 2x2 to r\58\g\58\b bits:0:*/ void gbm_ht_24_2x2(const GBM *gbm, const byte *src24, byte *dest24, byte rm, byte gm, byte bm) { int stride = ((gbm->w * 3 + 3) & ~3); int x, y; init(); src24 -= stride; dest24 -= stride; for ( y = 0; y < gbm->h - 1; y += 2 ) { const byte *src24a = (src24 += stride); const byte *src24b = (src24 += stride); byte *dest24a = (dest24 += stride); byte *dest24b = (dest24 += stride); for ( x = 0; x < gbm->w - 1; x += 2 ) /*...s2x2 case:24:*/ { word r,g,b; byte ri,gi,bi; byte *tmp; b = *src24a++; g = *src24a++; r = *src24a++; b += *src24a++; g += *src24a++; r += *src24a++; b += *src24b++; g += *src24b++; r += *src24b++; b += *src24b++; g += *src24b++; r += *src24b++; bi = (div4(b) & bm); gi = (div4(g) & gm); ri = (div4(r) & rm); *dest24a++ = bi; *dest24a++ = gi; *dest24a++ = ri; b -= bi; g -= gi; r -= ri; if ( b > 255 * 3 ) b = 255 * 3; if ( g > 255 * 3 ) g = 255 * 3; if ( r > 255 * 3 ) r = 255 * 3; bi = (div3(b) & bm); gi = (div3(g) & gm); ri = (div3(r) & rm); *dest24a++ = bi; *dest24a++ = gi; *dest24a++ = ri; b -= bi; g -= gi; r -= ri; if ( b > 255 * 2 ) b = 255 * 2; if ( g > 255 * 2 ) g = 255 * 2; if ( r > 255 * 2 ) r = 255 * 2; bi = (div2(b) & bm); gi = (div2(g) & gm); ri = (div2(r) & rm); *dest24b++ = bi; *dest24b++ = gi; *dest24b++ = ri; b -= bi; g -= gi; r -= ri; if ( b > 255 ) b = 255; if ( g > 255 ) g = 255; if ( r > 255 ) r = 255; bi = (b & bm); gi = (g & gm); ri = (r & rm); *dest24b++ = bi; *dest24b++ = gi; *dest24b++ = ri; tmp = dest24a; dest24a = dest24b; dest24b = tmp; } /*...e*/ if ( x < gbm->w ) /*...s1x2 case:24:*/ { word r,g,b; byte ri, gi, bi; b = *src24a++; g = *src24a++; r = *src24a; b += *src24b++; g += *src24b++; r += *src24b; bi = (div2(b) & bm); gi = (div2(g) & gm); ri = (div2(r) & rm); *dest24a++ = bi; *dest24a++ = gi; *dest24a++ = ri; b -= bi; g -= gi; r -= ri; if ( b > 255 ) b = 255; if ( g > 255 ) g = 255; if ( r > 255 ) r = 255; bi = (b & bm); gi = (g & gm); ri = (r & rm); *dest24b++ = bi; *dest24b++ = gi; *dest24b = ri; } /*...e*/ } if ( y < gbm->h ) { const byte *src24a = src24 + stride; byte *dest24a = dest24 + stride; for ( x = 0; x < gbm->w - 1; x += 2 ) /*...s2x1 case:24:*/ { word r,g,b; byte ri, gi, bi; b = *src24a++; g = *src24a++; r = *src24a++; b += *src24a++; g += *src24a++; r += *src24a++; bi = (div2(b) & bm); gi = (div2(g) & gm); ri = (div2(r) & rm); *dest24a++ = bi; *dest24a++ = gi; *dest24a++ = ri; b -= bi; g -= gi; r -= ri; if ( b > 255 ) b = 255; if ( g > 255 ) g = 255; if ( r > 255 ) r = 255; bi = (b & bm); gi = (g & gm); ri = (r & rm); *dest24a++ = bi; *dest24a++ = gi; *dest24a++ = ri; } /*...e*/ if ( x < gbm->w ) /*...s1x1 case:24:*/ { byte ri, gi, bi; bi = ((*src24a++) & bm); gi = ((*src24a++) & gm); ri = ((*src24a) & rm); *dest24a++ = bi; *dest24a++ = gi; *dest24a = ri; } /*...e*/ } }
static void split_into8( word r, word g, word b, int n, byte *inxs ) { byte inx; if ( n >= 9 ) { inx = takefrom8(div9(r), div9(g), div9(b)); b -= gbmrgb_8[inx].b; g -= gbmrgb_8[inx].g; r -= gbmrgb_8[inx].r; *inxs++ = inx; inx = takefrom8(div8(r), div8(g), div8(b)); b -= gbmrgb_8[inx].b; g -= gbmrgb_8[inx].g; r -= gbmrgb_8[inx].r; *inxs++ = inx; inx = takefrom8(div7(r), div7(g), div7(b)); b -= gbmrgb_8[inx].b; g -= gbmrgb_8[inx].g; r -= gbmrgb_8[inx].r; *inxs++ = inx; } if ( n >= 6 ) { inx = takefrom8(div6(r), div6(g), div6(b)); b -= gbmrgb_8[inx].b; g -= gbmrgb_8[inx].g; r -= gbmrgb_8[inx].r; *inxs++ = inx; inx = takefrom8(div5(r), div5(g), div5(b)); b -= gbmrgb_8[inx].b; g -= gbmrgb_8[inx].g; r -= gbmrgb_8[inx].r; *inxs++ = inx; } if ( n >= 4 ) { inx = takefrom8(div4(r), div4(g), div4(b)); b -= gbmrgb_8[inx].b; g -= gbmrgb_8[inx].g; r -= gbmrgb_8[inx].r; *inxs++ = inx; } if ( n >= 3 ) { inx = takefrom8(div3(r), div3(g), div3(b)); b -= gbmrgb_8[inx].b; g -= gbmrgb_8[inx].g; r -= gbmrgb_8[inx].r; *inxs++ = inx; } inx = takefrom8(div2(r), div2(g), div2(b)); b -= gbmrgb_8[inx].b; g -= gbmrgb_8[inx].g; r -= gbmrgb_8[inx].r; *inxs++ = inx; *inxs = takefrom8(r, g, b); }