[HarfBuzz] DirectWrite backend of HarfBuzz and again, some bits from Mozilla

Nikolay Sivov bunglehead at gmail.com
Sun Jun 26 22:31:19 UTC 2016


On 27.06.2016 0:58, Ebrahim Byagowi wrote:
> I had a chance to improve some minor thing around DirectWrite backend of
> HarfBuzz on this pull request
> <https://github.com/behdad/harfbuzz/pull/273> which basically is
> suggestion of Nikolay reviews on this mail
> <https://lists.freedesktop.org/archives/harfbuzz/2015-September/005066.html>.
> Thank you Nikolay for the suggestions and sorry for the delay :)

Hi, Ebrahim.

You're very welcome, thanks for working on this.

Another issue I see with current implementation (which is minor because
it will allocate more than needed, not less, but still):

> retry_getglyphs:
>   uint16_t* clusterMap = (uint16_t*) malloc (maxGlyphCount * sizeof (uint16_t));
>   uint16_t* glyphIndices = (uint16_t*) malloc (maxGlyphCount * sizeof (uint16_t));
>   DWRITE_SHAPING_TEXT_PROPERTIES* textProperties = (DWRITE_SHAPING_TEXT_PROPERTIES*)
>     malloc (maxGlyphCount * sizeof (DWRITE_SHAPING_TEXT_PROPERTIES));
>   DWRITE_SHAPING_GLYPH_PROPERTIES* glyphProperties = (DWRITE_SHAPING_GLYPH_PROPERTIES*)
>     malloc (maxGlyphCount * sizeof (DWRITE_SHAPING_GLYPH_PROPERTIES));

Cluster map and text properties should use WCHAR text length, not glyph
count.

> 
>   hr = analyzer->GetGlyphs (textString, textLength, fontFace, FALSE,
>     isRightToLeft, &runHead->mScript, localeName, NULL, &dwFeatures,
>     featureRangeLengths, 1, maxGlyphCount, clusterMap, textProperties, glyphIndices,
>     glyphProperties, &glyphCount);
> 
>   if (unlikely (hr == HRESULT_FROM_WIN32 (ERROR_INSUFFICIENT_BUFFER)))
>   {
>     free (clusterMap);
>     free (glyphIndices);
>     free (textProperties);
>     free (glyphProperties);
> 
>     maxGlyphCount *= 2;
> 
>     goto retry_getglyphs;
>   }

And this could do realloc() or free/malloc on glyphIndices and
glyphProperties only, because text length never changes.


More information about the HarfBuzz mailing list