关于imgui的richtext,issue有一篇文章一直讨论这个的,但是好像也没有特别好的办法
两种实现
自己参考了两个实现[1],做了下,大体思想是在imgui 渲染的地方根据字符串中特别标识的字段重新获取颜色出来。两种方法差不多,只是特别标识用的方法不太一样
用##aabbccdd这种颜色标识
实现代码
bool ParseColor(const char* s, ImU32* col) {
*col = 0;
if (s[0] != '#' || s[1] != '#') {
return false;
}
else {
for (int i = 0; i < 8; ++i) {
*col *= 16;
char c = s[i + 2];
if (c >= '0' && c <= '9') {
*col += c - '0';
}
else if (c >= 'A' && c <= 'F') {
*col += c - 'A' + 10;
}
else if (c >= 'a' && c <= 'f') {
*col += c - 'a' + 10;
}
else {
return false;
}
}
ImU32 flip_col = 0;
for (int i = 0; i < 4; ++i) {
flip_col <<= 8;
flip_col += (*col >> 8 * i) & 0x000000FF;
}
*col = flip_col;
return true;
}
}
然后在RenderText里面根据这个标识把颜色取出来
void ImFont::RenderText(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, float wrap_width, bool cpu_fine_clip) const
// 省略...
{
int index = 0;
int chain = 0;
const char* s = text_begin;
ImU32 temp_col;
while (s < text_end) {
if (s < text_end - 10 && ParseColor(s, &temp_col)) {
col = temp_col;
s += 10;
}
else {
char_buf[index] = *s;
col_buf[index] = col;
++index;
++s;
}
}
text_begin = &char_buf[0];
text_end = &char_buf[index];
}
使用的时候如下:
ImGui::Text("##F

博客介绍了两种颜色标识的实现方法,一是用##aabbccdd颜色标识,在imgui渲染处根据特别标识字段重新获取颜色;二是用Xterm color,同样识别表示颜色的字符并提取颜色。还提及Xterm标识符可表示颜色和控制信息,以及其256种颜色代码等内容。
最低0.47元/天 解锁文章
7786

被折叠的 条评论
为什么被折叠?



