OpBpath *MacOpSVGFont::GetGlyphOutline(uni_char uc) { static OpGlyphCallbackStruct data; data.path = new OpBpath(); 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 result = noErr; if(kATSQuadCurveType != mCurveType) ATSUGlyphGetCubicPaths(((MacOpFont*)m_font)->GetATSUStyle(1.0), glyph, mMoveToUPP, mLineToUPP, mCurveToUPP, mClosePathUPP, &data, &result); else ATSUGlyphGetQuadraticPaths(((MacOpFont*)m_font)->GetATSUStyle(1.0), glyph, mQuadNewPathUPP, mQuadLineUPP, mQuadCurveUPP, mQuadClosePathUPP, &data, &result); } return data.path; }
void GetGlyphBBox_AAT(ATSUStyle style, UInt16 gid, GlyphBBox* bbox) /* returns glyph bounding box in TeX points */ { ATSCurveType curveType; OSStatus status; bbox->xMin = 65536.0; bbox->yMin = 65536.0; bbox->xMax = -65536.0; bbox->yMax = -65536.0; status = ATSUGetNativeCurveType(style, &curveType); if (status == noErr) { OSStatus cbStatus; if (curveType == kATSCubicCurveType) { static ATSCubicMoveToUPP cubicMoveToProc; static ATSCubicLineToUPP cubicLineToProc; static ATSCubicCurveToUPP cubicCurveToProc; static ATSCubicClosePathUPP cubicClosePathProc; if (cubicMoveToProc == NULL) { cubicMoveToProc = NewATSCubicMoveToUPP(&CubicMoveTo); cubicLineToProc = NewATSCubicLineToUPP(&CubicLineTo); cubicCurveToProc = NewATSCubicCurveToUPP(&CubicCurveTo); cubicClosePathProc = NewATSCubicClosePathUPP(&CubicClosePath); } status = ATSUGlyphGetCubicPaths(style, gid, cubicMoveToProc, cubicLineToProc, cubicCurveToProc, cubicClosePathProc, bbox, &cbStatus); } else { static ATSQuadraticNewPathUPP quadraticNewPathProc; static ATSQuadraticLineUPP quadraticLineProc; static ATSQuadraticCurveUPP quadraticCurveProc; static ATSQuadraticClosePathUPP quadraticClosePathProc; if (quadraticNewPathProc == NULL) { quadraticNewPathProc = NewATSQuadraticNewPathUPP(&QuadraticNewPath); quadraticLineProc = NewATSQuadraticLineUPP(&QuadraticLine); quadraticCurveProc = NewATSQuadraticCurveUPP(&QuadraticCurve); quadraticClosePathProc = NewATSQuadraticClosePathUPP(&QuadraticClosePath); } status = ATSUGlyphGetQuadraticPaths(style, gid, quadraticNewPathProc, quadraticLineProc, quadraticCurveProc, quadraticClosePathProc, bbox, &cbStatus); } } if (status != noErr || bbox->xMin == 65536.0) bbox->xMin = bbox->yMin = bbox->xMax = bbox->yMax = 0; else { // convert PS to TeX points and flip y-axis float tmp = bbox->yMin; bbox->yMin = -bbox->yMax * 72.27 / 72.0; bbox->yMax = -tmp * 72.27 / 72.0; bbox->xMin *= 72.27 / 72.0; bbox->xMax *= 72.27 / 72.0; } }