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

test_font_loader.c (8603B)

      1 /**
      2  * @file test_font_loader.c
      3  *
      4  */
      5 
      6 /*********************
      7  *      INCLUDES
      8  *********************/
      9 
     10 #if LV_BUILD_TEST
     11 #include "../../lvgl.h"
     12 
     13 #include "unity/unity.h"
     14 
     15 /*********************
     16  *      DEFINES
     17  *********************/
     18 
     19 /**********************
     20  *      TYPEDEFS
     21  **********************/
     22 
     23 /**********************
     24  *  STATIC PROTOTYPES
     25  **********************/
     26 
     27 static int compare_fonts(lv_font_t * f1, lv_font_t * f2);
     28 void test_font_loader(void);
     29 
     30 /**********************
     31  *  STATIC VARIABLES
     32  **********************/
     33 
     34 /**********************
     35  *      MACROS
     36  **********************/
     37 
     38 /**********************
     39  *   GLOBAL FUNCTIONS
     40  **********************/
     41 
     42 extern lv_font_t font_1;
     43 extern lv_font_t font_2;
     44 extern lv_font_t font_3;
     45 
     46 void test_font_loader(void)
     47 {
     48     /*Test with cahce ('A' has cache)*/
     49     lv_font_t * font_1_bin = lv_font_load("A:src/test_fonts/font_1.fnt");
     50     lv_font_t * font_2_bin = lv_font_load("A:src/test_fonts/font_2.fnt");
     51     lv_font_t * font_3_bin = lv_font_load("A:src/test_fonts/font_3.fnt");
     52 
     53     compare_fonts(&font_1, font_1_bin);
     54     compare_fonts(&font_2, font_2_bin);
     55     compare_fonts(&font_3, font_3_bin);
     56 
     57     lv_font_free(font_1_bin);
     58     lv_font_free(font_2_bin);
     59     lv_font_free(font_3_bin);
     60 
     61     /*Test with cahce ('B' has NO cache)*/
     62     font_1_bin = lv_font_load("B:src/test_fonts/font_1.fnt");
     63     font_2_bin = lv_font_load("B:src/test_fonts/font_2.fnt");
     64     font_3_bin = lv_font_load("B:src/test_fonts/font_3.fnt");
     65 
     66     compare_fonts(&font_1, font_1_bin);
     67     compare_fonts(&font_2, font_2_bin);
     68     compare_fonts(&font_3, font_3_bin);
     69 
     70     lv_font_free(font_1_bin);
     71     lv_font_free(font_2_bin);
     72     lv_font_free(font_3_bin);
     73 }
     74 
     75 static int compare_fonts(lv_font_t * f1, lv_font_t * f2)
     76 {
     77     TEST_ASSERT_NOT_NULL_MESSAGE(f1, "font not null");
     78     TEST_ASSERT_NOT_NULL_MESSAGE(f2, "font not null");
     79 
     80     //    Skip these test because -Wpedantic tells
     81     //    ISO C forbids passing argument 1 of ‘TEST_ASSERT_EQUAL_PTR_MESSAGE’ between function pointer and ‘void *’
     82     //    TEST_ASSERT_EQUAL_PTR_MESSAGE(f1->get_glyph_dsc, f2->get_glyph_dsc, "glyph_dsc");
     83     //    TEST_ASSERT_EQUAL_PTR_MESSAGE(f1->get_glyph_bitmap, f2->get_glyph_bitmap, "glyph_bitmap");
     84 
     85     TEST_ASSERT_EQUAL_INT_MESSAGE(f1->line_height, f2->line_height, "line_height");
     86     TEST_ASSERT_EQUAL_INT_MESSAGE(f1->base_line, f2->base_line, "base_line");
     87     TEST_ASSERT_EQUAL_INT_MESSAGE(f1->subpx, f2->subpx, "subpx");
     88     lv_font_fmt_txt_dsc_t * dsc1 = (lv_font_fmt_txt_dsc_t *)f1->dsc;
     89     lv_font_fmt_txt_dsc_t * dsc2 = (lv_font_fmt_txt_dsc_t *)f2->dsc;
     90 
     91     TEST_ASSERT_EQUAL_INT_MESSAGE(dsc1->kern_scale, dsc2->kern_scale, "kern_scale");
     92     TEST_ASSERT_EQUAL_INT_MESSAGE(dsc1->cmap_num, dsc2->cmap_num, "cmap_num");
     93     TEST_ASSERT_EQUAL_INT_MESSAGE(dsc1->bpp, dsc2->bpp, "bpp");
     94     TEST_ASSERT_EQUAL_INT_MESSAGE(dsc1->kern_classes, dsc2->kern_classes, "kern_classes");
     95     TEST_ASSERT_EQUAL_INT_MESSAGE(dsc1->bitmap_format, dsc2->bitmap_format, "bitmap_format");
     96 
     97     // cmaps
     98     int total_glyphs = 0;
     99     for(int i = 0; i < dsc1->cmap_num; ++i) {
    100         lv_font_fmt_txt_cmap_t * cmaps1 = (lv_font_fmt_txt_cmap_t *)&dsc1->cmaps[i];
    101         lv_font_fmt_txt_cmap_t * cmaps2 = (lv_font_fmt_txt_cmap_t *)&dsc2->cmaps[i];
    102 
    103         TEST_ASSERT_EQUAL_INT_MESSAGE(cmaps1->range_start, cmaps2->range_start, "range_start");
    104         TEST_ASSERT_EQUAL_INT_MESSAGE(cmaps1->range_length, cmaps2->range_length, "range_length");
    105         TEST_ASSERT_EQUAL_INT_MESSAGE(cmaps1->glyph_id_start, cmaps2->glyph_id_start, "glyph_id_start");
    106         TEST_ASSERT_EQUAL_INT_MESSAGE(cmaps1->type, cmaps2->type, "type");
    107         TEST_ASSERT_EQUAL_INT_MESSAGE(cmaps1->list_length, cmaps2->list_length, "list_length");
    108 
    109         if(cmaps1->unicode_list != NULL && cmaps2->unicode_list != NULL) {
    110             TEST_ASSERT_TRUE_MESSAGE(cmaps1->unicode_list && cmaps2->unicode_list, "unicode_list");
    111 
    112             TEST_ASSERT_EQUAL_UINT8_ARRAY_MESSAGE(
    113                 (uint8_t *)cmaps1->unicode_list,
    114                 (uint8_t *)cmaps2->unicode_list,
    115                 sizeof(uint16_t) * cmaps1->list_length,
    116                 "unicode_list");
    117             total_glyphs += cmaps1->list_length;
    118         }
    119         else {
    120             total_glyphs += cmaps1->range_length;
    121             TEST_ASSERT_EQUAL_PTR_MESSAGE(cmaps1->unicode_list, cmaps2->unicode_list, "unicode_list");
    122         }
    123 
    124         if(cmaps1->glyph_id_ofs_list != NULL && cmaps2->glyph_id_ofs_list != NULL) {
    125             uint8_t * ids1 = (uint8_t *)cmaps1->glyph_id_ofs_list;
    126             uint8_t * ids2 = (uint8_t *)cmaps2->glyph_id_ofs_list;
    127 
    128             TEST_ASSERT_EQUAL_UINT8_ARRAY_MESSAGE(ids1, ids2, cmaps1->list_length, "glyph_id_ofs_list");
    129         }
    130         else {
    131             TEST_ASSERT_EQUAL_PTR_MESSAGE(cmaps1->glyph_id_ofs_list, cmaps2->glyph_id_ofs_list, "glyph_id_ofs_list");
    132         }
    133     }
    134 
    135     // kern_dsc
    136     if(dsc1->kern_classes == 1 && dsc2->kern_classes == 1) {
    137         lv_font_fmt_txt_kern_classes_t * kern1 = (lv_font_fmt_txt_kern_classes_t *)dsc1->kern_dsc;
    138         lv_font_fmt_txt_kern_classes_t * kern2 = (lv_font_fmt_txt_kern_classes_t *)dsc2->kern_dsc;
    139         if(kern1 != NULL && kern2 != NULL) {
    140             TEST_ASSERT_EQUAL_INT_MESSAGE(kern1->right_class_cnt, kern2->right_class_cnt, "right_class_cnt");
    141             TEST_ASSERT_EQUAL_INT_MESSAGE(kern1->left_class_cnt, kern2->left_class_cnt, "left_class_cnt");
    142 
    143             TEST_ASSERT_EQUAL_UINT8_ARRAY_MESSAGE(
    144                 (uint8_t *)kern1->left_class_mapping,
    145                 (uint8_t *)kern2->left_class_mapping,
    146                 kern1->left_class_cnt,
    147                 "left_class_mapping");
    148 
    149             TEST_ASSERT_EQUAL_UINT8_ARRAY_MESSAGE(
    150                 (uint8_t *)kern1->right_class_mapping,
    151                 (uint8_t *)kern2->right_class_mapping,
    152                 kern1->right_class_cnt,
    153                 "right_class_mapping");
    154 
    155             TEST_ASSERT_EQUAL_UINT8_ARRAY_MESSAGE(
    156                 (uint8_t *)kern1->class_pair_values,
    157                 (uint8_t *)kern2->class_pair_values,
    158                 kern1->right_class_cnt * kern1->left_class_cnt,
    159                 "class_pair_values");
    160         }
    161         else {
    162             TEST_ASSERT_EQUAL_PTR_MESSAGE(kern1, kern2, "kern");
    163         }
    164     }
    165     else if(dsc1->kern_classes == 0 && dsc2->kern_classes == 0) {
    166         lv_font_fmt_txt_kern_pair_t * kern1 = (lv_font_fmt_txt_kern_pair_t *)dsc1->kern_dsc;
    167         lv_font_fmt_txt_kern_pair_t * kern2 = (lv_font_fmt_txt_kern_pair_t *)dsc2->kern_dsc;
    168         if(kern1 != NULL && kern2 != NULL) {
    169             TEST_ASSERT_EQUAL_INT_MESSAGE(kern1->glyph_ids_size, kern2->glyph_ids_size, "glyph_ids_size");
    170             TEST_ASSERT_EQUAL_INT_MESSAGE(kern1->pair_cnt, kern2->pair_cnt, "pair_cnt");
    171 
    172             int ids_size;
    173 
    174             if(kern1->glyph_ids_size == 0) {
    175                 ids_size = sizeof(int8_t) * 2 * kern1->pair_cnt;
    176             }
    177             else {
    178                 ids_size = sizeof(int16_t) * 2 * kern1->pair_cnt;
    179             }
    180 
    181             TEST_ASSERT_EQUAL_UINT8_ARRAY_MESSAGE(kern1->glyph_ids, kern2->glyph_ids, ids_size, "glyph_ids");
    182             TEST_ASSERT_EQUAL_UINT8_ARRAY_MESSAGE(
    183                 (uint8_t *) kern1->values,
    184                 (uint8_t *) kern2->values,
    185                 kern1->pair_cnt,
    186                 "glyph_values");
    187         }
    188     }
    189 
    190     lv_font_fmt_txt_glyph_dsc_t * glyph_dsc1 = (lv_font_fmt_txt_glyph_dsc_t *)dsc1->glyph_dsc;
    191     lv_font_fmt_txt_glyph_dsc_t * glyph_dsc2 = (lv_font_fmt_txt_glyph_dsc_t *)dsc2->glyph_dsc;
    192 
    193     for(int i = 0; i < total_glyphs; ++i) {
    194         if(i < total_glyphs - 1) {
    195             int size1 = glyph_dsc1[i + 1].bitmap_index - glyph_dsc1[i].bitmap_index;
    196 
    197             if(size1 > 0) {
    198                 TEST_ASSERT_EQUAL_UINT8_ARRAY_MESSAGE(
    199                     dsc1->glyph_bitmap + glyph_dsc1[i].bitmap_index,
    200                     dsc2->glyph_bitmap + glyph_dsc2[i].bitmap_index,
    201                     size1 - 1, "glyph_bitmap");
    202             }
    203         }
    204         TEST_ASSERT_EQUAL_INT_MESSAGE(glyph_dsc1[i].adv_w, glyph_dsc2[i].adv_w, "adv_w");
    205         TEST_ASSERT_EQUAL_INT_MESSAGE(glyph_dsc1[i].box_w, glyph_dsc2[i].box_w, "box_w");
    206         TEST_ASSERT_EQUAL_INT_MESSAGE(glyph_dsc1[i].box_h, glyph_dsc2[i].box_h, "box_h");
    207         TEST_ASSERT_EQUAL_INT_MESSAGE(glyph_dsc1[i].ofs_x, glyph_dsc2[i].ofs_x, "ofs_x");
    208         TEST_ASSERT_EQUAL_INT_MESSAGE(glyph_dsc1[i].ofs_y, glyph_dsc2[i].ofs_y, "ofs_y");
    209     }
    210 
    211     LV_LOG_INFO("No differences found!");
    212     return 0;
    213 }
    214 
    215 /**********************
    216  *   STATIC FUNCTIONS
    217  **********************/
    218 
    219 #endif // LV_BUILD_TEST
    220