WinWorkstation.st
changeset 4087 7adf8102c9d9
parent 4074 b40ae99d0f76
child 4089 c6312c7dc92a
equal deleted inserted replaced
4086:49b6b4f7d055 4087:7adf8102c9d9
  4620  *         19
  4620  *         19
  4621  *         20
  4621  *         20
  4622  *       )
  4622  *       )
  4623  * CAVEAT: returns an array to avoid knowlege-need about ST-Objects (FontDescripttion) here.
  4623  * CAVEAT: returns an array to avoid knowlege-need about ST-Objects (FontDescripttion) here.
  4624  */
  4624  */
       
  4625 OBJ 
       
  4626 __charSetSymbolFor(charSet)
       
  4627 {
       
  4628     char *s;
       
  4629 
       
  4630     switch (charSet) {
       
  4631 	case ANSI_CHARSET:
       
  4632 	    s = "ms-ansi";
       
  4633 	    break;
       
  4634 	case DEFAULT_CHARSET:
       
  4635 	    s = "ms-default";
       
  4636 	    break;
       
  4637 	case SYMBOL_CHARSET:
       
  4638 	    s = "ms-symbol";
       
  4639 	    break;
       
  4640 	case SHIFTJIS_CHARSET:
       
  4641 	    s = "ms-shiftjis";
       
  4642 	    break;
       
  4643 	case GB2312_CHARSET:
       
  4644 	    s = "ms-gb2312";
       
  4645 	    break;
       
  4646 	case HANGEUL_CHARSET:
       
  4647 	    s = "ms-hangeul";
       
  4648 	    break;
       
  4649 # if defined(HANGUL_CHARSET) && (HANGUL_CHARSET != HANGEUL_CHARSET)
       
  4650 	case HANGUL_CHARSET:
       
  4651 	    s = "ms-hangul";
       
  4652 	    break;
       
  4653 # endif
       
  4654 	case CHINESEBIG5_CHARSET:
       
  4655 	    s = "ms-chinesebig5";
       
  4656 	    break;
       
  4657 	case OEM_CHARSET:
       
  4658 	    s = "ms-oem";
       
  4659 	    break;
       
  4660 # ifdef JOHAB_CHARSET
       
  4661 	case JOHAB_CHARSET:
       
  4662 	    s = "ms-johab";
       
  4663 	    break;
       
  4664 # endif
       
  4665 # ifdef HEBREW_CHARSET
       
  4666 	case HEBREW_CHARSET:
       
  4667 	    s = "ms-hebrew";
       
  4668 	    break;
       
  4669 # endif
       
  4670 # ifdef ARABIC_CHARSET
       
  4671 	case ARABIC_CHARSET:
       
  4672 	    s = "ms-arabic";
       
  4673 	    break;
       
  4674 # endif
       
  4675 # ifdef GREEK_CHARSET
       
  4676 	case GREEK_CHARSET:
       
  4677 	    s = "ms-greek";
       
  4678 	    break;
       
  4679 # endif
       
  4680 # ifdef TURKISH_CHARSET
       
  4681 	case TURKISH_CHARSET:
       
  4682 	    s = "ms-turkish";
       
  4683 	    break;
       
  4684 # endif
       
  4685 # ifdef RUSSIAN_CHARSET
       
  4686 	case RUSSIAN_CHARSET:
       
  4687 	    s = "ms-russian";
       
  4688 	    break;
       
  4689 # endif
       
  4690 # ifdef EASTEUROPE_CHARSET
       
  4691 	case EASTEUROPE_CHARSET:
       
  4692 	    s = "ms-easteurope";
       
  4693 	    break;
       
  4694 # endif
       
  4695 # ifdef BALTIC_CHARSET
       
  4696 	case BALTIC_CHARSET:
       
  4697 	    s = "ms-baltic";
       
  4698 	    break;
       
  4699 # endif
       
  4700 # ifdef VIETNAMESE_CHARSET
       
  4701 	case VIETNAMESE_CHARSET:
       
  4702 	    s = "ms-vietnamese";
       
  4703 	    break;
       
  4704 # endif
       
  4705 # ifdef THAI_CHARSET
       
  4706 	case THAI_CHARSET:
       
  4707 	    s = "ms-thai";
       
  4708 	    break;
       
  4709 # endif
       
  4710 # ifdef MAC_CHARSET
       
  4711 	case MAC_CHARSET:
       
  4712 	    s = "ms-mac";
       
  4713 	    break;
       
  4714 # endif
       
  4715 # ifdef UNICODE_CHARSET
       
  4716 	case UNICODE_CHARSET:
       
  4717 	    s = "ms-unicode";
       
  4718 	    break;
       
  4719 # endif
       
  4720 	default:
       
  4721 	    s = "unknown";
       
  4722 	    break;
       
  4723     }
       
  4724     return __MKSYMBOL(s, 0);
       
  4725 }
       
  4726 
  4625 OBJ
  4727 OBJ
  4626 __extractLogicalFontParameters(lplf) 
  4728 __extractLogicalFontParameters(lplf) 
  4627 	LOGFONT         *lplf;     /* ptr of logical-font data */
  4729 	LOGFONT         *lplf;     /* ptr of logical-font data */
  4628 {
  4730 {
  4629 	OBJ newArray, t;
  4731 	OBJ newArray, t;
  4725 	__PROTECT__(newArray);
  4827 	__PROTECT__(newArray);
  4726 	t = __MKSTRING(lplf->lfFaceName);
  4828 	t = __MKSTRING(lplf->lfFaceName);
  4727 	__UNPROTECT__(newArray);
  4829 	__UNPROTECT__(newArray);
  4728 	__ArrayInstPtr(newArray)->a_element[15] = t; __STORE(newArray, t);
  4830 	__ArrayInstPtr(newArray)->a_element[15] = t; __STORE(newArray, t);
  4729 
  4831 
  4730 	switch (lplf->lfCharSet) {
       
  4731 	    case ANSI_CHARSET:
       
  4732 		s = "ms-ansi";
       
  4733 		break;
       
  4734 	    case DEFAULT_CHARSET:
       
  4735 		s = "ms-default";
       
  4736 		break;
       
  4737 	    case SYMBOL_CHARSET:
       
  4738 		s = "ms-symbol";
       
  4739 		break;
       
  4740 	    case SHIFTJIS_CHARSET:
       
  4741 		s = "ms-shiftjis";
       
  4742 		break;
       
  4743 	    case GB2312_CHARSET:
       
  4744 		s = "ms-gb2312";
       
  4745 		break;
       
  4746 	    case HANGEUL_CHARSET:
       
  4747 		s = "ms-hangeul";
       
  4748 		break;
       
  4749 # if defined(HANGUL_CHARSET) && (HANGUL_CHARSET != HANGEUL_CHARSET)
       
  4750 	    case HANGUL_CHARSET:
       
  4751 		s = "ms-hangul";
       
  4752 		break;
       
  4753 # endif
       
  4754 	    case CHINESEBIG5_CHARSET:
       
  4755 		s = "ms-chinesebig5";
       
  4756 		break;
       
  4757 	    case OEM_CHARSET:
       
  4758 		s = "ms-oem";
       
  4759 		break;
       
  4760 # ifdef JOHAB_CHARSET
       
  4761 	    case JOHAB_CHARSET:
       
  4762 		s = "ms-johab";
       
  4763 		break;
       
  4764 # endif
       
  4765 # ifdef HEBREW_CHARSET
       
  4766 	    case HEBREW_CHARSET:
       
  4767 		s = "ms-hebrew";
       
  4768 		break;
       
  4769 # endif
       
  4770 # ifdef ARABIC_CHARSET
       
  4771 	    case ARABIC_CHARSET:
       
  4772 		s = "ms-arabic";
       
  4773 		break;
       
  4774 # endif
       
  4775 # ifdef GREEK_CHARSET
       
  4776 	    case GREEK_CHARSET:
       
  4777 		s = "ms-greek";
       
  4778 		break;
       
  4779 # endif
       
  4780 # ifdef TURKISH_CHARSET
       
  4781 	    case TURKISH_CHARSET:
       
  4782 		s = "ms-turkish";
       
  4783 		break;
       
  4784 # endif
       
  4785 # ifdef RUSSIAN_CHARSET
       
  4786 	    case RUSSIAN_CHARSET:
       
  4787 		s = "ms-russian";
       
  4788 		break;
       
  4789 # endif
       
  4790 # ifdef EASTEUROPE_CHARSET
       
  4791 	    case EASTEUROPE_CHARSET:
       
  4792 		s = "ms-easteurope";
       
  4793 		break;
       
  4794 # endif
       
  4795 # ifdef BALTIC_CHARSET
       
  4796 	    case BALTIC_CHARSET:
       
  4797 		s = "ms-baltic";
       
  4798 		break;
       
  4799 # endif
       
  4800 # ifdef VIETNAMESE_CHARSET
       
  4801 	    case VIETNAMESE_CHARSET:
       
  4802 		s = "ms-vietnamese";
       
  4803 		break;
       
  4804 # endif
       
  4805 # ifdef THAI_CHARSET
       
  4806 	    case THAI_CHARSET:
       
  4807 		s = "ms-thai";
       
  4808 		break;
       
  4809 # endif
       
  4810 # ifdef MAC_CHARSET
       
  4811 	    case MAC_CHARSET:
       
  4812 		s = "ms-mac";
       
  4813 		break;
       
  4814 # endif
       
  4815 # ifdef UNICODE_CHARSET
       
  4816 	    case UNICODE_CHARSET:
       
  4817 		s = "ms-unicode";
       
  4818 		break;
       
  4819 # endif
       
  4820 	    default:
       
  4821 		s = "unknown";
       
  4822 		break;
       
  4823 	}
       
  4824 	__PROTECT__(newArray);
  4832 	__PROTECT__(newArray);
  4825 	t = __MKSYMBOL(s, 0);
  4833 	t = __charSetSymbolFor(lplf->lfCharSet);
  4826 	__UNPROTECT__(newArray);
  4834 	__UNPROTECT__(newArray);
  4827 	__ArrayInstPtr(newArray)->a_element[16] = t; __STORE(newArray, t);
  4835 	__ArrayInstPtr(newArray)->a_element[16] = t; __STORE(newArray, t);
  4828 
  4836 
  4829 	return newArray;
  4837 	return newArray;
  4830 }
  4838 }
  8021      and evaluate the 3-arg block, aBlock with them"
  8029      and evaluate the 3-arg block, aBlock with them"
  8022 
  8030 
  8023     |val|
  8031     |val|
  8024 
  8032 
  8025     self getScaledRGBFrom:index into:[:r :g :b |
  8033     self getScaledRGBFrom:index into:[:r :g :b |
  8026         val := aBlock
  8034 	val := aBlock
  8027                 value:(r * 100.0 / 16rFFFF)
  8035 		value:(r * 100.0 / 16rFFFF)
  8028                 value:(g * 100.0 / 16rFFFF)
  8036 		value:(g * 100.0 / 16rFFFF)
  8029                 value:(b * 100.0 / 16rFFFF)
  8037 		value:(b * 100.0 / 16rFFFF)
  8030     ].
  8038     ].
  8031     "/ 'get RGB' printCR.
  8039     "/ 'get RGB' printCR.
  8032     ^ val
  8040     ^ val
  8033 !
  8041 !
  8034 
  8042 
 10987 fontMetricsOf:fontId
 10995 fontMetricsOf:fontId
 10988     "return a fonts metrics info object"
 10996     "return a fonts metrics info object"
 10989 
 10997 
 10990     |rawData info|
 10998     |rawData info|
 10991 
 10999 
 10992     rawData := Array new:10.
 11000     rawData := Array new:15.
 10993     (self primFontMetricsOf:fontId intoArray:rawData) isNil ifTrue:[
 11001     (self primFontMetricsOf:fontId intoArray:rawData) isNil ifTrue:[
 10994 	self primitiveFailed.
 11002 	self primitiveFailed.
 10995 	^ self
 11003 	^ self
 10996     ].
 11004     ].
 10997 
 11005 
 11001       descent:(rawData at:2)
 11009       descent:(rawData at:2)
 11002       maxAscent:(rawData at:3)
 11010       maxAscent:(rawData at:3)
 11003       maxDescent:(rawData at:4)
 11011       maxDescent:(rawData at:4)
 11004       minWidth:(rawData at:5)
 11012       minWidth:(rawData at:5)
 11005       maxWidth:(rawData at:6)
 11013       maxWidth:(rawData at:6)
 11006       avgWidth:(rawData at:7).
 11014       avgWidth:(rawData at:7)
 11007 
 11015       minCode:(rawData at:8)
       
 11016       maxCode:16rFFFF "(rawData at:9)"
       
 11017       direction:nil
       
 11018       encoding:(rawData at:11).
 11008     ^ info
 11019     ^ info
 11009 !
 11020 !
 11010 
 11021 
 11011 fontsInFamily:aFamilyName face:aFaceName filtering:filter
 11022 fontsInFamily:aFamilyName face:aFaceName filtering:filter
 11012     "return a set of all available fonts in aFamily/aFace on this display.
 11023     "return a set of all available fonts in aFamily/aFace on this display.
 11505       maxAscent  -> (data at:3)
 11516       maxAscent  -> (data at:3)
 11506       maxDescent -> (data at:4)
 11517       maxDescent -> (data at:4)
 11507       minWidth   -> (data at:5)
 11518       minWidth   -> (data at:5)
 11508       maxWidth   -> (data at:6)
 11519       maxWidth   -> (data at:6)
 11509       avgWidth   -> (data at:7).
 11520       avgWidth   -> (data at:7).
       
 11521       minChar    -> (data at:8).
       
 11522       maxChar    -> (data at:9).
       
 11523       defaultChar-> (data at:10).
       
 11524       charSet    -> (data at:11).
 11510 "
 11525 "
 11511 
 11526 
 11512 %{  
 11527 %{  
 11513 
 11528 
 11514     if (__isExternalAddress(fontId)
 11529     if (__isExternalAddress(fontId)
 11515      && __isArray(rawData)
 11530      && __isArray(rawData)
 11516      && (__arraySize(rawData) >= 7)) {
 11531      && (__arraySize(rawData) >= 11)) {
 11517 	SIZE size;
 11532 	SIZE size;
 11518 	int avgWidth;
 11533 	int avgWidth;
 11519 	HGDIOBJ hFont;
 11534 	HGDIOBJ hFont;
 11520 	HGDIOBJ prevFont;
 11535 	HGDIOBJ prevFont;
 11521 	TEXTMETRIC tmet;
 11536 	TEXTMETRIC tmet;
 11522 	static char *s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
 11537 	static char *s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
 11523 	static int len;
 11538 	static int len;
       
 11539 	OBJ t;
 11524 
 11540 
 11525 	hFont = _HGDIOBJVal(fontId);
 11541 	hFont = _HGDIOBJVal(fontId);
 11526 
 11542 
 11527 	/*
 11543 	/*
 11528 	 * temporarily set this font in the tmpDC (root-) context
 11544 	 * temporarily set this font in the tmpDC (root-) context
 11536 	    __tmpDC_hfont = hFont;
 11552 	    __tmpDC_hfont = hFont;
 11537 	}
 11553 	}
 11538 #else
 11554 #else
 11539 	prevFont = SelectObject(__tmpDC, hFont);
 11555 	prevFont = SelectObject(__tmpDC, hFont);
 11540 #endif
 11556 #endif
 11541 	GetTextMetrics(__tmpDC, &tmet);
 11557 	GetTextMetricsW(__tmpDC, &tmet);
 11542 	if (len == 0) {
 11558 	if (len == 0) {
 11543 	    len = strlen(s);
 11559 	    len = strlen(s);
 11544 	}
 11560 	}
       
 11561 #if 0
 11545 	GetTextExtentPoint32(__tmpDC, s, len, &size);
 11562 	GetTextExtentPoint32(__tmpDC, s, len, &size);
       
 11563 	avgWidth = (size.cx / (len / 2) + 1) / 2;
       
 11564 #else
       
 11565 	avgWidth = tmet.tmAveCharWidth;
       
 11566 #endif
       
 11567 
 11546 #ifndef CACHE_LAST_TMP_FONT
 11568 #ifndef CACHE_LAST_TMP_FONT
 11547 	SelectObject(__tmpDC, prevFont);
 11569 	SelectObject(__tmpDC, prevFont);
 11548 #endif
 11570 #endif
 11549 	avgWidth = (size.cx / (len / 2) + 1) / 2;
       
 11550 
 11571 
 11551 	__ArrayInstPtr(rawData)->a_element[0] = __MKSMALLINT(tmet.tmAscent);        /* ascent     -> (data at:1) */
 11572 	__ArrayInstPtr(rawData)->a_element[0] = __MKSMALLINT(tmet.tmAscent);        /* ascent     -> (data at:1) */
 11552 	__ArrayInstPtr(rawData)->a_element[1] = __MKSMALLINT(tmet.tmDescent);       /* descent    -> (data at:2) */
 11573 	__ArrayInstPtr(rawData)->a_element[1] = __MKSMALLINT(tmet.tmDescent);       /* descent    -> (data at:2) */
 11553 	__ArrayInstPtr(rawData)->a_element[2] = __MKSMALLINT(tmet.tmAscent);        /* maxAscent  -> (data at:3) */
 11574 	__ArrayInstPtr(rawData)->a_element[2] = __MKSMALLINT(tmet.tmAscent);        /* maxAscent  -> (data at:3) */
 11554 	__ArrayInstPtr(rawData)->a_element[3] = __MKSMALLINT(tmet.tmDescent);       /* maxDescent -> (data at:4) */
 11575 	__ArrayInstPtr(rawData)->a_element[3] = __MKSMALLINT(tmet.tmDescent);       /* maxDescent -> (data at:4) */
 11555 	__ArrayInstPtr(rawData)->a_element[4] = __MKSMALLINT(avgWidth);             /* minWidth   -> (data at:5) */
 11576 	__ArrayInstPtr(rawData)->a_element[4] = __MKSMALLINT(avgWidth);             /* minWidth   -> (data at:5) */
 11556 	__ArrayInstPtr(rawData)->a_element[5] = __MKSMALLINT(tmet.tmMaxCharWidth);  /* maxWidth   -> (data at:6) */
 11577 	__ArrayInstPtr(rawData)->a_element[5] = __MKSMALLINT(tmet.tmMaxCharWidth);  /* maxWidth   -> (data at:6) */
 11557 	__ArrayInstPtr(rawData)->a_element[6] = __MKSMALLINT(avgWidth);             /* avgWidth   -> (data at:7) */
 11578 	__ArrayInstPtr(rawData)->a_element[6] = __MKSMALLINT(avgWidth);             /* avgWidth   -> (data at:7) */
       
 11579 	__ArrayInstPtr(rawData)->a_element[7] = __MKSMALLINT(tmet.tmFirstChar);     /* min        -> (data at:8) */
       
 11580 	__ArrayInstPtr(rawData)->a_element[8] = __MKSMALLINT(tmet.tmLastChar);      /* max        -> (data at:9) */
       
 11581 	__ArrayInstPtr(rawData)->a_element[9] = __MKSMALLINT(tmet.tmDefaultChar);   /* default    -> (data at:10) */
       
 11582 	t = __charSetSymbolFor(tmet.tmCharSet);
       
 11583 	__ArrayInstPtr(rawData)->a_element[10]= t; __STORE(rawData, t);             /* charSet    -> (data at:11) */
 11558 
 11584 
 11559 	DPRINTF(("textMetrics h=%x  avgAsc=%d avgDesc=%d minW=%d maxW=%d avgW=%d\n",
 11585 	DPRINTF(("textMetrics h=%x  avgAsc=%d avgDesc=%d minW=%d maxW=%d avgW=%d\n",
 11560 		    hFont, tmet.tmAscent, tmet.tmDescent, avgWidth, tmet.tmMaxCharWidth,
 11586 		    hFont, tmet.tmAscent, tmet.tmDescent, avgWidth, tmet.tmMaxCharWidth,
 11561 		    tmet.tmAveCharWidth));
 11587 		    tmet.tmAveCharWidth));
 11562 	RETURN (self);
 11588 	RETURN (self);
 15722 ! !
 15748 ! !
 15723 
 15749 
 15724 !WinWorkstation class methodsFor:'documentation'!
 15750 !WinWorkstation class methodsFor:'documentation'!
 15725 
 15751 
 15726 version
 15752 version
 15727     ^ '$Header: /cvs/stx/stx/libview/WinWorkstation.st,v 1.256 2004-03-05 18:37:20 cg Exp $'
 15753     ^ '$Header: /cvs/stx/stx/libview/WinWorkstation.st,v 1.257 2004-03-10 15:41:34 ca Exp $'
 15728 ! !
 15754 ! !
 15729 
 15755 
 15730 WinWorkstation initialize!
 15756 WinWorkstation initialize!