[HarfBuzz] Arabic decoder
Lars Knoll
lars.knoll at nokia.com
Fri Dec 4 04:47:34 PST 2009
On Friday 04 December 2009 08:21:16 am Nicolas Lacombe wrote:
> problem solved:
[snip]
> I'm still having problem rendering complexe sentances, but it looks like
> working fine on small letter... I'm wondering if I have to take into
> account the advances given by the shaper... for now I'm just letting
> freetype taking care of it for me... need some test.
There's a reason harfbuzz delivers you advances and positions for the glyphs
;-) You'll need to use them to get correct layout.
> Are you aware of any problem in the arabic/syriac translation module, or is
> it suppose to work fine?
We're using the code directly in Qt and haven't gotten any bug reports about
problems with arabic or syriac for quite some time.
Cheers,
Lars
>
> Behdad answear to this question with:
>
> "Supposed to work fine. Though you need a bidi engine also. Try setting
> bidi level to 1 instead of 0..."
>
>
> Wich does not appear to change a lot of things. However I resolved my
> problem by changing font... they are very important, and I'm having trouble
> to find good Persian and Syriac font.
>
>
>
> 2009/12/2 Nicolas Lacombe <n.lacombe at gmail.com>
>
> > Hi,
> >
> > I'm using HarfBuzz with freetype to render arabic text. I must say that
> > this library was exactly what I was looking for, great job!
> >
> > Anyway I spotted something strange, I don't know if it's a bug or if it's
> > me that didn't understand correctly the spirit behind Harfbuzz.
> >
> > When rendering arabic letter equivalent of la , it should give me only
> > one glyph (لا).
> >
> > However, Harfbuzz render me correctly the glyph, but do not get rid of
> > the a. See screenshot here:
> >
> > http://img522.yfrog.com/i/21856341.png/
> >
> >
> > Here's my (simplified) render loop:
> >
> > HB_ShaperItem shaper_item;
> >
> > shaper_item.string = (HB_UChar16 *) g_utf8_to_utf16((gchar*)txt, -1,
> > NULL, &numberOfWords, NULL);
> >
> > shaper_item.kerning_applied = 0;
> > shaper_item.stringLength = 0;
> > shaper_item.shaperFlags = 0;
> > shaper_item.font = &hbFont;
> > shaper_item.face = hbFace;
> > shaper_item.glyphIndicesPresent = 0;
> > shaper_item.initialGlyphCount = 0;
> >
> > shaper_item.item.bidiLevel = 0;
> >
> > out_glyphs = (HB_Glyph*)malloc(numberOfWords * sizeof(HB_Glyph));
> > memset(out_glyphs, 0, numberOfWords * sizeof(HB_Glyph));
> > out_attrs = (HB_GlyphAttributes*)malloc(numberOfWords *
> > sizeof(HB_GlyphAttributes));
> > memset(out_attrs, 0, numberOfWords * sizeof(HB_GlyphAttributes));
> > out_advs = (HB_Fixed*)malloc(numberOfWords * sizeof(HB_Fixed));
> > memset(out_advs, 0, numberOfWords * sizeof(HB_Fixed));
> > out_offsets = (HB_FixedPoint*)malloc(numberOfWords *
> > sizeof(HB_FixedPoint));
> > memset(out_offsets, 0, numberOfWords * sizeof(HB_FixedPoint));
> > out_logClusters = (unsigned short*)malloc(numberOfWords *
> > sizeof(unsigned short));
> > memset(out_logClusters, 0, numberOfWords * sizeof(unsigned short));
> >
> > shaper_item.glyphs = out_glyphs;
> > shaper_item.attributes = out_attrs;
> > shaper_item.advances = out_advs;
> > shaper_item.offsets = out_offsets;
> > shaper_item.log_clusters = out_logClusters;
> > shaper_item.num_glyphs = numberOfWords;
> > shaper_item.stringLength = numberOfWords;
> >
> > int l = 0;
> > while(1){
> >
> > shaper_item.num_glyphs = numberOfWords;
> > if (!hb_utf16_script_run_next(NULL, &shaper_item.item,
> > shaper_item.string, numberOfWords , &iterator))
> > break;
> >
> > memset(out_glyphs, 0, numberOfWords * sizeof(HB_Glyph));
> > HB_ShapeItem(&shaper_item);
> > for (unsigned int j = 0; j < shaper_item.item.length; j++)
> > {
> > ind[l++] = out_glyphs[j];
> > }
> > }
> >
> > so at the end, ind contains all the index of the glyph I need to draw.
> >
> > Is there a way harfbuzz can tell me to get rid of a glyph?
> >
> > Thanks, Nico.
>
More information about the HarfBuzz
mailing list