1
0
mirror of https://github.com/lvgl/lvgl.git synced 2025-01-28 07:03:00 +08:00
lvgl/src/lv_misc/lv_txt_ap.c

210 lines
6.6 KiB
C
Raw Normal View History

2020-03-14 21:43:09 +03:30
/**
* @file lv_txt_ap.c
*
*/
/*********************
* INCLUDES
*********************/
#include <stddef.h>
#include "lv_bidi.h"
#include "lv_txt.h"
#include "lv_txt_ap.h"
#include "../lv_draw/lv_draw.h"
/*********************
* DEFINES
*********************/
/**********************
* TYPEDEFS
**********************/
/**********************
* STATIC PROTOTYPES
**********************/
2020-05-02 07:45:04 +02:00
#if LV_USE_ARABIC_PERSIAN_CHARS == 1
2020-03-14 21:43:09 +03:30
static uint32_t lv_ap_get_char_index(uint16_t c);
/**********************
* STATIC VARIABLES
**********************/
2020-05-01 11:17:43 +02:00
const ap_chars_map_t ap_chars_map[] = {
/* {Key Offset, End, Beginning, Middle, Isolated, {conjunction}} */
{1, 0xFE84, -1, 0, -1, {1, 0}}, // أ
{2, 0xFE86, -1, 0, -1, {1, 0}}, // ؤ
{3, 0xFE88, -1, 0, -1, {1, 0}}, // ﺇ
{4, 0xFE8A, 1, 2, -1, {1, 0}}, // ئ
{5, 0xFE8E, -1, 0, -1, {1, 0}}, // آ
{6, 0xFE90, 1, 2, -1, {1, 1}}, // ب
{92, 0xFB57, 1, 2, -1, {1, 1}}, // پ
{8, 0xFE96, 1, 2, -1, {1, 1}}, // ت
{9, 0xFE9A, 1, 2, -1, {1, 1}}, // ث
{10, 0xFE9E, 1, 2, -1, {1, 1}}, // ج
{100, 0xFB7B, 1, 2, -1, {1, 1}}, // چ
{11, 0xFEA2, 1, 2, -1, {1, 1}}, // ح
{12, 0xFEA6, 1, 2, -1, {1, 1}}, // خ
{13, 0xFEAA, -1, 0, -1, {1, 0}}, // د
{14, 0xFEAC, -1, 0, -1, {1, 0}}, // ذ
{15, 0xFEAE, -1, 0, -1, {1, 0}}, // ر
{16, 0xFEB0, -1, 0, -1, {1, 0}}, // ز
{118, 0xFB8B, -1, 0, -1, {1, 0}}, // ژ
{17, 0xFEB2, 1, 2, -1, {1, 1}}, // س
{18, 0xFEB6, 1, 2, -1, {1, 1}}, // ش
{19, 0xFEBA, 1, 2, -1, {1, 1}}, // ص
{20, 0xFEBE, 1, 2, -1, {1, 1}}, // ض
{21, 0xFEC2, 1, 2, -1, {1, 1}}, // ط
{22, 0xFEC6, 1, 2, -1, {1, 1}}, // ظ
{23, 0xFECA, 1, 2, -1, {1, 1}}, // ع
{24, 0xFECE, 1, 2, -1, {1, 1}}, // غ
{31, 0xFED2, 1, 2, -1, {1, 1}}, // ف
{32, 0xFED6, 1, 2, -1, {1, 1}}, // ق
{135, 0xFB8F, 1, 2, -1, {1, 1}}, // ک
{33, 0xFEDA, 1, 2, -1, {1, 1}}, // ﻙ
{141, 0xFB93, 1, 2, -1, {1, 1}}, // گ
{34, 0xFEDE, 1, 2, -1, {1, 1}}, // ل
{35, 0xFEE2, 1, 2, -1, {1, 1}}, // م
{36, 0xFEE6, 1, 2, -1, {1, 1}}, // ن
{38, 0xFEEE, -1, 0, -1, {1, 0}}, // و
{37, 0xFEEA, 1, 2, -1, {1, 1}}, // ه
{39, 0xFBFD, 1, 2, -1, {1, 1}}, // ي
{40, 0xFEF2, 1, 2, -1, {1, 1}}, // ي
{170, 0xFBFD, 1, 2, -1, {1, 1}}, // ی
{7, 0xFE94, 1, 2, -1, {1, 0}}, // ة
{206, 0x06F0, 1, 2, -1, {0, 0}}, // ۰
{207, 0x06F1, 0, 0, 0, {0, 0}}, // ۱
{208, 0x06F2, 0, 0, 0, {0, 0}}, // ۲
{209, 0x06F3, 0, 0, 0, {0, 0}}, // ۳
{210, 0x06F4, 0, 0, 0, {0, 0}}, // ۴
{211, 0x06F5, 0, 0, 0, {0, 0}}, // ۵
{212, 0x06F6, 0, 0, 0, {0, 0}}, // ۶
{213, 0x06F7, 0, 0, 0, {0, 0}}, // ۷
{214, 0x06F8, 0, 0, 0, {0, 0}}, // ۸
{215, 0x06F9, 0, 0, 0, {0, 0}}, // ۹
LV_AP_END_CHARS_LIST
2020-03-14 21:43:09 +03:30
};
/**********************
* MACROS
**********************/
/**********************
* GLOBAL FUNCTIONS
**********************/
2020-05-01 11:17:43 +02:00
uint32_t lv_txt_ap_calc_bytes_cnt(const char * txt)
{
2020-03-14 21:43:09 +03:30
uint32_t txt_length = 0;
uint32_t chars_cnt = 0;
uint32_t current_ap_idx = 0;
uint32_t i, j;
uint32_t ch_enc;
txt_length = lv_txt_get_encoded_length(txt);
2020-05-01 11:17:43 +02:00
i = 0;
j = 0;
while(i < txt_length) {
ch_enc = lv_txt_encoded_next(txt, &j);
current_ap_idx = lv_ap_get_char_index(ch_enc);
2020-03-14 21:43:09 +03:30
if(current_ap_idx != LV_UNDEF_ARABIC_PERSIAN_CHARS)
ch_enc = ap_chars_map[current_ap_idx].char_end_form;
2020-05-01 11:17:43 +02:00
if(ch_enc <= 0x7F)
chars_cnt++;
else if(ch_enc <= 0x7FFF)
chars_cnt += 2;
else
chars_cnt += 3;
2020-03-14 21:43:09 +03:30
2020-05-01 11:17:43 +02:00
i++;
2020-03-14 21:43:09 +03:30
}
return chars_cnt + 1;
}
2020-05-01 11:17:43 +02:00
void lv_txt_ap_proc(const char * txt, char * txt_out)
{
2020-05-01 11:17:43 +02:00
uint32_t txt_length = 0;
uint32_t index_current, idx_next, idx_previous, i, j;
2020-03-14 21:43:09 +03:30
uint32_t * ch_enc;
char * txt_out_temp;
txt_length = lv_txt_get_encoded_length(txt);
ch_enc = (uint32_t *)lv_mem_alloc(sizeof(uint32_t) * (txt_length + 1));
2020-03-14 21:43:09 +03:30
2020-05-01 11:17:43 +02:00
i = 0;
j = 0;
while(j < txt_length)
ch_enc[j++] = lv_txt_encoded_next(txt, &i);
2020-03-14 21:43:09 +03:30
ch_enc[j] = 0;
2020-05-01 11:17:43 +02:00
i = 0;
2020-03-14 21:43:09 +03:30
idx_previous = LV_UNDEF_ARABIC_PERSIAN_CHARS;
2020-05-01 11:17:43 +02:00
while(i < txt_length) {
2020-03-14 21:43:09 +03:30
index_current = lv_ap_get_char_index(ch_enc[i]);
2020-05-01 11:17:43 +02:00
idx_next = lv_ap_get_char_index(ch_enc[i + 1]);
2020-03-14 21:43:09 +03:30
2020-05-01 11:17:43 +02:00
if(index_current == LV_UNDEF_ARABIC_PERSIAN_CHARS) {
i++;
idx_previous = LV_UNDEF_ARABIC_PERSIAN_CHARS;
continue;
2020-03-14 21:43:09 +03:30
}
2020-05-01 11:17:43 +02:00
uint8_t conjunction_to_previuse = (i == 0 ||
idx_previous == LV_UNDEF_ARABIC_PERSIAN_CHARS) ? 0 : ap_chars_map[idx_previous].ap_chars_conjunction.conj_to_next;
uint8_t conjunction_to_next = ((i == txt_length - 1) ||
idx_next == LV_UNDEF_ARABIC_PERSIAN_CHARS) ? 0 : ap_chars_map[idx_next].ap_chars_conjunction.conj_to_previous;
2020-03-14 21:43:09 +03:30
if(conjunction_to_previuse && conjunction_to_next)
2020-05-01 11:17:43 +02:00
ch_enc[i] = ap_chars_map[index_current].char_end_form + ap_chars_map[index_current].char_middle_form_offset;
2020-03-14 21:43:09 +03:30
else if(!conjunction_to_previuse && conjunction_to_next)
2020-05-01 11:17:43 +02:00
ch_enc[i] = ap_chars_map[index_current].char_end_form + ap_chars_map[index_current].char_begining_form_offset;
2020-03-14 21:43:09 +03:30
else if(conjunction_to_previuse && !conjunction_to_next)
2020-05-01 11:17:43 +02:00
ch_enc[i] = ap_chars_map[index_current].char_end_form;
2020-03-14 21:43:09 +03:30
else
2020-05-01 11:17:43 +02:00
ch_enc[i] = ap_chars_map[index_current].char_end_form + ap_chars_map[index_current].char_isolated_form_offset;
2020-03-14 21:43:09 +03:30
idx_previous = index_current;
i++;
}
txt_out_temp = txt_out;
2020-05-01 11:17:43 +02:00
i = 0;
while(i < txt_length) {
if((ch_enc[i]) <= 0x7F) {
*(txt_out_temp++) = ch_enc[i];
}
else if(ch_enc[i] <= 0x7FFF) {
*(txt_out_temp++) = 0xC0 | ((ch_enc[i] >> 6) & 0x3F);
*(txt_out_temp++) = 0x80 | (ch_enc[i] & 0x3F);
}
else {
*(txt_out_temp++) = 0xE0 | ((ch_enc[i] >> 12) & 0x3F);
*(txt_out_temp++) = 0x80 | ((ch_enc[i] >> 6) & 0x3F);
*(txt_out_temp++) = 0x80 | (ch_enc[i] & 0x3F);
}
i++;
}
*(txt_out_temp) = '\0';
lv_mem_free(ch_enc);
2020-03-14 21:43:09 +03:30
}
/**********************
* STATIC FUNCTIONS
**********************/
2020-05-01 11:17:43 +02:00
static uint32_t lv_ap_get_char_index(uint16_t c)
{
for(uint8_t i = 0; ap_chars_map[i].char_end_form; i++) {
2020-03-14 21:43:09 +03:30
if(c == (ap_chars_map[i].char_offset + LV_AP_ALPHABET_BASE_CODE))
2020-05-01 11:17:43 +02:00
return i;
2020-03-14 21:43:09 +03:30
}
return LV_UNDEF_ARABIC_PERSIAN_CHARS;
}
#endif