summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2000-05-07 04:06:29 +0000
committerOwen Taylor <otaylor@src.gnome.org>2000-05-07 04:06:29 +0000
commit1a9eb53c12b49c53aaaf56ef40220c28bd13df84 (patch)
treefd8a5035b8606576ef7c9b9fa2366d4f7880b94e /modules
parentadf1db25a516e1a8b02b89de216e2b42ef1d7639 (diff)
downloadpango-1a9eb53c12b49c53aaaf56ef40220c28bd13df84.tar.gz
When handling overstrikes, try to guess a bit better how overstrike glyphs
Sun May 7 00:00:00 2000 Owen Taylor <otaylor@redhat.com> * modules/basic/basic.c (basic_engine_shape): When handling overstrikes, try to guess a bit better how overstrike glyphs are positioned in the font. (Now works with more of glyphs from clearlyu, though not the Hebrew accents in that font) * examples/HELLO.utf8: Insert tab characters to keep the columns in the right order for either global direction. Insert left-to-right marks in a few places to keep leading and trailing punctuation in the right place. * modules/basic/basic.c (basic_engine_shape): Don't show RLM and LRM * pango/glyphstring.c (pango_glyph_string_extents): Use the logical width set in the glyph string rather than that from the font's metrics. * pango/pangox.c (pango_x_render): Treat glyph index 0 as special - representing invisible, 0 size character. We need this sometimes, and it is easier and faster to have this special case than to shape a space. * pango/pango-context.c (pango_itemize): Put tabs into separate items. (Sort of lame hack, we do this to make line breaking with tab handling simpler) * examples/viewer.c (checkbutton_toggled): Notify all the layouts that the context has changed so the RTL base dir change actually takes effect.
Diffstat (limited to 'modules')
-rw-r--r--modules/basic/basic-x.c20
-rw-r--r--modules/basic/basic.c20
2 files changed, 22 insertions, 18 deletions
diff --git a/modules/basic/basic-x.c b/modules/basic/basic-x.c
index 6c851228..e78aa384 100644
--- a/modules/basic/basic-x.c
+++ b/modules/basic/basic-x.c
@@ -401,16 +401,9 @@ basic_engine_shape (PangoFont *font,
input = buf;
}
- if (wc == 0x200B) /* Zero-width space */
+ if (wc == 0x200B || wc == 0x200E || wc == 0x200F) /* Zero-width characters */
{
- index = find_char (cache, font, ' ', input);
- if (index)
- {
- set_glyph (font, glyphs, i, p - text, index);
- glyphs->glyphs[i].geometry.width = 0;
- }
- else
- set_glyph (font, glyphs, i, p - text, pango_x_get_unknown_glyph (font));
+ set_glyph (font, glyphs, i, p - text, 0);
}
else
{
@@ -423,10 +416,19 @@ basic_engine_shape (PangoFont *font,
{
if (i > 0)
{
+ PangoRectangle logical_rect, ink_rect;
+
glyphs->glyphs[i].geometry.width = MAX (glyphs->glyphs[i-1].geometry.width,
glyphs->glyphs[i].geometry.width);
glyphs->glyphs[i-1].geometry.width = 0;
glyphs->log_clusters[i] = glyphs->log_clusters[i-1];
+
+ /* Some heuristics to try to guess how overstrike glyphs are
+ * done and compensate
+ */
+ pango_font_get_glyph_extents (font, glyphs->glyphs[i].glyph, &ink_rect, &logical_rect);
+ if (logical_rect.width == 0 && ink_rect.x == 0)
+ glyphs->glyphs[i].geometry.x_offset = (glyphs->glyphs[i].geometry.width - ink_rect.width) / 2;
}
}
}
diff --git a/modules/basic/basic.c b/modules/basic/basic.c
index 6c851228..e78aa384 100644
--- a/modules/basic/basic.c
+++ b/modules/basic/basic.c
@@ -401,16 +401,9 @@ basic_engine_shape (PangoFont *font,
input = buf;
}
- if (wc == 0x200B) /* Zero-width space */
+ if (wc == 0x200B || wc == 0x200E || wc == 0x200F) /* Zero-width characters */
{
- index = find_char (cache, font, ' ', input);
- if (index)
- {
- set_glyph (font, glyphs, i, p - text, index);
- glyphs->glyphs[i].geometry.width = 0;
- }
- else
- set_glyph (font, glyphs, i, p - text, pango_x_get_unknown_glyph (font));
+ set_glyph (font, glyphs, i, p - text, 0);
}
else
{
@@ -423,10 +416,19 @@ basic_engine_shape (PangoFont *font,
{
if (i > 0)
{
+ PangoRectangle logical_rect, ink_rect;
+
glyphs->glyphs[i].geometry.width = MAX (glyphs->glyphs[i-1].geometry.width,
glyphs->glyphs[i].geometry.width);
glyphs->glyphs[i-1].geometry.width = 0;
glyphs->log_clusters[i] = glyphs->log_clusters[i-1];
+
+ /* Some heuristics to try to guess how overstrike glyphs are
+ * done and compensate
+ */
+ pango_font_get_glyph_extents (font, glyphs->glyphs[i].glyph, &ink_rect, &logical_rect);
+ if (logical_rect.width == 0 && ink_rect.x == 0)
+ glyphs->glyphs[i].geometry.x_offset = (glyphs->glyphs[i].geometry.width - ink_rect.width) / 2;
}
}
}