diff options
author | dkf <donal.k.fellows@manchester.ac.uk> | 2004-05-05 09:39:36 (GMT) |
---|---|---|
committer | dkf <donal.k.fellows@manchester.ac.uk> | 2004-05-05 09:39:36 (GMT) |
commit | 6537a2d1e074434eb560cd0bab189190e0dba106 (patch) | |
tree | d3af85b2b2acc80ea0fee4d624c5fc85fe550eb8 /win | |
parent | cfa2caa8be76ffed4179c1f51779095c837cab14 (diff) | |
download | tk-6537a2d1e074434eb560cd0bab189190e0dba106.zip tk-6537a2d1e074434eb560cd0bab189190e0dba106.tar.gz tk-6537a2d1e074434eb560cd0bab189190e0dba106.tar.bz2 |
Fix FMR in subfont handling on Windows. [Bug 618872]
Diffstat (limited to 'win')
-rw-r--r-- | win/tkWinFont.c | 46 |
1 files changed, 31 insertions, 15 deletions
diff --git a/win/tkWinFont.c b/win/tkWinFont.c index e78cd81..5ab0150 100644 --- a/win/tkWinFont.c +++ b/win/tkWinFont.c @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkWinFont.c,v 1.22 2004/01/13 02:06:02 davygrvy Exp $ + * RCS: @(#) $Id: tkWinFont.c,v 1.23 2004/05/05 09:39:39 dkf Exp $ */ #include "tkWinInt.h" @@ -188,12 +188,15 @@ static Tcl_Encoding systemEncoding; static FontFamily * AllocFontFamily(HDC hdc, HFONT hFont, int base); static SubFont * CanUseFallback(HDC hdc, WinFont *fontPtr, - char *fallbackName, int ch); + char *fallbackName, int ch, + SubFont **subfontPtrPtr); static SubFont * CanUseFallbackWithAliases(HDC hdc, WinFont *fontPtr, - char *faceName, int ch, Tcl_DString *nameTriedPtr); + char *faceName, int ch, Tcl_DString *nameTriedPtr, + SubFont **subfontPtrPtr); static int FamilyExists(HDC hdc, CONST char *faceName); static char * FamilyOrAliasExists(HDC hdc, CONST char *faceName); -static SubFont * FindSubFontForChar(WinFont *fontPtr, int ch); +static SubFont * FindSubFontForChar(WinFont *fontPtr, int ch, + SubFont **subfontPtrPtr); static void FontMapInsert(SubFont *subFontPtr, int ch); static void FontMapLoadPage(SubFont *subFontPtr, int row); static int FontMapLookup(SubFont *subFontPtr, int ch); @@ -640,7 +643,7 @@ Tk_MeasureChars( end = start + numBytes; for (p = start; p < end; ) { next = p + Tcl_UtfToUniChar(p, &ch); - thisSubFontPtr = FindSubFontForChar(fontPtr, ch); + thisSubFontPtr = FindSubFontForChar(fontPtr, ch, &lastSubFontPtr); if (thisSubFontPtr != lastSubFontPtr) { familyPtr = lastSubFontPtr->familyPtr; Tcl_UtfToExternalDString(familyPtr->encoding, start, @@ -996,7 +999,7 @@ MultiFontTextOut( end = source + numBytes; for (p = source; p < end; ) { next = p + Tcl_UtfToUniChar(p, &ch); - thisSubFontPtr = FindSubFontForChar(fontPtr, ch); + thisSubFontPtr = FindSubFontForChar(fontPtr, ch, &lastSubFontPtr); if (thisSubFontPtr != lastSubFontPtr) { if (p > source) { familyPtr = lastSubFontPtr->familyPtr; @@ -1445,7 +1448,9 @@ static SubFont * FindSubFontForChar( WinFont *fontPtr, /* The font object with which the character * will be displayed. */ - int ch) /* The Unicode character to be displayed. */ + int ch, /* The Unicode character to be displayed. */ + SubFont **subfontPtrPtr) /* Pointer to var to be fixed up if we + * reallocate the subfont table. */ { HDC hdc; int i, j, k; @@ -1509,7 +1514,7 @@ FindSubFontForChar( for (j = 0; fontFallbacks[i][j] != NULL; j++) { fallbackName = fontFallbacks[i][j]; subFontPtr = CanUseFallbackWithAliases(hdc, fontPtr, fallbackName, - ch, &ds); + ch, &ds, subfontPtrPtr); if (subFontPtr != NULL) { goto end; } @@ -1524,7 +1529,7 @@ FindSubFontForChar( for (i = 0; anyFallbacks[i] != NULL; i++) { fallbackName = anyFallbacks[i]; subFontPtr = CanUseFallbackWithAliases(hdc, fontPtr, fallbackName, - ch, &ds); + ch, &ds, subfontPtrPtr); if (subFontPtr != NULL) { goto end; } @@ -1592,7 +1597,8 @@ WinFontCanUseProc( fallbackName = Tcl_DStringValue(&faceString); if (SeenName(fallbackName, nameTriedPtr) == 0) { - subFontPtr = CanUseFallback(hdc, fontPtr, fallbackName, ch); + subFontPtr = CanUseFallback(hdc, fontPtr, fallbackName, ch, + subfontPtrPtr); if (subFontPtr != NULL) { canUsePtr->subFontPtr = subFontPtr; Tcl_DStringFree(&faceString); @@ -1800,17 +1806,19 @@ CanUseFallbackWithAliases( char *faceName, /* Desired face name for new screen font. */ int ch, /* The Unicode character that the new * screen font must be able to display. */ - Tcl_DString *nameTriedPtr) /* Records face names that have already + Tcl_DString *nameTriedPtr, /* Records face names that have already * been tried. It is possible for the same * face name to be queried multiple times when * trying to find a suitable screen font. */ + SubFont **subfontPtrPtr) /* Variable to fixup if we reallocate the + * array of subfonts. */ { int i; char **aliases; SubFont *subFontPtr; if (SeenName(faceName, nameTriedPtr) == 0) { - subFontPtr = CanUseFallback(hdc, fontPtr, faceName, ch); + subFontPtr = CanUseFallback(hdc, fontPtr, faceName, ch, subfontPtrPtr); if (subFontPtr != NULL) { return subFontPtr; } @@ -1819,7 +1827,8 @@ CanUseFallbackWithAliases( if (aliases != NULL) { for (i = 0; aliases[i] != NULL; i++) { if (SeenName(aliases[i], nameTriedPtr) == 0) { - subFontPtr = CanUseFallback(hdc, fontPtr, aliases[i], ch); + subFontPtr = CanUseFallback(hdc, fontPtr, aliases[i], ch, + subfontPtrPtr); if (subFontPtr != NULL) { return subFontPtr; } @@ -1898,8 +1907,10 @@ CanUseFallback( WinFont *fontPtr, /* The font object that will own the new * screen font. */ char *faceName, /* Desired face name for new screen font. */ - int ch) /* The Unicode character that the new + int ch, /* The Unicode character that the new * screen font must be able to display. */ + SubFont **subfontPtrPtr) /* Variable to fix-up if we realloc the array + * of subfonts. */ { int i; HFONT hFont; @@ -1938,7 +1949,7 @@ CanUseFallback( if (fontPtr->numSubFonts >= SUBFONT_SPACE) { SubFont *newPtr; - + newPtr = (SubFont *) ckalloc(sizeof(SubFont) * (fontPtr->numSubFonts + 1)); memcpy((char *) newPtr, fontPtr->subFontArray, @@ -1946,6 +1957,11 @@ CanUseFallback( if (fontPtr->subFontArray != fontPtr->staticSubFonts) { ckfree((char *) fontPtr->subFontArray); } + /* + * Fix up the variable pointed to by subfontPtrPtr so it still + * points into the live array. [Bug 618872] + */ + *subfontPtrPtr = newPtr + (*subfontPtrPtr - fontPtr->subFontArray); fontPtr->subFontArray = newPtr; } fontPtr->subFontArray[fontPtr->numSubFonts] = subFont; |