void CL_SpanLayout_Impl::draw_layout_text(CL_GraphicContext &gc, Line &line, LineSegment &segment, int x, int y) { CL_StringRef segment_text = text.substr(segment.start, segment.end - segment.start); int length = (int)segment_text.length(); int s1 = cl_clamp((int)sel_start - (int)segment.start, 0, length); int s2 = cl_clamp((int)sel_end - (int)segment.start, 0, length); if (s1 != s2) { int xx = x + segment.x_position; int xx0 = xx + segment.font.get_text_size(gc, segment_text.substr(0, s1)).width; int xx1 = xx0 + segment.font.get_text_size(gc, segment_text.substr(s1, s2 - s1)).width; int sel_width = segment.font.get_text_size(gc, segment_text.substr(s1, s2 - s1)).width; CL_Draw::fill(gc, xx0, y + line.ascender-segment.ascender, xx1, y+line.ascender+segment.descender, sel_background); if (cursor_visible && cursor_pos >= segment.start && cursor_pos < segment.end) { int cursor_x = x + segment.x_position + segment.font.get_text_size(gc, text.substr(segment.start, cursor_pos - segment.start)).width; int cursor_width = cursor_overwrite_mode ? segment.font.get_text_size(gc, text.substr(cursor_pos, 1)).width : 1; CL_Draw::fill(gc, cursor_x, y + line.ascender-segment.ascender, cursor_x + cursor_width, y+line.ascender+segment.descender, cursor_color); } if (s1 > 0) { if (is_ellipsis_draw) segment.font.draw_text_ellipsis(gc, xx, y + line.ascender, ellipsis_content_rect, segment_text.substr(0, s1), segment.color); else segment.font.draw_text(gc, xx, y + line.ascender, segment_text.substr(0, s1), segment.color); } if (is_ellipsis_draw) segment.font.draw_text_ellipsis(gc, xx0, y+line.ascender, ellipsis_content_rect, segment_text.substr(s1, s2 - s1), sel_foreground); else segment.font.draw_text(gc, xx0, y+line.ascender, segment_text.substr(s1, s2 - s1), sel_foreground); xx += sel_width; if (s2 < length) { if (is_ellipsis_draw) segment.font.draw_text_ellipsis(gc, xx1, y + line.ascender, ellipsis_content_rect, segment_text.substr(s2), segment.color); else segment.font.draw_text(gc, xx1, y + line.ascender, segment_text.substr(s2), segment.color); } } else { if (cursor_visible && cursor_pos >= segment.start && cursor_pos < segment.end) { int cursor_x = x + segment.x_position + segment.font.get_text_size(gc, text.substr(segment.start, cursor_pos - segment.start)).width; int cursor_width = cursor_overwrite_mode ? segment.font.get_text_size(gc, text.substr(cursor_pos, 1)).width : 1; CL_Draw::fill(gc, cursor_x, y + line.ascender-segment.ascender, cursor_x + cursor_width, y+line.ascender+segment.descender, cursor_color); } if (is_ellipsis_draw) segment.font.draw_text_ellipsis(gc, x + segment.x_position, y + line.ascender, ellipsis_content_rect, segment_text, segment.color); else segment.font.draw_text(gc, x + segment.x_position, y + line.ascender, segment_text, segment.color); } }
void Application::run() { mSigInit.invoke(); unsigned lastTime = CL_System::get_time(); while (!mQuit) { unsigned currTime = CL_System::get_time(); int delta = cl_clamp(static_cast<int>(currTime - lastTime), 0, 1000); lastTime = currTime; CL_KeepAlive::process(); if (delta != 0) mSigUpdate.invoke(delta); mGraphics->flip(); } mSigQuit.invoke(); }