>     /* Copyright (C) 2000-2003 by George Williams */
>     /*
>      * Redistribution and use in source and binary forms, with or without
>      * modification, are permitted provided that the following conditions are met:

>      * Redistributions of source code must retain the above copyright notice, this
>      * list of conditions and the following disclaimer.

>      * Redistributions in binary form must reproduce the above copyright notice,
>      * this list of conditions and the following disclaimer in the documentation
>      * and/or other materials provided with the distribution.

>      * The name of the author may not be used to endorse or promote products
>      * derived from this software without specific prior written permission.

>      * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
>      * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
>      * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
>      * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
>      * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
>      * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
>      * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
>      * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
>      * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
>      * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
>      */
>     #ifndef _VIEWS_H
>     #define _VIEWS_H

>     #include "splinefont.h"
>     #include "ggadget.h"

>     extern struct cvshows {
>         int showfore, showback, showgrids, showhints;
>         int showpoints, showfilled;
>     } CVShows;

>     extern struct bvshows {
>         int showfore, showoutline, showgrid;
>         int lastpixelsize;
>     } BVShows;

>     typedef struct drect {
>         double x, y;
>         double width, height;
>     } DRect;

>     typedef struct pressedOn {
>         int x,y;			/* screen location of the press */
>         double cx, cy;		/* Translated into character space */
>         SplinePoint *sp;
>         unsigned int nextcp: 1;	/* Is the cursor on the "next" control point of */
>         unsigned int prevcp: 1;	/*  the spline point, or the "prev" control point */
>         unsigned int anysel: 1;	/* did we hit anything? */
>         unsigned int width: 1;	/* we're moving the width rather than a spline */
>         unsigned int pressed: 1;
>         unsigned int rubberbanding: 1;
>         unsigned int transany: 1;
>         unsigned int transanyrefs: 1;
>         Spline *spline;
>         double t;			/* location on the spline where we pressed */
>         RefChar *ref;
>         SplinePointList *spl;	/* containing spline or point */
>         ImageList *img;
>         float ex, ey;		/* end of last rubber band rectangle */
>         BasePoint constrain;	/* Point to which we constrain movement */
>         BasePoint cp;		/* Original control point position */
>     } PressedOn;

>     /* Note: These are ordered as they are displayed in the tools palette */
>     enum cvtools { cvt_pointer, cvt_magnify,
>     	cvt_curve, cvt_corner, cvt_tangent, cvt_pen,
>     	cvt_knife, cvt_ruler,
>     	cvt_scale, cvt_flip,
>     	cvt_rotate, cvt_skew,
>     	cvt_rect, cvt_poly,
>     	cvt_ellipse, cvt_star,
>     	cvt_minify, cvt_max=cvt_minify,
>     	cvt_none = -1};
>     enum bvtools { bvt_pointer, bvt_magnify,
>     	bvt_pencil, bvt_line,
>     	bvt_shift, bvt_hand,
>     	bvt_minify, bvt_max=bvt_minify,
>     	bvt_rect, bvt_filledrect,
>     	bvt_ellipse, bvt_filledellipse,
>     	bvt_max2 = bvt_filledellipse,
>     	bvt_none = -1,
>     	bvt_fliph=0, bvt_flipv, bvt_rotate90cw, bvt_rotate90ccw, bvt_rotate180, bvt_skew };
>     enum drawmode { dm_fore, dm_back, dm_grid, dm_max };

>     typedef struct charview {
>         SplineChar *sc;
>         unsigned int showback:1;
>         unsigned int showfore:1;
>         unsigned int showgrids:1;
>         unsigned int showhints:1;
>         unsigned int showpoints:1;
>         unsigned int showfilled:1;
>         unsigned int needsrasterize:1;		/* Rasterization (of fill or fontview) needed on mouse up */
>         unsigned int recentchange:1;		/* a change happened in the grids or background. don't need to rasterize */
>         unsigned int drawmode:2;
>         unsigned int info_within: 1;		/* cursor is within main window */
>         unsigned int back_img_out_of_date: 1;	/* Force redraw of back image pixmap */
>         unsigned int cntrldown:1;
>         SplinePointList **heads[dm_max];
>         Undoes **uheads[dm_max];
>         Undoes **rheads[dm_max];
>         double scale;
>         GWindow gw, v;
>         int width, height;
>         int xoff, yoff;
>         int mbh, infoh;
>         GGadget *vsb, *hsb, *mb;
>         GFont *small;
>         int16 sas, sfh;
>         BasePoint info;
>         BasePoint last_c;
>         BDFChar *filled;
>         GImage gi;
>         struct charview *next;
>         struct fontview *fv;
>         GWindow icon;
>         PressedOn p;
>         GWindow tools, layers;
>         int8 b1_tool, cb1_tool, b2_tool, cb2_tool;		/* Button 3 does a popup */
>         int8 showing_tool, pressed_tool, pressed_display, had_control, active_tool;
>         SplinePointList *active_spl;
>         SplinePoint *active_sp;
>         GWindow ruler_w;
>         uint16 rfh, ras;
>         GFont *rfont;
>         BasePoint lastknife;
>         GTimer *pressed;
>         GWindow backimgs;
>         enum expandedge { ee_none, ee_nw, ee_up, ee_ne, ee_right, ee_se, ee_down,
>     	    ee_sw, ee_left, ee_max } expandedge;
>         BasePoint expandorigin;
>         double expandwidth, expandheight;
>         SplinePointList *active_shape;
>     } CharView;

>     typedef struct bitmapview {
>         BDFChar *bc;
>         BDFFont *bdf;
>         struct fontview *fv;
>         GWindow gw, v;
>         int xoff, yoff;
>         GGadget *vsb, *hsb, *mb;
>         int width, height;
>         int infoh, mbh;
>         int scale;
>         double scscale;
>         struct bitmapview *next;
>         unsigned int showfore:1;
>         unsigned int showoutline:1;
>         unsigned int showgrid:1;
>         unsigned int cntrldown:1;
>         unsigned int recentchange:1;
>         unsigned int clearing:1;
>         GWindow tools, layers;
>         GGadget *recalc;
>         int8 b1_tool, cb1_tool, b2_tool, cb2_tool;		/* Button 3 does a popup */
>         int8 showing_tool, pressed_tool, pressed_display, had_control, active_tool;
>         int pressed_x, pressed_y;
>         int info_x, info_y;
>         int event_x, event_y;
>         GFont *small;
>         int16 sas, sfh;
>     } BitmapView;

>     typedef struct metricsview {
>         struct fontview *fv;
>         int pixelsize;
>         BDFFont *bdf;		/* We can also see metric info on a bitmap font */
>         GWindow gw;
>         int16 width, height;
>         int16 mbh,sbh;
>         int16 topend;		/* y value of the end of the region containing the text field */
>         int16 displayend;		/* y value of the end of the region showing filled characters */
>         GFont *font;
>         int16 fh, as;
>         GGadget *hsb, *mb, *text;
>         GGadget *namelab, *widthlab, *lbearinglab, *rbearinglab, *kernlab;
>         struct metricchar {
>     	SplineChar *sc;
>     	BDFChar *show;
>     	int16 dx, dwidth;	/* position and width of the displayed char */
>     	int16 mx, mwidth;	/* position and width of the text underneath */
>     	int16 kernafter;
>     	unsigned int selected: 1;
>     	GGadget *width, *lbearing, *rbearing, *kern, *name;
>         } *perchar;
>         int16 mwidth, mbase;
>         int16 charcnt, max;
>         int16 pressed_x;
>         int16 activeoff;
>         int xoff;
>         struct metricsview *next;
>         unsigned int right_to_left: 1;
>         unsigned int pressed: 1;
>         unsigned int pressedwidth: 1;
>         unsigned int pressedkern: 1;
>         unsigned int showgrid: 1;
>     } MetricsView;

>     typedef struct fontview {
>         SplineFont *sf;
>         BDFFont *show, *filled;
>         GWindow gw, v;
>         int width, height;		/* of v */
>         int mbh;
>         int colcnt, rowcnt;
>         int rowoff, rowltot;
>         int cbw,cbh;		/* width/height of a character box */
>         GFont *header;
>         GGadget *vsb, *mb;
>         struct fontview *next;
>         int pressed_pos, end_pos;
>         GTimer *pressed;
>         char *selected;
>         MetricsView *metrics;
>         unsigned int onlycopydisplayed: 1;
>         unsigned int antialias:1;
>     } FontView;

>     typedef struct findsel {
>         GEvent *e;
>         double fudge;		/* One pixel fudge factor */
>         double xl,xh, yl, yh;	/* One pixel fudge factor */
>         unsigned int select_controls: 1;	/* notice control points */
>         unsigned int seek_controls: 1;	/* notice control points before base points */
>         double scale;
>         PressedOn *p;
>     } FindSel;

>     enum widthtype { wt_width, wt_lbearing, wt_rbearing };

>     extern FontView *FontViewCreate(SplineFont *sf);
>     extern void SplineFontSetUnChanged(SplineFont *sf);
>     extern FontView *ViewPostScriptFont(char *filename);
>     extern FontView *FontNew(void);
>     extern void FontViewFree(FontView *fv);
>     extern void FVToggleCharChanged(FontView *fv,SplineChar *sc);
>     extern void FVRefreshChar(FontView *fv,BDFFont *bdf,int enc);
>     extern void FVRegenChar(FontView *fv,SplineChar *sc);
>     extern int _FVMenuSave(FontView *fv);
>     extern int _FVMenuSaveAs(FontView *fv);
>     extern int _FVMenuGenerate(FontView *fv);
>     extern char *GetPostScriptFontName(void);
>     extern void MenuPrefs(GWindow base,struct gmenuitem *mi);
>     extern void MenuExit(GWindow base,struct gmenuitem *mi);
>     extern void MenuOpen(GWindow base,struct gmenuitem *mi);
>     extern void MenuNew(GWindow gw,struct gmenuitem *mi);
>     extern int FontMenuGeneratePostScript(SplineFont *sf);
>     extern void FontMenuFontInfo(SplineFont *sf,FontView *fv);
>     extern void FontViewReformat(FontView *fv);
>     extern void FVShowFilled(FontView *fv);
>     extern void SCPreparePopup(GWindow gw,SplineChar *sc);
>     extern void FVTrans(FontView *fv,SplineChar *sc,double transform[6],char *sel);
>     extern void FVMergeFonts(FontView *fv);
>     extern void FVInterpolateFonts(FontView *fv);
>     extern void FVRevert(FontView *fv);
>     extern void FVDelay(FontView *fv,void (*func)(FontView *));

>     extern void FVAutoKern(FontView *fv);
>     extern void FVAutoWidth(FontView *fv);

>     extern void CVDrawSplineSet(CharView *cv, GWindow pixmap, SplinePointList *set,
>     	Color fg, int dopoints, DRect *clip );

>     extern GWindow CVMakeTools(CharView *cv);
>     extern GWindow CVMakeLayers(CharView *cv);
>     extern GWindow BVMakeTools(BitmapView *bv);
>     extern GWindow BVMakeLayers(BitmapView *bv);
>     extern double CVRoundRectRadius(void);
>     extern double CVStarRatio(void);
>     extern int CVPolyStarPoints(void);
>     extern int TrueCharState(GEvent *event);
>     extern void BVToolsSetCursor(BitmapView *bv, int state);
>     extern void CVToolsSetCursor(CharView *cv, int state);
>     extern void CVToolsPopup(CharView *cv, GEvent *event);
>     extern void BVToolsPopup(BitmapView *bv, GEvent *event);
>     extern void CVTransFunc(CharView *cv,double transform[6]);
>     extern void TransformDlgCreate(void *data,void (*transfunc)(void *,double *,int),
>     	int (*getorigin)(void *,BasePoint *,int));
>     extern void BitmapDlg(FontView *fv,SplineChar *sc, int isavail);
>     extern void CVReviewHints(CharView *cv);
>     extern void CVCreateHint(CharView *cv,int ishstem);
>     extern int CVExport(CharView *cv);
>     extern int BVExport(BitmapView *bv);

>     extern CharView *CharViewCreate(SplineChar *sc,FontView *fv);
>     extern void CharViewFree(CharView *cv);
>     extern void CVDrawRubberRect(GWindow pixmap, CharView *cv);
>     extern void CVSetCharChanged(CharView *cv,int changed);
>     extern void CVCharChangedUpdate(CharView *cv);
>     extern void SCCharChangedUpdate(SplineChar *sc,FontView *fv);
>     extern void SCSynchronizeWidth(SplineChar *sc,double newwidth, double oldwidth,FontView *fv);
>     extern void SCSynchronizeLBearing(SplineChar *sc,char *selected,double off);
>     extern int CVAnySel(CharView *cv, int *anyp, int *anyr, int *anyi);
>     extern int CVTwoForePointsSelected(CharView *cv, SplinePoint **sp1, SplinePoint **sp2);
>     extern int CVClearSel(CharView *cv);
>     extern int CVSetSel(CharView *cv);
>     extern int CVAllSelected(CharView *cv);
>     extern void SCUpdateAll(SplineChar *sc);
>     extern void SCOutOfDateBackground(SplineChar *sc);
>     extern SplinePointList *CVAnySelPointList(CharView *cv);
>     extern SplinePoint *CVAnySelPoint(CharView *cv);
>     extern int CVOneThingSel(CharView *cv, SplinePoint **sp, SplinePointList **spl,
>     	RefChar **ref, ImageList **img);
>     extern void CVInfoDrawText(CharView *cv, GWindow pixmap );
>     extern void CVImport(CharView *cv);
>     extern void BVImport(BitmapView *bv);
>     extern void FVImport(FontView *bv);
>     extern int FVImportBDF(FontView *fv, char *filename);
>     extern void CVFindCenter(CharView *cv, BasePoint *bp, int nosel);
>     extern void CVStroke(CharView *cv);
>     extern void FVStroke(FontView *fv);
>     extern void SCGetInfo(SplineChar *sc,int nextprev);
>     extern void CVGetInfo(CharView *cv);
>     extern void FVSetWidth(FontView *fv,enum widthtype wtype);
>     extern void CVSetWidth(CharView *cv,enum widthtype wtype);
>     extern void CVChangeSC(CharView *cv, SplineChar *sc );

>     extern void CVAdjustPoint(CharView *cv, SplinePoint *sp);
>     extern void CVMergeSplineSets(CharView *cv, SplinePoint *active, SplineSet *activess,
>     	SplinePoint *merge, SplineSet *mergess);
>     extern void CVChar(CharView *cv, GEvent *event );
>     extern void CVMoveSelection(CharView *cv, double dx, double dy);
>     extern void CVMouseDownPoint(CharView *cv);
>     extern void CVMouseMovePoint(CharView *cv,PressedOn *);
>     extern void CVMouseMovePen(CharView *cv, PressedOn *p);
>     extern void CVMouseUpPoint(CharView *cv);
>     extern void CVMouseUpPointer(CharView *cv );
>     extern void CVMouseMovePointer(CharView *cv );
>     extern void CVMouseDownPointer(CharView *cv, FindSel *fs, GEvent *event);
>     extern void CVCheckResizeCursors(CharView *cv);
>     extern void CVMouseDownRuler(CharView *cv, GEvent *event);
>     extern void CVMouseMoveRuler(CharView *cv, GEvent *event);
>     extern void CVMouseUpRuler(CharView *cv, GEvent *event);
>     extern void CVMouseDownTransform(CharView *cv);
>     extern void CVMouseMoveTransform(CharView *cv);
>     extern void CVMouseUpTransform(CharView *cv);
>     extern void CVMouseDownKnife(CharView *cv);
>     extern void CVMouseMoveKnife(CharView *cv,PressedOn *);
>     extern void CVMouseUpKnife(CharView *cv);
>     extern void CVMouseDownShape(CharView *cv);
>     extern void CVMouseMoveShape(CharView *cv);
>     extern void CVMouseUpShape(CharView *cv);

>     extern int GotoChar(SplineFont *sf);

>     extern Undoes *CVPreserveState(CharView *cv);
>     extern Undoes *CVPreserveTState(CharView *cv);
>     extern Undoes *CVPreserveWidth(CharView *cv,int width);
>     extern void CVDoRedo(CharView *cv);
>     extern void CVDoUndo(CharView *cv);
>     extern void CVRestoreTOriginalState(CharView *cv);
>     extern void CVUndoCleanup(CharView *cv);
>     extern void CVRemoveTopUndo(CharView *cv);
>     extern int CopyContainsSomething(void);
>     extern int CopyContainsBitmap(void);
>     extern void CopyReference(SplineChar *sc);
>     extern void CopySelected(CharView *cv);
>     extern void CopyWidth(CharView *cv);
>     extern void PasteToCV(CharView *cv);
>     extern void BCCopySelected(BDFChar *bc,int pixelsize);
>     extern void PasteToBC(BDFChar *bc,int pixelsize,FontView *fv);
>     extern void FVCopyWidth(FontView *fv);
>     extern void FVCopy(FontView *fv, int fullcopy);
>     extern void PasteIntoFV(FontView *fv);

>     extern void WindowMenuBuild(GWindow base,struct gmenuitem *mi);

>     extern GImage GIcon_sel2ptr, GIcon_rightpointer, GIcon_angle, GIcon_distance,
>     	GIcon_selectedpoint;

>     extern BitmapView *BitmapViewCreate(BDFChar *bc, BDFFont *bdf, FontView *fv);
>     extern BitmapView *BitmapViewCreatePick(int enc, FontView *fv);
>     extern void BitmapViewFree(BitmapView *bv);
>     extern void BCCharChangedUpdate(BDFChar *bc,FontView *fv);
>     extern void BCFlattenFloat(BDFChar *bc);
>     extern BDFFloat *BDFFloatCreate(BDFChar *bc,int xmin,int xmax,int ymin,int ymax, int clear);
>     extern BDFFloat *BDFFloatCopy(BDFFloat *sel);
>     extern void BDFFloatFree(BDFFloat *sel);
>     extern void BVMenuRotateInvoked(GWindow gw,struct gmenuitem *mi);
>     extern void BVRotateBitmap(BitmapView *bv,enum bvtools type );
>     extern void BCSetPoint(BDFChar *bc, int x, int y, int clear);
>     extern void BCGeneralFunction(BitmapView *bv,
>     	void (*SetPoint)(BitmapView *,int x, int y, void *data),void *data);
>     extern unichar_t *BVFlipNames[];
>     extern void BVChangeBC(BitmapView *bv, BDFChar *bc, int fitit );
>     extern void BVChar(BitmapView *cv, GEvent *event );

>     extern void MVRefreshChar(MetricsView *mv, SplineChar *sc);
>     extern void MVRegenChar(MetricsView *mv, SplineChar *sc);
>     extern void MVReKern(MetricsView *mv);
>     extern MetricsView *MetricsViewCreate(FontView *fv,SplineChar *sc,BDFFont *bdf);
>     extern void MetricsViewFree(MetricsView *mv);

>     extern void LoadPrefs(void);
>     extern void SavePrefs(void);
>     extern void DoPrefs(void);
>     #endif