[ft-devel] patch requested for freetype2/internal header usage
(using font_bbox)
david turner
dturner at nds.com
Tue Jan 24 02:50:18 PST 2006
Hi Drew,
> 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.
>
>
I don't think it is useful for ordinary users of the library. The
programs that need the *exact*
values tend to be the one that are capable of parsing the Postscript
anyway, so they don't
rely on something like FreeType that tries to provide a unified
interface instead, masking
as much nasty things as possible.
> 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.
>
>
I think so
> 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?
>
>
Yes, it is, but you'll have the problem of knowing when freeing the
allocated structure
(and handling out-of-memory conditions as well properly within the
function and its
caller as well, tsss, tsss :-)
> 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?
>
>
yes, the operation is equivalent to a ceil-rounding, i.e. it will round
2.0 to 2 and 2.1 to 3
when you receive the integer values, you've already lost the fractional
part anyway, so
simply multiplying by 65536 converts the integers to the same 16.16
fixed point values.
> 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?
>
>
the values are longs. Apart from that, you're correct !
But wait, there is more: the original code is buggy !!
it should really look like the following instead:
FT_BBox *font_bbox = FT_Get_PS_Font_BBox(ti->ttface);
fprintf(out, "/FontBBox [%f %f %f %f] def\n",
font_bbox->xMin/65536.0,
font_bbox->yMin/65536.0,
font_bbox->xMax/65536.0,
font_bbox->yMax/65536.0);
that's because, according to the Type 1 spec, the values of /FontBBox
are normally expressed
in outline coordinates, as "regular" numbers. the original code produces
values that are too large
by a factor of 2**16 !!
the consequence of this is that:
- this code generates bogus values for /FontBBox already (they're huuuge)
and it seems that this has never been spotted before. In other words, it
probably isn't important at all.
- thus we can use the public face->bbox fields instead, since any loss of
accuracy due to the integer truncation is far below the radar of anything
important.
So, the correct, non-buggy code would be:
else
{
fprintf(out, "/FontBBox [%ld %ld %ld %ld] def\n",
ti->ttface->bbox->xMin,
ti->ttface->bbox->yMin * 65536,
ti->ttface->bbox->xMax * 65536,
ti->ttface->bbox->yMax * 65536);
}
and should be compatible with any release of FT2.
Hope this helps,
- David Turner
- The FreeType Project (www.freetype.org)
PS: It's sort of funny to see that the original developer went to great
lengths
(peeking within the library internals) to get the values it
needed, without
being able to use them correctly. Oh well :o)
> Thanks for the tips,
>
> Drew
>
>
>
***********************************************************************************
Information contained in this email message is confidential and may be privileged, and is intended only for use of the individual or entity named above. If the reader of this message is not the intended recipient, or the employee or agent responsible to deliver it to the intended recipient, you are hereby notified that any dissemination, distribution or copying of this communication is strictly prohibited. If you have received this communication in error, please immediately notify the postmaster at nds.com and destroy the original message.
***********************************************************************************
More information about the xorg-modular
mailing list