[HarfBuzz] Normalization
Behdad Esfahbod
behdad at behdad.org
Mon Aug 1 11:41:01 PDT 2011
On 08/01/11 12:20, Butrus Damaskus wrote:
> Hi Behdad,
>
> don't You plan to add some property to switch normaliation off?
No. Why?
behdad
> Thanks
>
> On Sun, Jul 24, 2011 at 5:37 AM, Behdad Esfahbod <behdad at behdad.org> wrote:
>> Hi,
>>
>> If you paid any attention you may have noticed that I was hacking on getting
>> composition / decomposition working. And I'm glad to announce that it's all
>> done and working and in master already.
>>
>> Here's the relevant source file:
>>
>> http://cgit.freedesktop.org/harfbuzz/tree/src/hb-ot-shape-normalize.cc
>>
>> These rely on the two new Unicode callbacks compose() and decompose(). I've
>> added similar APIs to glib (which will be shipped in 2.30), and the hb-glib
>> glue layer uses those if available, or falls back to using g_utf8_normalize(),
>> which is much much slower. The hb-icu layer implements these using
>> unorm_normalize() which has the same slowness problem. If someone wants to
>> look into adding compose()/decompose() API to ICU, that would be really cool.
>>
>> Here's a few lines about the design, copying from comments in the source:
>>
>> /*
>> * HIGHLEVEL DESIGN:
>> *
>> * This file exports one main function: _hb_ot_shape_normalize().
>> *
>> * This function closely reflects the Unicode Normalization Algorithm,
>> * yet it's different. The shaper an either prefer decomposed (NFD) or
>> * composed (NFC).
>> *
>> * In general what happens is that: each grapheme is decomposed in a chain
>> * of 1:2 decompositions, marks reordered, and then recomposed if desires,
>> * so far it's like Unicode Normalization. However, the decomposition and
>> * recomposition only happens if the font supports the resulting characters.
>> *
>> * The goals are:
>> *
>> * - Try to render all canonically equivalent strings similarly. To really
>> * achieve this we have to always do the full decomposition and then
>> * selectively recompose from there. It's kinda too expensive though, so
>> * we skip some cases. For example, if composed is desired, we simply
>> * don't touch 1-character clusters that are supported by the font, even
>> * though their NFC may be different.
>> *
>> * - When a font has a precomposed character for a sequence but the 'ccmp'
>> * feature in the font is not adequate, form use the precomposed character
>> * which typically has better mark positioning.
>> *
>> * - When a font does not support a character but supports its
>> * decomposition, well, use the decomposition.
>> *
>> * - The Indic shaper requests decomposed output. This will handle
>> * splitting matra for the Indic shaper.
>> */
>>
>> /* We do a farily straightforward yet custom normalization process in three
>> * separate rounds: decompose, reorder, recompose (if desired). Currently
>> * this makes two buffer swaps. We can make it faster by moving the last
>> * two rounds into the inner loop for the first round, but it's more
>> * readable this way. */
>>
>>
>> Comments, feedback, and testing re functionality and performance is appreciated!
>>
>> Cheers,
>> behdad
>> _______________________________________________
>> HarfBuzz mailing list
>> HarfBuzz at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/harfbuzz
>>
>
More information about the HarfBuzz
mailing list