CL_SpanLayout_Impl::TextSizeResult CL_SpanLayout_Impl::find_text_size(CL_GraphicContext &gc, const TextBlock &block, unsigned int object_index) { CL_Font font = objects[object_index].font; if (layout_cache.object_index != object_index) { layout_cache.object_index = object_index; layout_cache.metrics = font.get_font_metrics(); } TextSizeResult result; result.start = block.start; int pos = block.start; int x_position = 0; while (pos != block.end) { int end = cl_min(objects[object_index].end, block.end); CL_StringRef subtext = text.substr(pos, end-pos); CL_Size text_size = font.get_text_size(gc, subtext); result.width += text_size.width; result.height = cl_max(result.height, (int)(layout_cache.metrics.get_height()+layout_cache.metrics.get_external_leading())/*text_size.height*/); result.ascender = cl_max(result.ascender, (int)layout_cache.metrics.get_ascent()); result.descender = cl_max(result.descender, (int)layout_cache.metrics.get_descent()); LineSegment segment; segment.type = object_text; segment.start = pos; segment.end = end; segment.font = objects[object_index].font; segment.color = objects[object_index].color; segment.id = objects[object_index].id; segment.x_position = x_position; segment.width = text_size.width; segment.ascender = (int)layout_cache.metrics.get_ascent(); segment.descender = (int)layout_cache.metrics.get_descent(); x_position += text_size.width; result.segments.push_back(segment); pos = end; if (pos == objects[object_index].end) { object_index++; result.objects_traversed++; if (object_index < objects.size()) { layout_cache.object_index = object_index; font = objects[object_index].font; layout_cache.metrics = font.get_font_metrics(); } } } result.end = pos; return result; }
void CL_ListViewLayoutIcons::update_shown_items_grid(CL_Font &font, CL_ListViewItem doc_item) { CL_GraphicContext &gc = listview->get_gc(); shown_items.clear(); row_counter = 0; CL_ListViewItem item = doc_item.get_first_child(); int x = rect_view.left; int y = rect_view.top - scroll_y; int skip_items = (scroll_y/size_cell.height) * max_grid_cols_visible; int skip_rows = skip_items/max_grid_cols_visible; y += skip_rows * size_cell.height; int skip_item_counter = 0; while (item.is_item()) { if (skip_item_counter < skip_items) { item = item.get_next_sibling(); skip_item_counter++; } ListViewShownItem si; si.valid = true; si.item = item; CL_Rect rect_cell(x, y, x+size_cell.width, y+size_cell.height); si.rect_cell.push_back(rect_cell); rect_cell.shrink(rect_cell_shrink.left, rect_cell_shrink.top, rect_cell_shrink.right, rect_cell_shrink.bottom); // part_cell.get_content_box(si.rect_cell); CL_Rect rect_cell_content = rect_cell; si.rect_icon = get_icon_rect(rect_cell_content, item, rect_cell_content.left); const CL_StringRef &text = si.item.get_column(header->get_first_column().get_column_id()).get_text(); CL_Size text_size = font.get_text_size(gc, text); CL_Rect text_rect; text_rect.left = rect_cell_content.get_center().x - text_size.width/2; text_rect.top = rect_cell_content.bottom - text_size.height; text_rect.set_size(text_size); si.descent = font.get_font_metrics().get_descent(); si.rect_text.push_back(text_rect); shown_items.push_back(si); x += size_cell.width; if (x + size_cell.width > rect_view.right) { row_counter++; if (row_counter > (max_rows_visible+1)) break; y += size_cell.height; x = rect_view.left; } item = item.get_next_sibling(); } valid = true; }
CL_GUIThemePart::VerticalTextPosition CL_GUIThemePart::get_vertical_text_align(CL_GraphicContext &gc, CL_Font &font, const CL_Rect &content_rect) { // See diagram in: Documentation\Overview\fonts.html (Font Metrics) CL_FontMetrics metrics = font.get_font_metrics(); float align_height = metrics.get_ascent() - metrics.get_internal_leading(); float content_height = content_rect.get_height(); float baseline = (content_height + align_height) / 2.0f; VerticalTextPosition result; result.baseline = baseline + content_rect.top; result.top = result.baseline - metrics.get_ascent(); result.bottom = result.baseline + metrics.get_descent(); return result; }
void LabelImpl::load(CL_GraphicContext &p_gc) { CL_FontDescription desc; desc.set_height(m_size); if (m_font == Label::F_REGULAR || m_font == Label::F_BOLD) { desc.set_typeface_name("tahoma"); if (m_font == Label::F_BOLD) { desc.set_weight(100000); } m_clFont = new CL_Font_System(p_gc, desc); } else { desc.set_typeface_name("resources/pixel.ttf"); m_clFont = new CL_Font_Freetype(p_gc, desc); } // remember metrics m_fontMetrics = m_clFont->get_font_metrics(p_gc); }
void Info::draw(CL_GraphicContext &gc) { CL_String text_to_draw = name; CL_Rect draw_rect = get_geometry(); int draw_xpos = 0; int draw_ypos = 0; //CL_Draw::fill(gc, CL_Rect(draw_xpos, draw_ypos, CL_Size(get_width(), get_height())), CL_Colorf(CL_Colorf::red)); CL_Font font = gui->get_font(); CL_FontMetrics metrics = font.get_font_metrics(gc); draw_ypos += (int) metrics.get_ascent(); CL_Colorf color; int time_diff = CL_System::get_time() - activated_time; float color_value = 1.0f - ( ( (float) time_diff ) / 1000.0f); if ( (color_value <= 1.0f) && (color_value > 0.0f) ) { color = CL_Colorf(color_value, color_value/2.0f, color_value/2.0f, color_value); font.draw_text(gc, draw_xpos, draw_ypos, "#", color); color = CL_Colorf(color_value, color_value/2.0f, color_value/2.0f, 1.0f); text_to_draw = name + comment; set_constant_repaint(true); } else { color = CL_Colorf(0, 0, 0, 1.0f); set_constant_repaint(false); } //font.draw_text(gc, draw_xpos + 16, draw_ypos, text_to_draw, CL_Colorf::white); font.draw_text(gc, draw_xpos + 16-1, draw_ypos-1, text_to_draw, color); }