Category : C Source Code
Archive   : GRAFGEM1.ZIP
Filename : ORDERDIT.C

 
Output of file : ORDERDIT.C contained in archive : GRAFGEM1.ZIP
/*
Ordered Dithering
by Stephen Hawley
from "Graphics Gems", Academic Press, 1990
*/

/* Program to generate dithering matrices.
* written by Jim Blandy, Oberlin College, [email protected]
* Gifted to, documented and revised by Stephen Hawley,
* [email protected]
*
* Generates a dithering matrix from the command line arguments.
* The first argument, size, determines the dimensions of the
* matrix: 2^size by 2^size
* The optional range argument is the range of values to be
* dithered over. By default, it is (2^size)^2, or simply the
* total number of elements in the matrix.
* The final output is suitable for inclusion in a C program.
* A typical dithering function is something like this:
* extern int dm[], size;
*
* int
* dither(x,y, level)
* register int x,y, level;
* {
* return(level > dm[(x % size) + size * (y % size)];
* }
*/

main(argc, argv)
int argc;
char **argv;
{
register int size, range;

if (argc >= 2) size = atoi(argv[1]);
else size = 2;

if (argc == 3) range = atoi(argv[2]);
else range = (1 << size) * (1 << size);

printdither (size, range);
}


printdither (size, range)
register int size, range;
{
register int l = (1 << size), i;
/*
* print a dithering matrix.
* l is the length on a side.
*/
range = range / (l * l);
puts("int dm[] = {");
for (i=0; i < l*l; i++) {
if (i % l == 0) /* tab in 4 spaces per row */
printf(" ");
/* print the dither value for this location
* scaled to the given range
*/
printf("%4d", range * dithervalue(i / l, i % l, size));

/* commas after all but the last */
if (i + 1 < l * l)
putchar(',');
/* newline at the end of the row */
if ((i + 1) % l == 0)
putchar('\n');
}
puts("\n}; ");
}
dithervalue(x, y, size)
register int x, y, size;
{
register int d;
/*
* calculate the dither value at a particular
* (x, y) over the size of the matrix.
*/
d=0;
while (size-->0) {
/* Think of d as the density. At every iteration,
* d is shifted left one and a new bit is put in the
* low bit based on x and y. If x is odd and y is even,
* or x is even and y is odd, a bit is put in. This
* generates the checkerboard seen in dithering.
* This quantity is shifted left again and the low bit of
* y is added in.
* This whole thing interleaves a checkerboard bit pattern
* and y's bits, which is the value you want.
*/
d = (d <<1 | (x&1 ^ y&1))<<1 | y&1;
x >>= 1;
y >>= 1;
}
return(d);
}



  3 Responses to “Category : C Source Code
Archive   : GRAFGEM1.ZIP
Filename : ORDERDIT.C

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/