summaryrefslogtreecommitdiff
path: root/source/fitz/ucdn.c
diff options
context:
space:
mode:
authorSebastian Rasmussen <sebras@gmail.com>2016-02-20 21:09:35 +0100
committerTor Andersson <tor.andersson@artifex.com>2016-03-14 17:08:29 +0100
commit3ab2ad89c00326dcbaf33749125432e8691b68a0 (patch)
tree6f2858c577eb8b7f7d1e25c7c11204176738f2f2 /source/fitz/ucdn.c
parent23854d215beb3132109155817b2182415fedc91c (diff)
downloadmupdf-3ab2ad89c00326dcbaf33749125432e8691b68a0.tar.xz
ucdn: Add support for UAX#14 linebreaking classes.
Diffstat (limited to 'source/fitz/ucdn.c')
-rw-r--r--source/fitz/ucdn.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/source/fitz/ucdn.c b/source/fitz/ucdn.c
index 59d49487..d3dc0376 100644
--- a/source/fitz/ucdn.c
+++ b/source/fitz/ucdn.c
@@ -24,6 +24,7 @@ typedef struct {
unsigned char east_asian_width;
unsigned char normalization_check;
unsigned char script;
+ unsigned char linebreak_class;
} UCDRecord;
typedef struct {
@@ -197,6 +198,41 @@ int ucdn_get_script(uint32_t code)
return get_ucd_record(code)->script;
}
+int ucdn_get_linebreak_class(uint32_t code)
+{
+ return get_ucd_record(code)->linebreak_class;
+}
+
+int ucdn_get_resolved_linebreak_class(uint32_t code)
+{
+ const UCDRecord *record = get_ucd_record(code);
+
+ switch (record->linebreak_class)
+ {
+ case UCDN_LINEBREAK_CLASS_AI:
+ case UCDN_LINEBREAK_CLASS_SG:
+ case UCDN_LINEBREAK_CLASS_XX:
+ return UCDN_LINEBREAK_CLASS_AL;
+
+ case UCDN_LINEBREAK_CLASS_SA:
+ if (record->category == UCDN_GENERAL_CATEGORY_MC ||
+ record->category == UCDN_GENERAL_CATEGORY_MN)
+ return UCDN_LINEBREAK_CLASS_CM;
+ return UCDN_LINEBREAK_CLASS_AL;
+
+ case UCDN_LINEBREAK_CLASS_CJ:
+ return UCDN_LINEBREAK_CLASS_NS;
+
+ case UCDN_LINEBREAK_CLASS_CB:
+ return UCDN_LINEBREAK_CLASS_B2;
+
+ case UCDN_LINEBREAK_CLASS_NL:
+ return UCDN_LINEBREAK_CLASS_BK;
+ }
+
+ return record->linebreak_class;
+}
+
uint32_t ucdn_mirror(uint32_t code)
{
MirrorPair mp = {0};