ftp.nice.ch/pub/next/unix/network/www/wwwcount.2.3.NIHS.bs.tar.gz#/wwwcount2.3/combine/alphaim.c

This is alphaim.c in view mode; [Download] [Up]

/*
 *  AlphaImage () - creates an alpha channel
 *
 *  RCS:
 *      $Revision: 2.3 $
 *      $Date: 1996/05/03 02:21:34 $
 *
 *  Security:
 *      Unclassified
 *
 *  Description:
 *      From ImageMagick
 *
 *  Input Parameters:
 *      type    identifier  description
 *
 *      text
 *
 *  Output Parameters:
 *      type    identifier  description
 *
 *      text
 *
 *  Return Values:
 *      value   description
 *
 *  Side Effects:
 *      text
 *
 *  Limitations and Comments:
 *      text
 *
 *  Development History:
 *      who                 when        why
 *      muquit@semcor.com   24-Aug-95   first cut
 */
#include "combine.h"

#if __STDC__ || defined(sgi) || defined(_AIX)
void AlphaImage (Image *image,
    unsigned char red,unsigned char green,unsigned char blue)
#else
void AlphaImage (image,red,green,blue)
Image
    *image;
unsigned char
    red,
    green,
    blue;
#endif
{
#define DeltaX  16

    register Runlength
        *p;

    register int
        i;

    p=image->pixels;
    switch(image->class)
    {
        case DirectClass:
        {
            if (!image->alpha)
            {
                for (i=0; i < image->packets; i++)
                {
                    p->index=Opaque;
                    p++;
                }
                image->alpha=True;
                p=image->pixels;
            }

            for (i=0; i < image->packets; i++)
            {
                if (((int) p->red < (int) (red+DeltaX)) &&
                    ((int) p->red > (int) (red-DeltaX)) &&
                    ((int) p->green < (int) (green+DeltaX)) &&
                    ((int) p->green > (int) (green-DeltaX)) &&
                    ((int) p->blue < (int) (blue+DeltaX)) &&
                    ((int) p->blue > (int) (blue-DeltaX)))
                p->index=Transparent;
               p++;
                
             }
            break;
        }
        case PseudoClass:
        {
            double
                distance_squared,
                min_distance;

            int
                distance;

            register int
                index;

             min_distance=3.0*(MaxRGB+1)*(MaxRGB+1);
             index=0;

             for (i=0; i < image->colors; i++)
             {
                distance=(int) red-(int) image->colormap[i].red;
                distance_squared=(unsigned int) (distance*distance);
                distance=(int) green-(int) image->colormap[i].green;
                distance_squared+=(unsigned int) (distance*distance);
                distance=(int) blue-(int) image->colormap[i].blue;
                distance_squared+=(unsigned int) (distance*distance);
                if (distance_squared < min_distance)
                {
                    min_distance=distance_squared;
                    index=i;
                }
             }

             image->class=DirectClass;
             image->alpha=True;
             for (i=0; i < image->packets; i++)
             {
                if (p->index == index)
                    p->index=Transparent;
                else
                    p->index=Opaque;
                p++;
             }
             break;
        }
    }
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.