SVGnumber MacOpSVGFont::GetGlyphAdvance(uni_char uc) { ATSGlyphIdealMetrics metrics[1]; GlyphID glyphs[1]; if(m_font) { GlyphID glyph = 0; #ifdef USE_CG_SHOW_GLYPHS glyph = ((MacOpFont*)m_font)->GetGlyphID((UniChar)uc); #else #if 0 if(!mGlyphInfoArray) { ((MacOpFont*)m_font)->GetGlyphs(m_text, mGlyphInfoArray); } if(mGlyphInfoArray) glyph = mGlyphInfoArray->glyphs[gnum].glyphID; #endif #endif OSStatus err = noErr; glyphs[0] = glyph; err = ATSUGlyphGetIdealMetrics(((MacOpFont*)m_font)->GetATSUStyle(1.0), 1, glyphs, 0, metrics); if(err == noErr) { return metrics[0].advance.x; } } return 0; }
static cairo_status_t _cairo_atsui_font_glyph_extents(void *abstract_font, cairo_glyph_t * glyphs, int num_glyphs, cairo_text_extents_t * extents) { cairo_atsui_font_t *font = abstract_font; OSStatus err; assert(num_glyphs == 1); GlyphID theGlyph = glyphs[0].index; ATSGlyphIdealMetrics metricsH, metricsV; ATSUStyle style; ATSUCreateAndCopyStyle(font->unscaled_style, &style); err = ATSUGlyphGetIdealMetrics(style, 1, &theGlyph, 0, &metricsH); ATSUVerticalCharacterType verticalType = kATSUStronglyVertical; const ATSUAttributeTag theTag[] = { kATSUVerticalCharacterTag }; const ByteCount theSizes[] = { sizeof(verticalType) }; ATSUAttributeValuePtr theValues[] = { &verticalType }; err = ATSUSetAttributes(style, 1, theTag, theSizes, theValues); err = ATSUGlyphGetIdealMetrics(style, 1, &theGlyph, 0, &metricsV); extents->x_bearing = metricsH.sideBearing.x; extents->y_bearing = metricsV.advance.y; extents->width = metricsH.advance.x - metricsH.sideBearing.x - metricsH.otherSideBearing.x; extents->height = -metricsV.advance.y - metricsV.sideBearing.y - metricsV.otherSideBearing.y; extents->x_advance = metricsH.advance.x; extents->y_advance = 0; ATSUDisposeStyle(style); return CAIRO_STATUS_SUCCESS; }
float GetGlyphWidth_AAT(ATSUStyle style, UInt16 gid) /* returns TeX points */ { ATSGlyphIdealMetrics metrics; OSStatus status = ATSUGlyphGetIdealMetrics(style, 1, &gid, 0, &metrics); if (status == noErr) return PStoTeXPoints(metrics.advance.x); else return 0; }
float GetGlyphItalCorr_AAT(ATSUStyle style, UInt16 gid) { float rval = 0.0; ATSGlyphIdealMetrics metrics; OSStatus status = ATSUGlyphGetIdealMetrics(style, 1, &gid, 0, &metrics); if (status == noErr) { GlyphBBox bbox; GetGlyphBBox_AAT(style, gid, &bbox); if (bbox.xMax > PStoTeXPoints(metrics.advance.x)) rval = bbox.xMax - PStoTeXPoints(metrics.advance.x); } return rval; }
void GetGlyphSidebearings_AAT(ATSUStyle style, UInt16 gid, float* lsb, float* rsb) /* returns TeX points */ { ATSGlyphIdealMetrics metrics; OSStatus status = ATSUGlyphGetIdealMetrics(style, 1, &gid, 0, &metrics); if (status == noErr) { GlyphBBox bbox; GetGlyphBBox_AAT(style, gid, &bbox); *lsb = bbox.xMin; *rsb = PStoTeXPoints(metrics.advance.x) - bbox.xMax; } else { *lsb = *rsb = 0; } }