imgui富文本的实现

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


关于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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值