Interest in integrating with HarfBuzz shaper?

Nikolay Sivov nsivov at
Mon Jun 27 14:17:15 CDT 2022

On 6/24/22 20:29, Behdad Esfahbod wrote:
> Hi,
> I've been looking at the internal Wine implementation of usp10.dll, and
> wondering if there is an interest to integrate with HarfBuzz instead /
> optionally.

Hi, Behdad.

Uniscribe implementation hasn't been touched in a while. DirectWrite 
implementation currently supports all types of GSUB/GPOS lookups, uses 
structure and code taken from harfbuzz wrt to feature masks, loop 
organization, sorting, etc. Currently it only implements Arabic shaping.

My longer term plan was to move all that to a separate textshaping.dll 
that modern Windows releases are using, and link to it from both gdi32 
and dwrite, after removing existing uniscribe code. We don't need 
textshaping.dll interface to be compatible with Windows, because it's 
undocumented and isn't used by applications directly.
> The main hindrance is that HarfBuzz does NOT currently provide separate
> substitution vs positioning steps ala ScriptShape() and ScriptPosition().
> But I've been thinking about how to make that possibly happen, at least
> enough for Wine's needs.

Yes, I believe we talked about that some time (few years?) ago. 
Uniscribe's ScriptShape() and dwrite's GetGlyphs() are using very 
similar interface, and we'll need DWRITE_SHAPING_TEXT_PROPERTIES and 
DWRITE_SHAPING_GLYPH_PROPERTIES to be compatible with what Windows returns.

When I was working on this I found what some of the "reserved" fields 
mean in SHAPING_GLYPH_PROPERTIES, you can find structure definition in 
dlls/dwrite/dwrite_private.h:struct shaping_glyph_properties. I'm 
talking about last two fields "components" and "lig_component", that are 
important for GPOS handling.

Another field that harfbuzz does not provide I think is 
"DWRITE_SHAPING_GLYPH_PROPERTIES.justification" mask, which I believe is 
only useful for Arabic shaping, and roughly corresponds to character 

So technically, if we get correct ScriptShape()-style output from 
harfbuzz, including correct clustermap in WCHAR terms, we don't really 
need harfbuzz to produce ScriptPosition() output, because we have that 
implemented, and afaik it does not require script-specific handling, 
except maybe for features that have to be enabled.

Another consideration is that we'll likely have to import harfbuzz code, 
and build it as a static win32 library. That's not a decision I can 
make. I think the only build requirement would be a recent enough C++ 
compiler? And maybe ragel, at some point you had precompiled header in 
the tree. We'll have to ask Alexandre's opinion here.

We could also benefit from harfbuzz subsetter, and use it for fontsub 
and for Direct2D XPS printing.

> Regards,
> behdad
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the wine-devel mailing list