rem: do_math_spacing(Metrics &metrics, Cff::Font *font, const DvipsEncoding &dvipsenc, const OpenType::Cmap &cmap)
add: do_math_spacing(Metrics &metrics, const FontInfo &finfo, const DvipsEncoding &dvipsenc)
context: do_math_spacing(Metrics &metrics, Cff::Font *font,		const DvipsEncoding &dvipsenc, const OpenType::Cmap &cmap){    Transform font_xform;    if (extend)	font_xform.scale(extend, 1);    if (slant)	font_xform.shear(slant);    CharstringBounds boundser(font_xform);    int x_height = font_xheight(font, cmap, font_xform);    double slant = font_slant(font);    int boundary_char = dvipsenc.boundary_char();        int bounds[4], width;        for (int code = 0; code < 256; code++) {	int g = metrics.glyph(code);	if (g != 0 && g != Metrics::VIRTUAL_GLYPH && code != boundary_char) {	    if (char_bounds(bounds, width, font, cmap, code, font_xform)) {		int left_sb = (bounds[0] < 0 ? -bounds[0] : 0);		metrics.add_single_positioning(code, left_sb, 0, left_sb);				if (skew_char >= 0) {		    double virtual_height = (bounds[3] > x_height ? bounds[3] :x_height) - 0.5 * x_height;		    int right_sb = (bounds[2] > width ? bounds[2] - width : 0);		    int skew = (int)(slant * virtual_height + left_sb - right_sb);		    metrics.add_kern(code, skew_char, skew);		}	    }	}    }}