void SubSupCell::RecalculateSize(CellParser& parser, int fontsize, bool all) { double scale = parser.GetScale(); m_baseCell->RecalculateSize(parser, fontsize, true); m_indexCell->RecalculateSize(parser, MAX(MC_MIN_SIZE, fontsize - SUBSUP_DEC), true); m_exptCell->RecalculateSize(parser, MAX(MC_MIN_SIZE, fontsize - SUBSUP_DEC), true); m_height = m_baseCell->GetMaxHeight() + m_indexCell->GetMaxHeight() + m_exptCell->GetMaxHeight() - 2*SCALE_PX((8 * fontsize) / 10 + MC_EXP_INDENT, parser.GetScale()); m_center = m_exptCell->GetMaxHeight() + m_baseCell->GetMaxCenter() - SCALE_PX((8 * fontsize) / 10 + MC_EXP_INDENT, scale); MathCell::RecalculateSize(parser, fontsize, all); }
void SlideShow::RecalculateSize(CellParser& parser, int fontsize) { double scale = parser.GetScale(); m_images[m_displayed]->ViewportSize(m_canvasSize.x,m_canvasSize.y,scale); m_height = (scale * m_images[m_displayed]->m_height) + 2 * m_imageBorderWidth; m_center = m_height / 2; }
void ConjugateCell::RecalculateWidths(CellParser& parser, int fontsize) { double scale = parser.GetScale(); m_innerCell->RecalculateWidthsList(parser, fontsize); m_width = m_innerCell->GetFullWidth(scale) + SCALE_PX(8, scale); m_open->RecalculateWidthsList(parser, fontsize); m_close->RecalculateWidthsList(parser, fontsize); ResetData(); }
void DiffCell::RecalculateWidths(int fontsize) { CellParser *parser = CellParser::Get(); double scale = parser->GetScale(); m_baseCell->RecalculateWidthsList(fontsize); m_diffCell->RecalculateWidthsList(fontsize); m_width = m_baseCell->GetFullWidth(scale) + m_diffCell->GetFullWidth(scale) + 2*MC_CELL_SKIP; ResetData(); }
void SqrtCell::RecalculateSize(CellParser& parser, int fontsize) { double scale = parser.GetScale(); m_innerCell->RecalculateSizeList(parser, fontsize); m_height = m_innerCell->GetMaxHeight() + SCALE_PX(3, scale); m_center = m_innerCell->GetMaxCenter() + SCALE_PX(3, scale); m_open->RecalculateSizeList(parser, fontsize); m_close->RecalculateSizeList(parser, fontsize); }
void ImgCell::RecalculateSize(CellParser& parser, int fontsize) { double scale = parser.GetScale(); m_image->ViewportSize(m_canvasSize.x,m_canvasSize.y,scale); m_height = (scale * m_image->m_height) + 2 * m_imageBorderWidth; ResetData(); m_center = m_height / 2; }
void SqrtCell::RecalculateSize(int fontsize) { CellParser *parser = CellParser::Get(); double scale = parser->GetScale(); m_innerCell->RecalculateSizeList(fontsize); m_height = m_innerCell->GetMaxHeight() + SCALE_PX(3, scale); m_center = m_innerCell->GetMaxCenter() + SCALE_PX(3, scale); m_open->RecalculateSizeList(fontsize); m_close->RecalculateSizeList(fontsize); }
void MathCell::DrawList(CellParser& parser, wxPoint point, int fontsize) { MathCell *tmp=this; while(tmp!=NULL) { tmp->Draw(parser,point,fontsize); double scale = parser.GetScale(); point.x += tmp->m_width + SCALE_PX(MC_CELL_SKIP, scale); tmp=tmp->m_nextToDraw; } }
void SlideShow::RecalculateWidths(CellParser& parser, int fontsize, bool all) { if (m_bitmaps[m_displayed] != NULL) m_width = m_bitmaps[m_displayed]->GetWidth() + 2; else m_width = 0; double scale = parser.GetScale(); scale = MAX(scale, 1.0); m_width = (int) (scale * m_width); MathCell::RecalculateWidths(parser, fontsize, all); }
void LimitCell::RecalculateWidths(CellParser& parser, int fontsize, bool all) { double scale = parser.GetScale(); m_base->RecalculateWidths(parser, fontsize, true); m_under->RecalculateWidths(parser, MAX(MIN_LIMIT_FONT_SIZE, fontsize - LIMIT_FONT_SIZE_DECREASE), true); m_name->RecalculateWidths(parser, fontsize, true); m_width = MAX(m_name->GetFullWidth(scale), m_under->GetFullWidth(scale)) + m_base->GetFullWidth(scale); MathCell::RecalculateWidths(parser, fontsize, all); }
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 SlideShow::RecalculateWidths(int fontsize) { // Here we recalculate the height, as well: // - This doesn't cost much time and // - as image cell's sizes might change when the resolution does // we might have intermittent calculation issues otherwise CellParser *parser = CellParser::Get(); double scale = parser->GetScale(); m_images[m_displayed]->ViewportSize(m_canvasSize.x,m_canvasSize.y,scale); m_width = (scale * m_images[m_displayed]->m_width) + 2 * m_imageBorderWidth; m_height = (scale * m_images[m_displayed]->m_height) + 2 * m_imageBorderWidth; m_center = m_height / 2; }
void FracCell::RecalculateWidths(int fontsize) { CellParser *parser = CellParser::Get(); double scale = parser->GetScale(); if (m_isBroken || m_exponent) { m_num->RecalculateWidthsList(fontsize); m_denom->RecalculateWidthsList(fontsize); } else { m_num->RecalculateWidthsList(MAX(MC_MIN_SIZE, fontsize - FRAC_DEC)); m_denom->RecalculateWidthsList(MAX(MC_MIN_SIZE, fontsize - FRAC_DEC)); } if (m_exponent && !m_isBroken) { wxDC& dc = parser->GetDC(); int height; int fontsize1 = (int) ((double)(fontsize) * scale + 0.5); dc.SetFont(wxFont(fontsize1, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, parser->GetFontName(TS_VARIABLE))); dc.GetTextExtent(wxT("/"), &m_expDivideWidth, &height); m_width = m_num->GetFullWidth(scale) + m_denom->GetFullWidth(scale) + m_expDivideWidth; } else { wxDC& dc = parser->GetDC(); // We want half a space's widh of blank space to separate us from the // next minus. int dummy = 0; int fontsize1 = (int) ((double)(fontsize) * scale + 0.5); dc.SetFont(wxFont(fontsize1, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, parser->GetFontName(TS_VARIABLE))); dc.GetTextExtent(wxT("X"), &m_horizontalGap, &dummy); m_horizontalGap /= 2; m_width = MAX(m_num->GetFullWidth(scale), m_denom->GetFullWidth(scale)) + 2 * m_horizontalGap; } m_open1->RecalculateWidths(fontsize); m_close1->RecalculateWidths(fontsize); m_open2->RecalculateWidths(fontsize); m_close2->RecalculateWidths(fontsize); m_divide->RecalculateWidths(fontsize); ResetData(); }
void DiffCell::Draw(CellParser& parser, wxPoint point, int fontsize) { MathCell::Draw(parser, point, fontsize); if (DrawThisCell(parser, point) && InUpdateRegion()) { wxPoint bs, df; df.x = point.x; df.y = point.y; m_diffCell->DrawList(parser, df, fontsize); bs.x = point.x + m_diffCell->GetFullWidth(parser.GetScale()) + 2*MC_CELL_SKIP; bs.y = point.y; m_baseCell->DrawList(parser, bs, fontsize); } }
void ExptCell::RecalculateWidths(CellParser& parser, int fontsize, bool all) { double scale = parser.GetScale(); m_baseCell->RecalculateWidths(parser, fontsize, true); if (m_isBroken) m_powCell->RecalculateWidths(parser, fontsize, true); else m_powCell->RecalculateWidths(parser, MAX(MC_MIN_SIZE, fontsize - EXPT_DEC), true); m_width = m_baseCell->GetFullWidth(scale) + m_powCell->GetFullWidth(scale) - SCALE_PX(MC_TEXT_PADDING, scale); m_exp->RecalculateWidths(parser, fontsize, true); m_open->RecalculateWidths(parser, fontsize, true); m_close->RecalculateWidths(parser, fontsize, true); MathCell::RecalculateWidths(parser, fontsize, all); }
void SlideShow::RecalculateSize(CellParser& parser, int fontsize, bool all) { if (m_bitmaps[m_displayed] != NULL) m_height = m_bitmaps[m_displayed]->GetHeight() + 2; else m_height = 0; double scale = parser.GetScale(); scale = MAX(scale, 1.0); m_height= (int) (scale * m_height); m_center = m_height / 2; MathCell::RecalculateSize(parser, fontsize, all); }
void ExptCell::RecalculateSize(CellParser& parser, int fontsize, bool all) { double scale = parser.GetScale(); m_baseCell->RecalculateSize(parser, fontsize, true); if (m_isBroken) m_powCell->RecalculateSize(parser, fontsize, true); else m_powCell->RecalculateSize(parser, MAX(MC_MIN_SIZE, fontsize - EXPT_DEC), true); m_height = m_baseCell->GetMaxHeight() + m_powCell->GetMaxHeight() - SCALE_PX((8 * fontsize) / 10 + MC_EXP_INDENT, scale); m_center = m_powCell->GetMaxHeight() + m_baseCell->GetMaxCenter() - SCALE_PX((8 * fontsize) / 10 + MC_EXP_INDENT, scale); m_exp->RecalculateSize(parser, fontsize, true); m_open->RecalculateSize(parser, fontsize, true); m_close->RecalculateSize(parser, fontsize, true); MathCell::RecalculateSize(parser, fontsize, all); }
void ExptCell::Draw(CellParser& parser, wxPoint point, int fontsize, bool all) { if (DrawThisCell(parser, point)) { double scale = parser.GetScale(); wxPoint bs, pw; bs.x = point.x; bs.y = point.y; m_baseCell->Draw(parser, bs, fontsize, true); pw.x = point.x + m_baseCell->GetFullWidth(scale) - SCALE_PX(MC_TEXT_PADDING, scale); pw.y = point.y - m_baseCell->GetMaxCenter() - m_powCell->GetMaxHeight() + m_powCell->GetMaxCenter() + SCALE_PX((8 * fontsize) / 10 + MC_EXP_INDENT, scale); m_powCell->Draw(parser, pw, MAX(MC_MIN_SIZE, fontsize - EXPT_DEC), true); } MathCell::Draw(parser, point, fontsize, all); }
// 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; }
void SubCell::Draw(CellParser& parser, wxPoint point, int fontsize, bool all) { if (DrawThisCell(parser, point)) { double scale = parser.GetScale(); wxPoint bs, in; bs.x = point.x; bs.y = point.y; m_baseCell->Draw(parser, bs, fontsize, true); in.x = point.x + m_baseCell->GetFullWidth(scale) - SCALE_PX(2, scale); in.y = point.y + m_baseCell->GetMaxDrop() + m_indexCell->GetMaxCenter() - SCALE_PX((8 * fontsize) / 10 + MC_EXP_INDENT, scale); m_indexCell->Draw(parser, in, MAX(MC_MIN_SIZE, fontsize - SUB_DEC), true); } MathCell::Draw(parser, point, fontsize, all); }
void GroupCell::RecalculateWidths(CellParser& parser, int fontsize) { if (m_width == -1 || m_height == -1 || parser.ForceUpdate()) { // special case of 'line cell' if (m_groupType == GC_TYPE_PAGEBREAK) { m_width = 10; m_height = 2; ResetData(); return; } UnBreakUpCells(); double scale = parser.GetScale(); m_input->RecalculateWidthsList(parser, fontsize); // recalculate the position of input in ReEvaluateSelection! if (m_input->m_next != NULL) { m_input->m_next->m_currentPoint.x = m_currentPoint.x + m_input->GetWidth() + MC_CELL_SKIP; } if (m_output == NULL || m_hide) { m_width = m_input->GetFullWidth(scale); } else { MathCell *tmp = m_output; while (tmp != NULL) { tmp->RecalculateWidths(parser, tmp->IsMath() ? m_mathFontSize : m_fontSize); tmp = tmp->m_next; } // This is not correct, m_width will be computed correctly in RecalculateSize! m_width = m_input->GetFullWidth(scale); } BreakUpCells(parser, m_fontSize, parser.GetClientWidth()); BreakLines(parser.GetClientWidth()); } ResetData(); }
void SlideShow::Draw(wxPoint point, int fontsize) { MathCell::Draw(point, fontsize); // TODO: Enable this when unselecting text updates the right region. //if (!InUpdateRegion()) return; CellParser *parser = CellParser::Get(); wxDC& dc = parser->GetDC(); if (DrawThisCell(point) && (m_images[m_displayed] != NULL)) { wxMemoryDC bitmapDC; double scale = parser->GetScale(); m_images[m_displayed]->ViewportSize(m_canvasSize.x,m_canvasSize.y,scale); m_height = (m_images[m_displayed]->m_height) + 2 * m_imageBorderWidth; m_width = (m_images[m_displayed]->m_width) + 2 * m_imageBorderWidth; m_center = m_height / 2; // Slide show cells have a red border except if they are selected if(m_drawBoundingBox) dc.SetBrush( *(wxTheBrushList->FindOrCreateBrush(parser->GetColor(TS_SELECTION)))); else dc.SetPen(*wxRED_PEN); // If we need a selection border on another redraw we will be informed by OnPaint() again. m_drawBoundingBox = false; dc.DrawRectangle(wxRect(point.x, point.y - m_center, m_width, m_height)); wxBitmap bitmap = m_images[m_displayed]->GetBitmap(); bitmapDC.SelectObject(bitmap); dc.Blit(point.x + m_imageBorderWidth, point.y - m_center + m_imageBorderWidth, m_width - 2 * m_imageBorderWidth, m_height - 2 * m_imageBorderWidth, &bitmapDC, 0, 0); } else // The cell isn't drawn => No need to keep it's image cache for now. ClearCache(); }
void ParenCell::RecalculateSize(CellParser& parser, int fontsize) { double scale = parser.GetScale(); m_innerCell->RecalculateSizeList(parser, fontsize); m_height = m_innerCell->GetMaxHeight() + SCALE_PX(2, scale); m_center = m_innerCell->GetMaxCenter() + SCALE_PX(1, scale); #if defined __WXMSW__ if (!parser.CheckTeXFonts()) { wxDC& dc = parser.GetDC(); int fontsize1 = (int) ((fontsize * scale + 0.5)); dc.SetFont(wxFont(fontsize1, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, parser.GetFontName())); dc.GetTextExtent(wxT("("), &m_charWidth1, &m_charHeight1); } #endif m_open->RecalculateSizeList(parser, fontsize); m_close->RecalculateSizeList(parser, fontsize); }
void ConjugateCell::Draw(CellParser& parser, wxPoint point, int fontsize) { double scale = parser.GetScale(); wxDC& dc = parser.GetDC(); if (DrawThisCell(parser, point)) { SetPen(parser); wxPoint in; in.x = point.x + SCALE_PX(4, scale); in.y = point.y; m_innerCell->DrawList(parser, in, fontsize); dc.DrawLine(point.x + SCALE_PX(2, scale), point.y - m_center + SCALE_PX(2, scale), point.x + m_width - SCALE_PX(2, scale) - 1, point.y - m_center + SCALE_PX(2, scale) ); // point.y - m_center + m_height - SCALE_PX(2, scale)); UnsetPen(parser); } MathCell::Draw(parser, point, fontsize); }
void IntCell::RecalculateSize(CellParser& parser, int fontsize, bool all) { double scale = parser.GetScale(); m_under->RecalculateSize(parser, MAX(MC_MIN_SIZE, fontsize - 5), true); m_over->RecalculateSize(parser, MAX(MC_MIN_SIZE, fontsize - 5), true); m_base->RecalculateSize(parser, fontsize, true); m_var->RecalculateSize(parser, fontsize, true); if (m_intStyle == INT_DEF) { if (parser.CheckTeXFonts()) { m_center = MAX(m_over->GetMaxHeight() + SCALE_PX(4, scale) + m_signSize / 2 - m_signSize / 3, m_base->GetMaxCenter()); m_height = m_center + MAX(m_under->GetMaxHeight() + SCALE_PX(4, scale) + m_signSize / 2 - m_signSize / 3, m_base->GetMaxDrop()); } else { m_center = MAX(m_over->GetMaxHeight() + SCALE_PX(4, scale) + m_signSize / 2 - m_signSize / 3, m_base->GetMaxCenter()); m_height = m_center + MAX(m_under->GetMaxHeight() + SCALE_PX(4, scale) + m_signSize / 2 - m_signSize / 3, m_base->GetMaxDrop()); } } else { m_center = MAX(m_signSize / 2, m_base->GetMaxCenter()); m_height = m_center + MAX(m_signSize / 2, m_base->GetMaxDrop()); } MathCell::RecalculateSize(parser, fontsize, all); }
void IntCell::RecalculateSize(int fontsize) { CellParser *parser = CellParser::Get(); double scale = parser->GetScale(); m_under->RecalculateSizeList(MAX(MC_MIN_SIZE, fontsize - 5)); m_over->RecalculateSizeList(MAX(MC_MIN_SIZE, fontsize - 5)); m_base->RecalculateSizeList(fontsize); m_var->RecalculateSizeList(fontsize); if (m_intStyle == INT_DEF) { if (parser->CheckTeXFonts()) { m_center = MAX(m_over->GetMaxHeight() + SCALE_PX(4, scale) + m_signSize / 2 - m_signSize / 3, m_base->GetMaxCenter()); m_height = m_center + MAX(m_under->GetMaxHeight() + SCALE_PX(4, scale) + m_signSize / 2 - m_signSize / 3, m_base->GetMaxDrop()); } else { m_center = MAX(m_over->GetMaxHeight() + SCALE_PX(4, scale) + m_signSize / 2 - m_signSize / 3, m_base->GetMaxCenter()); m_height = m_center + MAX(m_under->GetMaxHeight() + SCALE_PX(4, scale) + m_signSize / 2 - m_signSize / 3, m_base->GetMaxDrop()); } } else { m_center = MAX(m_signSize / 2, m_base->GetMaxCenter()); m_height = m_center + MAX(m_signSize / 2, m_base->GetMaxDrop()); } }
void SqrtCell::Draw(CellParser& parser, wxPoint point, int fontsize, bool all) { if (DrawThisCell(parser, point)) { wxDC& dc = parser.GetDC(); double scale = parser.GetScale(); wxPoint in(point); if (parser.CheckTeXFonts()) { SetPen(parser); in.x += m_signWidth; double scale = parser.GetScale(); int fontsize1 = (int)(SIGN_FONT_SCALE*scale*fontsize*m_signFontScale + 0.5); dc.SetFont(wxFont(fontsize1, wxMODERN, false, false, false, parser.GetTeXCMEX())); SetForeground(parser); if (m_signType < 4) { dc.DrawText( m_signType == 1 ? wxT("p") : m_signType == 2 ? wxT("q") : m_signType == 3 ? wxT("r") : wxT("s"), point.x, point.y - m_innerCell->GetMaxCenter() - m_signTop); } else { int yBottom = point.y + m_innerCell->GetMaxDrop() - 3.2*m_signTop; int yTop = point.y - m_innerCell->GetMaxCenter() - m_signTop; int dy = m_signSize / 10; dc.DrawText(wxT("t"), point.x, yBottom); dc.DrawText(wxT("v"), point.x, yTop); while (yTop < yBottom) { yTop += dy; dc.DrawText(wxT("u"), point.x, yTop); } } dc.DrawLine(point.x + m_signWidth, point.y - m_innerCell->GetMaxCenter(), point.x + m_signWidth + m_innerCell->GetFullWidth(scale), point.y - m_innerCell->GetMaxCenter()); UnsetPen(parser); } else { in.x += SCALE_PX(10, scale) + SCALE_PX(1, scale) + 1; SetPen(parser); dc.DrawLine(point.x, point.y, point.x + SCALE_PX(3, scale), point.y - SCALE_PX(1, scale)); dc.DrawLine(point.x + SCALE_PX(3, scale), point.y - SCALE_PX(1, scale), point.x + SCALE_PX(7, scale), point.y + m_height - m_center - SCALE_PX(4, scale)); dc.DrawLine(point.x + SCALE_PX(3, scale) + 1, point.y - SCALE_PX(1, scale), point.x + SCALE_PX(7, scale) + 1, point.y + m_height - m_center - SCALE_PX(4, scale)); dc.DrawLine(point.x + SCALE_PX(7, scale) + 1, point.y + m_height - m_center - SCALE_PX(4, scale), point.x + SCALE_PX(10, scale), point.y - m_center + SCALE_PX(2, scale)); dc.DrawLine(point.x + SCALE_PX(10, scale), point.y - m_center + SCALE_PX(2, scale), point.x + m_width - SCALE_PX(1, scale), point.y - m_center + SCALE_PX(2, scale)); dc.DrawLine(point.x + m_width - SCALE_PX(1, scale), point.y - m_center + SCALE_PX(2, scale), point.x + m_width - SCALE_PX(1, scale), point.y - m_center + SCALE_PX(6, scale)); UnsetPen(parser); } m_innerCell->Draw(parser, in, fontsize, true); } MathCell::Draw(parser, point, fontsize, all); }
void ParenCell::Draw(CellParser& parser, wxPoint point, int fontsize) { if (DrawThisCell(parser, point)) { double scale = parser.GetScale(); wxDC& dc = parser.GetDC(); wxPoint in(point); if (parser.CheckTeXFonts()) { in.x = point.x + m_signWidth; SetForeground(parser); int fontsize1 = (int) ((m_parenFontSize * scale + 0.5)); dc.SetFont(wxFont(fontsize1, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, m_bigParenType < 1 ? parser.GetTeXCMRI() : parser.GetTeXCMEX())); if (m_bigParenType < 2) { dc.DrawText(m_bigParenType == 0 ? wxT("(") : wxT(PAREN_OPEN), point.x, point.y - m_center + SCALE_PX(MC_TEXT_PADDING, scale) - (m_bigParenType > 0 ? m_signTop : 0)); dc.DrawText(m_bigParenType == 0 ? wxT(")") : wxT(PAREN_CLOSE), point.x + m_signWidth + m_innerCell->GetFullWidth(scale), point.y - m_center + SCALE_PX(MC_TEXT_PADDING, scale) - (m_bigParenType > 0 ? m_signTop : 0)); } else { int top = point.y - m_center - m_signTop; int bottom = point.y + m_height - m_center - m_signTop - m_signSize / 2; dc.DrawText(wxT(PAREN_OPEN_TOP), point.x, top); dc.DrawText(wxT(PAREN_CLOSE_TOP), point.x + m_signWidth + m_innerCell->GetFullWidth(scale), top); dc.DrawText(wxT(PAREN_OPEN_BOTTOM), point.x, bottom); dc.DrawText(wxT(PAREN_CLOSE_BOTTOM), point.x + m_signWidth + m_innerCell->GetFullWidth(scale), bottom); top = top + m_signSize / 2; if (top <= bottom) { while (top < bottom) { dc.DrawText(wxT(PAREN_OPEN_EXTEND), point.x, top-1); dc.DrawText(wxT(PAREN_CLOSE_EXTEND), point.x + m_width - m_signWidth, top-1); top += m_signSize / 10; } } } } else { #if defined __WXMSW__ in.x += m_charWidth; int fontsize1 = (int) ((PAREN_FONT_SIZE * scale + 0.5)); SetForeground(parser); if (m_height < (3*m_charHeight)/2) { fontsize1 = (int) ((fontsize * scale + 0.5)); dc.SetFont(wxFont(fontsize1, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, parser.GetFontName())); dc.DrawText(wxT("("), point.x + m_charWidth - m_charWidth1, point.y - m_charHeight1 / 2); dc.DrawText(wxT(")"), point.x + m_width - m_charWidth, point.y - m_charHeight1 / 2); } else { dc.SetFont(wxFont(fontsize1, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, parser.GetSymbolFontName(), wxFONTENCODING_CP1250)); dc.DrawText(PAREN_LEFT_TOP, point.x, point.y - m_center); dc.DrawText(PAREN_LEFT_BOTTOM, point.x, point.y + m_height - m_center - m_charHeight); dc.DrawText(PAREN_RIGHT_TOP, point.x + m_width - m_charWidth, point.y - m_center); dc.DrawText(PAREN_RIGHT_BOTTOM, point.x + m_width - m_charWidth, point.y + m_height - m_center - m_charHeight); int top, bottom; top = point.y - m_center + m_charHeight/2; bottom = point.y + m_height - m_center - (4*m_charHeight)/3; if (top <= bottom) { while (top < bottom) { dc.DrawText(PAREN_LEFT_EXTEND, point.x, top); dc.DrawText(PAREN_RIGHT_EXTEND, point.x + m_width - m_charWidth, top); top += (2*m_charHeight)/3; } dc.DrawText(PAREN_LEFT_EXTEND, point.x, point.y + m_height - m_center - (3*m_charHeight)/2); dc.DrawText(PAREN_RIGHT_EXTEND, point.x + m_width - m_charWidth, point.y + m_height - m_center - (3*m_charHeight)/2); } } #else in.x = point.x + SCALE_PX(6, scale); SetPen(parser); // left dc.DrawLine(point.x + SCALE_PX(5, scale), point.y - m_innerCell->GetMaxCenter() + SCALE_PX(1, scale), point.x + SCALE_PX(2, scale), point.y - m_innerCell->GetMaxCenter() + SCALE_PX(7, scale)); dc.DrawLine(point.x + SCALE_PX(2, scale), point.y - m_innerCell->GetMaxCenter() + SCALE_PX(7, scale), point.x + SCALE_PX(2, scale), point.y + m_innerCell->GetMaxDrop() - SCALE_PX(7, scale)); dc.DrawLine(point.x + SCALE_PX(2, scale), point.y + m_innerCell->GetMaxDrop() - SCALE_PX(7, scale), point.x + SCALE_PX(5, scale), point.y + m_innerCell->GetMaxDrop() - SCALE_PX(1, scale)); // right dc.DrawLine(point.x + m_width - SCALE_PX(5, scale) - 1, point.y - m_innerCell->GetMaxCenter() + SCALE_PX(1, scale), point.x + m_width - SCALE_PX(2, scale) - 1, point.y - m_innerCell->GetMaxCenter() + SCALE_PX(7, scale)); dc.DrawLine(point.x + m_width - SCALE_PX(2, scale) - 1, point.y - m_innerCell->GetMaxCenter() + SCALE_PX(7, scale), point.x + m_width - SCALE_PX(2, scale) - 1, point.y + m_innerCell->GetMaxDrop() - SCALE_PX(7, scale)); dc.DrawLine(point.x + m_width - SCALE_PX(2, scale) - 1, point.y + m_innerCell->GetMaxDrop() - SCALE_PX(7, scale), point.x + m_width - SCALE_PX(5, scale) - 1, point.y + m_innerCell->GetMaxDrop() - SCALE_PX(1, scale)); UnsetPen(parser); #endif } m_innerCell->DrawList(parser, in, fontsize); } MathCell::Draw(parser, point, fontsize); }
void ParenCell::RecalculateWidths(CellParser& parser, int fontsize) { double scale = parser.GetScale(); if (m_innerCell == NULL) m_innerCell = new TextCell; m_innerCell->RecalculateWidthsList(parser, fontsize); if (parser.CheckTeXFonts()) { wxDC& dc = parser.GetDC(); m_innerCell->RecalculateSizeList(parser, fontsize); int size = m_innerCell->GetMaxHeight(); int fontsize1 = (int) ((fontsize * scale + 0.5)); if (size < 2*fontsize1) m_bigParenType = 0; else if (size < 4*fontsize1) m_bigParenType = 1; else m_bigParenType = 2; if (m_bigParenType < 2) { m_parenFontSize = fontsize; fontsize1 = (int) ((m_parenFontSize * scale + 0.5)); dc.SetFont( wxFont(fontsize1, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, m_bigParenType == 0 ? parser.GetTeXCMRI() : parser.GetTeXCMEX())); dc.GetTextExtent(m_bigParenType == 0 ? wxT("(") : m_bigParenType == 1 ? wxT(PAREN_OPEN) : wxT(PAREN_OPEN_TOP), &m_signWidth, &m_signSize); /// BUG 2897415: Exporting equations to HTML locks up on Mac /// there is something wrong with what dc.GetTextExtent returns, /// make sure there is no infinite loop! int i=0; // Avoid a possible infinite loop. if(size < 2) size = 2; while (m_signSize < TRANSFORM_SIZE(m_bigParenType, size) && i<20) { int fontsize1 = (int) ((m_parenFontSize++ * scale + 0.5)); dc.SetFont(wxFont(fontsize1, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, m_bigParenType == 0 ? parser.GetTeXCMRI() : parser.GetTeXCMEX())); dc.GetTextExtent(m_bigParenType == 0 ? wxT("(") : m_bigParenType == 1 ? wxT(PAREN_OPEN) : wxT(PAREN_OPEN_TOP), &m_signWidth, &m_signSize); // Avoid an infinite loop. if(m_signSize < 2) m_signSize = 2; i++; } } else { m_parenFontSize = fontsize; fontsize1 = (int) ((m_parenFontSize * scale + 0.5)); dc.SetFont(wxFont(fontsize1, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, m_bigParenType < 1 ? parser.GetTeXCMRI() : parser.GetTeXCMEX())); dc.GetTextExtent(wxT(PAREN_OPEN), &m_signWidth, &m_signSize); } m_signTop = m_signSize / 5; m_width = m_innerCell->GetFullWidth(scale) + 2*m_signWidth; } else { #if defined __WXMSW__ wxDC& dc = parser.GetDC(); int fontsize1 = (int) ((PAREN_FONT_SIZE * scale + 0.5)); dc.SetFont(wxFont(fontsize1, wxFONTFAMILY_MODERN, parser.IsItalic(TS_DEFAULT), parser.IsBold(TS_DEFAULT), parser.IsUnderlined(TS_DEFAULT), parser.GetSymbolFontName())); dc.GetTextExtent(PAREN_LEFT_TOP, &m_charWidth, &m_charHeight); if(m_charHeight < 2) m_charHeight = 2; m_width = m_innerCell->GetFullWidth(scale) + 2*m_charWidth; #else m_width = m_innerCell->GetFullWidth(scale) + SCALE_PX(12, parser.GetScale()); #endif } m_open->RecalculateWidthsList(parser, fontsize); m_close->RecalculateWidthsList(parser, fontsize); ResetData(); }
void SqrtCell::Draw(wxPoint point, int fontsize) { MathCell::Draw(point, fontsize); CellParser *parser = CellParser::Get(); if (DrawThisCell(point) && InUpdateRegion()) { wxDC& dc = parser->GetDC(); double scale = parser->GetScale(); wxPoint in(point); if (parser->CheckTeXFonts()) { SetPen(); in.x += m_signWidth; double scale = parser->GetScale(); int fontsize1 = (int)(SIGN_FONT_SCALE*scale*fontsize*m_signFontScale + 0.5); dc.SetFont(wxFont(fontsize1, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, parser->GetTeXCMEX())); SetForeground(); if (m_signType < 4) { dc.DrawText( m_signType == 1 ? wxT("p") : m_signType == 2 ? wxT("q") : m_signType == 3 ? wxT("r") : wxT("s"), point.x, point.y - m_innerCell->GetMaxCenter() - m_signTop); } else { int yBottom = point.y + m_innerCell->GetMaxDrop() - 3.2*m_signTop; int yTop = point.y - m_innerCell->GetMaxCenter() - m_signTop; int dy = m_signSize / 10; wxASSERT_MSG((yTop != 0) || (yBottom != 0),_("Font issue? The contents of a sqrt() has the size 0.")); wxASSERT_MSG(dy>0,_("Font issue: The sqrt() sign has the size 0! Installing http://www.math.union.edu/~dpvc/jsmath/download/jsMath-fonts.html and checking \"Use JSmath fonts\" in the configuration dialogue should be a workaround.")); if(dy <= 0) dy = 1; dc.DrawText(wxT("t"), point.x, yBottom); dc.DrawText(wxT("v"), point.x, yTop); while (yTop < yBottom) { yTop += dy; dc.DrawText(wxT("u"), point.x, yTop); } } dc.DrawLine(point.x + m_signWidth, point.y - m_innerCell->GetMaxCenter(), point.x + m_signWidth + m_innerCell->GetFullWidth(scale), point.y - m_innerCell->GetMaxCenter()); UnsetPen(); } else { in.x += SCALE_PX(10, scale) + SCALE_PX(1, scale) + 1; SetPen(); dc.DrawLine(point.x, point.y, point.x + SCALE_PX(3, scale), point.y - SCALE_PX(1, scale)); dc.DrawLine(point.x + SCALE_PX(3, scale), point.y - SCALE_PX(1, scale), point.x + SCALE_PX(7, scale), point.y + m_height - m_center - SCALE_PX(4, scale)); dc.DrawLine(point.x + SCALE_PX(3, scale) + 1, point.y - SCALE_PX(1, scale), point.x + SCALE_PX(7, scale) + 1, point.y + m_height - m_center - SCALE_PX(4, scale)); dc.DrawLine(point.x + SCALE_PX(7, scale) + 1, point.y + m_height - m_center - SCALE_PX(4, scale), point.x + SCALE_PX(10, scale), point.y - m_center + SCALE_PX(2, scale)); dc.DrawLine(point.x + SCALE_PX(10, scale), point.y - m_center + SCALE_PX(2, scale), point.x + m_width - SCALE_PX(1, scale), point.y - m_center + SCALE_PX(2, scale)); dc.DrawLine(point.x + m_width - SCALE_PX(1, scale), point.y - m_center + SCALE_PX(2, scale), point.x + m_width - SCALE_PX(1, scale), point.y - m_center + SCALE_PX(6, scale)); UnsetPen(); } m_innerCell->DrawList(in, fontsize); } }