freetype
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [ft] Fw: freetype cache and glyph metrics


From: Brady Duga
Subject: Re: [ft] Fw: freetype cache and glyph metrics
Date: Wed, 29 Sep 2010 11:12:58 -0700

Again, I really don't think you want descenders per-glyph. So, say you want to 
draw some text on a line. If we consider the upper-left of the screen to be 0,0 
with y increasing as we go down, and you want to draw a line whose baseline is 
at y=100, then you:

set x to 0
set y to 100
for every glyph:
  get cached glyph info
  draw bitmap at x+glyph.left, y - glyph.top
  set x to x + glyph.advance.x

This will place all your glyphs on the same baseline. If you really want to 
know how much of the glyph extends below the line, then it is just the bitmap 
height minus top.

--Brady

On Sep 29, 2010, at 11:04 AM, Michael Plitkins wrote:

> Yes it does work, but there is still no way to get the descender. The
> FT_GlyphRec already has some of the FT_Glyph_Metrics information in
> the form of the advance. Why doesn't the FT_GlyphRec contain the
> remaining information? Memory concerns? Performance?
> 
> Thanks again for help and suggestions.
> 
> Michael
> 
> On Wed, Sep 29, 2010 at 9:50 AM, Michael Plitkins
> <address@hidden> wrote:
>> Thanks. This may well get me moving forward. I do indeed need to
>> measure the horiBearingY because I am trying to line up type of
>> different sizes to get the presentation that we need. Measuring a few
>> sample characters will be adequate. Using the rendered bitmap still
>> won't give me a way to calculate the descender though (all I will know
>> is the actual full height of the rendered glyph).
>> 
>> I knew that the FT_Load_Glyph(), was bogus, but it was my last ditch attempt.
>> 
>> Using FTC_CMapCache_Lookup() is on list my too.
>> 
>> Many thanks and I will report how this turns out.
>> 
>> Michael
>> 
>> On Wed, Sep 29, 2010 at 8:34 AM, Brady Duga <address@hidden> wrote:
>>> Well, I am not entirely sure what you want to do. Using horiBearingY as the
>>> ascender seems weird - do you really want to use glyph metrics for line
>>> metrics? Or do you really need the ascender/descender info for every glyph?
>>> In any case, you shouldn't be calling FT_Load_Glyph when using the cache
>>> system. Instead, you let the cache subsytem make that call using the load
>>> flags you supply to FTC_ImageCache_LookupScaler(). That gives you an
>>> FT_Glyph which you can use for basic glyph metrics. Specifically the
>>> "advance" vector of that struct tells you how far to move to account for
>>> this glyph. In a more interesting case, you would pass FT_LOAD_RENDER to the
>>> cache subsystem, which should make the returned glyph be an FT_BitmapGlyph.
>>> That in turn gives you the left/top coordinates for the actual bitmap, plus
>>> an FT_Bitmap struct you can use for more information. Once you have the top
>>> and left values, you can essentially calculate the horibearingX/Y, though
>>> you may not need to bother. The nice thing about using the cache is, in most
>>> cases rendering is fast (already cached). It's only a problem if you plan to
>>> measure a *lot* of glyphs that you don't plan to render. Of course, in that
>>> case there isn't much point in using the cache at all.
>>> You might also want to consider caching the char map
>>> using FTC_CMapCache_Lookup instead of FT_Get_Char_Index.
>>> --Brady
>>> 
>>> 
>>> On Sep 28, 2010, at 11:30 PM, Werner LEMBERG wrote:
>>> 
>>> Please help this guy.
>>> 
>>> 
>>>    Werner
>>> 
>>> From: Michael Plitkins <address@hidden>
>>> Date: September 28, 2010 9:50:48 PM PDT
>>> To: address@hidden
>>> Subject: freetype cache and glyph metrics
>>> 
>>> 
>>> Hello Werner,
>>> 
>>> I have been using freetype for some time and have come to my first
>>> stumbling block: When using the image and font face caches, how can I
>>> get the the full metrics of a glyph (metrics.horiBearingY, etc.)? It
>>> seems that information is only available from the FT_GlyphSlotRec in
>>> the face itself. When using the cache APIs all of my attempts to get
>>> at the FT_Glyph_Metrics have yielded inconsistent results. Here is one
>>> of my latest attempts:
>>> 
>>> void nlGfxContext :: GetGlyphMetrics(nlULONG aHeight, char aGlyph,
>>> nlFontMetrics *aOutMetrics)
>>> {
>>>    if ((mFont != NULL) && (aOutMetrics != NULL))
>>>    {
>>>        FT_Face         font;
>>>        FTC_ScalerRec   scaler;
>>> 
>>>        scaler.face_id = mFont;
>>>        scaler.width = 0;
>>>        scaler.height = aHeight;
>>>        scaler.pixel = 1;
>>>        scaler.x_res = 0;
>>>        scaler.y_res = 0;
>>> 
>>>        font = mGlobals->LookupFontID(mFont);
>>> 
>>>        if (font != NULL)
>>>        {
>>>            FTC_ImageCache  icache = mGlobals->GetFontImageCache();
>>>            FT_Glyph        glyph;
>>>            FTC_Node        node;
>>>            FT_UInt         charidx = FT_Get_Char_Index(font, aGlyph);
>>>            FT_Error        err;
>>> 
>>>            err = FTC_ImageCache_LookupScaler(icache, &scaler,
>>> FT_LOAD_DEFAULT, charidx, &glyph, &node);
>>> 
>>>            FT_Load_Glyph(font, charidx, FT_LOAD_DEFAULT);
>>> 
>>>            if (err == FT_Err_Ok)
>>>            {
>>>                aOutMetrics->mHeight = font->glyph->metrics.height >> 6;
>>>                aOutMetrics->mAscender = font->glyph->metrics.horiBearingY >>
>>> 6;
>>>                aOutMetrics->mDescender = -(aOutMetrics->mHeight -
>>> aOutMetrics->mAscender);
>>>                aOutMetrics->mMaxAdvance =
>>> font->glyph->metrics.horiAdvance >> 6;
>>> 
>>>                FTC_Node_Unref(node, mGlobals->GetFontCacheManager());
>>>            }
>>>        }
>>>    }
>>> }
>>> 
>>> This is my horrible attempt to use the image cache scaler to get the
>>> glyph that i want at the size that i want and somehow get the glyph
>>> metrics to be set as i want as part of the FT_Load_Glyph(). It seems
>>> like it shouldn't work and it doesn't.
>>> 
>>> How does one get the metrics for an individual glyph and use the
>>> caching subsystems at the same time?
>>> 
>>> I apologize in advance if this has been answered somewhere out on the
>>> internet, but I was unable to find it.
>>> 
>>> Many thanks.
>>> 
>>> Michael Plitkins
>>> 
>>> 
>>> _______________________________________________
>>> Freetype mailing list
>>> address@hidden
>>> http://lists.nongnu.org/mailman/listinfo/freetype
>>> 
>>> 
>> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]