[prev in list] [next in list] [prev in thread] [next in thread]
List: elinks-dev
Subject: [elinks-dev] [PATCH 4/4] Improve isolated combining characters handling
From: Fabienne Ducroquet <fabiduc () gmail ! com>
Date: 2016-04-12 19:02:38
Message-ID: 1460487758-11562-5-git-send-email-fabiduc () gmail ! com
[Download RAW message or body]
If there are isolated combining characters, e.g. at the beginning of a paragraph
or table cell:
– if it's not the first screen column, combine them with whatever character is
printed to their left;
– otherwise, add a no-break space as the base character.
Previously, such combining characters were combined with the last letter
displayed, i.e. the last letter of the previous paragraph or cell.
Signed-off-by: Fabienne Ducroquet <fabiduc@gmail.com>
---
src/document/html/renderer.c | 51 ++++++++++++++++++++++++++++++++++++--------
1 file changed, 42 insertions(+), 9 deletions(-)
diff --git a/src/document/html/renderer.c b/src/document/html/renderer.c
index a55f62a..5c898bb 100644
--- a/src/document/html/renderer.c
+++ b/src/document/html/renderer.c
@@ -427,6 +427,21 @@ move_comb_x_y(struct part *part, int xf, int yf, int xt, int yt)
#ifdef CONFIG_COMBINE
static void
+set_comb_x_y(struct part *part, int x, int y)
+{
+ struct document *document = part->document;
+
+ document->comb_x = X(x);
+ document->comb_y = Y(y);
+ assert_comb_x_y_ok(document);
+ if_assert_failed discard_comb_x_y(document);
+}
+#else
+# define set_comb_x_y(part, x, y) ((void) 0)
+#endif
+
+#ifdef CONFIG_COMBINE
+static void
put_combined(struct part *part, int x)
{
struct document *document = part->document;
@@ -596,12 +611,33 @@ good_char:
put_combined(part, x);
document->combi[0] = data;
} else {
- if (document->combi_length < (UCS_MAX_LENGTH_COMBINED - 1)) {
- document->combi[++document->combi_length] = data;
+ if (part->cx == x) {
+ if (X(x)) {
+ /* Isolated combining
+ * character not on the
+ * first column: combine
+ * it with whatever is
+ * printed at its left. */
+ document->combi[0] = POS(x - 1, y).data;
+ set_comb_x_y(part, x - 1, y);
+ } else {
+ /* Isolated combining
+ * character on the
+ * first column: use
+ * UCS_NO_BREAK_SPACE as
+ * the base character.
+ * */
+ document->combi[0] = UCS_NO_BREAK_SPACE;
+ set_comb_x_y(part, x, y);
+ schar->data = UCS_SPACE;
+ copy_screen_chars(&POS(x++, y), schar, 1);
+ }
}
+ if (document->combi_length < (UCS_MAX_LENGTH_COMBINED - 1))
+ document->combi[++document->combi_length] = data;
continue;
}
-#endif
+#endif /* CONFIG_COMBINE */
part->spaces[x] = (data == UCS_SPACE);
if (unicode_to_cell(data) == 2) {
@@ -615,12 +651,9 @@ good_char:
part->char_width[x] = unicode_to_cell(data);
schar->data = (unicode_val_T)data;
}
-#ifdef CONFIG_COMBINE
- document->comb_x = X(x);
- document->comb_y = Y(y);
- assert_comb_x_y_ok(document);
- if_assert_failed discard_comb_x_y(document);
-#endif
+
+ set_comb_x_y(part, x, y);
+
copy_screen_chars(&POS(x++, y), schar, 1);
} /* while chars < end */
--
2.8.0.rc3
--
http://lists.linuxfromscratch.org/listinfo/elinks-dev
Unsubscribe: See the above information page
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic