Пример #1
0
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;
}
Пример #2
0
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;
	}
}