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