Article 506 of alt.sources.amiga:
Path: orstcs!reed!batcomputer!rpi!think.com!spool.mu.edu!uunet!peregrine!ccicpg!conexch!stanton!qed!dances
From: dances@qed.cts.com (aric r caley)
Newsgroups: alt.sources.amiga
Subject: FadeRGB()
Message-ID: <DNi5FB1w164w@qed.cts.com>
Date: 14 Feb 92 07:29:12 GMT
Article-I.D.: qed.DNi5FB1w164w
Sender: bbs@qed.UUCP
Organization: The QED BBS, Lakewood CA
Lines: 76

A while back, someone somewhere (either here or maybe
comp.sys.amiga.programer?) wanted a routine to "fade" the colours in a
screen..  well I finaly got around to it so here's a little routine to do
just that..  it will fade between veiwports, or fade one of them to black.
Please, I make no garantees or excuses for my programing style (or lack
thereof..:).. I wrote this a long time ago..  It does appear to work under
2.0 though.... :)  This is public domain, do whatever to it.  Though I'd be
curious to see whatever resulting programs you may write using it... you
might even mention me in the docs... and mail me a copy of it.. :)

If you need something more complex or anything else related or not for your
program, I could concievably be convinced to write something for you.. :)

PS.  do I use :)'s too much?  :)


/* FadeRGB(viewport1, viewport2)  Fades the colours in viewport 2 either to
** black (viewport1 = NULL), or "crossfades" viewport2's colours to match
** viewport1.  Kind of a neat effect.
*/

FadeRGB(struct ViewPort *viewport,struct ViewPort *viewport2)
{
  register BYTE loop, red, grn, blu, colsdone;
  UWORD *srccols, *dstcols;

  colsdone = 0;
  srccols = (UWORD *)viewport->ColorMap->ColorTable;
  dstcols = (UWORD *)viewport2->ColorMap->ColorTable;

  if(viewport == NULL){ /* fade to black */
    for(loop = 0;loop < viewport2->ColorMap->Count;loop++){
      if(dstcols[loop] == 0) colsdone++;
      else {
        red = (dstcols[loop] & 0x0f00)>>8;
        grn = (dstcols[loop] & 0x00f0)>>4;
        blu = (dstcols[loop] & 0x000f);
        red += (red == 0) ? 0:-1;
        grn += (grn == 0) ? 0:-1;
        blu += (blu == 0) ? 0:-1;
        SetRGB4(viewport2,loop,ABS(red),ABS(grn),ABS(blu));
      }
    }
  }
  else {
    for(loop = 0;loop < viewport2->ColorMap->Count;loop++){
      if(dstcols[loop] == srccols[loop]) colsdone++;
      else {
        red = (dstcols[loop] & 0x0f00)>>8;
        grn = (dstcols[loop] & 0x00f0)>>4;
        blu = (dstcols[loop] & 0x000f);
        red += SGN(((srccols[loop] & 0x0f00)>>8) - red);
        grn += SGN(((srccols[loop] & 0x00f0)>>4) - grn);
        blu += SGN(((srccols[loop] & 0x000f))    - blu);
        SetRGB4(viewport2,loop,ABS(red),ABS(grn),ABS(blu));

      }
    }
  }
  if(colsdone == viewport2->ColorMap->Count) return(0);
  return(1);
}


| Aric R Caley AKA Dances With Coyotes -------- rutgers!qed.cts.com!dances |
|"Forgive me father for I have sinned.. What did you do my son? I..I used..|
| a.. a GOTO.. <sob>..  I'm sorry but I cannot forgive you..."     fnord!  |
|            "My daddy loves me so much he bought me an Amiga"             |
|I'm.. too sexy for Microsoft, too sexy for MS-DOS, too sexy for Macintosh.|
| I do -not- look like Geddy lee, dammit!       Save a tree, eat a beaver! |
|  This is your brain: *  This is your brain on MS-DOS: .  Any questions?  |
|_______________"Any sufficently advanced bug is a feature"________________| 

------------------------------
dances@qed.cts.com (aric r caley)  or  qed!dances
The QED BBS -- (310)420-9327


