Index: dvi/dvi.h =================================================================== RCS file: /usr/local/cvsroot/tkdvi/dvi/dvi.h,v retrieving revision 1.7 diff -u -r1.7 dvi.h --- dvi/dvi.h 2000/06/29 10:54:42 1.7 +++ dvi/dvi.h 2000/07/14 10:21:47 @@ -228,18 +228,24 @@ S32 *tfmWidthPtr, S32 *pixelWidthPtr)); typedef int (Dvi_FontCloseProc) _ANSI_ARGS_((struct Dvi_Font *dviFont)); +typedef int (Dvi_FontIterateCallbackProc) + _ANSI_ARGS_((struct Dvi_Font *dviFont, S32 i, Dvi_Glyph *glyphPtr)); +typedef int (Dvi_FontIterateProc) _ANSI_ARGS_((struct Dvi_Font *dviFont, + Dvi_FontIterateCallbackProc *)); typedef struct Dvi_FontTypeDesc { char *name; Dvi_FontLoadProc *loadProc; Dvi_FontGlyphProc *glyphProc; Dvi_FontCloseProc *closeProc; + Dvi_FontIterateProc *iterateProc; } Dvi_FontTypeDesc; EXTERN int Dvi_CreateFontType _ANSI_ARGS_((Dvi_FontType type, char *name, Dvi_FontLoadProc *loadProc, Dvi_FontGlyphProc *glyphProc, - Dvi_FontCloseProc *closeProc)); + Dvi_FontCloseProc *closeProc, + Dvi_FontIterateProc *iterateProc)); EXTERN int Dvi_CreateFontType_PK _ANSI_ARGS_((void)); EXTERN int Dvi_CreateFontType_VF _ANSI_ARGS_((void)); EXTERN int Dvi_CreateFontType_TFM _ANSI_ARGS_((void)); @@ -282,6 +288,8 @@ S32 character, S32 *tfmWidthPtr, S32 *pixelWidthPtr)); +EXTERN int Dvi_FontIterate _ANSI_ARGS_((Dvi_FontIterateCallbackProc *)); + #ifdef DVI_DEBUG EXTERN Tcl_Obj * Dvi_FontDump _ANSI_ARGS_((Tcl_Interp *interp, Dvi_Font *dviFont)); Index: dvi/font.c =================================================================== RCS file: /usr/local/cvsroot/tkdvi/dvi/font.c,v retrieving revision 1.4 diff -u -r1.4 font.c --- dvi/font.c 2000/06/29 11:01:38 1.4 +++ dvi/font.c 2000/07/14 10:21:47 @@ -57,17 +57,20 @@ */ int -Dvi_CreateFontType (type, name, loadProc, glyphProc, closeProc) +Dvi_CreateFontType (type, name, loadProc, glyphProc, closeProc, + iterateProc) Dvi_FontType type; char *name; Dvi_FontLoadProc *loadProc; Dvi_FontGlyphProc *glyphProc; Dvi_FontCloseProc *closeProc; + Dvi_FontIterateProc *iterateProc; { fontTypes[type].name = name; fontTypes[type].loadProc = loadProc; fontTypes[type].glyphProc = glyphProc; fontTypes[type].closeProc = closeProc; + fontTypes[type].iterateProc = iterateProc; fontTypeCount++; return TCL_OK; @@ -405,6 +408,26 @@ fontHeadPtr = headPtr; return headPtr; +} + +int +Dvi_FontIterate(callbackProc) + Dvi_FontIterateCallbackProc *callbackProc; +{ + FontHead *headPtr; + Dvi_Font *fontPtr; + + for (headPtr = fontHeadPtr; headPtr != 0; headPtr = headPtr->nextPtr) { + for (fontPtr = headPtr->fonts; fontPtr; fontPtr = fontPtr->nextPtr) { + Dvi_FontIterateProc *iterateProc + = fontTypes[fontPtr->type].iterateProc; + + if (iterateProc != 0) { + (* iterateProc)(fontPtr, callbackProc); + } + } + } + return 1; } /* Index: dvi/fontPK.c =================================================================== RCS file: /usr/local/cvsroot/tkdvi/dvi/fontPK.c,v retrieving revision 1.3 diff -u -r1.3 fontPK.c --- dvi/fontPK.c 2000/05/18 12:50:32 1.3 +++ dvi/fontPK.c 2000/07/14 10:21:47 @@ -62,6 +62,8 @@ static Dvi_Glyph *PkRunCount _ANSI_ARGS_((U8 *codePtr)); static int PkClose _ANSI_ARGS_((Dvi_Font *dviFont)); +static int PkIterate _ANSI_ARGS_((Dvi_Font *dviFont, + Dvi_FontIterateCallbackProc *callbackProc)); /* * ------------------------------------------------------------------------ @@ -83,7 +85,8 @@ int Dvi_CreateFontType_PK () { - return Dvi_CreateFontType(dvi_font_pk, "pk", PkLoad, PkGlyph, PkClose); + return Dvi_CreateFontType(dvi_font_pk, "pk", PkLoad, PkGlyph, PkClose, + PkIterate); } static int @@ -622,4 +625,27 @@ } ckfree((char *)charInfoPtr); return TCL_OK; +} + +static int +PkIterate(dviFont, callback) + Dvi_Font *dviFont; + Dvi_FontIterateCallbackProc callback; +{ + PkInfo *infoPtr = (PkInfo *)dviFont->fontData; + PkCharInfo *charInfoPtr; + S32 i; + + if (infoPtr == (PkInfo *)0) { + return 0; + } + + charInfoPtr = infoPtr->charInfoPtr; + for (i = infoPtr->minChar; i <= infoPtr->maxChar; i++) { + if (charInfoPtr[i - infoPtr->minChar].glyphPtr) { + (* callback)(dviFont, i, + charInfoPtr[i - infoPtr->minChar].glyphPtr); + } + } + return 1; } Index: dvi/image.c =================================================================== RCS file: /usr/local/cvsroot/tkdvi/dvi/image.c,v retrieving revision 1.12 diff -u -r1.12 image.c --- dvi/image.c 2000/07/07 08:00:36 1.12 +++ dvi/image.c 2000/07/14 10:21:47 @@ -263,6 +263,8 @@ static int RenderFontDef _ANSI_ARGS_((ClientData, Dvi_Interp *, Dvi_FontList **, S32, U32, U32, U32, size_t, char *, Dvi_FontDefMode)); + +static int ReleaseShrunkenGlyph _ANSI_ARGS_((Dvi_Font *, S32, Dvi_Glyph *)); /* * This is a fixed version of the Tk_InitImageArgs function from the @@ -768,6 +770,17 @@ return TCL_OK; } +static int +ReleaseShrunkenGlyph (junk0, junk1, glyphPtr) + Dvi_Font *junk0; + S32 junk1; + Dvi_Glyph *glyphPtr; +{ + XDestroyImage((XImage *)(glyphPtr->shrinkGlyphPtr)); + glyphPtr->shrinkGlyphPtr = 0; + glyphPtr->shrink = 0; +} + static ColorContext * FindColorContext (instancePtr, fgUid, bgUid) DviInstance *instancePtr; @@ -837,6 +850,8 @@ colorContextPtr->nextPtr = instancePtr->colorCachePtr; instancePtr->colorCachePtr = colorContextPtr; + + Dvi_FontIterate(ReleaseShrunkenGlyph); return colorContextPtr; } Index: lib/browser.tcl =================================================================== RCS file: /usr/local/cvsroot/tkdvi/lib/browser.tcl,v retrieving revision 1.12 diff -u -r1.12 browser.tcl --- lib/browser.tcl 2000/07/07 09:02:32 1.12 +++ lib/browser.tcl 2000/07/14 10:21:47 @@ -31,6 +31,7 @@ measureunit {MeasureUnit cm} sourcespecials {SourceSpecials 0} freehandcolor {FreehandColor red} + gamma {Gamma 1.2} } foreach {option cv} [array get Options] { @@ -59,7 +60,10 @@ [namespace code [list Images $name -1]] trace variable Configure($name-shrink) w \ [namespace code [list Images $name -1]] - + + trace variable Configure($name-gamma) w \ + [namespace code [list Images $name -1]] + trace variable Configure($name-titleformat) w \ [namespace code [list TitleFormat $name]] @@ -378,6 +382,7 @@ set State($name-$key,i) [::image create dvi -file $State($name-code) \ -shrink $shrink -size $Configure($name-size) \ + -gamma $Configure($name-gamma) \ -specialcommand \ [namespace code [list SpecialCmd $name $key %x %y %c %s]] \ -precommand [namespace code [list PreCmd $name $key %p]] \ @@ -1283,6 +1288,7 @@ set Dialog($name-defaultmode) [option get $name mode Mode] set Dialog($name-measureunit) $Configure($name-measureunit) + set Dialog($name-gamma) $Configure($name-gamma) label $p.layout-l -text {Default Display Mode: } -anchor e eval OptionMenu $p.layout-m \ @@ -1298,6 +1304,14 @@ grid $p.unit-m -row $row -column 1 -sticky we -padx 2 -pady 2 incr row + label $p.gamma-l -text {Gamma value:} -anchor e + scale $p.gamma-s -orient horizontal -length 80 -resolution 0.1 \ + -showvalue true -from 0 -to 5 -tickinterval 0 \ + -variable tkdvi::browser::Dialog($name-gamma) + grid $p.gamma-l -row $row -column 0 -sticky e -ipadx 5 -ipady 5 + grid $p.gamma-s -row $row -column 1 -sticky we -padx 2 -pady 2 + incr row + frame $p.sep -relief sunken -borderwidth 1 -height 2 grid $p.sep -row $row -column 0 -columnspan 2 -sticky we incr row @@ -1319,6 +1333,7 @@ variable Dialog set Configure($name-measureunit) $Dialog($name-measureunit) + set Configure($name-gamma) $Dialog($name-gamma) option add *TkDVIBrowser.mode $Dialog($name-defaultmode) interactive if {$quit} {