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 FracCell::RecalculateWidths(CellParser& parser, int fontsize, bool all) { double scale = parser.GetScale(); if (m_isBroken || m_exponent) { m_num->RecalculateWidths(parser, fontsize, true); m_denom->RecalculateWidths(parser, fontsize, true); } else { m_num->RecalculateWidths(parser, MAX(MC_MIN_SIZE, fontsize - FRAC_DEC), true); m_denom->RecalculateWidths(parser, MAX(MC_MIN_SIZE, fontsize - FRAC_DEC), true); } 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, false, false, false, parser.GetFontName(TS_VARIABLE))); dc.GetTextExtent(wxT("/"), &m_expDivideWidth, &height); m_width = m_num->GetFullWidth(scale) + m_denom->GetFullWidth(scale) + m_expDivideWidth; } else { m_width = MAX(m_num->GetFullWidth(scale), m_denom->GetFullWidth(scale)); } m_open1->RecalculateWidths(parser, fontsize, false); m_close1->RecalculateWidths(parser, fontsize, false); m_open2->RecalculateWidths(parser, fontsize, false); m_close2->RecalculateWidths(parser, fontsize, false); m_divide->RecalculateWidths(parser, fontsize, false); MathCell::RecalculateWidths(parser, fontsize, all); }
void ParenCell::RecalculateSize(CellParser& parser, int fontsize, bool all) { double scale = parser.GetScale(); m_innerCell->RecalculateSize(parser, fontsize, true); 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, false, false, false, parser.GetFontName())); dc.GetTextExtent(wxT("("), &m_charWidth1, &m_charHeight1); } #endif m_open->RecalculateSize(parser, fontsize, false); m_close->RecalculateSize(parser, fontsize, false); MathCell::RecalculateSize(parser, fontsize, all); }
void FracCell::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 num, denom; if (m_exponent && !m_isBroken) { double scale = parser->GetScale(); num.x = point.x; num.y = point.y; denom.x = point.x + m_num->GetFullWidth(scale) + m_expDivideWidth; denom.y = num.y; m_num->DrawList(num, fontsize); m_denom->DrawList(denom, fontsize); int fontsize1 = (int) ((double)(fontsize) * scale + 0.5); dc.SetFont(wxFont(fontsize1, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, parser->GetFontName(TS_VARIABLE))); dc.DrawText(wxT("/"), point.x + m_num->GetFullWidth(scale), point.y - m_num->GetMaxCenter() + SCALE_PX(MC_TEXT_PADDING, scale)); } else { num.x = point.x + (m_width - m_num->GetFullWidth(scale)) / 2; num.y = point.y - m_num->GetMaxHeight() + m_num->GetMaxCenter() - SCALE_PX(2, scale); m_num->DrawList(num, MAX(MC_MIN_SIZE, fontsize - FRAC_DEC)); denom.x = point.x + (m_width - m_denom->GetFullWidth(scale)) / 2; denom.y = point.y + m_denom->GetMaxCenter() + SCALE_PX(2, scale); m_denom->DrawList(denom, MAX(MC_MIN_SIZE, fontsize - FRAC_DEC)); SetPen(); if (m_fracStyle != FC_CHOOSE) dc.DrawLine(point.x + m_horizontalGap, point.y, point.x + m_width - m_horizontalGap, point.y); UnsetPen(); } } }
void FracCell::Draw(CellParser& parser, wxPoint point, int fontsize, bool all) { if (DrawThisCell(parser, point)) { wxDC& dc = parser.GetDC(); double scale = parser.GetScale(); wxPoint num, denom; if (m_exponent && !m_isBroken) { double scale = parser.GetScale(); num.x = point.x; num.y = point.y; denom.x = point.x + m_num->GetFullWidth(scale) + m_expDivideWidth; denom.y = num.y; m_num->Draw(parser, num, fontsize, true); m_denom->Draw(parser, denom, fontsize, true); int fontsize1 = (int) ((double)(fontsize) * scale + 0.5); dc.SetFont(wxFont(fontsize1, wxFONTFAMILY_MODERN, false, false, false, parser.GetFontName(TS_VARIABLE))); dc.DrawText(wxT("/"), point.x + m_num->GetFullWidth(scale), point.y - m_num->GetMaxCenter() + SCALE_PX(MC_TEXT_PADDING, scale)); } else { num.x = point.x + (m_width - m_num->GetFullWidth(scale)) / 2; num.y = point.y - m_num->GetMaxHeight() + m_num->GetMaxCenter() - SCALE_PX(2, scale); m_num->Draw(parser, num, MAX(MC_MIN_SIZE, fontsize - FRAC_DEC), true); denom.x = point.x + (m_width - m_denom->GetFullWidth(scale)) / 2; denom.y = point.y + m_denom->GetMaxCenter() + SCALE_PX(2, scale); m_denom->Draw(parser, denom, MAX(MC_MIN_SIZE, fontsize - FRAC_DEC), true); SetPen(parser); if (m_fracStyle != FC_CHOOSE) dc.DrawLine(point.x, point.y, point.x + m_width, point.y); UnsetPen(parser); } } 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::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; wxASSERT_MSG(m_signSize>=10,_("Font issue: The Parenthesis sign is too small!")); if(m_signSize <= 10) m_signSize = 10; 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; wxASSERT_MSG(m_charHeight>=2,_("Font issue: The char height is too small! 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(m_charHeight <= 2) m_charHeight = 2; 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); }