Add a flag to hb_buffer_t to prevent the insertion of dotted circles on incorrect character sequences.
Current behavior unchanged if this flag is not set (and it isn't by default).
This commit is contained in:
parent
8b6eb6cf46
commit
30d7c40f8c
|
@ -284,6 +284,10 @@ hb_buffer_guess_segment_properties (hb_buffer_t *buffer);
|
||||||
* space glyph and zeroing the advance width.)
|
* space glyph and zeroing the advance width.)
|
||||||
* @HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES takes
|
* @HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES takes
|
||||||
* precedence over this flag. Since: 1.8.0
|
* precedence over this flag. Since: 1.8.0
|
||||||
|
* @HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE:
|
||||||
|
* flag indicating that a dotted circle should
|
||||||
|
* not be inserted in the rendering of incorrect
|
||||||
|
* character sequences (such at <0905 093E>).
|
||||||
*
|
*
|
||||||
* Since: 0.9.20
|
* Since: 0.9.20
|
||||||
*/
|
*/
|
||||||
|
@ -292,7 +296,8 @@ typedef enum { /*< flags >*/
|
||||||
HB_BUFFER_FLAG_BOT = 0x00000001u, /* Beginning-of-text */
|
HB_BUFFER_FLAG_BOT = 0x00000001u, /* Beginning-of-text */
|
||||||
HB_BUFFER_FLAG_EOT = 0x00000002u, /* End-of-text */
|
HB_BUFFER_FLAG_EOT = 0x00000002u, /* End-of-text */
|
||||||
HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES = 0x00000004u,
|
HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES = 0x00000004u,
|
||||||
HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES = 0x00000008u
|
HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES = 0x00000008u,
|
||||||
|
HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE = 0x00000010u
|
||||||
} hb_buffer_flags_t;
|
} hb_buffer_flags_t;
|
||||||
|
|
||||||
HB_EXTERN void
|
HB_EXTERN void
|
||||||
|
|
|
@ -214,7 +214,8 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan HB_UNUSED,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* No valid syllable as base for tone mark; try to insert dotted circle. */
|
/* No valid syllable as base for tone mark; try to insert dotted circle. */
|
||||||
if (font->has_glyph (0x25CCu))
|
if ( !(buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE)
|
||||||
|
&& font->has_glyph (0x25CCu))
|
||||||
{
|
{
|
||||||
hb_codepoint_t chars[2];
|
hb_codepoint_t chars[2];
|
||||||
if (!is_zero_width_char (font, u)) {
|
if (!is_zero_width_char (font, u)) {
|
||||||
|
|
|
@ -965,6 +965,9 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
|
||||||
hb_font_t *font,
|
hb_font_t *font,
|
||||||
hb_buffer_t *buffer)
|
hb_buffer_t *buffer)
|
||||||
{
|
{
|
||||||
|
if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE))
|
||||||
|
return;
|
||||||
|
|
||||||
/* Note: This loop is extra overhead, but should not be measurable.
|
/* Note: This loop is extra overhead, but should not be measurable.
|
||||||
* TODO Use a buffer scratch flag to remove the loop. */
|
* TODO Use a buffer scratch flag to remove the loop. */
|
||||||
bool has_broken_syllables = false;
|
bool has_broken_syllables = false;
|
||||||
|
|
|
@ -365,6 +365,9 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
|
||||||
hb_font_t *font,
|
hb_font_t *font,
|
||||||
hb_buffer_t *buffer)
|
hb_buffer_t *buffer)
|
||||||
{
|
{
|
||||||
|
if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE))
|
||||||
|
return;
|
||||||
|
|
||||||
/* Note: This loop is extra overhead, but should not be measurable. */
|
/* Note: This loop is extra overhead, but should not be measurable. */
|
||||||
bool has_broken_syllables = false;
|
bool has_broken_syllables = false;
|
||||||
unsigned int count = buffer->len;
|
unsigned int count = buffer->len;
|
||||||
|
|
|
@ -298,6 +298,9 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
|
||||||
hb_font_t *font,
|
hb_font_t *font,
|
||||||
hb_buffer_t *buffer)
|
hb_buffer_t *buffer)
|
||||||
{
|
{
|
||||||
|
if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE))
|
||||||
|
return;
|
||||||
|
|
||||||
/* Note: This loop is extra overhead, but should not be measurable. */
|
/* Note: This loop is extra overhead, but should not be measurable. */
|
||||||
bool has_broken_syllables = false;
|
bool has_broken_syllables = false;
|
||||||
unsigned int count = buffer->len;
|
unsigned int count = buffer->len;
|
||||||
|
|
|
@ -523,6 +523,9 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
|
||||||
hb_font_t *font,
|
hb_font_t *font,
|
||||||
hb_buffer_t *buffer)
|
hb_buffer_t *buffer)
|
||||||
{
|
{
|
||||||
|
if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE))
|
||||||
|
return;
|
||||||
|
|
||||||
/* Note: This loop is extra overhead, but should not be measurable. */
|
/* Note: This loop is extra overhead, but should not be measurable. */
|
||||||
bool has_broken_syllables = false;
|
bool has_broken_syllables = false;
|
||||||
unsigned int count = buffer->len;
|
unsigned int count = buffer->len;
|
||||||
|
|
|
@ -34,6 +34,9 @@ _hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,
|
||||||
hb_buffer_t *buffer,
|
hb_buffer_t *buffer,
|
||||||
hb_font_t *font HB_UNUSED)
|
hb_font_t *font HB_UNUSED)
|
||||||
{
|
{
|
||||||
|
if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE))
|
||||||
|
return;
|
||||||
|
|
||||||
/* UGLY UGLY UGLY business of adding dotted-circle in the middle of
|
/* UGLY UGLY UGLY business of adding dotted-circle in the middle of
|
||||||
* vowel-sequences that look like another vowel. Data for each script
|
* vowel-sequences that look like another vowel. Data for each script
|
||||||
* collected from the USE script development spec.
|
* collected from the USE script development spec.
|
||||||
|
|
|
@ -448,6 +448,9 @@ hb_set_unicode_props (hb_buffer_t *buffer)
|
||||||
static void
|
static void
|
||||||
hb_insert_dotted_circle (hb_buffer_t *buffer, hb_font_t *font)
|
hb_insert_dotted_circle (hb_buffer_t *buffer, hb_font_t *font)
|
||||||
{
|
{
|
||||||
|
if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE))
|
||||||
|
return;
|
||||||
|
|
||||||
if (!(buffer->flags & HB_BUFFER_FLAG_BOT) ||
|
if (!(buffer->flags & HB_BUFFER_FLAG_BOT) ||
|
||||||
buffer->context_len[0] ||
|
buffer->context_len[0] ||
|
||||||
!_hb_glyph_info_is_unicode_mark (&buffer->info[0]))
|
!_hb_glyph_info_is_unicode_mark (&buffer->info[0]))
|
||||||
|
|
Loading…
Reference in New Issue