acid-drop

- Hacking the planet from a LilyGo T-Deck using custom firmware
git clone git://git.acid.vegas/acid-drop.git
Log | Files | Refs | Archive | README | LICENSE

lv_bidi.h (4904B)

      1 /**
      2  * @file lv_bidi.h
      3  *
      4  */
      5 
      6 #ifndef LV_BIDI_H
      7 #define LV_BIDI_H
      8 
      9 #ifdef __cplusplus
     10 extern "C" {
     11 #endif
     12 
     13 /*********************
     14  *      INCLUDES
     15  *********************/
     16 #include "../lv_conf_internal.h"
     17 
     18 #include <stdbool.h>
     19 #include <stdint.h>
     20 #include "lv_txt.h"
     21 
     22 /*********************
     23  *      DEFINES
     24  *********************/
     25 /*Special non printable strong characters.
     26  *They can be inserted to texts to affect the run's direction*/
     27 #define LV_BIDI_LRO  "\xE2\x80\xAD" /*U+202D*/
     28 #define LV_BIDI_RLO  "\xE2\x80\xAE" /*U+202E*/
     29 
     30 /**********************
     31  *      TYPEDEFS
     32  **********************/
     33 enum {
     34     LV_BASE_DIR_LTR      = 0x00,
     35     LV_BASE_DIR_RTL      = 0x01,
     36     LV_BASE_DIR_AUTO     = 0x02,
     37 
     38     LV_BASE_DIR_NEUTRAL  = 0x20,
     39     LV_BASE_DIR_WEAK     = 0x21,
     40 };
     41 
     42 typedef uint8_t lv_base_dir_t;
     43 
     44 /**********************
     45  * GLOBAL PROTOTYPES
     46  **********************/
     47 #if LV_USE_BIDI
     48 
     49 /**
     50  * Convert a text to get the characters in the correct visual order according to
     51  * Unicode Bidirectional Algorithm
     52  * @param str_in the text to process
     53  * @param str_out store the result here. Has the be `strlen(str_in)` length
     54  * @param base_dir `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL`
     55  */
     56 void _lv_bidi_process(const char * str_in, char * str_out, lv_base_dir_t base_dir);
     57 
     58 /**
     59  * Auto-detect the direction of a text based on the first strong character
     60  * @param txt the text to process
     61  * @return `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL`
     62  */
     63 lv_base_dir_t _lv_bidi_detect_base_dir(const char * txt);
     64 
     65 /**
     66  * Get the logical position of a character in a line
     67  * @param str_in the input string. Can be only one line.
     68  * @param bidi_txt internally the text is bidi processed which buffer can be get here.
     69  * If not required anymore has to freed with `lv_mem_free()`
     70  * Can be `NULL` is unused
     71  * @param len length of the line in character count
     72  * @param base_dir base direction of the text: `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL`
     73  * @param visual_pos the visual character position which logical position should be get
     74  * @param is_rtl tell the char at `visual_pos` is RTL or LTR context
     75  * @return the logical character position
     76  */
     77 uint16_t _lv_bidi_get_logical_pos(const char * str_in, char ** bidi_txt, uint32_t len, lv_base_dir_t base_dir,
     78                                   uint32_t visual_pos, bool * is_rtl);
     79 
     80 /**
     81  * Get the visual position of a character in a line
     82  * @param str_in the input string. Can be only one line.
     83  * @param bidi_txt internally the text is bidi processed which buffer can be get here.
     84  * If not required anymore has to freed with `lv_mem_free()`
     85  * Can be `NULL` is unused
     86  * @param len length of the line in character count
     87  * @param base_dir base direction of the text: `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL`
     88  * @param logical_pos the logical character position which visual position should be get
     89  * @param is_rtl tell the char at `logical_pos` is RTL or LTR context
     90  * @return the visual character position
     91  */
     92 uint16_t _lv_bidi_get_visual_pos(const char * str_in, char ** bidi_txt, uint16_t len, lv_base_dir_t base_dir,
     93                                  uint32_t logical_pos, bool * is_rtl);
     94 
     95 /**
     96  * Bidi process a paragraph of text
     97  * @param str_in the string to process
     98  * @param str_out store the result here
     99  * @param len length of the text
    100  * @param base_dir base dir of the text
    101  * @param pos_conv_out an `uint16_t` array to store the related logical position of the character.
    102  * Can be `NULL` is unused
    103  * @param pos_conv_len length of `pos_conv_out` in element count
    104  */
    105 void _lv_bidi_process_paragraph(const char * str_in, char * str_out, uint32_t len, lv_base_dir_t base_dir,
    106                                 uint16_t * pos_conv_out, uint16_t pos_conv_len);
    107 
    108 /**
    109  * Get the real text alignment from the a text alignment, base direction and a text.
    110  * @param align     LV_TEXT_ALIGN_..., write back the calculated align here (LV_TEXT_ALIGN_LEFT/RIGHT/CENTER)
    111  * @param base_dir  LV_BASE_DIR_..., write the calculated base dir here (LV_BASE_DIR_LTR/RTL)
    112  * @param txt       a text, used with LV_BASE_DIR_AUTO to determine the base direction
    113  */
    114 void lv_bidi_calculate_align(lv_text_align_t * align, lv_base_dir_t * base_dir, const char * txt);
    115 
    116 
    117 /**********************
    118  *      MACROS
    119  **********************/
    120 
    121 #else /*LV_USE_BIDI*/
    122 /**
    123  * For compatibility if LV_USE_BIDI = 0
    124  * Get the real text alignment from the a text alignment, base direction and a text.
    125  * @param align     For LV_TEXT_ALIGN_AUTO give LV_TEXT_ALIGN_LEFT else leave unchanged, write back the calculated align here
    126  * @param base_dir  Unused
    127  * @param txt       Unused
    128  */
    129 static inline void lv_bidi_calculate_align(lv_text_align_t * align, lv_base_dir_t * base_dir, const char * txt)
    130 {
    131     LV_UNUSED(txt);
    132     LV_UNUSED(base_dir);
    133     if(*align == LV_TEXT_ALIGN_AUTO) * align = LV_TEXT_ALIGN_LEFT;
    134 }
    135 #endif /*LV_USE_BIDI*/
    136 
    137 #ifdef __cplusplus
    138 } /*extern "C"*/
    139 #endif
    140 
    141 #endif /*LV_BIDI_H*/