[comp.sources.amiga] v90i064: Surf r2 - bezier surfaces of revolution, Part02/04

Amiga-Request@cs.odu.edu (Amiga Sources/Binaries Moderator) (02/11/90)

Submitted-by: <edavies@sanjuan.uvic.ca>
Posting-number: Volume 90, Issue 064
Archive-name: applications/surf-r2/part02

#!/bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 2 (of 4)."
# Contents:  gadgetuse.c getfilenames.c mapcalc.c menu_files.c
#   menu_image.c menu_scrn.c revolve.c writeilbm.c
# Wrapped by tadguy@xanth on Sat Feb 10 15:47:40 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'gadgetuse.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'gadgetuse.c'\"
else
echo shar: Extracting \"'gadgetuse.c'\" \(5801 characters\)
sed "s/^X//" >'gadgetuse.c' <<'END_OF_FILE'
X/* this file contains definition for the screen */
X
X#include "scrnio.ih"
X#include <exec/memory.h>
X#ifdef MANX
X#include <functions.h>
X#endif
X
X#include "scrndef.h"
X#include "gadgetdef.h"
X#include "mytypes.h"
X#include "poly.h"
X#include "readilbm.h"
X
X#define GetExtens(gei) ((struct GadExtens *)gei->UserData)
X
X
Xvoid GadgetSetVal(gad)
X    struct Gadget *gad;
X{
X    struct GadExtens *vp;
X    struct PropInfo *prop;
X    long gadval;
X
X    if( !(gad->GadgetType & PROPGADGET) ) {
X        return;
X    }
X
X    if( !gad->GadgetRender ) {
X        gad->GadgetRender = (APTR) malloc(sizeof(struct Image));
X        if( !gad->GadgetRender ) {
X            OutErr("Not enough memory for gadgets");
X            CloseDisplay();
X            exit( 0 );
X        }
X    }
X    if( !gad->SpecialInfo ) {
X        static struct PropInfo dummyprop = {
X            FREEHORIZ|AUTOKNOB,
X            0x8000, 1, /* HorizPot = initial value */
X            0xff, 0, /* not really of interest */
X            0,0,0,0,0,0
X        };
X
X        gad->SpecialInfo = (APTR) malloc(sizeof(struct PropInfo));
X        if( !gad->SpecialInfo ) {
X            OutErr("Not enough memory for gadgets");
X            CloseDisplay();
X            exit( 0 );
X        }
X        *(struct PropInfo *)gad->SpecialInfo = dummyprop;
X    }
X
X    vp = GetExtens( gad );
X    if(!vp)  {
X        return;
X    }
X    prop = (struct PropInfo *) gad->SpecialInfo;
X
X    if( vp->isfloat ) {
X        gadval = (long)( (long)MAXPOT *
X            ( vp->curfval - vp->minfval )/(vp->maxfval - vp->minfval));
X        prop->HorizBody = MAXPOT /( 15 * 8 );
X    }
X    else {
X        gadval = ( (long)MAXPOT *
X            ( (long) vp->curival - vp->minival))/(vp->maxival - vp->minival);
X        prop->HorizBody = MAXPOT /( vp->maxival - vp->minival );
X    }
X
X    prop->HorizPot = gadval;
X}
X
X
X
Xvoid GadgetUpdate(gad, exists)
X    struct Gadget *gad;
X    bool exists; /* has the gadget already been displayed? */
X{
X    struct GadExtens *vp;
X    long potvalue;
X    char dbuff[25];
X    char *tx, *dx;
X    struct IntuiText *it;
X
X    if(!( gad->GadgetType & PROPGADGET) ) {
X        return;
X    }
X
X    vp = GetExtens( gad );
X    if(!vp) return;
X
X    potvalue = ((struct PropInfo *) gad->SpecialInfo)->HorizPot;
X
X    if( vp->isfloat ) {
X        float temp;
X        temp = ( potvalue * (vp->maxfval - vp->minfval ))/ MAXPOT
X                + vp->minfval;
X        vp->curfval = temp;
X#if !MANX
X        sprintf(dbuff,"%f   ", temp);
X#else
X        ftoa(temp, dbuff, sizeof(dbuff)-4, 1);
X#endif !MANX
X    }
X    else {
X        long temp;
X        temp = (long)( potvalue * (vp->maxival - vp->minival ))/ MAXPOT
X                + vp->minival;
X        vp->curival = temp;
X        sprintf(dbuff,"%-12d", temp);
X    }
X    /*
X     * find '['
X     */
X    it = gad->GadgetText;
X    for( tx = (char *)it->IText; *tx && *tx != '['; tx++ ) {
X        ;
X    }
X    if( !*tx ) {
X        return; /* something screwy */
X    }
X    tx++; /* skip past opening bracket */
X    dx = dbuff;
X    while( *tx != ']' ) {
X        *tx++ = *dx++;
X    }
X
X    if(exists){
X        long tempx, tempy;
X        tempx = it->LeftEdge + gad->LeftEdge;
X        tempy = it->TopEdge + gad->TopEdge + 6; /*fudge factor for baseline*/
X        Move( CntrlWin->RPort, tempx, tempy );
X        SetAPen(CntrlWin->RPort,it->FrontPen );
X        Text( CntrlWin->RPort, it->IText, strlen(it->IText ));
X    }
X}
X
Xvoid SetHourGlass() {
X    SetPointer( SurfWin, HourGlass, 16, 16, MPtrXOffset, MPtrYOffset);
X    SetPointer( GadWin, HourGlass, 16, 16, MPtrXOffset, MPtrYOffset);
X    SetPointer( CntrlWin, HourGlass, 16, 16, MPtrXOffset, MPtrYOffset);
X}
X
Xvoid ClearHourGlass() {
X    ClearPointer(SurfWin);
X    ClearPointer(GadWin);
X    ClearPointer(CntrlWin);
X}
X
Xvoid GadgetHandler(gadaddr)
X    struct Gadget *gadaddr;
X{
X    short curival;
X    float curfval;
X
X    if( gadaddr->UserData ) {
X        GadgetUpdate( gadaddr, true );
X        curival = ((struct GadExtens *) gadaddr->UserData)->curival;
X        curfval = ((struct GadExtens *) gadaddr->UserData)->curfval;
X    }
X
X    switch( (enum GadgetName) gadaddr->GadgetID ) {
X    case N_PtLocX:
X        LightSrc.x = (float)curival;
X        break;
X    case N_PtLocY:
X        LightSrc.y = (float)curival;
X        break;
X    case N_BackPlane:
X        BackColor = curival;
X        break;
X    case N_PtLocZ:
X        LightSrc.z = (float)curival;
X        break;
X    case N_BkIntens:
X        Ambience = curfval;
X        break;
X    case N_PtIntens:
X        PtIntensity = curfval;
X        break;
X    case N_Kdiffuse:
X        Kd = curfval;
X        break;
X    case N_Kspec:
X        Ks = curfval;
X        break;
X    case N_Map:
X        /* ResetCurve(); */
X        SetHourGlass();
X        RevMap();
X        ClearHourGlass();
X        break;
X    case N_Wire:
X        SetHourGlass();
X        RevNoShade();
X        ClearHourGlass();
X        break;
X    case N_Shaded:
X        SetHourGlass();
X        RevShade();
X        ClearHourGlass();
X        break;
X    case N_EditBez:
X        SetFitBez();
X        break;
X    case N_DefLines:
X        SetPolyDraw();
X        break;
X    case N_RevAngle:
X        SetRotRange( curival );
X        break;
X    case N_RevStart:
X        SetRotStart( curival );
X        break;
X    case N_TiltAng:
X        SetSecAng( curival );
X        break;
X    case N_RevSlices:
X        SetRevMesh( curival );
X        break;
X    case N_BezSlices:
X        SetBezMesh( curival );
X        break;
X    case N_SurfDist:
X        SetSurfDist( curival);
X        break;
X    case N_RepV:
X        MapRepV = curival;
X        PrepImgPix();
X        break;
X    case N_RepH:
X        MapRepH = curival;
X        PrepImgPix();
X        break;
X    case N_GoSurf:
X        ScreenToFront( SurfScrn );
X        break;
X    case N_GoPanel:
X        WBenchToFront();
X        WindowToFront( CntrlWin );
X        break;
X    default:
X        break;
X    }
X}
END_OF_FILE
if test 5801 -ne `wc -c <'gadgetuse.c'`; then
    echo shar: \"'gadgetuse.c'\" unpacked with wrong size!
fi
# end of 'gadgetuse.c'
fi
if test -f 'getfilenames.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'getfilenames.c'\"
else
echo shar: Extracting \"'getfilenames.c'\" \(4299 characters\)
sed "s/^X//" >'getfilenames.c' <<'END_OF_FILE'
X#include <intuition/intuition.h>
X#include "scrnio.ih"
X#include <exec/memory.h>
X#ifdef MANX
X#include <functions.h>
X#endif
X
X#include "scrndef.h"
X#include "mytypes.h"
X
X
X#define StringSize 40
X#define ROW 8
X#define COL 8
X#define TextX COL
X#define TextY (ROW/2)
X#define StringX 8
X#define StringY 12
X#define ReqSizeX 50*COL
X#define ReqSizeY 6*ROW
X
X#define CodeGo 100
X#define CodeCancel 101
X
X/*
X * declarations for a cancel button to be used by both
X * requestors.
X */
Xstatic struct IntuiText TextCancel = {
X    1,-1,JAM1, 2, 1, NULL,(UBYTE *) "Cancel", NULL };
X
Xstatic short S_Cancel[] = {
X    -2,-1,  -2,ROW+1,  6*COL+2,ROW+1,  6*COL+2,-1, -2,-1
X };
X
Xstatic struct Border B_Cancel = { 0, 0, 1, 0, JAM1, 5, S_Cancel, NULL };
X
Xstatic struct Gadget G_Cancel = {
X    NULL,
X    10*COL, ROW *4, 6*COL, ROW, /* loc and size of hit box */
X    GADGHBOX,    /* complemented when pressed */
X    RELVERIFY,    /* just get gadget up messages */
X    BOOLGADGET | REQGADGET,
X    (APTR)&B_Cancel, NULL,
X    &TextCancel,
X    0, NULL,
X    (int)CodeCancel,
X    NULL
X };
X
X/*
X * String gadget to get ilbm filename
X */
Xstatic char OutTitle[] = { "output filename:" };
Xstatic char InTitle[] = { "input filename:" };
X
Xstatic struct IntuiText TextOutFile = {
X    1,1,JAM1, TextX, TextY, NULL,
X    (UBYTE *)OutTitle, NULL
X };
Xstatic struct IntuiText TextInFile = {
X    1,1,JAM1, TextX, TextY, NULL,
X    (UBYTE *)InTitle, NULL
X };
X
X
Xstatic char OutNameBuff[StringSize] = { "out.ilbm" };
Xstatic char InNameBuff[StringSize] =  { "in.ilbm" };
Xstatic char undo[StringSize];
X
Xstatic struct StringInfo S_OutFile = {
X    (UBYTE *)OutNameBuff,
X    (UBYTE *)undo,
X    0,
X    sizeof( OutNameBuff),
X    0,
X    0,
X    13,
X    0,
X    0,0,NULL,0, NULL
X};
X
Xstatic struct StringInfo S_InFile = {
X    (UBYTE *)InNameBuff,
X    (UBYTE *)undo,
X    0,
X    sizeof( InNameBuff),
X    0,
X    0,
X    13,
X    0,
X    0,0,NULL,0, NULL
X};
X
Xstatic short BD_InOut[] = {
X    -2,-1,  -2, ROW,  (StringSize-1)*COL+1,ROW,
X    (StringSize-1)*COL+1,-1, -2, -1
X };
X
Xstatic struct Border B_InOut = { 0, 0, 1, 0, JAM1, 5, BD_InOut, NULL };
X
Xstatic struct Gadget G_OutFile = {
X    &G_Cancel,
X    StringX , StringY,   /* loc */
X    sizeof(OutNameBuff)*COL, ROW, /* size */
X    GADGHCOMP,
X    RELVERIFY /* | STRINGCENTER */,
X    STRGADGET | REQGADGET,
X    (APTR)&B_InOut, /* border */
X    NULL, /* high lighted */
X    &TextOutFile,
X    0,
X    (APTR) &S_OutFile,
X    (int)CodeGo,
X    NULL
X };
X
X
Xstatic struct Gadget G_InFile = {
X    &G_Cancel,
X    StringX , StringY,   /* loc */
X    sizeof(InNameBuff)*COL, ROW, /* size */
X    GADGHCOMP,
X    RELVERIFY/* | STRINGCENTER */,
X    STRGADGET | REQGADGET,
X    (APTR)&B_InOut, /* border */
X    NULL, /* high lighted */
X    NULL, /* text */
X    0,
X    (APTR) &S_InFile,
X    (int)CodeGo,
X    NULL
X };
X
Xstatic struct Requester R_InFile = {
X    NULL,
X    COL*10, ROW*4, ReqSizeX, ReqSizeY,
X    0, 0,
X    &G_InFile,
X    NULL,
X    &TextInFile,
X    NULL,
X    2, /* backfill */
X    NULL,
X    { NULL },
X    { NULL },
X    NULL,
X    { NULL },
X};
X
X
X
X
Xstatic struct Requester R_OutFile = {
X    NULL,
X    COL*10, ROW*4, ReqSizeX, ReqSizeY,
X    0, 0,
X    &G_OutFile,
X    NULL,
X    &TextOutFile,
X    NULL,
X    2, /* backfill */
X    NULL,
X    { NULL },
X    { NULL },
X    NULL,
X    { NULL },
X};
X
Xstatic bool
XWaitForUser() {
X    struct IntuiMessage mycopy,
X                        *orig;
X    long wakeupmask;
X
X    for(;;) {
X        wakeupmask = Wait( 1<< CntrlWin->UserPort->mp_SigBit );
X
X        /*
X         * handle messages for the control window
X         */
X
X        while( orig =(struct IntuiMessage *) GetMsg( CntrlWin->UserPort ) ) {
X
X            mycopy = *orig;
X            ReplyMsg( orig );
X
X            if( mycopy.Class == GADGETUP ) {
X                USHORT code;
X
X                code = ((struct Gadget*)mycopy.IAddress)->GadgetID;
X                if( code == CodeGo ) return( true );
X                if( code == CodeCancel) return(false);
X            }
X        }
X    }
X}
X
X
X
Xchar *GetInFile()
X{
X    bool answer;
X    Request( &R_InFile, CntrlWin);
X    answer = WaitForUser();
X    EndRequest( &R_InFile, CntrlWin);
X    return( answer?InNameBuff: NULL);
X}
X
X
Xchar *GetOutFile()
X{
X    bool answer;
X    Request( &R_OutFile, CntrlWin);
X    answer = WaitForUser();
X    EndRequest( &R_OutFile, CntrlWin);
X    return( answer?OutNameBuff: NULL);
X}
X
X
X
X
END_OF_FILE
if test 4299 -ne `wc -c <'getfilenames.c'`; then
    echo shar: \"'getfilenames.c'\" unpacked with wrong size!
fi
# end of 'getfilenames.c'
fi
if test -f 'mapcalc.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'mapcalc.c'\"
else
echo shar: Extracting \"'mapcalc.c'\" \(5365 characters\)
sed "s/^X//" >'mapcalc.c' <<'END_OF_FILE'
X#include <math.h>
X#include "mytypes.h"
X#include "revolve.h"       /* need to get scrnpair from here */
X#include "mapstuff.h"
X#include "menuexp.h"
X
X#ifdef TEST
X#undef DebugOn
X#define DebugOn 1
X#endif TEST
X
X
X#define DEBUG
X/*
X * this section of code derived from:
X * "The essential algorithms of ray tracing" by Eric Haines
X * presented in Sigraph proceedings on Ray Tracing
X * my major change has been to simplify it for two dimensions
X */
X
Xtypedef struct {
X    float x, y;
X} Vector;
X
Xstatic float DotVector(a,b)
X    Vector *a, *b;
X{
X    return( a->x * b->x + a->y * b->y);
X}
X
Xstatic void DivVector(in, scale, out)
X    Vector *in, *out;
X    float scale;
X{
X    if ( fabs(scale) < SingleTinyVal ) {
X        out->x = SingleLargeVal;
X        out->y = SingleLargeVal;
X    }
X    else {
X        out->x = in->x / scale;
X        out->y = in->y / scale;
X    }
X}
X
X
X
Xstatic Vector Na, Nb, Nc;
Xstatic float Du0, Du1, Du2,
X             Dv0, Dv1, Dv2;
Xstatic Vector Qux, Quy,
X              Qvx, Qvy;
Xstatic float Dux, Duy,
X             Dvx, Dvy;
Xstatic bool IsQuadu, IsQuadv;
X
Xvoid CalcMapConsts(vp)
X    register ScrnPair *vp;
X#define p00 vp[0]
X#define p01 vp[1]
X#define p11 vp[2]
X#define p10 vp[3]
X{
X    Vector Pa, Pb, Pc, Pd;
X
X    Pa.x = p00.x - p10.x + p11.x - p01.x;
X    Pa.y = p00.y - p10.y + p11.y - p01.y;
X
X    Pb.x = p10.x - p00.x;
X    Pb.y = p10.y - p00.y;
X
X    Pc.x = p01.x - p00.x;
X    Pc.y = p01.y - p00.y;
X
X    Pd.x = p00.x;
X    Pd.y = p00.y;
X
X    Na.x = Pa.y; Na.y = -Pa.x;
X    Nc.x = Pc.y; Nc.y = -Pc.x;
X    Nb.x = Pb.y; Nb.y = -Pb.x;
X
X    Du0 = DotVector(&Nc, &Pd);
X    Du1 = DotVector(&Na, &Pd) + DotVector(&Nc, &Pb);
X    Du2 = DotVector( &Na, &Pb);
X
X    if( fabs( Du2 ) > SingleTinyVal ) {
X        float TwoDu2;
X
X        IsQuadu = true;
X        TwoDu2 = 2.0 * Du2;
X        DivVector( &Na, TwoDu2, &Qux );
X        DivVector( &Nc, -Du2, &Quy );
X        Duy = Du0/Du2;
X        Dux = -Du1/TwoDu2;
X    }
X    else {
X        IsQuadu = false;
X    }
X
X    Dv0 = DotVector( &Nb, &Pd);
X    Dv1 = DotVector(&Na, &Pd) + DotVector(&Nb, &Pc);
X    Dv2 = DotVector( &Na, &Pc);
X    if( fabs( Dv2 ) > SingleTinyVal ) {
X        float TwoDv2;
X
X        IsQuadv = true;
X        TwoDv2 = 2.0 * Dv2;
X        DivVector( &Na, TwoDv2, &Qvx);
X        DivVector( &Nb, -Dv2, &Qvy);
X/*      DivVector( &Nc, -Dv2, &Qvy); */
X        Dvx = - Dv1/TwoDv2;
X        Dvy = Dv0/Dv2;
X    }
X    else {
X        IsQuadv = false;
X    }
X#ifdef DEBUG
X    if( DebugOn ) {
X        printf("du2 %f, du1 %f, du0 %f\n", Du2, Du1, Du0 );
X        printf("dv2 %f, dv1 %f, dv0 %f\n", Dv2, Dv1, Dv0 );
X        printf("Na = (%f, %f), Nb = (%f,%f), Nc = (%f,%f)\n",
X        Na.x, Na.y, Nb.x, Nb.y, Nc.x, Nc.y );
X        printf("IsQuad =(%c, %c)\n", IsQuadu?'t':'f', IsQuadv? 't': 'f' );
X    }
X#endif DEBUG
X
X}
X
X
X/*
X * given points px,py in the quadrilateral, map them to points inside a
X * unit square
X */
Xvoid  MapXYRatio(px, py, outx, outy, SweepCode)
X    float px, py;
X    float *outx, *outy;
X    short SweepCode;
X{
X    float resu, resv;
X    Vector Ri;
X
X
X    Ri.x = px; Ri.y = py;
X
X    if( !IsQuadu ) {
X        float denom;
X        denom = (Du1 - DotVector(&Na, &Ri));
X        if( fabs(denom) < SingleTinyVal )
X            resu = 2.0;
X        else
X            resu = (DotVector(&Nc, &Ri) - Du0)/denom;
X    } else {
X        float Ka, Kb;
X        float discrim;
X
X        Ka = Dux + DotVector( &Qux, &Ri);
X        Kb = Duy + DotVector( &Quy, &Ri);
X        discrim = sqrt(fabs(Ka * Ka - Kb));
X        resu = Ka + ((discrim > Ka)? discrim: (-discrim));
X#ifdef DEBUG
X        if( DebugOn ) {
X            printf("dux=%f, duy = %f, ka = %f, kb = %f\n",
X                Dux, Duy, Ka, Kb );
X        }
X#endif DEBUG
X
X    }
X
X    if( !IsQuadv ) {
X        float denom;
X        denom = (Dv1 - DotVector(&Na, &Ri));
X        if( fabs(denom) < SingleTinyVal )
X            resv = 2.0;
X        else
X            resv = (DotVector(&Nb, &Ri) - Dv0)/denom;
X    } else {
X        float Ka, Kb;
X        float discrim;
X
X        Ka = Dvx + DotVector( &Qvx, &Ri);
X        Kb = Dvy + DotVector( &Qvy, &Ri);
X        discrim = sqrt(fabs( Ka * Ka - Kb));
X        resv = Ka + ((discrim > Ka)? discrim: (-discrim));
X#ifdef DEBUG
X        if( DebugOn ) {
X            printf("dvx=%f, dvy = %f, ka = %f, kb = %f\n",
X                Dvx, Dvy, Ka, Kb );
X        }
X#endif DEBUG
X    }
X
X#ifdef DEBUG
X    if( DebugOn ) {
X        printf("(%f,%f) -> (%f, %f)\n", px, py, resu, resv );
X    }
X#endif DEBUG
X
X    if( resu > 1.0 || resu < 0.0 ) {
X        resu = ( SweepCode & MP_XMAX)? 1.0: 0.0;
X    }
X    if( resv > 1.0 || resv < 0.0 ) {
X        resv = ( SweepCode & MP_YMAX)? 1.0: 0.0;
X    }
X
X    *outx = resu; *outy = resv;
X}
X
X
X
X/*
X * here abides testcode
X */
X#ifdef TEST
X#include <stdio.h>
X
XReadScrnPair(set, a)
X    char *set;
X    ScrnPair *a;
X{
X    int tx, ty;
X    printf("enter screen pair %s\n",set);
X    scanf("%d %d", &tx, &ty);
X    a->x = tx; a->y = ty;
X}
X
XReadLimits(a)
XScrnPair a[];
X{
X    ReadScrnPair("a", &a[0]);
X    ReadScrnPair("b", &a[1]);
X    ReadScrnPair("c", &a[2]);
X    ReadScrnPair("d", &a[3]);
X}
X
Xmain() {
X    float inx, iny;
X    float outy, outx;
X    ScrnPair pts[4];
X
X    ReadLimits(pts);
X    CalcMapConsts(pts);
X    while(!feof(stdin)) {
X        printf("enter quadrilateral points\n");
X        scanf("%f %f", &inx, &iny );
X        MapXYRatio( inx, iny, &outx, &outy, 0);
X        printf("p(%f,%f)->p(%f,%f)\n", inx, iny, outx, outy);
X    }
X}
X#endif TEST
END_OF_FILE
if test 5365 -ne `wc -c <'mapcalc.c'`; then
    echo shar: \"'mapcalc.c'\" unpacked with wrong size!
fi
# end of 'mapcalc.c'
fi
if test -f 'menu_files.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'menu_files.c'\"
else
echo shar: Extracting \"'menu_files.c'\" \(7512 characters\)
sed "s/^X//" >'menu_files.c' <<'END_OF_FILE'
X#include "gadgetdef.h"
X
Xstatic struct IntuiText filetext[] = {
X    { 0, 1, JAM2, 2, 0, NULL, (UBYTE *)"save as", NULL },
X    { 0, 1, JAM2, 2, 0, NULL, (UBYTE *)"save first", NULL },
X    { 0, 1, JAM2, 2, 0, NULL, (UBYTE *)"save next", NULL },
X    { 0, 1, JAM2, 2, 0, NULL, (UBYTE *)"open map", NULL },
X    { 0, 1, JAM2, 2, 0, NULL, (UBYTE *)"close map", NULL },
X    { 0, 1, JAM2, 2, 0, NULL, (UBYTE *)"write data", NULL }
X};
X
Xstatic struct IntuiText greytext[] = {
X   { 0, 1, JAM2, 2, 0, NULL, (UBYTE *)"Grey model",   NULL },
X   { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"Average",   NULL },
X   { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"Lumin",   NULL },
X   { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"Distance",   NULL },
X   { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"R only",   NULL },
X   { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"G only",   NULL },
X   { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"B only",   NULL }
X};
X
Xstatic struct IntuiText packtext[] = {
X    { 0, 1, JAM2, 2, 0, NULL, (UBYTE *)"compression", NULL },
X    { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"run length", NULL },
X    { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"none", NULL }
X};
X
X
X
X#define FILEFLAGS  ( ITEMTEXT | HIGHCOMP | ITEMENABLED )
X
Xstatic struct MenuItem packitems[] = {
X  { &packitems[1], /* next item */
X    90, 0, 110 , 10, /* x,y,w,h */
X    COLMEMFLAGS| CHECKED,
X    2, /* mutual exclude bits */
X    (APTR) &packtext[1],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { NULL, /* next item */
X    90, 10, 110 , 10, /* x,y,w,h */
X    COLMEMFLAGS,
X    1, /* mutual exclude bits */
X    (APTR) &packtext[2],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    }
X};
X
X#define GREYMUTUAL(pos) (077 ^ (1<<(pos)))
Xstatic struct MenuItem greyitems[] = {
X  { &greyitems[1], /* next item */
X    90, 0, 80 , 10, /* x,y,w,h */
X    COLMEMFLAGS|CHECKED,
X    GREYMUTUAL(0), /* mutual exclude bits */
X    (APTR) &greytext[1],  /* average */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { &greyitems[2], /* next item */
X    90, 10, 80 , 10, /* x,y,w,h */
X    COLMEMFLAGS,
X    GREYMUTUAL(1), /* mutual exclude bits */
X    (APTR) &greytext[2],  /* lumin */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { &greyitems[3], /* next item */
X    90, 20, 80 , 10, /* x,y,w,h */
X    COLMEMFLAGS,
X    GREYMUTUAL(2), /* mutual exclude bits */
X    (APTR) &greytext[3],  /* dist */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { &greyitems[4], /* next item */
X    90, 30, 80 , 10, /* x,y,w,h */
X    COLMEMFLAGS,
X    GREYMUTUAL(3), /* mutual exclude bits */
X    (APTR) &greytext[4],  /* dist */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { &greyitems[5], /* next item */
X    90, 40, 80 , 10, /* x,y,w,h */
X    COLMEMFLAGS,
X    GREYMUTUAL(4), /* mutual exclude bits */
X    (APTR) &greytext[5],  /* dist */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { NULL, /* next item */
X    90, 50, 80 , 10, /* x,y,w,h */
X    COLMEMFLAGS,
X    GREYMUTUAL(5), /* mutual exclude bits */
X    (APTR) &greytext[6],  /* dist */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    }
X};
X
X
X
X
Xstatic struct MenuItem fileitems[] = {
X  { &fileitems[1], /* next item */
X    10, 0, 90 , 10, /* x,y,w,h */
X    FILEFLAGS,
X    0, /* mutual exclude bits */
X    (APTR) &filetext[0],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { &fileitems[2], /* next item */
X    10, 10, 90 , 10, /* x,y,w,h */
X    FILEFLAGS,
X    0, /* mutual exclude bits */
X    (APTR) &filetext[1],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { &fileitems[3], /* next item */
X    10, 20, 90 , 10, /* x,y,w,h */
X    FILEFLAGS,
X    0, /* mutual exclude bits */
X    (APTR) &filetext[2],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { &fileitems[4], /* next item */
X    10, 30, 90 , 10, /* x,y,w,h */
X    FILEFLAGS,
X    0, /* mutual exclude bits */
X    (APTR) &packtext[0],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    packitems, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { &fileitems[5], /* next item */
X    10, 40, 90 , 10, /* x,y,w,h */
X    FILEFLAGS,
X    0, /* mutual exclude bits */
X    (APTR) &filetext[3],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { &fileitems[6], /* next item */
X    10, 50, IMAGE_HITWIDTH , 10, /* x,y,w,h */
X    COLMEMFLAGS,
X    1, /* mutual exclude bits */
X    (APTR) &greytext[0],     /* red */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    greyitems, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { &fileitems[7], /* next item */
X    10, 60, 90 , 10, /* x,y,w,h */
X    FILEFLAGS,
X    0, /* mutual exclude bits */
X    (APTR) &filetext[4],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { NULL, /* next item */
X    10, 70, 90 , 10, /* x,y,w,h */
X    FILEFLAGS,
X    0, /* mutual exclude bits */
X    (APTR) &filetext[5],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    }
X};
X
Xextern char *GetOutFile();
Xextern char *GetInFile();
X
XMenuDoFile(item)
Xint item;
X{
X    static int filecnt = 0;
X    char tempbuff[80];
X    char *filename;
X    bool packflag;
X    int i;
X
X    packflag = Selected( packitems[0] )?1:0;
X
X
X    switch (item ) {
X    case 0:
X        if( (filename = GetOutFile())) {
X            SetHourGlass();
X            WriteIlbm(filename, &SurfWinDef, &SurfScrnDef, packflag);
X        }
X        break;
X    case 1:
X        filecnt = 0; /* deliberate fall into case 2 */
X    case 2:
X        if( filename = GetOutFile()) {
X            SetHourGlass();
X            sprintf(tempbuff, "%s.%d", filename, filecnt++ );
X            WriteIlbm(tempbuff, &SurfWinDef, &SurfScrnDef, packflag);
X        }
X        break;
X    case 4:
X        if( filename = GetInFile()){
X            SetHourGlass();
X            ReadIlbm( filename);
X        }
X        break;
X    case 5:
X        for( i = 0; i < (sizeof(greyitems)/sizeof(greyitems[0])); i++ ) {
X            if( Selected(greyitems[i])) {
X                SetGreyModel(i);
X            }
X        }
X        break;
X    case 6:
X        CloseImgPix();
X        break;
X    case 7:
X        if( filename = GetOutFile()) {
X            SetHourGlass();
X            WriteData(filename);
X        }
X        break;
X
X    default:
X        break;
X    }
X
X    ClearHourGlass();
X}
END_OF_FILE
if test 7512 -ne `wc -c <'menu_files.c'`; then
    echo shar: \"'menu_files.c'\" unpacked with wrong size!
fi
# end of 'menu_files.c'
fi
if test -f 'menu_image.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'menu_image.c'\"
else
echo shar: Extracting \"'menu_image.c'\" \(6963 characters\)
sed "s/^X//" >'menu_image.c' <<'END_OF_FILE'
X#include "menuexp.h"
X
X
X/*
X * Menu description for selecting color mapping
X */
Xstatic struct IntuiText Specular = {
X     0, 1, JAM2, 20, 0, NULL, (UBYTE *)"Specular",  NULL
X};
X
Xstatic struct IntuiText revtext[] = {
X   { 0, 1, JAM2, 2, 0, NULL, (UBYTE *)"Rev. Axis",  NULL },
X   { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"X",   NULL },
X   { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"Y",   NULL }
X};
X
Xstatic struct IntuiText dithertext[] = {
X   { 0, 1, JAM2, 2, 0, NULL, (UBYTE *)"Dither",   NULL },
X   { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"none",   NULL },
X   { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"2",   NULL },
X   { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"4",   NULL },
X   { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"8",   NULL },
X   { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"16",   NULL },
X   { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"32",   NULL },
X   { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"64",   NULL },
X   { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"128",   NULL }
X};
X
X
Xstatic struct IntuiText MiscText[] = {
X   { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"Abort Draw",   NULL },
X   { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"Debug",   NULL },
X   { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"Flip XY Map", NULL }
X};
X
Xstruct MenuItem revitems[] = {
X  { &revitems[1], /* next item */
X    90, 0, 80 , 10, /* x,y,w,h */
X    COLMEMFLAGS| CHECKED,
X    2, /* mutual exclude bits */
X    (APTR) &revtext[1],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { NULL, /* next item */
X    90, 10, 80 , 10, /* x,y,w,h */
X    COLMEMFLAGS,
X    1, /* mutual exclude bits */
X    (APTR) &revtext[2],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    }
X};
X
X#define DitherExMask(X) (((1<<8)-1) ^ (1<<X))
X
Xstruct MenuItem ditheritems[] = {
X  { &ditheritems[1], /* next item */
X    90, 0, 80 , 10, /* x,y,w,h */
X    COLMEMFLAGS,
X    DitherExMask(0), /* mutual exclude bits */
X    (APTR) &dithertext[1],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { &ditheritems[2], /* next item */
X    90, 10, 80 , 10, /* x,y,w,h */
X    COLMEMFLAGS,
X    DitherExMask(1), /* mutual exclude bits */
X    (APTR) &dithertext[2],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { &ditheritems[3], /* next item */
X    90, 20, 80 , 10, /* x,y,w,h */
X    COLMEMFLAGS| CHECKED,
X    DitherExMask(2), /* mutual exclude bits */
X    (APTR) &dithertext[3],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { &ditheritems[4], /* next item */
X    90, 30, 80 , 10, /* x,y,w,h */
X    COLMEMFLAGS,
X    DitherExMask(3), /* mutual exclude bits */
X    (APTR) &dithertext[4],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { &ditheritems[5], /* next item */
X    90, 40, 80 , 10, /* x,y,w,h */
X    COLMEMFLAGS,
X    DitherExMask(4), /* mutual exclude bits */
X    (APTR) &dithertext[5],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { &ditheritems[6], /* next item */
X    90, 50, 80 , 10, /* x,y,w,h */
X    COLMEMFLAGS,
X    DitherExMask(5), /* mutual exclude bits */
X    (APTR) &dithertext[6],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { &ditheritems[7], /* next item */
X    90, 60, 80 , 10, /* x,y,w,h */
X    COLMEMFLAGS,
X    DitherExMask(6), /* mutual exclude bits */
X    (APTR) &dithertext[7],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { NULL, /* next item */
X    90, 70, 80 , 10, /* x,y,w,h */
X    COLMEMFLAGS,
X    DitherExMask(7), /* mutual exclude bits */
X    (APTR) &dithertext[8],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    }
X};
X
X
X#define IMAGE_HITWIDTH 96
X
Xstruct MenuItem imageitems[] = {
X  { &imageitems[1], /* next item */
X    1, 0, IMAGE_HITWIDTH , 10, /* x,y,w,h */
X    COLMEMFLAGS,
X    2, /* mutual exclude bits */
X    (APTR) &revtext[0],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    revitems, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { &imageitems[2], /* next item */
X    1, 10, IMAGE_HITWIDTH , 10, /* x,y,w,h */
X    COLMEMFLAGS,
X    1, /* mutual exclude bits */
X    (APTR) &dithertext[0],     /* red */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    ditheritems, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { &imageitems[3], /* next item */
X    1, 20, IMAGE_HITWIDTH , 10, /* x,y,w,h */
X    COLMEMFLAGS|MENUTOGGLE,
X    0, /* mutual exclude bits */
X    (APTR) &Specular,
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { &imageitems[4], /* next item */
X    1, 30, IMAGE_HITWIDTH , 10, /* x,y,w,h */
X    COLMEMFLAGS|MENUTOGGLE,
X    0, /* mutual exclude bits */
X    (APTR) &MiscText[2], /* Flip XY */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { &imageitems[5], /* next item */
X    1, 40, 100 , 10, /* x,y,w,h */
X    COLMEMFLAGS| MENUTOGGLE,
X    0, /* mutual exclude bits */
X    (APTR) &MiscText[0], /* AbortDraw */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { NULL, /* next item */
X    1, 50, IMAGE_HITWIDTH, 10, /* x,y,w,h */
X    COLMEMFLAGS|MENUTOGGLE,
X    0, /* mutual exclude bits */
X    (APTR) &MiscText[1],   /* debug */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    }
X};
X
XUSHORT *AbortDrawPtr = &imageitems[4].Flags;
XUSHORT *DebugOnPtr = &imageitems[5].Flags;
X
X
Xstatic void MenuSetImage()
X{
X    int i;
X    if( Selected(revitems[0])) {
X        SetRevAxis(0); /* Xaxis */
X    }
X    else {
X        SetRevAxis(1); /* Yaxis */
X    }
X
X    for( i = 0; i < sizeof(ditheritems)/sizeof(ditheritems[0]); i++ ) {
X        if( Selected(ditheritems[i] )) {
X            if( i != DitherPower ) {
X                FreeOldDither();
X            }
X            DitherPower = i;
X        }
X    }
X
X    SpecOn = Selected( imageitems[2])?true:false;
X    FlipImgPix( Selected(imageitems[3])?true:false);
X}
X
END_OF_FILE
if test 6963 -ne `wc -c <'menu_image.c'`; then
    echo shar: \"'menu_image.c'\" unpacked with wrong size!
fi
# end of 'menu_image.c'
fi
if test -f 'menu_scrn.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'menu_scrn.c'\"
else
echo shar: Extracting \"'menu_scrn.c'\" \(5430 characters\)
sed "s/^X//" >'menu_scrn.c' <<'END_OF_FILE'
X#include "scrndef.h"
X/*
X * Menu description for selecting color mapping
X */
X
X/*
X * define mutual exclusion flags
X */
X#define MUBIT1 1
X#define MUBIT2 2
X#define MUBIT3 4
X#define MUBIT4 8
X#define MUBIT5 16
X#define MULO 32
X#define MUHI 64
X#define MUHAM 128
X#define MUOVER 256
X
Xstatic struct IntuiText scrntext[] = {
X   { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"2 color",  NULL },
X   { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"4 color ",   NULL },
X   { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"8 color", NULL },
X   { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"16 color",  NULL },
X   { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"32 color",  NULL },
X   { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"lores",  NULL },
X   { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"hires",  NULL },
X   { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"ham",  NULL },
X   { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"overscan",  NULL },
X   { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"interlace",  NULL },
X};
X
Xstatic struct MenuItem scrnitems[] = {
X  { &scrnitems[1], /* next item */
X    10, 0, 90 , 10, /* x,y,w,h */
X    COLMEMFLAGS ,
X    MUBIT2|MUBIT3|MUBIT4|MUBIT5, /* mutual exclude bits */
X    (APTR) &scrntext[0],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { &scrnitems[2], /* next item */
X    10, 10, 90 , 10, /* x,y,w,h */
X    COLMEMFLAGS,
X    MUBIT1|MUBIT3|MUBIT4|MUBIT5, /* mutual exclude bits */
X    (APTR) &scrntext[1],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { &scrnitems[3], /* next item */
X    10, 20, 90 , 10, /* x,y,w,h */
X    COLMEMFLAGS,
X    MUBIT1|MUBIT2|MUBIT4|MUBIT5, /* mutual exclude bits */
X    (APTR) &scrntext[2],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { &scrnitems[4], /* next item */
X    10, 30, 90 , 10, /* x,y,w,h */
X    COLMEMFLAGS| CHECKED,
X    MUBIT1|MUBIT2|MUBIT3|MUBIT5, /* mutual exclude bits */
X    (APTR) &scrntext[3],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { &scrnitems[5], /* next item */
X    10, 40, 90 , 10, /* x,y,w,h */
X    COLMEMFLAGS,
X    MUBIT1|MUBIT2|MUBIT3|MUBIT4|MUHI, /* mutual exclude bits */
X    (APTR) &scrntext[4],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { &scrnitems[6], /* next item */
X    10, 50, 90 , 10, /* x,y,w,h */
X    COLMEMFLAGS| CHECKED,
X    MUHI|MUHAM, /* mutual exclude bits */
X    (APTR) &scrntext[5],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { &scrnitems[7], /* next item */
X    10, 60, 90 , 10, /* x,y,w,h */
X    COLMEMFLAGS,
X    MULO|MUHAM|MUBIT5, /* mutual exclude bits */
X    (APTR) &scrntext[6],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { &scrnitems[8], /* next item */
X    10, 70, 90 , 10, /* x,y,w,h */
X    (COLMEMFLAGS) & ~ITEMENABLED,
X    MULO|MUHI, /* mutual exclude bits */
X    (APTR) &scrntext[7],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { &scrnitems[9], /* next item */
X    10, 80, 90 , 10, /* x,y,w,h */
X    ( COLMEMFLAGS|MENUTOGGLE)& ~ITEMENABLED ,
X    0, /* mutual exclude bits */
X    (APTR) &scrntext[8],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    },
X  { NULL, /* next item */
X    10, 90, 90 , 10, /* x,y,w,h */
X    COLMEMFLAGS|MENUTOGGLE,
X    0, /* mutual exclude bits */
X    (APTR) &scrntext[9],  /* grey */
X    NULL, /* highlight image */
X    'h', /* command byte ? */
X    NULL, /* submenu item */
X    0 /* next select for select dragging */
X    }
X};
X
X
X
Xvoid MenuSetScrn()
X{
X    UBYTE colmax;
X
X    CloseSurf();
X
X    /*
X     * overscan
X     */
X    SurfScrnDef.Width = 320;
X    SurfScrnDef.Height = 200+ButHeight;
X    SurfScrnDef.LeftEdge = SurfScrnDef.TopEdge = 0;
X
X    if( Selected(scrnitems[8])) {
X        SurfScrnDef.Width = 352;
X        SurfScrnDef.Height = 220;
X    }
X
X    if( Selected(scrnitems[7])) { /* ham mode */
X        SurfScrnDef.Depth = 6;
X        SurfScrnDef.ViewModes = HAM;
X    }
X    else {
X        int i;
X        SurfScrnDef.Depth = 3; /* incase non of the flags are set */
X
X        for( i = 0; i < 5; i++ ) {
X            if( Selected( scrnitems[i])) {
X                SurfScrnDef.Depth = i+1;
X            }
X        }
X
X        if( Selected( scrnitems[5] ) ) { /* lores */
X            SurfScrnDef.ViewModes = 0;
X        }
X        else {
X            SurfScrnDef.ViewModes = HIRES;
X            SurfScrnDef.Width <<= 1;
X            SurfScrnDef.LeftEdge *= 2;
X            if( SurfScrnDef.Depth > 4 ) {
X                SurfScrnDef.Depth = 4;
X            }
X        }
X    }
X
X    if( Selected( scrnitems[9] )) {   /* interlace */
X        SurfScrnDef.Height <<= 1;
X        SurfScrnDef.Height -= ButHeight;
X        SurfScrnDef.TopEdge *= 2;
X        SurfScrnDef.ViewModes |= LACE;
X    }
X
X
X    OpenSurf();
X}
END_OF_FILE
if test 5430 -ne `wc -c <'menu_scrn.c'`; then
    echo shar: \"'menu_scrn.c'\" unpacked with wrong size!
fi
# end of 'menu_scrn.c'
fi
if test -f 'revolve.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'revolve.c'\"
else
echo shar: Extracting \"'revolve.c'\" \(6344 characters\)
sed "s/^X//" >'revolve.c' <<'END_OF_FILE'
X#include <math.h>
X#include <stdio.h>
X#include "fasttrig.h"
X#include "bezpt.h"
X#include "revolve.h"
X#include "mytypes.h"
X
X
XRevAxisType RevAxis;
X
X
Xshort RevMesh = DefRevMeshVal;
Xshort RevImageR, /* revolution index */
X      RevImageB; /* bezier index */
X
Xstatic int RotRange = DefRotRange;
Xstatic int RotStart = DefRotStart;
Xstatic int SecAngle = DefTilt;
Xstatic float SurfDist = DefSurfDist;
Xstatic float ViewDist = DefViewDist;
Xstatic bool Perspective = DefPersp;
X
Xvoid SetPerspective(  value)
X    int value;
X{
X    Perspective = value;
X}
X
X
X
Xvoid SetRevAxis( value)
X
X{
X    RevAxis = (value)? RevY : RevX;
X}
X
X
Xvoid SetRotStart( value )
X    int value;
X{
X    RotStart = value;
X}
X
Xvoid SetRotRange(  value )
X    int value;
X{
X    RotRange = value;
X}
X
Xvoid SetSecAng( value )
X    int value;
X{
X    SecAngle = value;
X}
X
Xvoid SetRevMesh( value )
X    int value;
X{
X    RevMesh = value;
X}
X
X
X
Xvoid SetSurfDist( value )
X    int value;
X{
X    SurfDist = (float )value;
X}
X
X
Xvoid SetViewDist( value )
X    int value;
X{
X    ViewDist = (float )value;
X}
X
X
X
Xstatic
Xfloat secsin, seccos; /* trig values of secondary angle */
X
Xstatic
Xint sizeptlist = 0;
X
Xstatic
XPtGen *ptlist1 = 0,
X      *ptlist2 = 0;
X
Xstatic
Xint NumEnts; /* number of angle slices */
X
X
Xstatic
Xbool PrepRev()
X{
X    NumEnts = RevMesh+1;
X
X    /*
X     * allocate space 3d descriptions of a point revolved x degrees
X     */
X    if( NumEnts > sizeptlist ) {
X        if( ptlist1 ) free(ptlist1);
X        if( ptlist2 ) free(ptlist2);
X
X        ptlist1 =(PtGen *) malloc( NumEnts * sizeof(PtGen)  );
X        ptlist2 =(PtGen *) malloc( NumEnts * sizeof(PtGen)  );
X        if( !ptlist1 || !ptlist2 ) {
X            OutErr("PrepRev:not enough memory");
X            return(true);
X        }
X    }
X
X
X    if( InitFastTrig( RotStart, RotRange, NumEnts)) return(true);
X    secsin = sin((float)SecAngle*PI/180);
X    seccos = cos((float)SecAngle*PI/180);
X    return (false);
X}
X
X
Xstatic
Xvoid CalcRing(ptlist, xpos, ypos)
Xregister PtGen *ptlist;
Xfloat xpos, ypos;
X{
X    int angle;
X
X    for( angle = 0; angle < NumEnts; angle++, ptlist++) {
X        float temp;
X        /*
X         * calculate 3d coordinate of point revolved
X         */
X        if( RevAxis == RevX) {
X            ptlist->d3.y = ypos * fcos(angle);
X            temp = ypos * fsin(angle);
X            ptlist->d3.x = xpos* seccos - temp *secsin;
X            ptlist->d3.z = xpos * secsin + temp * seccos;
X        }
X        else {
X            ptlist->d3.x = xpos * fcos(angle);
X            temp = xpos * fsin( angle);
X            ptlist->d3.y = ypos * seccos + temp * secsin;
X            ptlist->d3.z = secsin * ypos - temp * seccos;
X        }
X        ptlist->d3.z -= SurfDist;
X
X/*        if( Perspective ) {
X            float PerspScale;
X
X            PerspScale = fabs(ViewDist / ptlist->d3.z);
X            ptlist->d3.x *= PerspScale;
X            ptlist->d3.y *= PerspScale;
X        }
X */
X        /*
X         * calculate the 2d screen coordinate equvalent
X         */
X      /*
X        ptlist->d2.x = (short) ptlist->d3.x;
X        ptlist->d2.y = (short) ptlist->d3.y;
X       */
X        ptlist->d2.x = (short) (ptlist->d3.x + 0.5);
X        ptlist->d2.y = (short) (ptlist->d3.y + 0.5);
X    }
X}
X
X
X
X
X
X
X/*
X * return true on failure
X */
Xbool Revolve(acceptfunc)
X    void (*acceptfunc)();
X{
X    float tparm, deltat;
X    int subseg;
X
X    if( PrepRev() ) {
X        return(true);
X    }
X
X    deltat = 1.0/BezMesh;
X    RevImageB = 0;
X    ResetActSeg();
X    do {
X        float xpos, ypos;
X
X
X        InitCalcBez();
X        xpos = StartPtX(GetCurSeg());
X        ypos = StartPtY(GetCurSeg());
X        CalcRing(ptlist1, xpos, ypos );
X        for( subseg = 1; subseg <= BezMesh; subseg++ ) {
X            register PtGen *ptlista, *ptlistb;
X            register int numpoly;
X
X            tparm = subseg * deltat;
X            if( subseg & 1 ) {
X                ptlista = ptlist2; ptlistb = ptlist1;
X            }
X            else {
X                ptlista = ptlist1; ptlistb = ptlist2;
X            }
X
X            CalcBezPt(tparm, &xpos, &ypos );
X            CalcRing( ptlista, xpos, ypos );
X            RevImageR = 0;
X            for( numpoly = NumEnts -1; numpoly--; ) {
X                (* acceptfunc)(ptlistb, ptlista, ptlista+1, ptlistb+1);
X                ptlista++;
X                ptlistb++;
X                RevImageR++;
X            }
X            RevImageB++;
X        }
X        NextSeg();
X
X    } while( ActSeg );
X    return( false );
X}
X
X/*
X * write a ring of points
X */
Xstatic void WriteRing(fileout, ptlist, numpnts)
XFILE *fileout;
XPtGen *ptlist;
Xint numpnts;
X{
X    while( numpnts-- ) {
X        fprintf(fileout, "%f %f %f \n", ptlist->d3.x,
X            ptlist->d3.y, ptlist->d3.z );
X            ptlist++;
X    }
X}
X
X/*
X * write the list of vertices to file pointer
X * this function performs a similar function to revolve
X */
Xstatic void WriteRevolve(fileout)
X    FILE *fileout;
X{
X    float tparm, deltat;
X    float OldSurfDist;
X    int subseg;
X    float xpos, ypos;
X
X
X    OldSurfDist = SurfDist;
X    SurfDist = 0;
X    deltat = 1.0/BezMesh;
X    RevImageB = 0;
X    ResetActSeg();
X    /*
X     * write out the starting ring
X     */
X    InitCalcBez();
X    xpos = StartPtX(GetCurSeg());
X    ypos = StartPtY(GetCurSeg());
X    CalcRing(ptlist1, xpos, ypos );
X    WriteRing(fileout, ptlist1, NumEnts);
X    /*
X     * loop to write out all the other rings
X     */
X    do {
X
X        InitCalcBez();
X        for( subseg = 1; subseg <= BezMesh; subseg++ ) {
X            tparm = subseg * deltat;
X            CalcBezPt(tparm, &xpos, &ypos );
X            CalcRing( ptlist1, xpos, ypos );
X            WriteRing(fileout, ptlist1, NumEnts);
X            RevImageB++;
X        }
X        NextSeg();
X
X    } while( ActSeg );
X    SurfDist = OldSurfDist;
X
X    return;
X}
X
X/*
X * this function writes a list of vertices to "filename"
X */
Xvoid WriteData(filename)
X    char *filename;
X{
X        FILE *fileout;
X
X        if(( GetNumSegs() < 1) || PrepRev()){
X                return;
X        }
X
X        fileout = fopen(filename,"w");
X        if(!fileout) {
X            OutErr("could not open data file");
X            return;
X        }
X
X
X        fprintf(fileout, "%d   * number of Rings\n", BezRings());
X        fprintf(fileout, "%d   * Rev mesh\n", RevMesh);
X        fprintf(fileout, "%d   * Rotation range\n", RotRange);
X        WriteRevolve(fileout);
X        fprintf(fileout, "end\n");
X        fclose(fileout);
X}
X
X
X
END_OF_FILE
if test 6344 -ne `wc -c <'revolve.c'`; then
    echo shar: \"'revolve.c'\" unpacked with wrong size!
fi
# end of 'revolve.c'
fi
if test -f 'writeilbm.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'writeilbm.c'\"
else
echo shar: Extracting \"'writeilbm.c'\" \(6260 characters\)
sed "s/^X//" >'writeilbm.c' <<'END_OF_FILE'
X#include <stdio.h>
X#include <exec/types.h>
X#include <intuition/intuition.h>
X#include <graphics/gfxmacros.h>
X#ifdef MANX
X#include <functions.h>
X#endif
X#include "mytypes.h"
X
Xextern int PackRow();
X/*
X * following definitions cut from ilbm.h file
X */
Xtypedef UBYTE Masking;          /* Choice of masking technique.*/
X#define mskNone                 0
X#define mskHasMask              1
X#define mskHasTransparentColor  2
X#define mskLasso                3
X
Xtypedef UBYTE Compression;      /* Choice of compression algorithm applied to
X     * each row of the source and mask planes. "cmpByteRun1" is the byte run
X     * encoding generated by Mac's PackBits. See Packer.h . */
X#define cmpNone      0
X#define cmpByteRun1  1
X
X/* Aspect ratios: The proper fraction xAspect/yAspect represents the pixel
X * aspect ratio pixel_width/pixel_height.
X *
X * For the 4 Amiga display modes:
X *   320 x 200: 10/11  (these pixels are taller than they are wide)
X *   320 x 400: 20/11
X *   640 x 200:  5/11
X *   640 x 400: 10/11           */
X#define x320x200Aspect 10
X#define y320x200Aspect 11
X#define x320x400Aspect 20
X#define y320x400Aspect 11
X#define x640x200Aspect  5
X#define y640x200Aspect 11
X#define x640x400Aspect 10
X#define y640x400Aspect 11
X
X/* A BitMapHeader is stored in a BMHD chunk. */
Xtypedef struct {
X    UWORD w, h;                 /* raster width & height in pixels */
X    WORD  x, y;                 /* position for this image */
X    UBYTE nPlanes;              /* # source bitplanes */
X    Masking masking;            /* masking technique */
X    Compression compression;    /* compression algoithm */
X    UBYTE pad1;                 /* UNUSED.  For consistency, put 0 here.*/
X    UWORD transparentColor;     /* transparent "color number" */
X    UBYTE xAspect, yAspect;     /* aspect ratio, a rational number x/y */
X    WORD  pageWidth, pageHeight;  /* source "page" size in pixels */
X    } BitMapHeader;
X
X/* RowBytes computes the number of bytes in a row, from the width in pixels.*/
X#define RowBytes(w)   (((w) + 15) >> 4 << 1)
X
X
X
X#define IDSIZE 4
X
Xvoid WriteIlbm( filename, win, scrn,packflag )
X    char *filename;
X    struct NewWindow *win;
X    struct NewScreen *scrn;
X    bool packflag;
X{
X    FILE *ofile;
X    long formpos; /* position of length following 'FORM' */
X    long formsize;
X    struct ViewPort *vp;
X
X    ofile = fopen(filename,"w");
X    if( !ofile ) {
X        return;
X    }
X
X    fwrite("FORM", IDSIZE, 1, ofile);
X    formpos = ftell( ofile );
X    fwrite( (char *)&formsize, sizeof(formsize), 1, ofile); /* will be rewritten */
X    fwrite( "ILBMBMHD", IDSIZE*2, 1, ofile );
X
X    {
X        BitMapHeader bmhdr;
X        long bmhdrsize;
X        static UBYTE xaspect[2][2]= { { x320x200Aspect, x320x400Aspect },
X                                      { x640x200Aspect, x640x400Aspect }};
X        static UBYTE yaspect[2][2]= { { y320x200Aspect, y320x400Aspect },
X                                      { y640x200Aspect, y640x400Aspect }};
X        int wx, wy;
X
X        bmhdrsize = 20;
X        fwrite( (char *)&bmhdrsize, sizeof(bmhdrsize), 1, ofile);
X        bmhdr.x = bmhdr.y = 0;
X        bmhdr.w = win->Width;
X        bmhdr.h = win->Height;
X        bmhdr.nPlanes = scrn->Depth;
X        bmhdr.masking = mskNone;
X        bmhdr.compression = packflag ?cmpByteRun1: cmpNone;
X        bmhdr.pad1 = 0;
X
X        wx = (scrn->Width == 320)? 0: 1;
X        wy = (scrn->Height == 200)? 0: 1;
X        bmhdr.xAspect = xaspect[wx][wy];
X        bmhdr.yAspect = yaspect[wx][wy];
X        bmhdr.pageHeight = win->Height;
X        bmhdr.pageWidth = scrn->Width;
X        bmhdr.transparentColor = 0;
X        fwrite((char *)&bmhdr, bmhdrsize, 1, ofile );
X    }
X
X    fwrite("CMAP",IDSIZE, 1, ofile);
X    vp = &win->Screen->ViewPort;
X    {
X        long cmapsize;
X        long i;
X        UWORD value;
X        UBYTE col[3];
X        int numentries;
X
X        numentries = (1<< scrn->Depth );
X        cmapsize = numentries*3;
X        fwrite( (char *)&cmapsize, sizeof(cmapsize), 1,ofile);
X        for( i = 0; i < numentries; i++ ) {
X              value = GetRGB4(vp->ColorMap, i);
X              col[2] = (value & 0xf) << 4;        /* blue */
X              col[1] = value & 0xf0; /* green */
X              col[0] = (value & 0xf00) >> 4; /* red */
X              fwrite(col, 3, 1, ofile);
X        }
X    }
X
X    fwrite("CAMG", IDSIZE, 1, ofile);
X    {
X        long viewmode;
X        long viewmodesize;
X
X        viewmodesize = sizeof(viewmode);
X        viewmode = scrn->ViewModes;
X        fwrite((char *)&viewmodesize, sizeof(viewmodesize), 1, ofile);
X        fwrite((char *)&viewmode, sizeof(viewmode), 1, ofile );
X    }
X
X    fwrite("BODY", IDSIZE,1, ofile);
X    {
X        struct BitMap *bm;
X        long bodypos,
X             bodysize;
X        UBYTE *bmd[16]; /* assume as many as 16 bit planes :-) */
X        int row;
X        int plane;
X        int rowlength; /* in bytes */
X        char outbuff[200]; /* largest enough for a row 1600 bits wide */
X
X        bodypos = ftell(ofile);
X        fwrite( (char *)&bodysize, sizeof(bodysize), 1, ofile);
X        bm = vp->RasInfo->BitMap;
X        rowlength = RowBytes(scrn->Width);
X
X        for( plane = 0; plane < scrn->Depth; plane++ ) {
X            bmd[plane] = bm->Planes[plane] + rowlength * win->TopEdge;
X        }
X
X        /*
X         * write actual bitplanes
X         */
X        for( row = 0; row < win->Height; row++ ) {
X
X            for( plane = 0; plane < scrn->Depth; plane++ ) {
X                if( packflag ) {
X                    int packedsize;
X
X                    packedsize = PackRow(bmd[plane],outbuff, rowlength );
X                    fwrite(outbuff, packedsize, 1, ofile);
X                }
X                else {
X                    fwrite(bmd[plane], rowlength, 1, ofile );
X                }
X                bmd[plane] += rowlength;
X            }
X        }
X        bodysize = ftell(ofile) -( bodypos + 4);
X        /*
X         * fill out body to make even
X         */
X        if( bodysize & 1 ) {
X            fputc(0,ofile);
X            bodysize++;
X        }
X        formsize = ftell(ofile) -( formpos + 4);
X
X        fseek( ofile, bodypos, 0L );
X        fwrite( (char *)&bodysize, sizeof(bodysize), 1, ofile);
X    }
X
X    fseek( ofile, formpos, 0L );
X    fwrite( (char *)&formsize, sizeof(formsize), 1, ofile);
X
X    fclose(ofile);
X}
END_OF_FILE
if test 6260 -ne `wc -c <'writeilbm.c'`; then
    echo shar: \"'writeilbm.c'\" unpacked with wrong size!
fi
# end of 'writeilbm.c'
fi
echo shar: End of archive 2 \(of 4\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 3 4 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 4 archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 
Mail submissions (sources or binaries) to <amiga@cs.odu.edu>.
Mail comments to the moderator at <amiga-request@cs.odu.edu>.
Post requests for sources, and general dicussion to comp.sys.amiga.