Mercurial > octave
comparison libinterp/corefcn/ft-text-renderer.cc @ 28305:6e8d5c99263c
Produce better looking TeX superscript and subscripts (bug #58376).
* NEWS: Announce changes.
* ft-text-renderer.cc (visit (text_element_superscript& e)): Scale down
font size 70% of the parent font size. Shift baseline +40% of the parent
font size.
* ft-text-renderer.cc (visit (text_element_subscript& e)): Scale down font size
70% of the parent font size. Shift baseline -15% of the parent font size.
* octave-svgconvert.cc (draw): Translate font-size string to double rather than
to int.
author | Pantxo Diribarne <pantxo.diribarne@gmail.com> |
---|---|
date | Sat, 16 May 2020 15:53:42 +0200 |
parents | 11d66485fc19 |
children | 98889de398dd |
comparison
equal
deleted
inserted
replaced
28304:144d77f3f829 | 28305:6e8d5c99263c |
---|---|
1097 { | 1097 { |
1098 ft_font saved_font (font); | 1098 ft_font saved_font (font); |
1099 int saved_line_yoffset = line_yoffset; | 1099 int saved_line_yoffset = line_yoffset; |
1100 int saved_yoffset = yoffset; | 1100 int saved_yoffset = yoffset; |
1101 | 1101 |
1102 double sz = font.get_size (); | |
1103 | |
1104 // Reducing font size by 70% produces decent results. | |
1102 set_font (font.get_name (), font.get_weight (), font.get_angle (), | 1105 set_font (font.get_name (), font.get_weight (), font.get_angle (), |
1103 font.get_size () - 2); | 1106 std::max (5.0, sz * 0.7)); |
1104 | 1107 |
1105 if (font.is_valid ()) | 1108 if (font.is_valid ()) |
1106 { | 1109 { |
1107 int h = font.get_face ()->size->metrics.height >> 6; | 1110 // Shifting the baseline by 15% of the font size gives decent results. |
1108 | 1111 yoffset -= std::ceil (sz * 0.15); |
1109 // Shifting the baseline by 2/3 the font height seems to produce | |
1110 // decent result. | |
1111 yoffset -= (h * 2) / 3; | |
1112 | 1112 |
1113 if (mode == MODE_BBOX) | 1113 if (mode == MODE_BBOX) |
1114 update_line_bbox (); | 1114 update_line_bbox (); |
1115 } | 1115 } |
1116 | 1116 |
1128 { | 1128 { |
1129 ft_font saved_font (font); | 1129 ft_font saved_font (font); |
1130 int saved_line_yoffset = line_yoffset; | 1130 int saved_line_yoffset = line_yoffset; |
1131 int saved_yoffset = yoffset; | 1131 int saved_yoffset = yoffset; |
1132 | 1132 |
1133 double sz = font.get_size (); | |
1134 | |
1135 // Reducing font size by 70% produces decent results. | |
1133 set_font (font.get_name (), font.get_weight (), font.get_angle (), | 1136 set_font (font.get_name (), font.get_weight (), font.get_angle (), |
1134 font.get_size () - 2); | 1137 std::max (5.0, sz * 0.7)); |
1135 | 1138 |
1136 if (saved_font.is_valid ()) | 1139 if (saved_font.is_valid ()) |
1137 { | 1140 { |
1138 int s_asc = saved_font.get_face ()->size->metrics.ascender >> 6; | 1141 // Shifting the baseline by 40% of the font size gives decent results. |
1139 | 1142 yoffset += std::ceil (sz * 0.4); |
1140 // Shifting the baseline by 2/3 base font ascender seems to produce | |
1141 // decent result. | |
1142 yoffset += (s_asc * 2) / 3; | |
1143 | 1143 |
1144 if (mode == MODE_BBOX) | 1144 if (mode == MODE_BBOX) |
1145 update_line_bbox (); | 1145 update_line_bbox (); |
1146 } | 1146 } |
1147 | 1147 |