WinWorkstation.st
changeset 4087 7adf8102c9d9
parent 4074 b40ae99d0f76
child 4089 c6312c7dc92a
--- a/WinWorkstation.st	Wed Mar 10 15:19:48 2004 +0100
+++ b/WinWorkstation.st	Wed Mar 10 16:41:34 2004 +0100
@@ -4622,6 +4622,108 @@
  *       )
  * CAVEAT: returns an array to avoid knowlege-need about ST-Objects (FontDescripttion) here.
  */
+OBJ 
+__charSetSymbolFor(charSet)
+{
+    char *s;
+
+    switch (charSet) {
+	case ANSI_CHARSET:
+	    s = "ms-ansi";
+	    break;
+	case DEFAULT_CHARSET:
+	    s = "ms-default";
+	    break;
+	case SYMBOL_CHARSET:
+	    s = "ms-symbol";
+	    break;
+	case SHIFTJIS_CHARSET:
+	    s = "ms-shiftjis";
+	    break;
+	case GB2312_CHARSET:
+	    s = "ms-gb2312";
+	    break;
+	case HANGEUL_CHARSET:
+	    s = "ms-hangeul";
+	    break;
+# if defined(HANGUL_CHARSET) && (HANGUL_CHARSET != HANGEUL_CHARSET)
+	case HANGUL_CHARSET:
+	    s = "ms-hangul";
+	    break;
+# endif
+	case CHINESEBIG5_CHARSET:
+	    s = "ms-chinesebig5";
+	    break;
+	case OEM_CHARSET:
+	    s = "ms-oem";
+	    break;
+# ifdef JOHAB_CHARSET
+	case JOHAB_CHARSET:
+	    s = "ms-johab";
+	    break;
+# endif
+# ifdef HEBREW_CHARSET
+	case HEBREW_CHARSET:
+	    s = "ms-hebrew";
+	    break;
+# endif
+# ifdef ARABIC_CHARSET
+	case ARABIC_CHARSET:
+	    s = "ms-arabic";
+	    break;
+# endif
+# ifdef GREEK_CHARSET
+	case GREEK_CHARSET:
+	    s = "ms-greek";
+	    break;
+# endif
+# ifdef TURKISH_CHARSET
+	case TURKISH_CHARSET:
+	    s = "ms-turkish";
+	    break;
+# endif
+# ifdef RUSSIAN_CHARSET
+	case RUSSIAN_CHARSET:
+	    s = "ms-russian";
+	    break;
+# endif
+# ifdef EASTEUROPE_CHARSET
+	case EASTEUROPE_CHARSET:
+	    s = "ms-easteurope";
+	    break;
+# endif
+# ifdef BALTIC_CHARSET
+	case BALTIC_CHARSET:
+	    s = "ms-baltic";
+	    break;
+# endif
+# ifdef VIETNAMESE_CHARSET
+	case VIETNAMESE_CHARSET:
+	    s = "ms-vietnamese";
+	    break;
+# endif
+# ifdef THAI_CHARSET
+	case THAI_CHARSET:
+	    s = "ms-thai";
+	    break;
+# endif
+# ifdef MAC_CHARSET
+	case MAC_CHARSET:
+	    s = "ms-mac";
+	    break;
+# endif
+# ifdef UNICODE_CHARSET
+	case UNICODE_CHARSET:
+	    s = "ms-unicode";
+	    break;
+# endif
+	default:
+	    s = "unknown";
+	    break;
+    }
+    return __MKSYMBOL(s, 0);
+}
+
 OBJ
 __extractLogicalFontParameters(lplf) 
 	LOGFONT         *lplf;     /* ptr of logical-font data */
@@ -4727,102 +4829,8 @@
 	__UNPROTECT__(newArray);
 	__ArrayInstPtr(newArray)->a_element[15] = t; __STORE(newArray, t);
 
-	switch (lplf->lfCharSet) {
-	    case ANSI_CHARSET:
-		s = "ms-ansi";
-		break;
-	    case DEFAULT_CHARSET:
-		s = "ms-default";
-		break;
-	    case SYMBOL_CHARSET:
-		s = "ms-symbol";
-		break;
-	    case SHIFTJIS_CHARSET:
-		s = "ms-shiftjis";
-		break;
-	    case GB2312_CHARSET:
-		s = "ms-gb2312";
-		break;
-	    case HANGEUL_CHARSET:
-		s = "ms-hangeul";
-		break;
-# if defined(HANGUL_CHARSET) && (HANGUL_CHARSET != HANGEUL_CHARSET)
-	    case HANGUL_CHARSET:
-		s = "ms-hangul";
-		break;
-# endif
-	    case CHINESEBIG5_CHARSET:
-		s = "ms-chinesebig5";
-		break;
-	    case OEM_CHARSET:
-		s = "ms-oem";
-		break;
-# ifdef JOHAB_CHARSET
-	    case JOHAB_CHARSET:
-		s = "ms-johab";
-		break;
-# endif
-# ifdef HEBREW_CHARSET
-	    case HEBREW_CHARSET:
-		s = "ms-hebrew";
-		break;
-# endif
-# ifdef ARABIC_CHARSET
-	    case ARABIC_CHARSET:
-		s = "ms-arabic";
-		break;
-# endif
-# ifdef GREEK_CHARSET
-	    case GREEK_CHARSET:
-		s = "ms-greek";
-		break;
-# endif
-# ifdef TURKISH_CHARSET
-	    case TURKISH_CHARSET:
-		s = "ms-turkish";
-		break;
-# endif
-# ifdef RUSSIAN_CHARSET
-	    case RUSSIAN_CHARSET:
-		s = "ms-russian";
-		break;
-# endif
-# ifdef EASTEUROPE_CHARSET
-	    case EASTEUROPE_CHARSET:
-		s = "ms-easteurope";
-		break;
-# endif
-# ifdef BALTIC_CHARSET
-	    case BALTIC_CHARSET:
-		s = "ms-baltic";
-		break;
-# endif
-# ifdef VIETNAMESE_CHARSET
-	    case VIETNAMESE_CHARSET:
-		s = "ms-vietnamese";
-		break;
-# endif
-# ifdef THAI_CHARSET
-	    case THAI_CHARSET:
-		s = "ms-thai";
-		break;
-# endif
-# ifdef MAC_CHARSET
-	    case MAC_CHARSET:
-		s = "ms-mac";
-		break;
-# endif
-# ifdef UNICODE_CHARSET
-	    case UNICODE_CHARSET:
-		s = "ms-unicode";
-		break;
-# endif
-	    default:
-		s = "unknown";
-		break;
-	}
 	__PROTECT__(newArray);
-	t = __MKSYMBOL(s, 0);
+	t = __charSetSymbolFor(lplf->lfCharSet);
 	__UNPROTECT__(newArray);
 	__ArrayInstPtr(newArray)->a_element[16] = t; __STORE(newArray, t);
 
@@ -8023,10 +8031,10 @@
     |val|
 
     self getScaledRGBFrom:index into:[:r :g :b |
-        val := aBlock
-                value:(r * 100.0 / 16rFFFF)
-                value:(g * 100.0 / 16rFFFF)
-                value:(b * 100.0 / 16rFFFF)
+	val := aBlock
+		value:(r * 100.0 / 16rFFFF)
+		value:(g * 100.0 / 16rFFFF)
+		value:(b * 100.0 / 16rFFFF)
     ].
     "/ 'get RGB' printCR.
     ^ val
@@ -10989,7 +10997,7 @@
 
     |rawData info|
 
-    rawData := Array new:10.
+    rawData := Array new:15.
     (self primFontMetricsOf:fontId intoArray:rawData) isNil ifTrue:[
 	self primitiveFailed.
 	^ self
@@ -11003,8 +11011,11 @@
       maxDescent:(rawData at:4)
       minWidth:(rawData at:5)
       maxWidth:(rawData at:6)
-      avgWidth:(rawData at:7).
-
+      avgWidth:(rawData at:7)
+      minCode:(rawData at:8)
+      maxCode:16rFFFF "(rawData at:9)"
+      direction:nil
+      encoding:(rawData at:11).
     ^ info
 !
 
@@ -11507,13 +11518,17 @@
       minWidth   -> (data at:5)
       maxWidth   -> (data at:6)
       avgWidth   -> (data at:7).
+      minChar    -> (data at:8).
+      maxChar    -> (data at:9).
+      defaultChar-> (data at:10).
+      charSet    -> (data at:11).
 "
 
 %{  
 
     if (__isExternalAddress(fontId)
      && __isArray(rawData)
-     && (__arraySize(rawData) >= 7)) {
+     && (__arraySize(rawData) >= 11)) {
 	SIZE size;
 	int avgWidth;
 	HGDIOBJ hFont;
@@ -11521,6 +11536,7 @@
 	TEXTMETRIC tmet;
 	static char *s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
 	static int len;
+	OBJ t;
 
 	hFont = _HGDIOBJVal(fontId);
 
@@ -11538,15 +11554,20 @@
 #else
 	prevFont = SelectObject(__tmpDC, hFont);
 #endif
-	GetTextMetrics(__tmpDC, &tmet);
+	GetTextMetricsW(__tmpDC, &tmet);
 	if (len == 0) {
 	    len = strlen(s);
 	}
+#if 0
 	GetTextExtentPoint32(__tmpDC, s, len, &size);
+	avgWidth = (size.cx / (len / 2) + 1) / 2;
+#else
+	avgWidth = tmet.tmAveCharWidth;
+#endif
+
 #ifndef CACHE_LAST_TMP_FONT
 	SelectObject(__tmpDC, prevFont);
 #endif
-	avgWidth = (size.cx / (len / 2) + 1) / 2;
 
 	__ArrayInstPtr(rawData)->a_element[0] = __MKSMALLINT(tmet.tmAscent);        /* ascent     -> (data at:1) */
 	__ArrayInstPtr(rawData)->a_element[1] = __MKSMALLINT(tmet.tmDescent);       /* descent    -> (data at:2) */
@@ -11555,6 +11576,11 @@
 	__ArrayInstPtr(rawData)->a_element[4] = __MKSMALLINT(avgWidth);             /* minWidth   -> (data at:5) */
 	__ArrayInstPtr(rawData)->a_element[5] = __MKSMALLINT(tmet.tmMaxCharWidth);  /* maxWidth   -> (data at:6) */
 	__ArrayInstPtr(rawData)->a_element[6] = __MKSMALLINT(avgWidth);             /* avgWidth   -> (data at:7) */
+	__ArrayInstPtr(rawData)->a_element[7] = __MKSMALLINT(tmet.tmFirstChar);     /* min        -> (data at:8) */
+	__ArrayInstPtr(rawData)->a_element[8] = __MKSMALLINT(tmet.tmLastChar);      /* max        -> (data at:9) */
+	__ArrayInstPtr(rawData)->a_element[9] = __MKSMALLINT(tmet.tmDefaultChar);   /* default    -> (data at:10) */
+	t = __charSetSymbolFor(tmet.tmCharSet);
+	__ArrayInstPtr(rawData)->a_element[10]= t; __STORE(rawData, t);             /* charSet    -> (data at:11) */
 
 	DPRINTF(("textMetrics h=%x  avgAsc=%d avgDesc=%d minW=%d maxW=%d avgW=%d\n",
 		    hFont, tmet.tmAscent, tmet.tmDescent, avgWidth, tmet.tmMaxCharWidth,
@@ -15724,7 +15750,7 @@
 !WinWorkstation class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libview/WinWorkstation.st,v 1.256 2004-03-05 18:37:20 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libview/WinWorkstation.st,v 1.257 2004-03-10 15:41:34 ca Exp $'
 ! !
 
 WinWorkstation initialize!