From d274d3a6dfc0864ec6a44e7d6948c2d873eb6f76 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Fri, 11 Nov 2022 10:50:39 +0100 Subject: Add image (custom emoji) alt text for copy-pasting, limit custom emoji size in room description, change max size to 32, 32, cache custom emoji locally --- src/Text.cpp | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) (limited to 'src/Text.cpp') diff --git a/src/Text.cpp b/src/Text.cpp index c43944b..50db0ee 100644 --- a/src/Text.cpp +++ b/src/Text.cpp @@ -124,10 +124,11 @@ namespace QuickMedia dirtyText = true; } - // TODO: Alt text. Helpful when copying the text. Or do we want to copy the url instead? // static - std::string Text::formatted_image(const std::string &url, bool local, mgl::vec2i size) { + std::string Text::formatted_image(const std::string &url, bool local, mgl::vec2i size, const std::string &alt) { const uint32_t str_size = url.size(); + const uint32_t alt_str_size = alt.size(); + std::string result; result += FORMATTED_TEXT_START; result += (uint8_t)FormattedTextType::IMAGE; @@ -136,6 +137,8 @@ namespace QuickMedia result.append((const char*)&local, sizeof(local)); result.append((const char*)&str_size, sizeof(str_size)); result.append(url); + result.append((const char*)&alt_str_size, sizeof(alt_str_size)); + result.append(alt); result += FORMATTED_TEXT_END; return result; } @@ -182,6 +185,12 @@ namespace QuickMedia for(auto &text_element : tmp_text_elements) { if(text_element.type == TextElement::Type::TEXT) result.append(text_element.text); + else if(text_element.type == TextElement::Type::IMAGE) { + if(!text_element.alt.empty()) + result.append(text_element.alt); + else + result.append(text_element.url); + } } return result; } @@ -435,12 +444,13 @@ namespace QuickMedia return std::min(5 + sizeof(uint32_t) + text_size + 1, size); // + 1 for FORMATTED_TEXT_END } - static size_t parse_formatted_image(const char *str, size_t size, std::string &image_url, bool &image_local, mgl::vec2i &image_size) { + static size_t parse_formatted_image(const char *str, size_t size, std::string &image_url, bool &image_local, mgl::vec2i &image_size, std::string &alt) { image_url.clear(); image_local = true; image_size = { 0, 0 }; + alt.clear(); - if(size < sizeof(image_size.x) + sizeof(image_size.y) + sizeof(image_local) + sizeof(uint32_t)) + if(size < sizeof(image_size.x) + sizeof(image_size.y) + sizeof(image_local) + sizeof(uint32_t) + sizeof(uint32_t)) return size; size_t offset = 0; @@ -456,13 +466,24 @@ namespace QuickMedia uint32_t text_size; memcpy(&text_size, str + offset, sizeof(text_size)); offset += sizeof(text_size); + const size_t image_url_offset = offset; + + if(size < offset + text_size + sizeof(uint32_t)) + return size; + + offset += text_size; + uint32_t alt_size; + memcpy(&alt_size, str + offset, sizeof(alt_size)); + offset += sizeof(alt_size); + const size_t alt_offset = offset; - if(size < offset + text_size) + if(size < offset + alt_size) return size; - image_url.assign(str + offset, text_size); + image_url.assign(str + image_url_offset, text_size); + alt.assign(str + alt_offset, alt_size); image_size = clamp_to_size(image_size, MAX_IMAGE_SIZE); - return std::min(offset + text_size + 1, size); // + 1 for FORMATTED_TEXT_END + return std::min(offset + alt_size + 1, size); // + 1 for FORMATTED_TEXT_END } static size_t parse_formatted_text(const char *str, size_t size, TextElement &text_element) { @@ -477,7 +498,7 @@ namespace QuickMedia } case FormattedTextType::IMAGE: { text_element.type = TextElement::Type::IMAGE; - return parse_formatted_image(str + 1, size - 1, text_element.url, text_element.local, text_element.size); + return parse_formatted_image(str + 1, size - 1, text_element.url, text_element.local, text_element.size, text_element.alt); } default: break; -- cgit v1.2.3