void Bitmap::GetMaxPoint(int* width, int* height) { MathCell* tmp = m_tree; int currentHeight = 0; int currentWidth = 0; *width = 0; *height = 0; bool bigSkip = false; bool firstCell = true; while (tmp != NULL) { if (!tmp->m_isBroken) { if (tmp->BreakLineHere() || firstCell) { firstCell = false; currentHeight += tmp->GetMaxHeight(); if (bigSkip) currentHeight += MC_LINE_SKIP; *height = currentHeight; currentWidth = tmp->GetWidth(); *width = MAX(currentWidth, *width); } else { currentWidth += (tmp->GetWidth() + MC_CELL_SKIP); *width = MAX(currentWidth - MC_CELL_SKIP, *width); } bigSkip = tmp->m_bigSkip; } tmp = tmp->m_nextToDraw; } }
void Bitmap::BreakLines() { int fullWidth = BM_FULL_WIDTH; int currentWidth = 0; MathCell* tmp = m_tree; while (tmp != NULL) { if (!tmp->m_isBroken) { tmp->BreakLine(false); tmp->ResetData(); if (tmp->BreakLineHere() || (currentWidth + tmp->GetWidth() >= fullWidth)) { currentWidth = tmp->GetWidth(); tmp->BreakLine(true); } else currentWidth += (tmp->GetWidth() + MC_CELL_SKIP); } tmp = tmp->m_nextToDraw; } }
void GroupCell::RecalculateSize(CellParser& parser, int fontsize) { if (m_width == -1 || m_height == -1 || parser.ForceUpdate()) { // special case if (m_groupType == GC_TYPE_PAGEBREAK) { m_width = 10; m_height = 2; m_center = 0; m_indent = 0; MathCell::RecalculateWidthsList(parser, fontsize); return; } double scale = parser.GetScale(); m_input->RecalculateSizeList(parser, fontsize); m_center = m_input->GetMaxCenter(); m_height = m_input->GetMaxHeight(); m_indent = parser.GetIndent(); if (m_output != NULL && !m_hide) { MathCell *tmp = m_output; while (tmp != NULL) { tmp->RecalculateSize(parser, tmp->IsMath() ? m_mathFontSize : m_fontSize); tmp = tmp->m_next; } m_outputRect.x = m_currentPoint.x; m_outputRect.y = m_currentPoint.y - m_output->GetMaxCenter(); m_outputRect.width = 0; m_outputRect.height = 0; m_height = m_input->GetMaxHeight(); m_width = m_input->GetFullWidth(scale); tmp = m_output; while (tmp != NULL) { if (tmp->BreakLineHere() || tmp == m_output) { m_width = MAX(m_width, tmp->GetLineWidth(scale)); m_outputRect.width = MAX(m_outputRect.width, tmp->GetLineWidth(scale)); m_height += tmp->GetMaxHeight(); if (tmp->m_bigSkip) m_height += MC_LINE_SKIP; m_outputRect.height += tmp->GetMaxHeight() + MC_LINE_SKIP; } tmp = tmp->m_nextToDraw; } } } m_appendedCells = NULL; }
void GroupCell::BreakLines(MathCell *cell, int fullWidth) { int currentWidth = m_indent; MathCell *tmp = cell; while (tmp != NULL && !m_hide) { tmp->ResetData(); tmp->BreakLine(false); if (!tmp->m_isBroken) { if (tmp->BreakLineHere() || (currentWidth + tmp->GetWidth() >= fullWidth)) { currentWidth = m_indent + tmp->GetWidth(); tmp->BreakLine(true); } else currentWidth += (tmp->GetWidth() + MC_CELL_SKIP); } tmp = tmp->m_nextToDraw; } }
// We assume that appended cells will be in a new line! void GroupCell::RecalculateAppended(CellParser& parser) { if (m_appendedCells == NULL) return; MathCell *tmp = m_appendedCells; int fontsize = m_fontSize; double scale = parser.GetScale(); // Recalculate widths of cells while (tmp != NULL) { tmp->RecalculateWidths(parser, tmp->IsMath() ? m_mathFontSize : m_fontSize); tmp = tmp->m_next; } // Breakup cells and break lines BreakUpCells(m_appendedCells, parser, fontsize, parser.GetClientWidth()); BreakLines(m_appendedCells, parser.GetClientWidth()); // Recalculate size of cells tmp = m_appendedCells; while (tmp != NULL) { tmp->RecalculateSize(parser, tmp->IsMath() ? m_mathFontSize : m_fontSize); tmp = tmp->m_next; } // Update widths tmp = m_appendedCells; while (tmp != NULL) { if (tmp->BreakLineHere() || tmp == m_appendedCells) { m_width = MAX(m_width, tmp->GetLineWidth(scale)); m_outputRect.width = MAX(m_outputRect.width, tmp->GetLineWidth(scale)); m_height += tmp->GetMaxHeight(); if (tmp->m_bigSkip) m_height += MC_LINE_SKIP; m_outputRect.height += tmp->GetMaxHeight() + MC_LINE_SKIP; } tmp = tmp->m_nextToDraw; } m_appendedCells = NULL; }