From peter@sugar.uu.net Wed Oct 19 07:08:31 1988
Path: leah!bingvaxu!sunybcs!rutgers!mit-eddie!killer!texbell!sugar!peter
From: peter@sugar.uu.net (Peter da Silva)
Newsgroups: comp.sys.amiga
Subject: Re: Sculpt-4D Upgrade
Message-ID: <2862@sugar.uu.net>
Date: 19 Oct 88 11:08:31 GMT
References: <4779@louie.udel.EDU> <297@celia.UUCP> <2832@sugar.uu.net> <1121@leah.Albany.Edu>
Distribution: usa
Organization: Sugar Land Unix - Houston, TX
Lines: 60

In article <1121@leah.Albany.Edu>, rsb584@leah.Albany.Edu (Raymond S Brand) writes:
> In article <2855@sugar.uu.net>, peter@sugar.uu.net (Peter da Silva) writes:
> > And thirdly, they never seem to try propogating the HAM error backwards,
> > even though this might produce better results...

> This is easy to say, and sometimes easy to see, but it isn't easy to do for
> the general case.

Handling HAM at all isn't that easy to do for the general case... but people
still do it.

> If erradicating this defect is that important to you, devise and
> publish an algorithm/code that when given an X by Y image D bits deep, will
> output an X by Y HAM image and color table such that the "HAM shadows" are
> minimized for the image.

Well, the outline is conceptually easy. If you're handling HAM at all you have
some sort of function that will tell you the distance between seperate colors
so I'm going to take that as a given.

The simplest algorithm would be to alternate the error propogation on a
scanline basis, the way nroff does to prevent rivers of whitespace in one
or the other margin. A better algorithm would be:

Pass 1:
	Initialise all tracked colors and counts to 0.
	Scan:
		When dist(color(this pixel), color(next pixel)) > thresh
			If it's within thresh of a tracked color, inc
				its count, go on.
			Else add it to the tracked color list.
	Allocate top 16 tracked colors as true colors.
	
This is already more than most existing programs do, because they all seem to
allocate true colors on the fly while generating the image, or let you
do it manually. This of course assumes you HAVE a deeper bitmap to work
from. As an experiment you could also try allocate the top 8 as true colors
and then allocate the next 8 from the remaining colors unless a HAM change
will put it within thresh...

Pass 2:
	Scan:
		When dist(color(this pixel), color(next pixel)) > thresh
			If a single HAM change can make it within
				thresh, do it
			Else If it's within thresh of a true color, assign
				that color.
			Else if a single HAM change from LAST pixel will
				put THIS pixel within thresh of NEXT
				pixel, do it.
			Repeat for double HAM change, if intermediate
				HAM color is within thresh.
			Repeat for triple HAM change, if intermediate
				HAM color is within thresh.
			Else If a true color is within a HAM change of new
				color, use that as the new color.
			Else fall back on existing algorithm.
-- 
		Peter da Silva  `-_-'  peter@sugar.uu.net
		 Have you hugged  U  your wolf today?
