Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!sun-barr!newstop!sun!peregrine!falk From: falk@peregrine.Sun.COM (Ed Falk) Newsgroups: comp.graphics Subject: Re: bit masks Message-ID: <141649@sun.Eng.Sun.COM> Date: 31 Aug 90 01:53:00 GMT References: <23900013@sunb4> Sender: news@sun.Eng.Sun.COM Organization: Sun Microsystems, Mt. View, Ca. Lines: 75 In article <23900013@sunb4> mcooper@sunb4.cs.uiuc.edu writes: > >I'm looking for an algorithm (or C code, of you have it) to generate >16 x 16 bit masks. Ideally, I should be able to specify a percentage and >the program should spit out the pattern filled appropriately. > >ie. > >100% yeilds > > [all 1's] > >This is no problem to write,m but the simple way gives you nasty artifacts such >as: 25 % yeilds > > [25% 1's] > > >Does anyone have code that will properly randomize this stuff to avoid the >inevitable artifacts and moire patterns? It seems to me that what you're asking for is a way to generate dither patterns. If you don't mind regular patterns, which generally is the best way to go, use this dither matrix: static int d16[16][16] = { { 0,192, 48,240, 12,204, 60,252, 3,195, 51,243, 15,207, 63,255}, {128, 64,176,112,140, 76,188,124,131, 67,179,115,143, 79,191,127}, { 32,224, 16,208, 44,236, 28,220, 35,227, 19,211, 47,239, 31,223}, {160, 96,144, 80,172,108,156, 92,163, 99,147, 83,175,111,159, 95}, { 8,200, 56,248, 4,196, 52,244, 11,203, 59,251, 7,199, 55,247}, {136, 72,184,120,132, 68,180,116,139, 75,187,123,135, 71,183,119}, { 40,232, 24,216, 36,228, 20,212, 43,235, 27,219, 39,231, 23,215}, {168,104,152, 88,164,100,148, 84,171,107,155, 91,167,103,151, 87}, { 2,194, 50,242, 14,206, 62,254, 1,193, 49,241, 13,205, 61,253}, {130, 66,178,114,142, 78,190,126,129, 65,177,113,141, 77,189,125}, { 34,226, 18,210, 46,238, 30,222, 33,225, 17,209, 45,237, 29,221}, {162, 98,146, 82,174,110,158, 94,161, 97,145, 81,173,109,157, 93}, { 10,202, 58,250, 6,198, 54,246, 9,201, 57,249, 5,197, 53,245}, {138, 74,186,122,134, 70,182,118,137, 73,185,121,133, 69,181,117}, { 42,234, 26,218, 38,230, 22,214, 41,233, 25,217, 37,229, 21,213}, {170,106,154, 90,166,102,150, 86,169,105,153, 89,165,101,149, 85}} ; This maps intensities from 0-255 to either 0 or 1 by these rules: Take the x and y coordinates of the pixel, mod 16, and use them as an index into this array. If the intensity is less than or equal to this value, write a 0, otherwise, write a 1. If the intensity is 256, always write a 1. This is called ordered dithering. So, if you were to write a solid field of value 256 (100%), you would get 1111 1111 1111 1111 If you were to write a solid field of value 64 (50%), you would get 1010 0000 1010 0000 and so on. If you were to take a greyscale image, and map each pixel, you would get something you could display on a monochrome monitor. -ed falk, sun microsystems -- sun!falk, falk@sun.com "What are politicians going to tell people when the Constitution is gone and we still have a drug problem?" -- William Simpson, A.C.L.U.