Esempio n. 1
0
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;
}
Esempio n. 2
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;
}
Esempio n. 3
0
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;
}
Esempio n. 4
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;
}
Esempio n. 5
0
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;
	}
}