aboutsummaryrefslogtreecommitdiff
path: root/src/Text.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Text.cpp')
-rw-r--r--src/Text.cpp37
1 files changed, 29 insertions, 8 deletions
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;