geof@imagen.UUCP (Geoffrey Cooper) (08/14/86)
As always, I came up with "just the right thing" just after posting. The following is a better dither function. The difference between it and the one posted is [1] the grid function is now exp(x*.66) instead of exp(x), and [2] one line of code is added to skew the grid in a bricklayer's pattern rather than straight up and down. [1] makes the greatest difference -- it has the effect of darkening the picture and bringing out more grey levels. [2] is most noticeable when you are looking at the picture from close up. - Geof Cooper IMAGEN -----------CUT HERE--------------- dither(x, y, level) int x, y, level; { int dlev; /* dither level */ static unsigned char expgrid[64] = { 9, 10, 11, 11, 12, 12, 13, 14, 40, 42, 44, 46, 49, 51, 54, 15, 37, 112, 118, 124, 130, 137, 57, 15, 36, 106, 208, 219, 230, 145, 60, 16, 34, 101, 197, 254, 243, 152, 63, 17, 32, 96, 187, 178, 169, 160, 66, 18, 30, 91, 86, 82, 78, 74, 70, 19, 29, 27, 26, 25, 23, 22, 21, 20 }; /* * skew every second line over by half a grid to get a brick-layer's * pattern, rather than a straight grid. The human eye is too good * at seeing straight lines when the points in the grid line up. */ x += (y & 8) >> 1; /* apply an 8x8 grid: */ dlev = ((y & 7) << 3) + (x & 7); /* apply dithering function and compare */ return ( level < expgrid[dlev] ); }