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);
	}
}
Exemple #2
0
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();
}