home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
001-099
/
ff005.lzh
/
SpeechToySrc
/
speechtoy.c
Wrap
C/C++ Source or Header
|
1986-01-11
|
49KB
|
1,391 lines
/* !!! To those who haven't figured it out yet:
* !!! set stack to 15000 before compiling.
* !!! This is a generally good thing to do if
* !!! the compiler blows up on a large source.
* !!! if your program suddenly KILLS the compiler,
* !!! increase stack by 5K and try again. jeeze you guys.
*/
/* This program was written to show the use of gadgets in a
* window. Thus one menu, one auto requester, but lots of
* gadget types.
* For the sake of example, two mutual exclude gadgets
* (female/male) are shown that perform a function that might
* be better implemented as a toggle image, in a manner similar
* to that shown in the inflection Mode gadget.
* Again for the sake of example, the proportional gadgets
* are generated dynamicly (that is, copied from a template and
* filled in), whereas most gadgets are declared staticly in
* the struct declaration, which saves the initialization code
* space.
* Lastly, for the sake of example, this program is extremely
* verbose in the way of comments. Hope you don't mind.
*/
/* Written by David M Lucas. */
/* This program Copyright (C) 1985 David Lucas */
/* This program is not to be sold for commercial gain. */
/* Use it as an example, and PIECES MAY BE PLAGIARISED FREELY */
/* If you find somthing you don't like, fix it! Have fun! */
/* Send complaints to /dev/null. really. */
/* Thanks Amiga. */
#include "exec/types.h"
#include "exec/exec.h"
#include "intuition/intuition.h"
#include "intuition/intuitionbase.h"
#include "graphics/regions.h"
#include "graphics/copper.h"
#include "graphics/gels.h"
#include "graphics/gfxbase.h"
#include "devices/keymap.h"
#include "hardware/blit.h"
#include "devices/narrator.h"
#include "libraries/translator.h"
/* #define DEBUG */
#define CONTWINDW 321 /* Overall Control Window Width/Height */
#define CONTWINDH 123
#define FACEWINDW 32 /* Overall Face Window Width / Height */
#define FACEWINDH 44 /* this includes borders, incedently */
/* Pen numbers to draw gadget borders/images/text with */
#define REDP 3 /* color in register 3 once was red */
#define BLKP 2 /* color in register 2 was black */
#define WHTP 1 /* color in register 1 was white */
#define BLUP 0 /* color in register 0 was blue */
/* the length of the English and phonetic buffers */
#define ESTRINGSIZE 512
#define PSTRINGSIZE 768 /* phonemes are longer than english */
#define NUMPROPS 4 /* number of proportional gadgets */
/* Ranges of proportional data */
#define RNGFREQ (MAXFREQ - MINFREQ) +1
#define RNGRATE (MAXRATE - MINRATE) +1
#define RNGPITCH (MAXPITCH - MINPITCH) +1
#define RNGVOL (MAXVOL - MINVOL) +1
struct TextAttr TestFont = /* Needed for opening screen */
{
(STRPTR)"topaz.font",
TOPAZ_EIGHTY, 0, 0
};
/* Which audio channels to use */
BYTE audio_chan[] = {3, 5, 10, 12};
/* Pointer to translator library vectors */
struct Library *TranslatorBase = 0;
struct MsgPort talk_port; /* Message port for the say's I/O */
struct MsgPort read_port; /* Message port for the say's I/O */
struct mouth_rb mouth_io; /* IO Request block, mouth flavor */
/* IO Request block, narrator flavor */
struct narrator_rb voice_io;
/* indicative of the Open return */
UBYTE NarratorOpenError = 0;
/* indicative of a Translations success */
UBYTE TranslatorError = 0;
USHORT i;
/* These are used to draw the eyes and mouth size relative */
USHORT MouthWMult;
USHORT EyesLeft;
USHORT MouthHMult;
USHORT EyesTop;
USHORT EyesBottom;
USHORT YMouthCenter; /* Pixels from top edge */
USHORT XMouthCenter; /* Pixels from left edge */
USHORT yaw;
USHORT LipWidth, LipHeight;
/* String Gadgets *********************************************
* First the string gadgets.
* 1) because the Phonetic string is refreshed programaticly
* (that is, deleted and added again) quite often, and doing
* this requires the use of RefreshGadgets(), and this causes
* gadgets that are closer to the beginning of the list than
* the gadget given to RefreshGadgets() to flicker.
* 2) because they don't flicker when OTHER gadgets
* (ie female/male, coming up) are deleted and added.
*/
/* These'll be used to put a nice double line border around
* each of the two string gadgets.
*/
/* y,x pairs drawn as a connected line. Be sure to have an even
* number of arguments (ie complete pairs).
*/
USHORT StrVectors[] = {
0, 0, 297, 0, 297, 14, 0, 14,
0, 1, 296, 1, 296, 13, 1, 13,
1, 1
};
struct Border StrBorder = {
-4, -3, /* initial offsets, gadget relative */
WHTP, BLUP, JAM1, /* pens (fore, back) and drawmode */
9, /* number of vectors */
StrVectors, /* pointer to the actual array of vectors */
NULL /* no next Border, can point to another border */
};
/* The same undo buffer is used for both string gadgets,
* this is sized to largest so that largest fits.
*/
UBYTE UndoBuffer[PSTRINGSIZE];
/* English String Gadget is where the user types in English */
/* default text */
UBYTE EnglBuffer[ESTRINGSIZE] = "This is amiga speaking.";
struct StringInfo EnglInfo = {
EnglBuffer, /* pointer to I/O buffer */
UndoBuffer, /* pointer to undo buffer */
0, /* buffer position */
ESTRINGSIZE, /* max number of chars, including NULL */
0, 0, /* first char in display, undo positions */
24, /* number of chars (currently) in the buffer */
0, 0, 0, /* position variables calculated by Intuition */
NULL, /* no pointer to RastPort */
0, /* not a LongInt string gadget */
NULL /* no pointer to alternate keymap */
};
struct IntuiText EnglText = {
WHTP, BLUP, /* FrontPen, BackPen */
JAM1, /* DrawMode */
0, -13, /* LeftEdge, TopEdge (relative to gadget) */
&TestFont, /* pointer to TextFont */
"English:", /* pointer to Text */
NULL /* no pointer to NextText */
};
struct Gadget EnglStrGadget = {
NULL, /* pointer to Next Gadget */
11, 63, 290, 10, /* (Left Top Width Height) Hit Box */
GADGHCOMP, /* Flags */
RELVERIFY, /* Activation flags */
STRGADGET, /* Type */
(APTR)&StrBorder, /* pointer to Border Image */
NULL, /* no pointer to SelectRender */
&EnglText, /* pointer to GadgetText */
0, /* no MutualExclude */
(APTR)&EnglInfo, /* pointer to SpecialInfo */
0, /* no ID */
NULL /* no pointer to special data */
};
/* Phonetic string gadget is where the program puts the
* translated string, necessating a call to RefreshGadgets(),
* and is where the user can type in Phonemes.
*/
UBYTE PhonBuffer[PSTRINGSIZE] =
"DHIHS IHZ AHMIY3GAH SPIY4KIHNX.";
struct StringInfo PhonInfo = {
PhonBuffer, /* pointer to input buffer */
UndoBuffer, /* pointer to undo buffer */
0, /* initial buffer position */
PSTRINGSIZE, /* max number of chars, including NULL */
0, 0, /* display, undo positions */
32, /* number of chars (currently) in the buffer */
0, 0, 0, /* position variables calculated by Intuition */
NULL, /* no pointer to RastPort */
NULL, /* not a LongInt string gadget */
NULL /* no pointer to alternate keymap */
};
struct IntuiText PhonText = {
WHTP, BLUP, /* FrontPen, BackPen */
JAM1, /* DrawMode */
0, -13, /* LeftEdge, TopEdge (relative to gadget) */
&TestFont, /* pointer to TextFont */
"Phonetics:", /* pointer to Text */
NULL /* no pointer to NextText */
};
struct Gadget PhonStrGadget = {
&EnglStrGadget, /* pointer to Next Gadget */
11, 94, 290, 10, /* (Left Top Width Height) Hit Box */
GADGHCOMP, /* Flags */
RELVERIFY, /* Activation flags */
STRGADGET, /* Type */
(APTR)&StrBorder, /* pointer to Border Image */
NULL, /* no pointer to SelectRender */
&PhonText, /* pointer to GadgetText */
0, /* no MutualExclude */
(APTR)&PhonInfo, /* pointer to SpecialInfo */
0, /* no ID */
NULL /* no pointer to special data */
};
/* Now come the Boolean Gadgets.
* The female/male pair shows the simplest implementation I
* could think of to show how you can do mutual-exclude type
* things yourself. They are two toggle gadgets that use
* highlight image. The program starts with one selected, and
* then if either of them are hit, both toggle. Gadgets must
* be deleted and added whenever you want to change structure
* member values that intuition expects to be coming from the
* user, not a program (like the SELECTED bit in flags). Note
* that certain structure values CAN be changed programaticly
* without all this broohaha. Haha. Consult the intuition
* manual.
*/
/* Female Toggle (Highlight Image)
(Quasi mutual exclude with Male Toggle) */
struct Image FemaleImage = {
0, 0, /* LeftEdge, TopEdge (relative to gadget) */
20, 10, 1, /* Width, Height, Depth */
NULL, /* pointer to ImageData */
0x1, 0x0 /* PlanePick, PlaneOnOff */
};
struct Gadget FemaleGadget = {
&PhonStrGadget, /* pointer to Next Gadget */
134, 34, 20, 10, /* (Left Top Width Height) Hit Box */
GADGIMAGE | GADGHCOMP, /* Flags */
/* Activation flags */
RELVERIFY | GADGIMMEDIATE | TOGGLESELECT,
BOOLGADGET, /* Type */
(APTR)&FemaleImage, /* pointer to GadgetRender */
NULL, /* no pointer to SelectRender */
NULL, /* no pointer to GadgetText */
0, /* no MutualExclude */
NULL, /* no pointer to SpecialInfo */
0, /* no ID */
NULL /* no pointer to special data */
};
/* Male Toggle (Highlight Image)
(Quasi mutual Exclude with above) */
struct Image MaleImage = {
0, 0, /* LeftEdge, TopEdge (relative to gadget) */
20, 10, 1, /* Width, Height, Depth */
NULL, /* pointer to ImageData */
0x1, 0x0 /* PlanePick, PlaneOnOff */
};
struct Gadget MaleGadget = {
&FemaleGadget, /* pointer to Next Gadget */
154, 34, 20, 10, /* (Left Top Width Height) Hit Box */
GADGIMAGE | GADGHCOMP | SELECTED, /* Flags */
/* Activation flags */
RELVERIFY | GADGIMMEDIATE | TOGGLESELECT | ACTIVATE,
BOOLGADGET, /* Type */
(APTR)&MaleImage, /* pointer to GadgetRender */
NULL, /* no pointer to SelectRender */
NULL, /* no pointer to GadgetText */
0, /* no MutualExclude */
NULL, /* no pointer to SpecialInfo */
0, /* no ID */
NULL /* no pointer to special data */
};
/* This boolean toggle gadget has an
* alternate image that indicates
* selection. The image stays flipped
* until it gets another hit. (it toggles)
*/
/* Inflection Mode Toggle (AltImage) *************************/
struct Image HumanImage = {
0, 0, /* LeftEdge, TopEdge (relative to gadget) */
40, 20, 1, /* Width, Height, Depth */
NULL, /* pointer to ImageData */
0x1, 0x0 /* PlanePick, PlaneOnOff */
};
struct Image RobotImage = {
0, 0, /* LeftEdge, TopEdge (relative to gadget) */
40, 20, 1, /* Width, Height, Depth */
NULL, /* pointer to ImageData */
0x1, 0x0 /* PlanePick, PlaneOnOff */
};
struct Gadget ModeGadget = {
&MaleGadget, /* pointer to Next Gadget */
134, 2, 40, 20, /* (Left Top Width Height) Hit Box */
GADGIMAGE | GADGHIMAGE, /* Flags */
/* Activation flags */
RELVERIFY | GADGIMMEDIATE | TOGGLESELECT,
BOOLGADGET, /* Type */
(APTR)&HumanImage, /* pointer to GadgetRender */
(APTR)&RobotImage, /* pointer to SelectRender */
NULL, /* no pointer to GadgetText */
0, /* no MutualExclude */
NULL, /* no pointer to SpecialInfo */
0, /* no ID */
NULL /* no pointer to special data */
};
/* Face Toggle (image and text) ******************************/
struct IntuiText FaceIText = {
WHTP, BLUP, /* FrontPen, BackPen */
JAM2, /* DrawMode */
4, 1, /* LeftEdge, TopEdge (relative to gadget) */
&TestFont, /* pointer to TextFont */
"Face",/* pointer to Text */
NULL /* no pointer to NextText */
};
struct Image FaceImage = {
0, 0, /* LeftEdge, TopEdge (relative to gadget) */
40, 10, 1, /* Width, Height, Depth */
NULL, /* pointer to ImageData */
0x1, 0x0 /* PlanePick, PlaneOnOff */
};
struct Gadget FaceGadget = {
&ModeGadget, /* pointer to Next Gadget */
134, 23, 40, 10, /* (Left Top Width Height) Hit Box */
GADGIMAGE | GADGHCOMP, /* Flags */
/* Activation flags */
RELVERIFY | GADGIMMEDIATE | TOGGLESELECT,
BOOLGADGET, /* Type */
(APTR) &FaceImage, /* pointer to GadgetRender */
NULL, /* no pointer to SelectRender */
&FaceIText, /* pointer to GadgetText */
0, /* no MutualExclude */
NULL, /* no pointer to SpecialInfo */
0, /* no ID */
NULL /* no pointer to special data */
};
/* Stop Hit (image and text) ******************************/
struct IntuiText StopIText = {
WHTP, BLUP, /* FrontPen, BackPen */
JAM2, /* DrawMode */
4, 1, /* LeftEdge, TopEdge (relative to gadget) */
&TestFont, /* pointer to TextFont */
"Stop",/* pointer to Text */
NULL /* no pointer to NextText */
};
struct Image StopImage = {
0, 0, /* LeftEdge, TopEdge (relative to gadget) */
40, 10, 1, /* Width, Height, Depth */
NULL, /* pointer to ImageData */
0x1, 0x0 /* PlanePick, PlaneOnOff */
};
struct Gadget StopGadget = {
&FaceGadget, /* pointer to Next Gadget */
134, 45, 40, 10, /* Left Top Width Height Hit Box */
GADGIMAGE | GADGHCOMP, /* Flags */
RELVERIFY | GADGIMMEDIATE, /* Activation flags */
BOOLGADGET, /* Type */
(APTR) &StopImage, /* pointer to GadgetRender */
NULL, /* no pointer to SelectRender */
&StopIText, /* pointer to GadgetText */
0, /* no MutualExclude */
NULL, /* no pointer to SpecialInfo */
0, /* no ID */
NULL /* no pointer to special data */
};
/* This is a hit (as opposed to toggle)
gadget that starts the translation.*/
/* Translate Hit (Highlight image) ***************************/
USHORT TransVectors[] = {
0, 0, 79, 0, 79, 13, 0, 13,
0, 1, 78, 1, 78, 12, 1, 12,
1, 1
};
struct Border TransBorder = {
-4, -3, /* initial offsets, gadget relative */
WHTP, BLUP, JAM1, /* pens (fore, back) and drawmode */
9, /* number of vectors */
TransVectors, /* pointer to the array of vectors */
NULL /* no next Border, can point to another */
};
struct IntuiText TranslateIText = {
WHTP, BLUP, /* FrontPen, BackPen */
JAM2, /* DrawMode */
0, 0, /* LeftEdge, TopEdge (relative to gadget) */
&TestFont, /* pointer to TextFont */
"Translate",/* pointer to Text */
NULL /* no pointer to NextText */
};
struct Gadget TranslateGadget = {
&StopGadget, /* pointer to Next Gadget */
229, 48, 71, 8, /* (Left Top Width Height) Hit Box */
GADGHCOMP, /* Flags */
RELVERIFY | GADGIMMEDIATE, /* Activation flags */
BOOLGADGET, /* Type */
(APTR)&TransBorder, /* no pointer to GadgetRender */
NULL, /* no pointer to SelectRender */
&TranslateIText, /* pointer to GadgetText */
0, /* no MutualExclude */
NULL, /* no pointer to SpecialInfo */
0, /* no ID */
NULL /* no pointer to special data */
};
/* This is a hit (as opposed to toggle) Starts the narration */
/* Speak Hit (Highlight Image) *******************************/
USHORT SpeakVectors[] = {
0, 0, 47, 0, 47, 13, 0, 13,
0, 1, 46, 1, 46, 12, 1, 12,
1, 1
};
struct Border SpeakBorder = {
-4, -3, /* initial offsets, gadget relative */
WHTP, BLUP, JAM1, /* pens (fore, back) and drawmode */
9, /* number of vectors */
SpeakVectors, /* pointer to the actual array of vectors */
NULL /* no next Border, can point to another border */
};
struct IntuiText SpeakIText = {
WHTP, BLUP, /* FrontPen, BackPen */
JAM2, /* DrawMode */
0, 0, /* LeftEdge, TopEdge (relative to gadget) */
&TestFont, /* pointer to TextFont */
"Speak", /* pointer to Text */
NULL /* no pointer to NextText */
};
struct Gadget SpeakGadget = {
&TranslateGadget, /* pointer to Next Gadget */
261, 79, 40, 8, /* (Left Top Width Height) Hit Box */
GADGHCOMP, /* Flags */
RELVERIFY | GADGIMMEDIATE, /* Activation flags */
BOOLGADGET, /* Type */
(APTR)&SpeakBorder, /* pointer to GadgetRender */
NULL, /* no pointer to SelectRender */
&SpeakIText, /* pointer to GadgetText */
0, /* no MutualExclude */
NULL, /* no pointer to SpecialInfo */
0, /* no ID */
NULL /* no pointer to special data */
};
/* Now the proportional gadgets. */
/* Proportional Gadgets **************************************/
/* The following variables are used to create proportional
* Gadgets. These variables will be filled in with copies of
* the generic Gadgetry below.
*/
SHORT PropCount = 0; /* index to next available Gadget */
struct IntuiText PTexts[NUMPROPS];/* get copies of TPropText */
/* dummy AUTOKNOB Images are required */
struct Image PImages[NUMPROPS];
/* These get copies of TPropInfo */
struct PropInfo PInfos[NUMPROPS];
/* These get copies of TPropGadget */
struct Gadget Props[NUMPROPS];
struct IntuiText TPropText = {
WHTP, BLUP, /* FrontPen, BackPen */
JAM1, /* DrawMode */
0, -10, /* LeftEdge, TopEdge (relative to gadget) */
&TestFont, /* pointer to TextFont */
NULL, /* pointer to Text is filled at runtime */
NULL /* no pointer to NextText */
};
struct PropInfo TPropInfo = {
AUTOKNOB | FREEHORIZ, /* Flags */
0, 0, /* Pots: Horiz, Vert: both start at 0 */
0x1FFF, 0x1FFF, /* Bodies: Horiz is 1/8, Vert is 1/8 */
0, 0, 0, 0, 0, 0 /* System usage stuff */
};
/* this is the template for the Gadget of a horizontal */
/* Proportional Gadget */
struct Gadget TPropGadget = {
&SpeakGadget, /* pointer to NextGadget */
7, 12, 115, 10, /* Select Box L T W H */
GADGHCOMP | GADGIMAGE, /* Flags */
GADGIMMEDIATE | RELVERIFY, /* Activation flags */
PROPGADGET, /* Type */
NULL, /* pointer to Image filled in later */
NULL, /* no pointer to SelectRender */
NULL, /* no pointer to GadgetText */
0, /* no MutualExclude */
NULL, /* SpecialInfo proportional data filled later */
0, /* no ID */
NULL /* no pointer to special data */
};
struct IntuitionBase *IntuitionBase = 0;
struct GfxBase *GfxBase = 0;
/* Only one menu. */
ULONG MenuNumber;
ULONG TheMenu;
ULONG TheItem;
struct IntuiText MenuItemText = {
BLUP, /* Front Pen */
WHTP, /* Back pen */
JAM2, /* Draw Mode */
0, /* Left Edge */
0, /* Top */
&TestFont, /* pointer to TextFont */
"About SpeechToy...", /* text */
NULL /* next */
};
struct MenuItem MyMenuItem = {
NULL, /* pointer to next item */
0, /* left */
0, /* top */
150, /* width */
8, /* height */
ITEMTEXT | ITEMENABLED | HIGHCOMP, /* flags */
0, /* no mutual exclude */
(APTR)&MenuItemText, /* Render */
NULL, /* pointer to alternate image */
NULL, /* Command "amiga" char */
NULL, /* Sub Item */
MENUNULL /* nextselect */
};
struct Menu MyMenu = {
NULL, /* pointer to next menu */
0,0,150,0, /* left,0,Width,0 */
MENUENABLED, /* flags */
"SpeachToy Menu", /* menu name */
&MyMenuItem /* First Item in list */
};
struct IntuiText ReqText1 = {
BLUP, /* Front Pen */
WHTP, /* Back pen */
JAM2, /* Draw Mode */
5, /* Left Edge */
23, /* Top */
&TestFont, /* pointer to TextFont */
"Version 1.1 21 Dec, 1985", /* text */
NULL /* next */
};
struct IntuiText ReqText2 = {
BLUP, /* Front Pen */
WHTP, /* Back pen */
JAM2, /* Draw Mode */
5, /* Left Edge */
13, /* Top */
&TestFont, /* pointer to TextFont */
"Freeware - Public Domain ", /* text */
&ReqText1 /* next */
};
struct IntuiText ReqText3 = {
BLUP, /* Front Pen */
WHTP, /* Back pen */
JAM2, /* Draw Mode */
5, /* Left Edge */
3, /* Top */
&TestFont, /* pointer to TextFont */
"Written by David M Lucas ", /* text */
&ReqText2 /* next */
};
struct IntuiText OKIText = {
BLUP, WHTP, /* FrontPen, BackPen */
JAM2, /* DrawMode */
6, 3, /* LeftEdge, TopEdge (relative to gadget) */
&TestFont, /* pointer to TextFont */
"OK", /* pointer to Text */
NULL /* no pointer to NextText */
};
struct Requester *AboutRequester;
USHORT autoret;
struct Window *ControlWindow = NULL;
struct Window *FaceWindow = NULL;
struct IntuiMessage *MyIntuiMessage;
struct NewWindow NewControlWindow = {
00, 11, /* start LeftEdge, TopEdge */
CONTWINDW, CONTWINDH, /* start Width, Height */
-1, -1, /* DetailPen, BlockPen */
GADGETUP | CLOSEWINDOW | MENUPICK, /* IDCMP FLAGS */
WINDOWDRAG | WINDOWDEPTH | WINDOWCLOSE
| GIMMEZEROZERO | ACTIVATE,/* Flags (can be NULL) */
&Props[NUMPROPS-1], /* Pointer to FirstGadget */
NULL, /* no pointer to first CheckMark */
"SpeechToy", /* Title (can be NULL) */
NULL, /* no Pointer to Screen */
NULL, /* no Pointer to BitMap */
20, 20, /* Min/max Sizable to (w/h) */
CONTWINDW, CONTWINDH, /* These aint used, can't size */
WBENCHSCREEN /* Type of screen window appears in */
};
struct NewWindow NewFaceWindow = {
CONTWINDW, 11, /* start LeftEdge, TopEdge */
FACEWINDW * 2, FACEWINDH, /* start Width, Height */
-1, -1, /* DetailPen, BlockPen */
SIZEVERIFY | NEWSIZE | MENUPICK, /* IDCMP FLAGS */
/* Flags (can be NULL) */
WINDOWDRAG | WINDOWDEPTH | WINDOWSIZING
| SIZEBBOTTOM | GIMMEZEROZERO | ACTIVATE,
NULL, /* no Pointer to FirstGadget */
NULL, /* no Pointer to first CheckMark */
"Face", /* Title */
NULL, /* no Pointer to Screen */
NULL, /* no Pointer to BitMap */
FACEWINDW, FACEWINDH,/* Minimum sizeable to */
640, 200, /* Maximum sizeable to */
WBENCHSCREEN /* Type of screen window appears in */
};
USHORT FemaleIData[] = {
/* ---- - These nibbles matter to image. */
0x0000, 0x0000,
0x00F0, 0x0000,
0x0198, 0x0000,
0x030C, 0x0000,
0x0198, 0x0000,
0x00F0, 0x0000,
0x0060, 0x0000,
0x01F8, 0x0000,
0x0060, 0x0000,
0x0000, 0x0000
};
USHORT MaleIData[] = {
/* ---- - These nibbles matter to image. */
0x0000, 0x0000,
0x003E, 0x0000,
0x000E, 0x0000,
0x0036, 0x0000,
0x01E0, 0x0000,
0x0330, 0x0000,
0x0618, 0x0000,
0x0330, 0x0000,
0x01E0, 0x0000,
0x0000, 0x0000
};
USHORT HumanIData[] = {
/* ---- ---- -- These nibbles matter to image. */
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0007,0x9E00,0x0000,
0x0001,0x8600,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x2000,0x0000,
0x0000,0x1000,0x0000,
0x0000,0x0800,0x0000,
0x0000,0x7C00,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x7800,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000
};
USHORT RobotIData[] = {
/* ---- ---- -- These nibbles matter to image. */
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0007,0x9E00,0x0000,
0x0004,0x9200,0x0000,
0x0007,0x9E00,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0001,0xF800,0x0000,
0x0001,0x0800,0x0000,
0x0001,0xF800,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000
};
USHORT FaceIData[] = {
/* ---- ---- -- These nibbles matter to image. */
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000
};
USHORT StopIData[] = {
/* ---- ---- -- These nibbles matter to image. */
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000
};
USHORT *FemaleIData_chip = 0;
USHORT *MaleIData_chip = 0;
USHORT *HumanIData_chip = 0;
USHORT *RobotIData_chip = 0;
USHORT *FaceIData_chip = 0;
USHORT *StopIData_chip = 0;
/** start of code ***************************/
main()
{
ULONG Signals; /* Wait() tells me which to look at */
ULONG MIClass; /* Save quickly, ReplyMsg() asap */
USHORT MICode; /* These hold my needed information */
APTR MIAddress;
/* let MyCleanup know these signals not allocated yet */
talk_port.mp_SigBit = -1;
read_port.mp_SigBit = -1;
/* Open those libraries that the program uses directly */
if ((IntuitionBase = (struct IntuitionBase *)
OpenLibrary("intuition.library", LIBRARY_VERSION)) == 0) {
#ifdef DEBUG
printf("Can't open the intuition library\n");
#endif
MyCleanup();
exit(FALSE);
}
if ((GfxBase = (struct GfxBase *)
OpenLibrary("graphics.library", LIBRARY_VERSION)) == 0) {
#ifdef DEBUG
printf("Can't open the graphics library\n");
#endif
MyCleanup();
exit(FALSE);
}
if ((TranslatorBase = (struct Library *)
OpenLibrary("translator.library", LIBRARY_VERSION)) == 0) {
#ifdef DEBUG
printf("Can't open the translator library\n");
#endif
MyCleanup();
exit(FALSE);
}
/* Open the device */
if ((NarratorOpenError = OpenDevice("narrator.device", 0,
&voice_io, 0)) != 0) {
#ifdef DEBUG
printf("Can't open the narrator device\n");
#endif
MyCleanup();
exit(FALSE);
}
/* This is where the proportional gadgets are set up, using
* the templates that were declared staticly.
*/
for(PropCount = 0; PropCount < NUMPROPS; PropCount++) {
PTexts[PropCount] = TPropText;
Props[PropCount] = TPropGadget;
PInfos[PropCount] = TPropInfo;
Props[PropCount].GadgetText = (struct IntuiText *)
&PTexts[PropCount];
Props[PropCount].GadgetRender = (APTR)
&PImages[PropCount];
Props[PropCount].SpecialInfo = (APTR)&PInfos[PropCount];
switch (PropCount) {
case 0:
PTexts[PropCount].IText = "Sample Freq:";
if (DEFFREQ == MAXFREQ)
PInfos[PropCount].HorizPot = 65535;
else
PInfos[PropCount].HorizPot = ((DEFFREQ - MINFREQ)
<< 16) / (MAXFREQ - MINFREQ);
break;
case 1:
PTexts[PropCount].IText = "Rate:";
Props[PropCount].TopEdge += 22;
Props[PropCount].NextGadget = &Props[PropCount-1];
if (DEFRATE == MAXRATE)
PInfos[PropCount].HorizPot = 65535;
else
PInfos[PropCount].HorizPot = ((DEFRATE - MINRATE)
<< 16) / (MAXRATE - MINRATE);
break;
case 2:
PTexts[PropCount].IText = "Pitch:";
Props[PropCount].LeftEdge += 183;
Props[PropCount].NextGadget = &Props[PropCount-1];
if (DEFPITCH == MAXPITCH)
PInfos[PropCount].HorizPot = 65535;
else
PInfos[PropCount].HorizPot = ((DEFPITCH-MINPITCH)
<< 16) / (MAXPITCH - MINPITCH);
break;
case 3:
PTexts[PropCount].IText = "Volume:";
Props[PropCount].TopEdge += 22;
Props[PropCount].LeftEdge += 183;
Props[PropCount].NextGadget = &Props[PropCount-1];
if (DEFVOL == MAXVOL)
PInfos[PropCount].HorizPot = 65535;
else
PInfos[PropCount].HorizPot = ((DEFVOL - MINVOL)
<< 16) / (MAXVOL - MINVOL);
break;
}
}
/* Now allocate memory accessable by the chips for images */
if (InitImages() != TRUE) {
#ifdef DEBUG
printf("Couldn't Allocate Images in chip memory.\n");
#endif
MyCleanup();
exit(FALSE);
}
/* Set up the write port, allocate the signal, */
/* and the message */
talk_port.mp_Node.ln_Type = NT_MSGPORT;
talk_port.mp_Flags = 0;
if ((talk_port.mp_SigBit = AllocSignal(-1)) == -1) {
#ifdef DEBUG
printf("Couldn't Allocate talk Signal bit\n");
#endif
MyCleanup();
exit(FALSE);
}
talk_port.mp_SigTask = (struct Task *) FindTask((char *)
NULL);
NewList(&talk_port.mp_MsgList);
/* Set up the read port, allocate the signal, */
/* and the message */
read_port.mp_Node.ln_Type = NT_MSGPORT;
read_port.mp_Flags = 0;
if ((read_port.mp_SigBit = AllocSignal(-1)) == -1) {
#ifdef DEBUG
printf("Couldn't Allocate read Signal bit\n");
#endif
MyCleanup();
exit(FALSE);
}
read_port.mp_SigTask = (struct Task *)
FindTask((char *) NULL);
NewList(&read_port.mp_MsgList);
/* Set up the write channel information */
voice_io.ch_masks = (audio_chan);
voice_io.nm_masks = sizeof(audio_chan);
voice_io.mouths = 0;
voice_io.message.io_Message.mn_ReplyPort = &talk_port;
voice_io.message.io_Command = CMD_WRITE;
voice_io.message.io_Offset = 0;
voice_io.message.io_Data = (APTR)PhonBuffer;
voice_io.message.io_Message.mn_Length = sizeof(voice_io);
/* Set up the read channel information */
mouth_io.voice = voice_io;
mouth_io.width = 0;
mouth_io.height = 0;
mouth_io.voice.message.io_Message.mn_ReplyPort = &read_port;
mouth_io.voice.message.io_Command = CMD_READ;
mouth_io.voice.message.io_Error = 0;
if (FaceWindow == NULL) {
if ((ControlWindow = (struct Window *)OpenWindow
(&NewControlWindow)) == NULL) {
#ifdef DEBUG
printf("Couldn't open the control window.\n");
#endif
MyCleanup();
exit(FALSE);
}
}
/* fill background of window */
SetAPen(ControlWindow->RPort, BLKP);
RectFill(ControlWindow->RPort,0,0,
ControlWindow->GZZWidth, ControlWindow->GZZHeight);
RefreshGadgets(&Props[NUMPROPS-1],ControlWindow,NULL);
SetMenuStrip(ControlWindow, &MyMenu);
/* !!! Ah, But what if FaceWindow's not been opened? */
for (;;) { /* ever wait for a signal and process it */
/* wait lets the rest of the system run, */
/* this program sleeps */
Signals = Wait((1 << ControlWindow->UserPort->mp_SigBit)
| (1 << FaceWindow->UserPort->mp_SigBit)
| (1 << voice_io.message.io_Message.mn_ReplyPort->mp_SigBit)
| (1 <<
mouth_io.voice.message.io_Message.mn_ReplyPort->mp_SigBit));
/* now check to see to what we owe the intrusion */
if (Signals & (1<< ControlWindow->UserPort->mp_SigBit)) {
/* Process the Intuition message */
while (MyIntuiMessage=(struct IntuiMessage *)
GetMsg(ControlWindow->UserPort)) {
/* Get all the needed info and give message back */
MIClass = MyIntuiMessage->Class;
MICode = MyIntuiMessage->Code;
MIAddress = MyIntuiMessage->IAddress;
ReplyMsg(MyIntuiMessage);
/* Now, what was it you wanted? */
switch (MIClass) {
case MENUPICK:
menumessage(MICode, ControlWindow);
break;
case GADGETUP: /* reply, then process */
gadgetmessage(MIAddress, ControlWindow);
break;
case CLOSEWINDOW: /* bye! */
while (MyIntuiMessage = (struct
IntuiMessage *) GetMsg(
ControlWindow->UserPort))
ReplyMsg(MyIntuiMessage);
MyCleanup();
exit(TRUE);
break;
default:
#ifdef DEBUG
printf("Unhandled Message Received.\n");
#endif
break;
} /* switch */
} /* while */
} /* if */
/* Woken by intuition for FaceWindow*/
if (Signals & (1<< FaceWindow->UserPort->mp_SigBit)) {
/* Process the Intuition message */
while (MyIntuiMessage=(struct IntuiMessage *)
GetMsg(FaceWindow->UserPort)) {
switch (MyIntuiMessage->Class) {
case SIZEVERIFY:
ReplyMsg(MyIntuiMessage);
break;
case MENUPICK:
menumessage(MyIntuiMessage->Code,FaceWindow);
ReplyMsg(MyIntuiMessage);
break;
case NEWSIZE: /* Don't reply until processed */
DrawFace();
ReplyMsg(MyIntuiMessage);
break;
default:
#ifdef DEBUG
printf("Unhandled Message Received.\n");
#endif
ReplyMsg(MyIntuiMessage);
break;
} /* switch */
} /* while */
} /* if */
/* A voice SendIO (Write) has completed */
if (Signals & (1 <<
voice_io.message.io_Message.mn_ReplyPort->mp_SigBit)) {
/* Was it Sucessful? filter out the abort error */
if (voice_io.message.io_Error == -2)
voice_io.message.io_Error = 0;
if (voice_io.message.io_Error != 0) {
#ifdef DEBUG
printf("Narrator won't. (%ld)\n",
voice_io.message.io_Error);
#endif
/* flash this screen */
DisplayBeep(ControlWindow->WScreen);
/* let user see where phoneme string was bad. */
i = RemoveGadget(ControlWindow, &PhonStrGadget);
/* move the cursor to the error char */
PhonInfo.BufferPos = voice_io.message.io_Actual -1;
/* assure cursor (error point) is shown in gad. */
/* within 29 (number of chars shown) of front */
if (voice_io.message.io_Actual < 29)
PhonInfo.DispPos = 0;
/* within 29 of end */
else if ((voice_io.message.io_Length -
voice_io.message.io_Actual) < 29)
PhonInfo.DispPos = voice_io.message.io_Length
- 29;
else
PhonInfo.DispPos = voice_io.message.io_Actual
- 15;
AddGadget(ControlWindow, &PhonStrGadget, i);
RefreshGadgets(&PhonStrGadget, ControlWindow,
NULL);
voice_io.message.io_Error = 0;
}
/* SpeakGadget.Flags ^= GADGDISABLED;
FaceGadget.Flags ^= GADGDISABLED;
*/
OnGadget(&SpeakGadget, ControlWindow, NULL);
OnGadget(&FaceGadget, ControlWindow, NULL);
}
/* A mouth DoIO (Read) has completed */
if (Signals & (1 <<
mouth_io.voice.message.io_Message.mn_ReplyPort->mp_SigBit)) {
WaitBOVP(&FaceWindow->WScreen->ViewPort);
SetAPen(FaceWindow->RPort, WHTP);
RectFill(FaceWindow->RPort, 0, EyesBottom,
FaceWindow->GZZWidth, FaceWindow->GZZHeight);
if (MouthWMult == 0)
LipWidth = mouth_io.width >> 1;
else
LipWidth = mouth_io.width * MouthWMult;
if (MouthHMult == 0)
LipHeight = mouth_io.height >> 1;
else
LipHeight = mouth_io.height * (MouthHMult);
SetAPen(FaceWindow->RPort, REDP);
Move(FaceWindow->RPort,
XMouthCenter - LipWidth, YMouthCenter);
Draw(FaceWindow->RPort,
XMouthCenter, YMouthCenter - LipHeight);
Draw(FaceWindow->RPort,
XMouthCenter + LipWidth, YMouthCenter);
Draw(FaceWindow->RPort,
XMouthCenter, YMouthCenter + LipHeight);
Draw(FaceWindow->RPort,
XMouthCenter - LipWidth, YMouthCenter);
/* the narrator will give an error when the */
/* write has completed and I've tried to read */
/* so I stop trying when that happens */
if (mouth_io.voice.message.io_Error == 0)
SendIO(&mouth_io);
}
} /* for */
} /* main */
/* a MENUPICK has been received, this
* routine takes the appropriate action
*/
menumessage(code, w)
USHORT code;
struct Window *w;
{
switch (MENUNUM(code)) {
case 0:
switch (ITEMNUM(code)) {
case 0:
AutoRequest(w, &ReqText3, NULL,
&OKIText, 0, 0, 280, 47);
break;
}
break;
}
}
/* a GADGETUP has been received, this
* routine takes the appropriate action
*/
gadgetmessage(address, w)
APTR address;
struct Window *w;
{
USHORT i;
long PropRange;
if (address == (APTR)&ModeGadget) {
if (ModeGadget.Flags & SELECTED)
voice_io.mode = ROBOTICF0;
else
voice_io.mode = NATURALF0;
}
else if (address == (APTR)&FaceGadget) {
/* tell the write that reads will be forthcomming */
if (FaceGadget.Flags & SELECTED) {
voice_io.mouths = 1;
if ((FaceWindow = (struct Window *)
OpenWindow(&NewFaceWindow)) == NULL) {
#ifdef DEBUG
printf("Couldn't open the face window.\n");
#endif
MyCleanup();
exit(FALSE);
}
SetMenuStrip(FaceWindow, &MyMenu);
DrawFace();
}
else { /* FaceGadget de-SELECTed */
voice_io.mouths = 0;
NewFaceWindow.LeftEdge = FaceWindow->LeftEdge;
NewFaceWindow.TopEdge = FaceWindow->TopEdge;
NewFaceWindow.Width = FaceWindow->Width;
NewFaceWindow.Height = FaceWindow->Height;
CloseWindow(FaceWindow);
FaceWindow = NULL;
}
}
else if (address == (APTR)&StopGadget) {
AbortIO(&voice_io);
voice_io.message.io_Error = 0;
mouth_io.voice.message.io_Error = 0;
}
/* Since this program changes a flag that intuition expects
* only the user to change (SELECTED bit), this program has
* to remove, then change, then add this gadget. Then by
* passing the address of this gadget to RefreshGadgets(),
* only the gadgets from here to the start of the list will
* be refreshed, which minimizes the visible flash that
* RefreshGadgets() can introduce.
* If one of the two gadgets (female/male) is hit, toggle
* the selection of the other gadget (since the gadget hit
* was toggled by intuition when it was hit).
*/
else if (address == (APTR)&FemaleGadget) {
if (FemaleGadget.Flags & SELECTED)
voice_io.sex = FEMALE;
else
voice_io.sex = MALE;
i = RemoveGadget(ControlWindow, &MaleGadget);
MaleGadget.Flags ^= SELECTED;
AddGadget(ControlWindow, &MaleGadget, i);
RefreshGadgets(&MaleGadget, ControlWindow, NULL);
}
else if (address == (APTR)&MaleGadget) {
if (MaleGadget.Flags & SELECTED)
voice_io.sex = MALE;
else
voice_io.sex = FEMALE;
i = RemoveGadget(ControlWindow, &FemaleGadget);
FemaleGadget.Flags ^= SELECTED;
AddGadget(ControlWindow, &FemaleGadget, i);
RefreshGadgets(&MaleGadget, ControlWindow, NULL);
}
/* Since the program changes the contents of the string
* gadgets' buffer and it's size, which is something else
* intuition doesn't expect a program (as opposed to the
* user) to do. The program must remove, then change, then
* add this gadget, and then by passing the address of this
* gadget to RefreshGadgets(), only the gadgets from here
* to the start of the list will be refreshed, which
* minimizes the visible flash that RefreshGadgets() can
* introduce.
*/
else if (address == (APTR)&TranslateGadget) {
i = RemoveGadget(ControlWindow, &PhonStrGadget);
if ((TranslatorError = Translate((APTR)EnglBuffer,
EnglInfo.NumChars, (APTR)PhonBuffer, PhonInfo.MaxChars))
!= 0) {
#ifdef DEBUG
printf("Translator won't. (%lx)\n",TranslatorError);
#endif
/* flash this screen */
DisplayBeep(ControlWindow->WScreen);
}
/* Hey! NumChars includes the terminating NULL. */
/* This must be done. */
PhonInfo.NumChars = voice_io.message.io_Length + 1;
if (PhonInfo.DispPos > voice_io.message.io_Length)
PhonInfo.DispPos = voice_io.message.io_Length;
AddGadget(ControlWindow, &PhonStrGadget, i);
RefreshGadgets(&PhonStrGadget, ControlWindow, NULL);
}
else if (address == (APTR)&SpeakGadget) {
/* SpeakGadget.Flags ^= GADGDISABLED;
FaceGadget.Flags ^= GADGDISABLED;
*/
OffGadget(&SpeakGadget, ControlWindow, NULL);
OffGadget(&FaceGadget, ControlWindow, NULL);
voice_io.message.io_Length = strlen(PhonBuffer);
SendIO(&voice_io);
if (voice_io.mouths == 1) {
mouth_io.voice.message.io_Error = 0;
SendIO(&mouth_io);
}
}
else if (address == (APTR)&EnglStrGadget); /* do nothing */
else if (address == (APTR)&PhonStrGadget); /* do nothing */
else if (address == (APTR)&Props[0]) {
PropRange = RNGFREQ;
voice_io.sampfreq = (( (PInfos[0].HorizPot >> 1)
* PropRange) >> 15) + MINFREQ;
#ifdef DEBUG
printf("Freq. = %ld\n", voice_io.sampfreq);
#endif
}
else if (address == (APTR)&Props[1]) {
PropRange = RNGRATE;
voice_io.rate = (((PInfos[1].HorizPot >> 1)
* PropRange) >> 15) + MINRATE;
#ifdef DEBUG
printf("Rate = %ld\n", voice_io.rate);
#endif
}
else if (address == (APTR)&Props[2]) {
PropRange = RNGPITCH;
voice_io.pitch = (((PInfos[2].HorizPot >> 1)
* PropRange) >> 15) + MINPITCH;
#ifdef DEBUG
printf("Pitch = %ld\n", voice_io.pitch);
#endif
}
else if (address == (APTR)&Props[3]) {
PropRange = RNGVOL;
voice_io.volume = (((PInfos[3].HorizPot >> 1)
* PropRange) >> 15) + MINVOL;
#ifdef DEBUG
printf("Vol. = %ld\n", voice_io.volume);
#endif
}
#ifdef DEBUG
else printf("Unhandled gadget up received!\n");
#endif
}
/* This calculates variables used to draw the mouth
* and eyes, as well as redrawing the face.
* Proportionality makes it very wierd, but it's
* wierder if you don't use a GimmeZeroZero window
* and GZZWidth/GZZHeight.
*/
DrawFace() {
XMouthCenter = FaceWindow->GZZWidth >> 1;
/* set left edge of left eye */
EyesLeft = FaceWindow->GZZWidth >> 2;
/* multiplier for mouth width */
MouthWMult = FaceWindow->GZZWidth >> 6;
EyesTop = (FaceWindow->GZZHeight >> 2)
- (FaceWindow->GZZHeight >> 4);
EyesBottom = EyesTop + (FaceWindow->GZZHeight >> 3) + 1;
yaw = FaceWindow->GZZHeight - EyesBottom;
YMouthCenter = ((yaw >> 1) + EyesBottom);
MouthHMult = yaw >> 5;
/* Set pen to White */
SetAPen(FaceWindow->RPort, WHTP);
RectFill(FaceWindow->RPort, 0, 0,
FaceWindow->GZZWidth, FaceWindow->GZZHeight);
/* Set pen to Blue */
SetAPen(FaceWindow->RPort, BLUP);
RectFill(FaceWindow->RPort,
EyesLeft, EyesTop,
EyesLeft + (FaceWindow->GZZWidth >> 3),
EyesTop + (FaceWindow->GZZHeight >> 3));
RectFill(FaceWindow->RPort,
(FaceWindow->GZZWidth >> 1)
+ (FaceWindow->GZZWidth >> 3),
EyesTop,
(FaceWindow->GZZWidth >> 1)
+ (FaceWindow->GZZWidth >> 3) /* two >> 3, not one >> 2 */
+ (FaceWindow->GZZWidth >> 3),/* so eyes are same width */
EyesTop + (FaceWindow->GZZHeight >> 3));
SetAPen(FaceWindow->RPort, REDP); /* Set pen to Red */
Move(FaceWindow->RPort,
XMouthCenter - (FaceWindow->GZZWidth >> 3), YMouthCenter);
Draw(FaceWindow->RPort,
XMouthCenter + (FaceWindow->GZZWidth >> 3), YMouthCenter);
}
/* Deallocate any memory, and close all of the
* windows/screens/devices/libraries in reverse order to
* make things work smoothly. And be sure to check
* that the open/allocation was successful before
* closing/deallocating.
*/
MyCleanup()
{
if (read_port.mp_SigBit != -1)
FreeSignal(read_port.mp_SigBit);
if (talk_port.mp_SigBit != -1)
FreeSignal(talk_port.mp_SigBit);
if (FaceWindow != NULL)
CloseWindow(FaceWindow);
if (ControlWindow != NULL)
CloseWindow(ControlWindow);
/* freeimages makes sure image allocation was successful */
freeimages();
if (NarratorOpenError == 0)
CloseDevice(&voice_io);
if (TranslatorBase != 0)
CloseLibrary(TranslatorBase);
if (GfxBase != 0)
CloseLibrary(GfxBase);
if (IntuitionBase != 0)
CloseLibrary(IntuitionBase);
return(0);
}
/* Allocate chip memory for gadget images, and set the
* pointers in the corresponding image structures to point
* to these images. This must be done because the program
* could be loaded into expansion memory (off the side of
* the box), which the custom chips cannot access.
* And images must be in chip ram (that's memory that the
* custom chips can access, the internal 512K).
*/
InitImages()
{
/* the images were staticly initialized above main */
extern USHORT *FemaleIData_chip;
extern USHORT *MaleIData_chip;
extern USHORT *HumanIData_chip;
extern USHORT *RobotIData_chip;
extern USHORT *FaceIData_chip;
extern USHORT *StopIData_chip;
int i;
/* Allocate them all, stop and return false on failure */
if ((FemaleIData_chip = (USHORT *)
AllocMem(sizeof(FemaleIData),MEMF_CHIP)) == 0)
return(FALSE);
if ((MaleIData_chip = (USHORT *)
AllocMem(sizeof(MaleIData),MEMF_CHIP)) == 0)
return(FALSE);
if ((HumanIData_chip = (USHORT *)
AllocMem(sizeof(HumanIData),MEMF_CHIP)) == 0)
return(FALSE);
if ((RobotIData_chip = (USHORT *)
AllocMem(sizeof(RobotIData),MEMF_CHIP)) == 0)
return(FALSE);
if ((FaceIData_chip = (USHORT *)
AllocMem(sizeof(FaceIData),MEMF_CHIP)) == 0)
return(FALSE);
if ((StopIData_chip = (USHORT *)
AllocMem(sizeof(StopIData),MEMF_CHIP)) == 0)
return(FALSE);
for (i=0; i<20; i++)
FemaleIData_chip[i] = FemaleIData[i];
for (i=0; i<20; i++)
MaleIData_chip[i] = MaleIData[i];
for (i=0; i<60; i++)
HumanIData_chip[i] = HumanIData[i];
for (i=0; i<60; i++)
RobotIData_chip[i] = RobotIData[i];
for (i=0; i<30; i++)
FaceIData_chip[i] = FaceIData[i];
for (i=0; i<30; i++)
StopIData_chip[i] = StopIData[i];
FemaleImage.ImageData = FemaleIData_chip;
MaleImage.ImageData = MaleIData_chip;
HumanImage.ImageData = HumanIData_chip;
RobotImage.ImageData = RobotIData_chip;
FaceImage.ImageData = FaceIData_chip;
StopImage.ImageData = StopIData_chip;
return(TRUE);
}
/* Deallocate the memory that was used for images,
* See initimages for more details.
*/
freeimages()
{
/* the images were staticly initialized above main */
extern USHORT *FemaleIData_chip;
extern USHORT *MaleIData_chip;
extern USHORT *HumanIData_chip;
extern USHORT *RobotIData_chip;
extern USHORT *FaceIData_chip;
extern USHORT *StopIData_chip;
/* Deallocate only if the pointer is really there. */
if (RobotIData_chip != 0)
FreeMem(RobotIData_chip, sizeof(RobotIData));
if (HumanIData_chip != 0)
FreeMem(HumanIData_chip, sizeof(HumanIData));
if (MaleIData_chip != 0)
FreeMem(MaleIData_chip, sizeof(MaleIData));
if (FemaleIData_chip != 0)
FreeMem(FemaleIData_chip, sizeof(FemaleIData));
if (FaceIData_chip != 0)
FreeMem(FaceIData_chip, sizeof(FaceIData));
if (StopIData_chip != 0)
FreeMem(StopIData_chip, sizeof(StopIData));
}