/*- # X-BASED ABACUS # # AbacusP.h # ### # # Copyright (c) 1994 - 2007 David Albert Bagley, bagleyd@tux.org # # Abacus demo and neat pointers from # Copyright (c) 1991 - 1998 Luis Fernandes, elf@ee.ryerson.ca # # All Rights Reserved # # Permission to use, copy, modify, and distribute this software and # its documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies and # that both that copyright notice and this permission notice appear in # supporting documentation, and that the name of the author not be # used in advertising or publicity pertaining to distribution of the # software without specific, written prior permission. # # This program is distributed in the hope that it will be "useful", # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # */ /* Private header file for Abacus */ #ifndef _AbacusP_h #define _AbacusP_h #include "xwin.h" #include "timer.h" #include "Abacus.h" #ifdef WINVER #ifndef DEMOPATH #ifdef UNIXDELIM #define DEMOPATH "c:/WINDOWS" #else #define DEMOPATH "c:\\WINDOWS" #endif #endif extern void DestroyAbacus(AbacusWidget w, HBRUSH brush); extern void ResizeAbacus(AbacusWidget w); extern void InitializeAbacus(AbacusWidget w, HBRUSH brush); extern void ExposeAbacus(AbacusWidget w); extern void HideAbacus(AbacusWidget w); extern void SelectAbacus(AbacusWidget w, const int x, const int y); extern void ReleaseAbacus(AbacusWidget w); extern void ClearAbacus(AbacusWidget w); extern void IncrementAbacus(AbacusWidget w); extern void DecrementAbacus(AbacusWidget w); extern void FormatAbacus(AbacusWidget w); extern void MuseumAbacus(AbacusWidget w); extern void RomanNumeralsAbacus(AbacusWidget w); extern void GroupAbacus(AbacusWidget w); extern void SignAbacus(AbacusWidget w); extern void QuarterAbacus(AbacusWidget w); extern void QuarterPercentAbacus(AbacusWidget w); extern void TwelfthAbacus(AbacusWidget w); extern void SubdeckAbacus(AbacusWidget w); extern void EighthAbacus(AbacusWidget w); extern void AnomalyAbacus(AbacusWidget w); extern void WatchAbacus(AbacusWidget w); extern void SpeedAbacus(AbacusWidget w); extern void SlowAbacus(AbacusWidget w); extern void SoundAbacus(AbacusWidget w); extern void EnterAbacus(AbacusWidget w); extern void LeaveAbacus(AbacusWidget w); extern void MoveAbacus(AbacusWidget w); extern void setAbacusString(AbacusWidget w, int reason, char *string); extern void InitializeAbacusDemo(AbacusWidget w); extern void ExposeAbacusDemo(AbacusWidget w); extern void ClearAbacusDemo(AbacusWidget w); extern void DemoAbacusDemo(AbacusWidget w); extern void NextAbacusDemo(AbacusWidget w); extern void RepeatAbacusDemo(AbacusWidget w); extern void JumpAbacusDemo(AbacusWidget w); extern void MoreAbacusDemo(AbacusWidget w); extern void ChapterAbacusDemo(AbacusWidget w, int chapt); #else #ifdef VMS #ifndef DEMOPATH #define DEMOPATH "[.]" #endif #else #ifndef DEMOPATH #if 0 #define DEMOPATH "/usr/share/games/xabacus" #endif #define DEMOPATH "/usr/local/share/games/xabacus" #endif #endif typedef struct _AbacusClassPart { int ignore; } AbacusClassPart; typedef struct _AbacusClassRec { CoreClassPart coreClass; AbacusClassPart abacusClass; } AbacusClassRec; extern AbacusClassRec abacusClassRec; #endif #ifndef BUMPSOUND #define BUMPSOUND "bump" #endif #ifndef MOVESOUND #define MOVESOUND "move" #endif #define MAXDECKS 2 #define PLACESETTING 2 #define UP 1 #define DOWN 0 #define TOP 1 #define BOTTOM 0 #define CARRY 2 /* If you have a strange abacus you may have to increase this also need a space to hold null (not included) */ #define SPECIAL_PIECES 2 /* Pieces, PiecePercents */ /* Migrate to Locale */ #define DECIMAL_SEPARATOR '.' #define GROUP_SEPARATOR ',' #define MAXLENFORMAT 9 #define CHAPTERS 5 #define LINES 4 #define CHARS 64 #define MAXSLICES 10 #define DEFAULTSUBDECKS 3 #define DEFAULTSUBBEADS 4 #define DEFAULTSHIFTPERCENT 2 #define DEFAULTSHIFTANOMALY 2 #define DEFAULTGROUPSIZE 3 #define SUBDECKSPACE 1 #define MAXMUSEUMS 3 #define IT 0 #define UK 1 #define FR 2 #define COUNTRYSIZE 3 #define STRINGSIZE 81 #define COLORMIDDLE 1 #define COLOR1STOFGROUP 2 #define COLORHALF 4 #define NORMAL 1 #define DOUBLE 2 #define INSTANT 3 #define NEWPOS(dir,x) ((((dir)==UP)?-1:1)*(x)) #define VDRAWLINE(w,dr,c,x1,y1,x2,y2) if (w->abacus.vertical) \ {DRAWLINE(w,dr,c,y1,x1,y2,x2);} else {DRAWLINE(w,dr,c,x1,y1,x2,y2);} #define VDRAWRECTANGLE(w,dr,c,i,j,l,h) if (w->abacus.vertical) \ {DRAWRECTANGLE(w,dr,c,j,i,h,l);} else {DRAWRECTANGLE(w,dr,c,i,j,l,h);} #define VFILLRECTANGLE(w,dr,c,i,j,l,h) if (w->abacus.vertical) \ {FILLRECTANGLE(w,dr,c,j,i,h,l);} else {FILLRECTANGLE(w,dr,c,i,j,l,h);} #define VDRAWCIRCLE(w,dr,c,d,x,y) if (w->abacus.vertical) \ {DRAWCIRCLE(w,dr,c,d,y,x);} else {DRAWCIRCLE(w,dr,c,d,x,y);} #define VFILLCIRCLE(w,dr,c,d,x,y) if (w->abacus.vertical) \ {FILLCIRCLE(w,dr,c,d,y,x);} else {FILLCIRCLE(w,dr,c,d,x,y);} #define VPOLYGON(w,dr,c,cl,l,n,b1,b2) if (w->abacus.vertical) \ {int i,t; for (i=0;iabacus.vertical) \ {FillRectClipX(w,dr,c,dy,dx,sy,sx,o,wo,ws);} else \ {FillRectClipY(w,dr,c,dx,dy,sx,sy,o,wo,ws);} typedef struct _MuseumPart { char museum[MAXMUSEUMS]; /* 2 char country code of museum */ Boolean separateSlots; } MuseumPart; typedef struct _SubdeckPart { int number; int factor; int position; int spaces; /* spaces between beads */ int room; /* spaces + number */ Position height; } SubdeckPart; typedef struct _DeckPart { int number; Boolean orientation; int factor; int *position; int spaces; /* spaces between beads */ int room; /* spaces + number */ Position height; int piece, piecePercent; } DeckPart; typedef struct _AbacusPart { DeckPart decks[MAXDECKS]; SubdeckPart *subdecks; int currentDeck, currentRail, currentPosition; int rails; /* number of columns of beads */ int decimalPosition, numDigits; int base, displayBase; /* 10 usually */ int subdeck, subbead, subbase; int shiftPercent, shiftAnomaly, shiftAnomalySq; int groupSize, anomaly, anomalySq; int delay, numSlices, mode, submode, colorScheme, railIndex; int leftAuxRails, rightAuxRails; int deck, rail, number; Position width, midHeight, midBarY, railWidth; Point frameSize, beadSize; Point pos, delta, offset; Boolean sign, minusSign, romanNumerals, group; Boolean carryAnomaly, carryAnomalySq; Boolean mono, reverse, script, demo, focus, vertical, aux, lee; Boolean versionOnly; Boolean slot, diamond, sound; char *digits, *mathBuffer; FILE *fp; GC frameGC, borderGC, symbolGC, railGC[2], inverseGC; GC beadShadeGC[10]; Pixmap bufferBead[2][2][2]; TimeVal oldTime; #ifdef WINVER char format[STRINGSIZE], museum[COUNTRYSIZE]; char bumpSound[STRINGSIZE], moveSound[STRINGSIZE]; #else char *format, *museum, *bumpSound, *moveSound; int menu, pixmapSize; Colormap colormap; Pixel foreground, background; Pixel borderColor, frameColor; Pixel beadColor[2], railColor[2]; XtCallbackList select; #endif } AbacusPart; typedef struct _AbacusDemoPart { int chapterCount; int lessons[CHAPTERS], lessonLength, lessonCount; int aux, deck, rail, number, lines; int fontHeight; FILE *fp; Boolean chapter, query, started, framed; GC foregroundGC; #ifdef WINVER char path[STRINGSIZE]; #else GC inverseGC; char *path, *font; XFontStruct *fontInfo; Pixel background, foreground; XtCallbackList select; #endif } AbacusDemoPart; typedef struct _AbacusRec { CorePart core; AbacusPart abacus; AbacusDemoPart abacusDemo; } AbacusRec; extern void setAbacus(AbacusWidget w, int reason); extern void setAbacusDemo(AbacusWidget w, int reason); extern void setAbacusMove(AbacusWidget w, int reason, int aux, int deck, int rail, int number); extern int char2Int(char character); extern char int2Char(int digit); extern void dividePieces(char * buf, int base, int pieces, int mult, int places); extern void shiftDecimal(char *buf, char *aBuf, int shift, int place); extern void addStrings(char *finalBuf, char *buf, char *pieceBuf, int base); extern void subStrings(char *finalBuf, char *buf, char *pieceBuf, int base); extern void convertString(char * buf, char * inbuf, int base, int displayBase, int decimalPosition, int anomaly, int shiftAnomaly, Boolean carryAnomaly, int anomalySq, int shiftAnomalySq, Boolean carryAnomalySq); extern int sizeofRoman(int base, Boolean romanNumerals); extern int string2Roman(char *buf, char *inbuf, int base, int pieces, int number, int subnumber, int subbase); extern void string2Group(char *buf, char *inbuf, int groupSize); extern void calculate(AbacusWidget w, char *buffer); extern int baseToBottom(int base); extern void ClearRails(AbacusWidget w); #endif /* _AbacusP_h */