comparison src/w32term.c @ 24146:9ed2245a9b79

(W32_TEXTOUT): New macro. (dumpglyphs): Support BDF fonts. Use W32_TEXTOUT macro. Simplify baseline calculation. Detect SJIS by font, not glyph. Call SetTextAlign. (syms_of_w32term): Remove "jisx0212-sjis" from w32-charset-to-codepage-alist. Replace "ksc5601" with "ksc5601.1987" in w32-charset-to-codepage-alist. Add "ksc5601.1992' to w32-charset-to-codepage-alist.
author Geoff Voelker <voelker@cs.washington.edu>
date Fri, 22 Jan 1999 19:58:37 +0000
parents 34f6ec762e5e
children c5f1a1deffbb
comparison
equal deleted inserted replaced
24145:95d0947c83b2 24146:9ed2245a9b79
540 ((ch & 0xff00) >> 8) 540 ((ch & 0xff00) >> 8)
541 541
542 #define BYTE2(ch) \ 542 #define BYTE2(ch) \
543 (ch & 0x00ff) 543 (ch & 0x00ff)
544 544
545 #define W32_TEXTOUT(start_offset,nchars) \
546 { \
547 int charset_dim = CHARSET_DIMENSION(charset); \
548 if (font->bdf) \
549 w32_BDF_TextOut (font->bdf, hdc, left + xoffset, \
550 top + yoffset, \
551 x_1byte_buffer + start_offset, \
552 charset_dim, charset_dim * nchars, 0); \
553 else if (print_via_unicode) \
554 ExtTextOutW (hdc, left + xoffset, top + yoffset, \
555 fuOptions, clip_region, \
556 x_2byte_buffer + start_offset, nchars, NULL); \
557 else \
558 ExtTextOut (hdc, left + xoffset, top + yoffset, \
559 fuOptions, clip_region, \
560 x_1byte_buffer + start_offset, \
561 nchars * charset_dim, NULL); \
562 start_offset += nchars * (print_via_unicode ? 1 : charset_dim ); \
563 xoffset += nchars * glyph_width; \
564 }
545 565
546 /* Display a sequence of N glyphs found at GP. 566 /* Display a sequence of N glyphs found at GP.
547 WINDOW is the window to output to. LEFT and TOP are starting coords. 567 WINDOW is the window to output to. LEFT and TOP are starting coords.
548 HL is 1 if this text is highlighted, 2 if the cursor is on it, 568 HL is 1 if this text is highlighted, 2 if the cursor is on it,
549 3 if should appear in its mouse-face. 569 3 if should appear in its mouse-face.
687 fill background in advance in the following cases: 707 fill background in advance in the following cases:
688 1) A face has stipple. 708 1) A face has stipple.
689 2) A height of font is shorter than LINE_HEIGHT. 709 2) A height of font is shorter than LINE_HEIGHT.
690 3) Drawing a composite character. 710 3) Drawing a composite character.
691 4) Font has non-zero _MULE_BASELINE_OFFSET property. 711 4) Font has non-zero _MULE_BASELINE_OFFSET property.
712 5) Font is a bdf font.
692 After filling background, we draw glyphs by XDrawString16. */ 713 After filling background, we draw glyphs by XDrawString16. */
693 int background_filled; 714 int background_filled;
694 /* Baseline position of a character, offset from TOP. */ 715 /* Baseline position of a character, offset from TOP. */
695 int baseline; 716 int baseline;
696 /* The property value of `_MULE_RELATIVE_COMPOSE' and 717 /* The property value of `_MULE_RELATIVE_COMPOSE' and
697 `_MULE_DEFAULT_ASCENT'. */ 718 `_MULE_DEFAULT_ASCENT'. */
698 int relative_compose = 0, default_ascent = 0; 719 int relative_compose = 0, default_ascent = 0;
699 /* 1 if we find no font or a font of inappropriate size. */ 720 /* 1 if we find no font or a font of inappropriate size. */
700 int require_clipping; 721 int require_clipping;
722 RECT clip_rectangle;
723 LPRECT clip_region = NULL;
724 UINT fuOptions = 0;
725
701 int codepage = CP_DEFAULT; 726 int codepage = CP_DEFAULT;
702 BOOL print_via_unicode = FALSE; 727 BOOL print_via_unicode = FALSE;
703 728
704 /* HL = 3 means use a mouse face previously chosen. */ 729 /* HL = 3 means use a mouse face previously chosen. */
705 if (hl == 3) 730 if (hl == 3)
742 charset, NULL, fontset))) 767 charset, NULL, fontset)))
743 goto font_not_found; 768 goto font_not_found;
744 769
745 font = (XFontStruct *) (fontp->font); 770 font = (XFontStruct *) (fontp->font);
746 codepage = w32_codepage_for_font (fontp->name); 771 codepage = w32_codepage_for_font (fontp->name);
772
773 if ( font && !font->bdf )
747 print_via_unicode = w32_use_unicode_for_codepage (codepage); 774 print_via_unicode = w32_use_unicode_for_codepage (codepage);
748 775
749 /* tmLastChar will only exceed 255 if TEXTMETRICW is used 776 baseline = FONT_BASE (font) + fontp->baseline_offset;
750 (ie on NT but not on 95). In this case there is no harm
751 in being wrong, so have a go anyway. */
752 baseline =
753 (font->tm.tmLastChar > 255
754 ? (line_height + font->tm.tmAscent - font->tm.tmDescent) / 2
755 : f->output_data.w32->font_baseline - fontp->baseline_offset);
756 if (FONT_HEIGHT (font) <= line_height
757 && (font->tm.tmAscent > baseline
758 || font->tm.tmDescent > line_height - baseline))
759 /* Adjust baseline for this font to show the whole
760 glyphs in a line. */
761 baseline = line_height - font->tm.tmDescent;
762 777
763 if (cmpcharp && cmpcharp->cmp_rule == NULL) 778 if (cmpcharp && cmpcharp->cmp_rule == NULL)
764 { 779 {
765 relative_compose = fontp->relative_compose; 780 relative_compose = fontp->relative_compose;
766 default_ascent = fontp->default_ascent; 781 default_ascent = fontp->default_ascent;
806 #else /* Assume multidimensional charsets stay so. */ 821 #else /* Assume multidimensional charsets stay so. */
807 *cp = BUILD_WCHAR_T (ccl->reg[1],ccl->reg[2]); 822 *cp = BUILD_WCHAR_T (ccl->reg[1],ccl->reg[2]);
808 #endif 823 #endif
809 } 824 }
810 } 825 }
811 /* Japanese Kanji are a special case under w32, as they
812 must be printed in SJIS rather than EUC. */
813 else if ((charset == charset_jisx0208)
814 || (charset == charset_jisx0208_1978)
815 || (charset == charset_id_internal ("japanese-jisx0212")))
816 {
817 int sjis1, sjis2;
818 for (cp = x_2byte_buffer; cp < x_2byte_buffer + len; cp++)
819 {
820 ENCODE_SJIS (BYTE1 (*cp), BYTE2 (*cp), sjis1, sjis2);
821 *cp = BUILD_WCHAR_T (sjis1, sjis2);
822 }
823 }
824 else if (fontp->encoding[charset]) 826 else if (fontp->encoding[charset])
825 { 827 {
826 int enc = fontp->encoding[charset]; 828 int enc = fontp->encoding[charset];
827 829
828 if ((enc == 1 || enc == 2) && CHARSET_DIMENSION (charset) == 2) 830 if ((enc == 1 || enc == 2) && CHARSET_DIMENSION (charset) == 2)
829 for (cp = x_2byte_buffer; cp < x_2byte_buffer + len; cp++) 831 for (cp = x_2byte_buffer; cp < x_2byte_buffer + len; cp++)
830 *cp = BUILD_WCHAR_T (BYTE1 (*cp) | 0x80, BYTE2 (*cp)); 832 *cp = BUILD_WCHAR_T (BYTE1 (*cp) | 0x80, BYTE2 (*cp));
831 if (enc == 1 || enc == 3) 833 if (enc == 1 || enc == 3)
832 for (cp = x_2byte_buffer; cp < x_2byte_buffer + len; cp++) 834 for (cp = x_2byte_buffer; cp < x_2byte_buffer + len; cp++)
833 *cp = BUILD_WCHAR_T (BYTE1 (*cp), BYTE2 (*cp) | 0x80); 835 *cp = BUILD_WCHAR_T (BYTE1 (*cp), BYTE2 (*cp) | 0x80);
836 /* Special encoding for SJIS Kanji. */
837 if (enc == 4)
838 {
839 if (CHARSET_DIMENSION (charset) == 2)
840 {
841 int sjis1, sjis2;
842 for (cp = x_2byte_buffer;
843 cp < x_2byte_buffer + len; cp++)
844 {
845 ENCODE_SJIS (BYTE1 (*cp), BYTE2 (*cp),
846 sjis1, sjis2);
847 *cp = BUILD_WCHAR_T (sjis1, sjis2);
848 }
849 }
850 else
851 for (cp = x_2byte_buffer;
852 cp < x_2byte_buffer + len; cp++)
853 *cp = BUILD_WCHAR_T (BYTE1 (*cp),
854 BYTE2 (*cp) | 0x80);
855 }
834 } 856 }
835 } 857 }
836 else 858 else
837 { 859 {
838 font_not_found: 860 font_not_found:
842 if (!font || font == (XFontStruct *) FACE_DEFAULT) 864 if (!font || font == (XFontStruct *) FACE_DEFAULT)
843 font = FRAME_FONT (f); 865 font = FRAME_FONT (f);
844 baseline = FONT_BASE (FRAME_FONT (f)); 866 baseline = FONT_BASE (FRAME_FONT (f));
845 if (charset == charset_latin_iso8859_1) 867 if (charset == charset_latin_iso8859_1)
846 { 868 {
847 if (font->tm.tmLastChar < 0x80) 869 if (!font->bdf && font->tm.tmLastChar < 0x80)
848 /* This font can't display Latin1 characters. */ 870 /* This font can't display Latin1 characters. */
849 font = NULL; 871 font = NULL;
850 else 872 else
851 { 873 {
852 for (cp = x_2byte_buffer; 874 for (cp = x_2byte_buffer;
909 } 931 }
910 } 932 }
911 933
912 if (font) 934 if (font)
913 require_clipping = (!NILP (Vclip_large_size_font) 935 require_clipping = (!NILP (Vclip_large_size_font)
914 && (font->tm.tmAscent > baseline 936 && ((font->bdf
915 || font->tm.tmDescent > 937 ? (font->bdf->ury > baseline
916 line_height - baseline 938 || font->bdf->lly > line_height - baseline)
917 || (!cmpcharp 939 : (font->tm.tmAscent > baseline
918 && FONT_MAX_WIDTH (font) > glyph_width))); 940 || font->tm.tmDescent > line_height - baseline))
941 || (!cmpcharp && FONT_MAX_WIDTH (font) > glyph_width)));
919 942
920 if (font && (just_foreground || (cmpcharp && gidx > 0))) 943 if (font && (just_foreground || (cmpcharp && gidx > 0)))
921 background_filled = 1; 944 background_filled = 1;
922 945
923 /* Stippling not supported under w32. */ 946 /* Stippling not supported under w32. */
924 947
925 else if (!font 948 else if (!font
949 || font->bdf
926 || FONT_HEIGHT (font) < line_height 950 || FONT_HEIGHT (font) < line_height
927 || FONT_WIDTH (font) < glyph_width 951 || FONT_WIDTH (font) < glyph_width
928 || FONT_MAX_WIDTH (font) != FONT_WIDTH (font) 952 || FONT_MAX_WIDTH (font) != FONT_WIDTH (font)
929 || cmpcharp) 953 || cmpcharp)
930 { 954 {
944 background_filled = 0; 968 background_filled = 0;
945 969
946 SetBkMode (hdc, background_filled ? TRANSPARENT : OPAQUE); 970 SetBkMode (hdc, background_filled ? TRANSPARENT : OPAQUE);
947 SetTextColor (hdc, fg); 971 SetTextColor (hdc, fg);
948 SetBkColor (hdc, bg); 972 SetBkColor (hdc, bg);
973 SetTextAlign (hdc, TA_BASELINE | TA_LEFT);
949 974
950 if ( print_via_unicode ) 975 if ( print_via_unicode )
951 n_chars = MultiByteToWideChar 976 n_chars = MultiByteToWideChar
952 (codepage, 0, x_1byte_buffer, n_chars, 977 (codepage, 0, x_1byte_buffer, n_chars,
953 x_2byte_buffer, FRAME_WINDOW_WIDTH (f)); 978 x_2byte_buffer, FRAME_WINDOW_WIDTH (f));
954 979
955 if (font) 980 if (font)
956 { 981 {
982 if (font->hfont)
957 SelectObject (hdc, font->hfont); 983 SelectObject (hdc, font->hfont);
958 984
959 if (!cmpcharp) 985 if (!cmpcharp)
960 { 986 {
961 int multibyte_pos_offset = 0; 987 int xoffset = 0, yoffset = baseline;
962 if (require_clipping || FONT_WIDTH (font) != glyph_width 988 if (require_clipping || FONT_WIDTH (font) != glyph_width
963 || FONT_MAX_WIDTH (font) != FONT_WIDTH (font)) 989 || FONT_MAX_WIDTH (font) != FONT_WIDTH (font))
964 { 990 {
965 RECT clip_rectangle; 991 /* The incrementing of i in this loop is done
966 LPRECT clip_region = NULL; 992 inside the W32_CHAROUT macro. */
967 UINT fuOptions = 0; 993 for (i = 0; i < n_chars; )
968
969 for (i = 0; i < n_chars; i++)
970 { 994 {
971 if (require_clipping) 995 if (require_clipping)
972 { 996 {
973 /* Set up a clipping rectangle for ExtTextOut */ 997 /* Set up a clipping rectangle for ExtTextOut */
974 fuOptions |= ETO_CLIPPED; 998 fuOptions |= ETO_CLIPPED;
977 = left + (i + 1) * glyph_width; 1001 = left + (i + 1) * glyph_width;
978 clip_rectangle.top = top; 1002 clip_rectangle.top = top;
979 clip_rectangle.bottom = top + line_height; 1003 clip_rectangle.bottom = top + line_height;
980 clip_region = &clip_rectangle; 1004 clip_region = &clip_rectangle;
981 } 1005 }
982 1006 W32_TEXTOUT (i, 1);
983 /* baseline works differently on w32 than X,
984 leave it out for now. */
985 if (print_via_unicode)
986 ExtTextOutW (hdc, left + glyph_width * i,
987 top /*+ baseline*/, fuOptions,
988 clip_region, x_2byte_buffer + i,
989 1, NULL);
990 else if (CHARSET_DIMENSION (charset) > 1)
991 {
992 /* Keep character together */
993 int n = CHARSET_DIMENSION (charset) ;
994 ExtTextOut (hdc, left + multibyte_pos_offset,
995 top /*+ baseline*/, fuOptions,
996 clip_region, x_1byte_buffer + i,
997 n, NULL);
998 /* fiddle i. */
999 i += n - 1;
1000 multibyte_pos_offset += glyph_width;
1001 }
1002 else
1003 ExtTextOut (hdc, left + glyph_width * i,
1004 top /*+ baseline*/, fuOptions,
1005 clip_region, x_1byte_buffer + i,
1006 1, NULL);
1007 } 1007 }
1008 } 1008 }
1009 else 1009 else
1010 { 1010 {
1011 /* Print the whole run of characters. */ 1011 i = 0;
1012 if (print_via_unicode) 1012 W32_TEXTOUT (i, n_chars);
1013 TextOutW (hdc, left, top /*+ baseline*/,
1014 x_2byte_buffer, n_chars);
1015 else
1016 TextOut (hdc, left, top /*+ baseline*/,
1017 x_1byte_buffer, n_chars);
1018 } 1013 }
1019 } 1014 }
1020 else 1015 else
1021 { 1016 {
1022 /* Handle composite characters. */ 1017 /* Handle composite characters. */
1040 && gidx == 0) 1035 && gidx == 0)
1041 { 1036 {
1042 /* This is the first character. Initialize variables. 1037 /* This is the first character. Initialize variables.
1043 HIGHEST is the highest position of glyphs ever 1038 HIGHEST is the highest position of glyphs ever
1044 written, LOWEST the lowest position. */ 1039 written, LOWEST the lowest position. */
1045 int x_offset = 0; 1040 int xoffset = 0;
1041 int yoffset = baseline;
1042 int start = 0;
1046 1043
1047 if (default_ascent 1044 if (default_ascent
1048 && CHAR_TABLE_P (Vuse_default_ascent) 1045 && CHAR_TABLE_P (Vuse_default_ascent)
1049 && !NILP (Faref (Vuse_default_ascent, first_ch))) 1046 && !NILP (Faref (Vuse_default_ascent, first_ch)))
1050 { 1047 {
1051 highest = default_ascent; 1048 highest = default_ascent;
1052 lowest = 0; 1049 lowest = 0;
1053 } 1050 }
1054 else 1051 /* TODO: per char metrics for Truetype and BDF
1052 fonts. */
1055 { 1053 {
1056 /* Per char metrics not supported on w32 - use 1054 highest = FONT_BASE (font) + 1;
1057 font's metrics. */ 1055 lowest = - (FONT_HEIGHT (font) - FONT_BASE (font));
1058 highest = font->tm.tmAscent + 1;
1059 lowest = - font->tm.tmDescent;
1060 } 1056 }
1061 1057
1062 if (cmpcharp->cmp_rule) 1058 if (cmpcharp->cmp_rule)
1063 x_offset = (int)(cmpcharp->col_offset[0] 1059 xoffset = (int)(cmpcharp->col_offset[0]
1064 * FONT_WIDTH (FRAME_FONT (f))); 1060 * FONT_WIDTH (FRAME_FONT (f)));
1065 1061
1066 i = 1; 1062 i = 1;
1067 1063
1068 /* Truetype fonts often contain underhangs to 1064 /* Truetype fonts often contain underhangs to
1078 *x_1byte_buffer, 1074 *x_1byte_buffer,
1079 &char_placement)) 1075 &char_placement))
1080 { 1076 {
1081 char_width = char_placement.abcA 1077 char_width = char_placement.abcA
1082 + char_placement.abcB + char_placement.abcC; 1078 + char_placement.abcB + char_placement.abcC;
1083 x_offset += FONT_WIDTH (font) - char_width; 1079 xoffset += FONT_WIDTH (font) - char_width;
1084 } 1080 }
1085 /* Don't let characters go beyond the glyph 1081 /* Don't let characters go beyond the glyph
1086 boundary whatever their over/underhangs. */ 1082 boundary whatever their over/underhangs. */
1087 if (x_offset > glyph_width - char_width) 1083 if (xoffset > glyph_width - char_width)
1088 x_offset = glyph_width - char_width; 1084 xoffset = glyph_width - char_width;
1089 1085
1090 if (x_offset < 0) 1086 if (xoffset < 0)
1091 x_offset = 0; 1087 xoffset = 0;
1092 1088
1093 /* Draw the first character at the normal position. */ 1089 /* Draw the first character at the normal
1094 if (print_via_unicode) 1090 position. */
1095 ExtTextOutW (hdc, left + x_offset, 1091 W32_TEXTOUT (start, 1);
1096 top /*+ baseline*/,
1097 fuOptions, clip_region,
1098 x_2byte_buffer, 1, NULL);
1099 else if (CHARSET_DIMENSION (charset) > 1)
1100 {
1101 /* Keep character together */
1102 int n = CHARSET_DIMENSION (charset) ;
1103 ExtTextOut (hdc, left + x_offset,
1104 top /*+ baseline*/,
1105 fuOptions, clip_region,
1106 x_1byte_buffer, n, NULL);
1107 /* fiddle i. */
1108 i += n - 1;
1109 }
1110 else
1111 ExtTextOut (hdc, left + x_offset,
1112 top /*+ baseline*/,
1113 fuOptions, clip_region,
1114 x_1byte_buffer, 1, NULL);
1115 gidx++; 1092 gidx++;
1116 } 1093 }
1117 else 1094 else
1118 i = 0; 1095 i = 0;
1119 1096
1120 for (; i < n_chars; i++, gidx++) 1097 for (; i < n_chars; gidx++)
1121 { 1098 {
1122 int x_offset = 0, y_offset = 0; 1099 int xoffset = 0, yoffset = FONT_BASE (font);
1123 1100
1124 if (relative_compose) 1101 if (relative_compose)
1125 { 1102 {
1126 /* No per char metrics on w32. */ 1103 /* No per char metrics on w32. */
1127 if (NILP (Vignore_relative_composition) 1104 if (NILP (Vignore_relative_composition)
1128 || NILP (Faref (Vignore_relative_composition, 1105 || NILP (Faref (Vignore_relative_composition,
1129 make_number (cmpcharp->glyph[gidx])))) 1106 make_number (cmpcharp->glyph[gidx]))))
1130 { 1107 {
1131 if (- font->tm.tmDescent >= relative_compose) 1108 if (- (FONT_HEIGHT (font) - FONT_BASE (font))
1109 >= relative_compose)
1132 { 1110 {
1133 /* Draw above the current glyphs. */ 1111 /* Draw above the current glyphs. */
1134 y_offset = highest + font->tm.tmDescent; 1112 yoffset = highest + FONT_HEIGHT (font);
1135 highest += font->tm.tmAscent 1113 highest += FONT_HEIGHT (font);
1136 + font->tm.tmDescent;
1137 } 1114 }
1138 else if (font->tm.tmAscent <= 0) 1115 else if (FONT_BASE (font) <= 0)
1139 { 1116 {
1140 /* Draw beneath the current glyphs. */ 1117 /* Draw beneath the current glyphs. */
1141 y_offset = lowest - font->tm.tmAscent; 1118 yoffset = lowest;
1142 lowest -= font->tm.tmAscent 1119 lowest -= FONT_HEIGHT (font);
1143 + font->tm.tmDescent;
1144 } 1120 }
1145 } 1121 }
1146 else 1122 else
1147 { 1123 {
1148 /* Draw the glyph at normal position. If 1124 /* Draw the glyph at normal position. If
1149 it sticks out of HIGHEST or LOWEST, 1125 it sticks out of HIGHEST or LOWEST,
1150 update them appropriately. */ 1126 update them appropriately. */
1151 if (font->tm.tmAscent > highest) 1127 if (FONT_BASE (font) > highest)
1152 highest = font->tm.tmAscent; 1128 highest = FONT_BASE (font);
1153 else if (- font->tm.tmDescent < lowest) 1129 else if (- (FONT_HEIGHT (font) - FONT_BASE (font))
1154 lowest = - font->tm.tmDescent; 1130 < lowest)
1131 lowest = - (FONT_HEIGHT (font) -
1132 FONT_BASE (font));
1155 } 1133 }
1156 } 1134 }
1157 else if (cmpcharp->cmp_rule) 1135 else if (cmpcharp->cmp_rule)
1158 { 1136 {
1159 int gref = (cmpcharp->cmp_rule[gidx] - 0xA0) / 9; 1137 int gref = (cmpcharp->cmp_rule[gidx] - 0xA0) / 9;
1168 1146
1169 /* No per char metrics on w32. */ 1147 /* No per char metrics on w32. */
1170 bottom = ((gref == 0 ? highest : gref == 1 ? 0 1148 bottom = ((gref == 0 ? highest : gref == 1 ? 0
1171 : gref == 2 ? lowest 1149 : gref == 2 ? lowest
1172 : (highest + lowest) / 2) 1150 : (highest + lowest) / 2)
1173 - (nref == 0 ? font->tm.tmAscent 1151 - (nref == 0 ? FONT_HEIGHT (font)
1174 + font->tm.tmDescent 1152 : nref == 1 ? (FONT_HEIGHT (font) -
1175 : nref == 1 ? font->tm.tmDescent 1153 FONT_BASE (font))
1176 : nref == 2 ? 0 1154 : nref == 2 ? 0
1177 : (font->tm.tmAscent + 1155 : (FONT_HEIGHT (font) / 2)));
1178 font->tm.tmDescent) / 2)); 1156 top = bottom + FONT_HEIGHT (font);
1179 top = bottom + (font->tm.tmAscent + 1157
1180 font->tm.tmDescent);
1181 if (top > highest) 1158 if (top > highest)
1182 highest = top; 1159 highest = top;
1183 if (bottom < lowest) 1160 if (bottom < lowest)
1184 lowest = bottom; 1161 lowest = bottom;
1185 y_offset = bottom + font->tm.tmDescent; 1162 yoffset = bottom + FONT_HEIGHT (font);
1186 x_offset = (int)(cmpcharp->col_offset[gidx] 1163 xoffset = (int)(cmpcharp->col_offset[gidx]
1187 * FONT_WIDTH (FRAME_FONT(f))); 1164 * FONT_WIDTH (FRAME_FONT(f)));
1188 } 1165 }
1189 1166
1190 /* Truetype fonts often contain underhangs to 1167 /* Truetype fonts often contain underhangs to
1191 handle composition characters. This works 1168 handle composition characters. This works
1200 *(x_1byte_buffer + i), 1177 *(x_1byte_buffer + i),
1201 &char_placement)) 1178 &char_placement))
1202 { 1179 {
1203 char_width = char_placement.abcA 1180 char_width = char_placement.abcA
1204 + char_placement.abcB + char_placement.abcC; 1181 + char_placement.abcB + char_placement.abcC;
1205 x_offset += FONT_WIDTH (font) - char_width; 1182 xoffset += FONT_WIDTH (font) - char_width;
1206 } 1183 }
1207 /* Don't let characters go beyond the glyph 1184 /* Don't let characters go beyond the glyph
1208 boundary whatever their over/underhangs. */ 1185 boundary whatever their over/underhangs. */
1209 if (x_offset > glyph_width - char_width) 1186 if (xoffset > glyph_width - char_width)
1210 x_offset = glyph_width - char_width; 1187 xoffset = glyph_width - char_width;
1211 1188
1212 if (x_offset < 0) 1189 if (xoffset < 0)
1213 x_offset = 0; 1190 xoffset = 0;
1214 1191
1215 if (print_via_unicode) 1192 W32_TEXTOUT (i, 1);
1216 ExtTextOutW (hdc, left + x_offset,
1217 top /*+ baseline - y_offset*/,
1218 fuOptions, clip_region,
1219 x_2byte_buffer + i, 1, NULL);
1220 else if (CHARSET_DIMENSION (charset) > 1)
1221 {
1222 /* Keep character together */
1223 int n = CHARSET_DIMENSION (charset) ;
1224 ExtTextOut (hdc, left + x_offset,
1225 top /*+ baseline - y_offset*/,
1226 fuOptions, clip_region,
1227 x_1byte_buffer + i, n, NULL);
1228 /* fiddle i. */
1229 i += n - 1;
1230 }
1231 else
1232 ExtTextOut (hdc, left + x_offset,
1233 top /*+ baseline - y_offset*/,
1234 fuOptions, clip_region,
1235 x_1byte_buffer + i, 1, NULL);
1236 } 1193 }
1237 } 1194 }
1238 } 1195 }
1239 if (!font) 1196 if (!font)
1240 { 1197 {
1264 current font results in shaky underline if it strides 1221 current font results in shaky underline if it strides
1265 over different fonts. So, we set the position based only 1222 over different fonts. So, we set the position based only
1266 on the default font of this frame. */ 1223 on the default font of this frame. */
1267 int underline_position = 1; 1224 int underline_position = 1;
1268 1225
1269 if (FRAME_FONT (f)->tm.tmDescent <= underline_position) 1226 if (FONT_HEIGHT (FRAME_FONT (f)) - FONT_BASE(FRAME_FONT (f))
1270 underline_position = FRAME_FONT (f)->tm.tmDescent - 1; 1227 <= underline_position)
1228 underline_position = (FONT_HEIGHT (FRAME_FONT (f)) -
1229 FONT_BASE(FRAME_FONT (f))) - 1;
1271 1230
1272 if (face->underline) 1231 if (face->underline)
1273 w32_fill_area (f, hdc, fg, left, 1232 w32_fill_area (f, hdc, fg, left,
1274 top + FONT_BASE (FRAME_FONT (f)) 1233 top + FONT_BASE (FRAME_FONT (f))
1275 + underline_position, 1234 + underline_position,
4176 if (!fontp) 4135 if (!fontp)
4177 return Qnil; 4136 return Qnil;
4178 4137
4179 FRAME_FONT (f) = (XFontStruct *) (fontp->font); 4138 FRAME_FONT (f) = (XFontStruct *) (fontp->font);
4180 f->output_data.w32->font_baseline 4139 f->output_data.w32->font_baseline
4181 = FRAME_FONT(f)->tm.tmAscent + fontp->baseline_offset; 4140 = FONT_BASE (FRAME_FONT (f)) + fontp->baseline_offset;
4182 FRAME_FONTSET (f) = -1; 4141 FRAME_FONTSET (f) = -1;
4183 4142
4184 /* Compute the scroll bar width in character columns. */ 4143 /* Compute the scroll bar width in character columns. */
4185 if (f->scroll_bar_pixel_width > 0) 4144 if (f->scroll_bar_pixel_width > 0)
4186 { 4145 {
5153 Far-East Languages on Windows 95/98 from working properly.\n\ 5112 Far-East Languages on Windows 95/98 from working properly.\n\
5154 NT uses Unicode internally anyway, so this flag will probably have no\n\ 5113 NT uses Unicode internally anyway, so this flag will probably have no\n\
5155 affect on NT machines."); 5114 affect on NT machines.");
5156 w32_enable_unicode_output = 1; 5115 w32_enable_unicode_output = 1;
5157 5116
5158 /* w32-charset-to-codepage-alist is initialized in w32-win.el. */
5159 DEFVAR_LISP ("w32-charset-to-codepage-alist", 5117 DEFVAR_LISP ("w32-charset-to-codepage-alist",
5160 &Vw32_charset_to_codepage_alist, 5118 &Vw32_charset_to_codepage_alist,
5161 "Alist linking character sets to Windows Codepages."); 5119 "Alist linking character sets to Windows Codepages.");
5162 Vw32_charset_to_codepage_alist = Qnil; 5120 Vw32_charset_to_codepage_alist = Qnil;
5163 /* Initialise the alist with some defaults. */ 5121 /* Initialise the alist with some defaults. */
5167 XSETFASTINT (codepage, 950); 5125 XSETFASTINT (codepage, 950);
5168 store_in_alist (&Vw32_charset_to_codepage_alist, 5126 store_in_alist (&Vw32_charset_to_codepage_alist,
5169 build_string ("big5"), codepage); 5127 build_string ("big5"), codepage);
5170 XSETFASTINT (codepage, 949); 5128 XSETFASTINT (codepage, 949);
5171 store_in_alist (&Vw32_charset_to_codepage_alist, 5129 store_in_alist (&Vw32_charset_to_codepage_alist,
5172 build_string ("ksc5601"), codepage); 5130 build_string ("ksc5601.1987"), codepage);
5173 XSETFASTINT (codepage, 932); 5131 XSETFASTINT (codepage, 1361);
5174 /* SJIS only contains a subset of JISX0212, but list it anyway. */
5175 store_in_alist (&Vw32_charset_to_codepage_alist, 5132 store_in_alist (&Vw32_charset_to_codepage_alist,
5176 build_string ("jisx0212-sjis"), codepage); 5133 build_string ("ksc5601.1992"), codepage);
5177 XSETFASTINT (codepage, 932); 5134 XSETFASTINT (codepage, 932);
5178 store_in_alist (&Vw32_charset_to_codepage_alist, 5135 store_in_alist (&Vw32_charset_to_codepage_alist,
5179 build_string ("jisx0208-sjis"), codepage); 5136 build_string ("jisx0208-sjis"), codepage);
5180 XSETFASTINT (codepage, 874); 5137 XSETFASTINT (codepage, 874);
5181 store_in_alist (&Vw32_charset_to_codepage_alist, 5138 store_in_alist (&Vw32_charset_to_codepage_alist,