[ft-devel] patch requested for freetype2/internal header usage
(using font_bbox)
Drew Parsons
dparsons at debian.org
Mon Jan 23 16:55:35 PST 2006
On Mon, 2006-01-23 at 11:20 +0100, david turner wrote:
> Hello Drew,
>
> If this assumptions holds true (i.e. Xprint basically uses its own
> copy of FreeType
> instead of the one installed on the system), it is at least safe from
> the 2.2 install
> problems we described recently. Good to know.
Yes, that's been the case up till now with the X.org monolithic build. A
copy of Freetype was held in the extras directory. The new modular
build is intended to loosen up tight code dependencies, so I understand
X.org's X11R7 would prefer to use the normal installed version of
Freetype, using its public API, rather than continuing to keep a version
bindled with the X.org code.
> - there is a public field named "bbox" in the FT_Face structure that
> receives
> the global font bounding box in EM units. This is slightly different
> from the
> so-called Type 1 "font_bbox" values that are accessed by the code, which
> are all expressed in 16.16 fixed point values.
>
> For example, the face->bbox fields are populated by code that is found
> here in the CVS sources:
>
> src/type1/t1objs.c (403):
> root->bbox.xMin = type1->font_bbox.xMin >> 16;
> root->bbox.yMin = type1->font_bbox.yMin >> 16;
> root->bbox.xMax = ( type1->font_bbox.xMax + 0xFFFFU ) >> 16;
> root->bbox.yMax = ( type1->font_bbox.yMax + 0xFFFFU ) >> 16;
>
...
> Now, it all depends wether Xprint needs the original exact values or not.
>
> A/ in one hand, we can imagine it could use the face->bbox fields, multiply
> them by 65536 to obtain "equivalent" values. This may create a slightly
> larger bounding box *if* the original values were decimal, instead of
> integers.
>
> First of all, I don't think that this will be the majority of cases.
> Second, I'm
> not even certain that this would have any impact on Xprint's output.
>
> B/ on the other hand, we can also imagine that Xprint wants the *absolutely*
> exact values, without truncating/rounding. Then, we can provide you with
> a small high-level API that implements this "feature" in a clean way. For
> example by getting the Type42 values from the TrueType container
> as well :-)
>
I think your option A would probably be safe. But if you do think
providing the API would be generally useful, then let me know when it's
implemented, I could upgrade the Xprint to use it in the future.
> This code would depend on a newer version of FreeType though.
Yes, it's probably better for Xprint users not to necessarily have to
force them to upgrade their version of Freetype, I think. So working
around the cooordinate conversion is probably best for now.
Let me see if I have the idea right. I would simply want to replace
FT_Get_PS_Font_BBox( ) to look something like:
static FT_BBox *
FT_Get_PS_Font_BBox( FT_Face face )
{
const char *driver_name;
FT_BBox *font_bbox = malloc(sizeof( FT_BBox ) );
if ( face )
{
font_bbox->xMin = face->bbox.xMin * 65536;
font_bbox->yMin = face->bbox.yMin * 65536;
font_bbox->xMax = face->bbox.xMax * 65536;
font_bbox->yMax = face->bbox.yMax * 65536;
}
return font_bbox;
}
Is that the general idea?
xMax and yMax also added 0xFFFFU ("root->bbox.xMax =
( type1->font_bbox.xMax + 0xFFFFU ) >> 16;" instead of just
"root->bbox.xMin = type1->font_bbox.xMin >> 16;"), so is simply
multiplying by 65536 really all I need to do?
Actually, mallocing the font_bbox like this will be a nuisance since I'd
have to be careful to deallocate afterwards. I might therefore prefer
to use "face->bbox.xMin * 65536" directly in
PSType3_generateOutlineFont:
else
{
fprintf(out, "/FontBBox [%d %d %d %d] def\n",
(int)ti->ttface->bbox->xMin * 65536,
(int)ti->ttface->bbox->yMin * 65536,
(int)ti->ttface->bbox->xMax * 65536,
(int)ti->ttface->bbox->yMax * 65536);
}
instead of
else
{
FT_BBox *font_bbox = FT_Get_PS_Font_BBox(ti->ttface);
fprintf(out, "/FontBBox [%d %d %d %d] def\n",
(int)font_bbox->xMin,
(int)font_bbox->yMin,
(int)font_bbox->xMax,
(int)font_bbox->yMax);
}
I suspect I can remove the (int) cast here too, since the face->bbox
values are already integers, would that be correct?
Thanks for the tips,
Drew
More information about the xorg-modular
mailing list