From ebd3c08d9c656557bd9692f23926ca46e96d5738 Mon Sep 17 00:00:00 2001 From: Aldrik Ramaekers Date: Tue, 9 Jun 2020 21:13:51 +0200 Subject: bmp loading --- src/localization.c | 295 ++++++++++++++++++++++++++--------------------------- 1 file changed, 147 insertions(+), 148 deletions(-) (limited to 'src/localization.c') diff --git a/src/localization.c b/src/localization.c index 2ee39e3..6512d40 100644 --- a/src/localization.c +++ b/src/localization.c @@ -1,148 +1,147 @@ -/* -* BSD 2-Clause “Simplified” License -* Copyright (c) 2019, Aldrik Ramaekers, aldrik.ramaekers@protonmail.com -* All rights reserved. -*/ - -mo_file load_localization_file(u8 *start_addr, u8 *end_addr, u8 *img_start, u8 *img_end, - char *locale_id, char *locale_name) -{ - mo_file mo; - mo.translations = array_create(sizeof(mo_translation)); - - { - mo.header = *(mo_header*)start_addr; - mo.locale_id = mem_alloc(strlen(locale_id)+1); - string_copyn(mo.locale_id, locale_id, strlen(locale_id)+1); - - mo.locale_full = mem_alloc(strlen(locale_name)+1); - string_copyn(mo.locale_full, locale_name, strlen(locale_name)+1); - - mo.icon = assets_load_image(img_start, img_end, false); - - char *buffer = (char*)start_addr; - mo_entry *identifiers = (mo_entry*)(buffer + mo.header.identifier_table_offset); - mo_entry *translations = (mo_entry*)(buffer + mo.header.translation_table_offset); - - for (s32 i = 0; i < mo.header.number_of_strings; i++) - { - mo_entry *entry = &identifiers[i]; - mo_entry *trans = &translations[i]; - - mo_translation translation; - translation.identifier_len = entry->length; - translation.identifier = buffer+entry->offset; - translation.translation = buffer+trans->offset; - - array_push(&mo.translations, &translation); - //printf("%s=%s\n", translation.identifier, translation.translation); - } - } - - return mo; -} - -char* locale_get_name() -{ - if (!global_localization.active_localization) - { - return "[NO LOCALE]"; - } - - return global_localization.active_localization->locale_full; -} - -char* locale_get_id() -{ - if (!global_localization.active_localization) - { - return "[NO LOCALE]"; - } - - return global_localization.active_localization->locale_id; -} - -bool set_locale(char *country_id) -{ - if (country_id == 0 && global_localization.mo_files.length) - { - global_localization.active_localization = array_at(&global_localization.mo_files, 0); - return true; - } - - for (s32 i = 0; i < global_localization.mo_files.length; i++) - { - mo_file *file = array_at(&global_localization.mo_files, i); - if (strcmp(file->locale_id, country_id) == 0) - { - global_localization.active_localization = file; - return true; - } - } - - // if localization is not found, default to first in list (english), return false to report error - if (global_localization.mo_files.length) - global_localization.active_localization = array_at(&global_localization.mo_files, 0); - else - global_localization.active_localization = 0; - - return false; -} - -char* localize(const char *identifier) -{ - if (!global_localization.active_localization) - { - //printf("NO LOCALE SELECTED."); - return (char*)identifier; - } - - s32 len = strlen(identifier); - for (s32 i = 0; i < global_localization.active_localization->translations.length; i++) - { - mo_translation *trans = array_at(&global_localization.active_localization->translations, i); - - if (trans->identifier_len == len && strcmp(identifier, trans->identifier) == 0) - { - return trans->translation; - } - } - printf("MISSING TRANSLATION: [%s][%s]\n", identifier, global_localization.active_localization->locale_id); - return "MISSING"; -} - -void load_available_localizations() -{ - global_localization.mo_files = array_create(sizeof(mo_file)); - array_reserve(&global_localization.mo_files, 10); - - mo_file en = load_localization_file(_binary____data_translations_en_English_mo_start, - _binary____data_translations_en_English_mo_end, - _binary____data_imgs_en_png_start, - _binary____data_imgs_en_png_end, - "en", "English"); - - mo_file nl = load_localization_file(_binary____data_translations_nl_Dutch_mo_start, - _binary____data_translations_nl_Dutch_mo_end, - _binary____data_imgs_nl_png_start, - _binary____data_imgs_nl_png_end, - "nl", "Dutch"); - - array_push(&global_localization.mo_files, &en); - array_push(&global_localization.mo_files, &nl); -} - -void destroy_available_localizations() -{ - for (s32 i = 0; i < global_localization.mo_files.length; i++) - { - mo_file *file = array_at(&global_localization.mo_files, i); - array_destroy(&file->translations); - mem_free(file->locale_id); - mem_free(file->locale_full); - - if (file->icon) - assets_destroy_image(file->icon); - } - array_destroy(&global_localization.mo_files); -} +/* +* BSD 2-Clause “Simplified” License +* Copyright (c) 2019, Aldrik Ramaekers, aldrik.ramaekers@protonmail.com +* All rights reserved. +*/ + +mo_file load_localization_file(u8 *start_addr, u8 *end_addr, u8 *img_start, u8 *img_end, + char *locale_id, char *locale_name) +{ + mo_file mo; + mo.translations = array_create(sizeof(mo_translation)); + + { + mo.header = *(mo_header*)start_addr; + mo.locale_id = mem_alloc(strlen(locale_id)+1); + string_copyn(mo.locale_id, locale_id, strlen(locale_id)+1); + + mo.locale_full = mem_alloc(strlen(locale_name)+1); + string_copyn(mo.locale_full, locale_name, strlen(locale_name)+1); + + mo.icon = assets_load_bitmap(img_start, img_end); + + char *buffer = (char*)start_addr; + mo_entry *identifiers = (mo_entry*)(buffer + mo.header.identifier_table_offset); + mo_entry *translations = (mo_entry*)(buffer + mo.header.translation_table_offset); + + for (s32 i = 0; i < mo.header.number_of_strings; i++) + { + mo_entry *entry = &identifiers[i]; + mo_entry *trans = &translations[i]; + + mo_translation translation; + translation.identifier_len = entry->length; + translation.identifier = buffer+entry->offset; + translation.translation = buffer+trans->offset; + + array_push(&mo.translations, &translation); + } + } + + return mo; +} + +char* locale_get_name() +{ + if (!global_localization.active_localization) + { + return "[NO LOCALE]"; + } + + return global_localization.active_localization->locale_full; +} + +char* locale_get_id() +{ + if (!global_localization.active_localization) + { + return "[NO LOCALE]"; + } + + return global_localization.active_localization->locale_id; +} + +bool set_locale(char *country_id) +{ + if (country_id == 0 && global_localization.mo_files.length) + { + global_localization.active_localization = array_at(&global_localization.mo_files, 0); + return true; + } + + for (s32 i = 0; i < global_localization.mo_files.length; i++) + { + mo_file *file = array_at(&global_localization.mo_files, i); + if (strcmp(file->locale_id, country_id) == 0) + { + global_localization.active_localization = file; + return true; + } + } + + // if localization is not found, default to first in list (english), return false to report error + if (global_localization.mo_files.length) + global_localization.active_localization = array_at(&global_localization.mo_files, 0); + else + global_localization.active_localization = 0; + + return false; +} + +char* localize(const char *identifier) +{ + if (!global_localization.active_localization) + { + //printf("NO LOCALE SELECTED."); + return (char*)identifier; + } + + s32 len = strlen(identifier); + for (s32 i = 0; i < global_localization.active_localization->translations.length; i++) + { + mo_translation *trans = array_at(&global_localization.active_localization->translations, i); + + if (trans->identifier_len == len && strcmp(identifier, trans->identifier) == 0) + { + return trans->translation; + } + } + printf("MISSING TRANSLATION: [%s][%s]\n", identifier, global_localization.active_localization->locale_id); + return "MISSING"; +} + +void load_available_localizations() +{ + global_localization.mo_files = array_create(sizeof(mo_file)); + array_reserve(&global_localization.mo_files, 10); + + mo_file en = load_localization_file(_binary____data_translations_en_English_mo_start, + _binary____data_translations_en_English_mo_end, + _binary____data_imgs_en_bmp_start, + _binary____data_imgs_en_bmp_end, + "en", "English"); + + mo_file nl = load_localization_file(_binary____data_translations_nl_Dutch_mo_start, + _binary____data_translations_nl_Dutch_mo_end, + _binary____data_imgs_nl_bmp_start, + _binary____data_imgs_nl_bmp_end, + "nl", "Dutch"); + + array_push(&global_localization.mo_files, &en); + array_push(&global_localization.mo_files, &nl); +} + +void destroy_available_localizations() +{ + for (s32 i = 0; i < global_localization.mo_files.length; i++) + { + mo_file *file = array_at(&global_localization.mo_files, i); + array_destroy(&file->translations); + mem_free(file->locale_id); + mem_free(file->locale_full); + + if (file->icon) + assets_destroy_image(file->icon); + } + array_destroy(&global_localization.mo_files); +} -- cgit v1.2.3-70-g09d2