diff options
author | Sebastian Rasmussen <sebras@gmail.com> | 2016-02-20 21:09:35 +0100 |
---|---|---|
committer | Tor Andersson <tor.andersson@artifex.com> | 2016-03-14 17:08:29 +0100 |
commit | 3ab2ad89c00326dcbaf33749125432e8691b68a0 (patch) | |
tree | 6f2858c577eb8b7f7d1e25c7c11204176738f2f2 /source/fitz/ucdn.c | |
parent | 23854d215beb3132109155817b2182415fedc91c (diff) | |
download | mupdf-3ab2ad89c00326dcbaf33749125432e8691b68a0.tar.xz |
ucdn: Add support for UAX#14 linebreaking classes.
Diffstat (limited to 'source/fitz/ucdn.c')
-rw-r--r-- | source/fitz/ucdn.c | 36 |
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}; |