/* 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; /* ボタン押下時のスクリーン上の位置 */
double cx, cy; /* 文字空間に座標変換された値 */
SplinePoint *sp;
unsigned int nextcp: 1; /* "次" の制御点、または "前" の制御点 */
unsigned int prevcp: 1; /* の上にカーソルが置かれているか */
unsigned int anysel: 1; /* 何か打鍵したか? */
unsigned int width: 1; /* スプラインではなく文字幅を移動しているところである */
unsigned int pressed: 1;
unsigned int rubberbanding: 1;
unsigned int transany: 1;
unsigned int transanyrefs: 1;
Spline *spline;
double t; /* 押下した点のスプライン上の位置 */
RefChar *ref;
SplinePointList *spl; /* スプラインまたは点を含む */
ImageList *img;
float ex, ey; /* 最後のラバーバンド長方形の終了位置 */
BasePoint constrain; /* 動きが制約される起点となる位置 */
BasePoint cp; /* オリジナルの制御点の位置 */
} PressedOn;
/* 注意: これらはツールパレット内での表示順に並んでいる */
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; /* マウス離上時に(塗り潰しまたはフォントビューでの) ラスタ変換が必要 */
unsigned int recentchange:1; /* グリッドまたは背景で変更が行われた。ラスタ変換不要 */
unsigned int drawmode:2;
unsigned int info_within: 1; /* カーソルがメインウィンドウ内にあるか */
unsigned int back_img_out_of_date: 1; /* 背景画像の 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; /* ボタン 3 はポップアップを起動 */
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; /* ボタン 3 はポップアップを起動 */
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; /* ビットマップもメトリックをもつ */
GWindow gw;
int16 width, height;
int16 mbh,sbh;
int16 topend; /* テキストフィールドを含む領域の終端の y 座標 */
int16 displayend; /* 塗り潰された文字を表示する領域の終端の y 座標 */
GFont *font;
int16 fh, as;
GGadget *hsb, *mb, *text;
GGadget *namelab, *widthlab, *lbearinglab, *rbearinglab, *kernlab;
struct metricchar {
SplineChar *sc;
BDFChar *show;
int16 dx, dwidth; /* 表示された文字の位置と幅 */
int16 mx, mwidth; /* 下にあるテキストの位置と幅 */
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; /* v の */
int mbh;
int colcnt, rowcnt;
int rowoff, rowltot;
int cbw,cbh; /* 文字ボックスの幅/高さ */
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; /* 1 ピクセルの許容誤差 (fudge factor) */
double xl,xh, yl, yh; /* 1 ピクセルの許容誤差 */
unsigned int select_controls: 1; /* 制御点を検知する */
unsigned int seek_controls: 1; /* 基点より制御点を先に検知する */
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