void wxSVGFileDCImpl::DoStartNewGraphics() { wxString s, sBrush, sPenCap, sPenJoin, sPenStyle, sLast; sBrush = wxS("<g style=\"") + wxBrushString(m_brush.GetColour(), m_brush.GetStyle()) + wxPenString(m_pen.GetColour(), m_pen.GetStyle()); switch ( m_pen.GetCap() ) { case wxCAP_PROJECTING : sPenCap = wxS("stroke-linecap:square; "); break; case wxCAP_BUTT : sPenCap = wxS("stroke-linecap:butt; "); break; case wxCAP_ROUND : default : sPenCap = wxS("stroke-linecap:round; "); } switch ( m_pen.GetJoin() ) { case wxJOIN_BEVEL : sPenJoin = wxS("stroke-linejoin:bevel; "); break; case wxJOIN_MITER : sPenJoin = wxS("stroke-linejoin:miter; "); break; case wxJOIN_ROUND : default : sPenJoin = wxS("stroke-linejoin:round; "); } sLast = wxString::Format(wxS("stroke-width:%d\" transform=\"translate(%s %s) scale(%s %s)\">"), m_pen.GetWidth(), NumStr((m_deviceOriginX - m_logicalOriginX)* m_signX), NumStr((m_deviceOriginY - m_logicalOriginY)* m_signY), NumStr(m_scaleX * m_signX), NumStr(m_scaleY * m_signY)); s = sBrush + sPenCap + sPenJoin + sPenStyle + sLast + wxS("\n"); write(s); }
void wxSVGFileDCImpl::DoDrawRotatedText(const wxString& sText, wxCoord x, wxCoord y, double angle) { //known bug; if the font is drawn in a scaled DC, it will not behave exactly as wxMSW NewGraphicsIfNeeded(); wxString s, sTmp; // calculate bounding box wxCoord w, h, desc; DoGetTextExtent(sText, &w, &h, &desc); double rad = wxDegToRad(angle); // wxT("upper left") and wxT("upper right") CalcBoundingBox(x, y); CalcBoundingBox((wxCoord)(x + w*cos(rad)), (wxCoord)(y - h*sin(rad))); // wxT("bottom left") and wxT("bottom right") CalcBoundingBox((wxCoord)(x + h*sin(rad)), (wxCoord)(y + h*cos(rad))); CalcBoundingBox((wxCoord)(x + h*sin(rad) + w*cos(rad)), (wxCoord)(y + h*cos(rad) - w*sin(rad))); if (m_backgroundMode == wxBRUSHSTYLE_SOLID) { // draw background first // just like DoDrawRectangle except we pass the text color to it and set the border to a 1 pixel wide text background sTmp.Printf ( wxT(" <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" "), x, y, w, h ); s = sTmp + wxT("style=\"") + wxBrushString(m_textBackgroundColour); s += wxT("stroke-width:1; ") + wxPenString(m_textBackgroundColour); sTmp.Printf ( wxT("\" transform=\"rotate( %s %d %d ) \" />"), NumStr(-angle), x,y ); s += sTmp + wxT("\n"); write(s); } // convert x,y to SVG text x,y (the coordinates of the text baseline) x = (wxCoord)(x + (h-desc)*sin(rad)); y = (wxCoord)(y + (h-desc)*cos(rad)); //now do the text itself s.Printf (wxT(" <text x=\"%d\" y=\"%d\" "),x,y ); sTmp = m_font.GetFaceName(); if (sTmp.Len() > 0) s += wxT("style=\"font-family:") + sTmp + wxT("; "); else s += wxT("style=\" "); wxString fontweights [3] = { wxT("normal"), wxT("lighter"), wxT("bold") }; s += wxT("font-weight:") + fontweights[m_font.GetWeight() - wxNORMAL] + wxT("; "); wxString fontstyles [5] = { wxT("normal"), wxT("style error"), wxT("style error"), wxT("italic"), wxT("oblique") }; s += wxT("font-style:") + fontstyles[m_font.GetStyle() - wxNORMAL] + wxT("; "); sTmp.Printf (wxT("font-size:%dpt; "), m_font.GetPointSize() ); s += sTmp; //text will be solid, unless alpha value isn't opaque in the foreground colour s += wxBrushString(m_textForegroundColour) + wxPenString(m_textForegroundColour); sTmp.Printf ( wxT("stroke-width:0;\" transform=\"rotate( %s %d %d ) \" >"), NumStr(-angle), x,y ); s += sTmp + wxMarkupParser::Quote(sText) + wxT("</text> ") + wxT("\n"); if (m_OK) { write(s); } }
void wxSVGFileDCImpl::DoDrawRotatedText(const wxString& sText, wxCoord x, wxCoord y, double angle) { //known bug; if the font is drawn in a scaled DC, it will not behave exactly as wxMSW NewGraphicsIfNeeded(); wxString s; // Get extent of whole text. wxCoord w, h, heightLine; GetOwner()->GetMultiLineTextExtent(sText, &w, &h, &heightLine); // Compute the shift for the origin of the next line. const double rad = wxDegToRad(angle); const double dx = heightLine * sin(rad); const double dy = heightLine * cos(rad); // wxS("upper left") and wxS("upper right") CalcBoundingBox(x, y); CalcBoundingBox((wxCoord)(x + w*cos(rad)), (wxCoord)(y - h*sin(rad))); // wxS("bottom left") and wxS("bottom right") CalcBoundingBox((wxCoord)(x + h*sin(rad)), (wxCoord)(y + h*cos(rad))); CalcBoundingBox((wxCoord)(x + h*sin(rad) + w*cos(rad)), (wxCoord)(y + h*cos(rad) - w*sin(rad))); if (m_backgroundMode == wxBRUSHSTYLE_SOLID) { // draw background first // just like DoDrawRectangle except we pass the text color to it and set the border to a 1 pixel wide text background s += wxString::Format(wxS(" <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" "), x, y, w, h); s += wxS("style=\"") + wxBrushString(m_textBackgroundColour); s += wxS("stroke-width:1; ") + wxPenString(m_textBackgroundColour); s += wxString::Format(wxS("\" transform=\"rotate(%s %d %d)\"/>"), NumStr(-angle), x, y); s += wxS("\n"); write(s); } // Draw all text line by line const wxArrayString lines = wxSplit(sText, '\n', '\0'); for (size_t lineNum = 0; lineNum < lines.size(); lineNum++) { // convert x,y to SVG text x,y (the coordinates of the text baseline) wxCoord ww, hh, desc; DoGetTextExtent(lines[lineNum], &ww, &hh, &desc); int xx = x + wxRound(lineNum * dx) + (hh - desc) * sin(rad); int yy = y + wxRound(lineNum * dy) + (hh - desc) * cos(rad); //now do the text itself s += wxString::Format(wxS(" <text x=\"%d\" y=\"%d\" textLength=\"%d\" "), xx, yy, ww); wxString fontName(m_font.GetFaceName()); if (fontName.Len() > 0) s += wxS("style=\"font-family:") + fontName + wxS("; "); else s += wxS("style=\" "); wxString fontweight; switch (m_font.GetWeight()) { case wxFONTWEIGHT_MAX: wxFAIL_MSG(wxS("invalid font weight value")); wxFALLTHROUGH; case wxFONTWEIGHT_NORMAL: fontweight = wxS("normal"); break; case wxFONTWEIGHT_LIGHT: fontweight = wxS("lighter"); break; case wxFONTWEIGHT_BOLD: fontweight = wxS("bold"); break; } wxASSERT_MSG(!fontweight.empty(), wxS("unknown font weight value")); s += wxS("font-weight:") + fontweight + wxS("; "); wxString fontstyle; switch (m_font.GetStyle()) { case wxFONTSTYLE_MAX: wxFAIL_MSG(wxS("invalid font style value")); wxFALLTHROUGH; case wxFONTSTYLE_NORMAL: fontstyle = wxS("normal"); break; case wxFONTSTYLE_ITALIC: fontstyle = wxS("italic"); break; case wxFONTSTYLE_SLANT: fontstyle = wxS("oblique"); break; } wxASSERT_MSG(!fontstyle.empty(), wxS("unknown font style value")); s += wxS("font-style:") + fontstyle + wxS("; "); wxString textDecoration; if (m_font.GetUnderlined()) textDecoration += wxS(" underline"); if (m_font.GetStrikethrough()) textDecoration += wxS(" line-through"); if (textDecoration.IsEmpty()) textDecoration = wxS(" none"); s += wxS("text-decoration:") + textDecoration + wxS("; "); s += wxString::Format(wxS("font-size:%dpt; "), m_font.GetPointSize()); //text will be solid, unless alpha value isn't opaque in the foreground colour s += wxBrushString(m_textForegroundColour) + wxPenString(m_textForegroundColour); s += wxString::Format(wxS("stroke-width:0;\" transform=\"rotate(%s %d %d)\""), NumStr(-angle), xx, yy); s += wxS(" xml:space=\"preserve\">"); s += wxMarkupParser::Quote(lines[lineNum]) + wxS("</text>\n"); write(s); } }