// accessors //------------------------------------------------- // line::xoffset //------------------------------------------------- public float xoffset() { float result; switch (justify()) { case text_justify.LEFT: default: result = 0; break; case text_justify.CENTER: result = (m_layout.width() - width()) / 2; break; case text_justify.RIGHT: result = m_layout.width() - width(); break; } return(result); }
// accessors public float xoffset(text_layout layout) { return((layout.width() * m_anchor_target) - (m_width * m_anchor_pos)); }
public void align_text(text_layout layout) { assert(m_right_justify_start >= m_center_justify_start); if (m_characters.empty() || m_center_justify_start != 0) { // at least some of the text is left-justified - anchor to left m_anchor_pos = 0.0f; m_anchor_target = 0.0f; if ((layout.width() > m_width) && (m_characters.size() > m_center_justify_start)) { // at least some text is not left-justified if (m_right_justify_start == m_center_justify_start) { // all text that isn't left-justified is right-justified float right_offset = layout.width() - m_width; for (size_t i = m_right_justify_start; m_characters.size() > i; ++i) { m_characters[i] = new positioned_char() { character = m_characters[i].character, style = m_characters[i].style, source = m_characters[i].source, xoffset = m_characters[i].xoffset + right_offset, xwidth = m_characters[i].xwidth } } ; //m_characters[i].xoffset += right_offset; m_width = layout.width(); } else if (m_characters.size() <= m_right_justify_start) { // all text that isn't left-justified is center-justified float center_width = m_width - m_characters[m_center_justify_start].xoffset; float center_offset = ((layout.width() - center_width) * 0.5f) - m_characters[m_center_justify_start].xoffset; if (0.0f < center_offset) { for (size_t i = m_center_justify_start; m_characters.size() > i; ++i) { m_characters[i] = new positioned_char() { character = m_characters[i].character, style = m_characters[i].style, source = m_characters[i].source, xoffset = m_characters[i].xoffset + center_offset, xwidth = m_characters[i].xwidth } } ; //m_characters[i].xoffset += center_offset; m_width += center_offset; } } else { // left, right and center-justified parts float center_width = m_characters[m_right_justify_start].xoffset - m_characters[m_center_justify_start].xoffset; float center_offset = ((layout.width() - center_width) * 0.5f) - m_characters[m_center_justify_start].xoffset; float right_offset = layout.width() - m_width; if (center_offset > right_offset) { // right-justified text pushes centre-justified text to the left for (size_t i = m_center_justify_start; m_right_justify_start > i; ++i) { m_characters[i] = new positioned_char() { character = m_characters[i].character, style = m_characters[i].style, source = m_characters[i].source, xoffset = m_characters[i].xoffset + right_offset, xwidth = m_characters[i].xwidth } } ; //m_characters[i].xoffset += right_offset; } else if (0.0f < center_offset) { // left-justified text doesn't push centre-justified text to the right for (size_t i = m_center_justify_start; m_right_justify_start > i; ++i) { m_characters[i] = new positioned_char() { character = m_characters[i].character, style = m_characters[i].style, source = m_characters[i].source, xoffset = m_characters[i].xoffset + center_offset, xwidth = m_characters[i].xwidth } } ; //m_characters[i].xoffset += center_offset; } for (size_t i = m_right_justify_start; m_characters.size() > i; ++i) { m_characters[i] = new positioned_char() { character = m_characters[i].character, style = m_characters[i].style, source = m_characters[i].source, xoffset = m_characters[i].xoffset + right_offset, xwidth = m_characters[i].xwidth } } ; //m_characters[i].xoffset += right_offset; m_width = layout.width(); } } } else if (m_characters.size() <= m_right_justify_start) { // all text is center-justified - anchor to center m_anchor_pos = 0.5f; m_anchor_target = 0.5f; } else { // at least some text is right-justified - anchor to right m_anchor_pos = 1.0f; m_anchor_target = 1.0f; if ((layout.width() > m_width) && (m_right_justify_start > m_center_justify_start)) { // mixed center-justified and right-justified text float center_width = m_characters[m_right_justify_start].xoffset; float center_offset = (layout.width() - m_width + (center_width * 0.5f)) - (layout.width() * 0.5f); if (0.0f < center_offset) { for (size_t i = m_right_justify_start; m_characters.size() > i; ++i) { m_characters[i] = new positioned_char() { character = m_characters[i].character, style = m_characters[i].style, source = m_characters[i].source, xoffset = m_characters[i].xoffset + center_offset, xwidth = m_characters[i].xwidth } } ; //m_characters[i].xoffset += center_offset; m_width += center_offset; } } } }