summaryrefslogtreecommitdiff
path: root/source/fitz/ucdn.c
diff options
context:
space:
mode:
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};