Tk Source Code

Artifact [b83d3bea]
Login

Artifact b83d3beaf3bcdec15daff4141c18deca4d0d148be490e39ec97ffab0ba50617e:

Attachment "diff.out" to ticket [8162e9b7] added by nemethi 2024-05-26 15:28:35.
Index: tests/font.test
==================================================================
--- tests/font.test
+++ tests/font.test
@@ -2348,16 +2348,15 @@
 
 
 test font-44.1 {TkFontGetPixels: size < 0} -setup {
     set oldscale [tk scaling]
 } -body {
-    set oldsize [expr {-(-12.0 / $oldscale)}]
     tk scaling 0.5
-    expr {round([font actual {times -12} -size] / $oldscale * 0.5) - round($oldsize) == 0}
+    font actual {times -11} -size
 } -cleanup {
     tk scaling $oldscale
-} -result 1
+} -result 22
 test font-44.2 {TkFontGetPoints: size >= 0} -constraints {noExceed haveTimes12Font} -setup {
     set oldscale [tk scaling]
 } -body {
     tk scaling 0.5
     font actual {times 12} -size

Index: unix/tkUnixRFont.c
==================================================================
--- unix/tkUnixRFont.c
+++ unix/tkUnixRFont.c
@@ -186,10 +186,11 @@
  * 	Fill in TkFontAttributes from an XftFont.
  */
 
 static void
 GetTkFontAttributes(
+    Tk_Window tkwin,
     XftFont *ftFont,
     TkFontAttributes *faPtr)
 {
     const char *family = "Unknown";
     const char *const *familyPtr = &family;
@@ -216,15 +217,19 @@
     if (XftPatternGetInteger(ftFont->pattern, XFT_SLANT, 0,
 	    &slant) != XftResultMatch) {
 	slant = XFT_SLANT_ROMAN;
     }
 
-    DEBUG(("GetTkFontAttributes: family %s size %d weight %d slant %d\n",
-	    family, (int)size, weight, slant));
+    DEBUG(("GetTkFontAttributes: family %s size %ld weight %d slant %d\n",
+	    family, lround(size), weight, slant));
 
     faPtr->family = Tk_GetUid(family);
-    faPtr->size = size;
+    /*
+     * Make sure that faPtr->size will be > 0 even
+     * in the very unprobable case that size < 0
+     */
+    faPtr->size = TkFontGetPoints(tkwin, size);
     faPtr->weight = (weight > XFT_WEIGHT_MEDIUM) ? TK_FW_BOLD : TK_FW_NORMAL;
     faPtr->slant = (slant > XFT_SLANT_ROMAN) ? TK_FS_ITALIC : TK_FS_ROMAN;
     faPtr->underline = 0;
     faPtr->overstrike = 0;
 }
@@ -356,11 +361,11 @@
 	FinishedWithFont(fontPtr);
 	ckfree(fontPtr);
 	return NULL;
     }
     fontPtr->font.fid = XLoadFont(Tk_Display(tkwin), "fixed");
-    GetTkFontAttributes(ftFont, &fontPtr->font.fa);
+    GetTkFontAttributes(tkwin, ftFont, &fontPtr->font.fa);
     GetTkFontMetrics(ftFont, &fontPtr->font.fm);
     Tk_DeleteErrorHandler(handler);
     if (errorFlag) {
 	FinishedWithFont(fontPtr);
 	ckfree(fontPtr);
@@ -500,12 +505,12 @@
 {
     XftPattern *pattern;
     int weight, slant;
     UnixFtFont *fontPtr;
 
-    DEBUG(("TkpGetFontFromAttributes: %s %d %d %d\n", faPtr->family,
-	    (int)faPtr->size, faPtr->weight, faPtr->slant));
+    DEBUG(("TkpGetFontFromAttributes: %s %ld %d %d\n", faPtr->family,
+	    lround(faPtr->size), faPtr->weight, faPtr->slant));
 
     pattern = XftPatternCreate();
     if (faPtr->family) {
 	XftPatternAddString(pattern, XFT_FAMILY, faPtr->family);
     }
@@ -679,11 +684,11 @@
  *----------------------------------------------------------------------
  */
 
 void
 TkpGetFontAttrsForChar(
-    TCL_UNUSED(Tk_Window),		/* Window on the font's display */
+    Tk_Window tkwin,		/* Window on the font's display */
     Tk_Font tkfont,		/* Font to query */
     int c,         		/* Character of interest */
     TkFontAttributes *faPtr)	/* Output: Font attributes */
 {
     UnixFtFont *fontPtr = (UnixFtFont *) tkfont;
@@ -691,11 +696,11 @@
     FcChar32 ucs4 = (FcChar32) c;
 				/* UCS-4 character to map */
     XftFont *ftFont = GetFont(fontPtr, ucs4, 0.0);
 				/* Actual font used to render the character */
 
-    GetTkFontAttributes(ftFont, faPtr);
+    GetTkFontAttributes(tkwin, ftFont, faPtr);
     faPtr->underline = fontPtr->font.fa.underline;
     faPtr->overstrike = fontPtr->font.fa.overstrike;
 }
 
 int