Loading change_log.txt +12 −0 Original line number Original line Diff line number Diff line Loading @@ -4,6 +4,18 @@ Started 2007-June-11 Please add newer entries at the top, list the date and your name with Please add newer entries at the top, list the date and your name with email address. email address. 2007-sept-22 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr> ================================================================================ + all * small change in hotkeys handling (Ki_HotkeyInfo: new member m_IdMenuEvent to call an existing event handler from a hotkey list) + eeschema: * added drag component in pop up menu and hotkeys * plot svg format: incorrect arc draw fixed 2007-Sep-22 UPDATE Dick Hollenbeck <dick@softplc.com> 2007-Sep-22 UPDATE Dick Hollenbeck <dick@softplc.com> ================================================================================ ================================================================================ + pcbnew + pcbnew Loading common/common_plotPS_functions.cpp +5 −4 Original line number Original line Diff line number Diff line Loading @@ -166,10 +166,11 @@ char Line[256]; void PlotPolyPS(int nb_segm, int * coord, int fill, int width) void PlotPolyPS(int nb_segm, int * coord, int fill, int width) /*****************************************************************/ /*****************************************************************/ /* Trace un polygone ( ferme si rempli ) en format POSTSCRIPT /* Draw a polygon ( a filled polygon if fill == 1 ) in POSTSCRIPT format * coord = tableau des coord des sommets * @param nb_segm = corner count * nb_segm = nombre de coord ( 1 coord = 2 elements: X et Y du tableau ) * @param coord = corner list (a corner uses 2 int = X coordinate followed by Y coordinate * fill : si != 0 polygone rempli * @param fill :if == 0 : filled polygon * @param width = line width */ */ { { int ii; int ii; Loading common/dcsvg.cpp +530 −417 Original line number Original line Diff line number Diff line ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // Name: svg.cpp // Name: svg.cpp // Purpose: SVG plot // Purpose: SVG plot // Author: Chris Elliott // Author: Chris Elliott Loading @@ -23,6 +24,7 @@ #include "wx/image.h" #include "wx/image.h" #define wxSVG_DEBUG FALSE #define wxSVG_DEBUG FALSE // or TRUE to see the calls being executed // or TRUE to see the calls being executed #define newline wxString( wxT( "\n" ) ) #define newline wxString( wxT( "\n" ) ) #define space wxString( wxT( " " ) ) #define space wxString( wxT( " " ) ) Loading @@ -43,11 +45,15 @@ #define pt2mm 0.352777777778 #define pt2mm 0.352777777778 #endif #endif static inline double DegToRad(double deg) { return (deg * M_PI) / 180.0; } ; static inline double DegToRad( double deg ) { return (deg * M_PI) / 180.0; }; wxString wxColStr( wxColour c ) wxString wxColStr( wxColour c ) { { unsigned char r, g, b; unsigned char r, g, b; r = c.Red(); r = c.Red(); g = c.Green(); g = c.Green(); b = c.Blue(); b = c.Blue(); Loading @@ -61,19 +67,21 @@ wxString wxColStr ( wxColour c ) wxString wxBrushString( wxColour c, int style ) wxString wxBrushString( wxColour c, int style ) { { wxString s = wxT( "fill:#" ) + wxColStr( c ) + semicolon + space; wxString s = wxT( "fill:#" ) + wxColStr( c ) + semicolon + space; switch( style ) switch( style ) { { case wxSOLID: case wxSOLID: s = s + wxT( "fill-opacity:1.0; " ); s = s + wxT( "fill-opacity:1.0; " ); break; break; case wxTRANSPARENT: case wxTRANSPARENT: s = s + wxT( "fill-opacity:0.0; " ); s = s + wxT( "fill-opacity:0.0; " ); break; break; default: default: wxASSERT_MSG( FALSE, wxT( "wxSVGFileDC::Requested Brush Style not available" ) ); wxASSERT_MSG( FALSE, wxT( "wxSVGFileDC::Requested Brush Style not available" ) ); } } s = s + newline; s = s + newline; return s; return s; } } Loading @@ -82,6 +90,7 @@ wxString wxBrushString ( wxColour c, int style ) /***********************************************************************/ /***********************************************************************/ void wxSVGFileDC::Init( wxString f, int Width, int Height, float dpi ) void wxSVGFileDC::Init( wxString f, int Width, int Height, float dpi ) /***********************************************************************/ /***********************************************************************/ /* set up things first wxDCBase does all this? /* set up things first wxDCBase does all this? */ */ { { Loading Loading @@ -141,18 +150,20 @@ void wxSVGFileDC::Init (wxString f, int Width, int Height, float dpi) write( s ); write( s ); s.Printf( wxT( " version=\"1.1\"\n" ) ); s.Printf( wxT( " version=\"1.1\"\n" ) ); write( s ); write( s ); s.Printf ( wxT(" width=\"%.2gcm\" height=\"%.2gcm\" viewBox=\"0 0 %d %d \"\n"), float(Width)/dpi*2.54, float(Height)/dpi*2.54, Width, Height ); s.Printf( wxT( " width=\"%.2gcm\" height=\"%.2gcm\" viewBox=\"0 0 %d %d \"\n" ), float (Width) / dpi * 2.54, float (Height) / dpi * 2.54, Width, Height ); write( s ); write( s ); s.Printf( wxT( ">\n" ) ); s.Printf( wxT( ">\n" ) ); write( s ); write( s ); s = wxT(" <title>SVG Picture created as ") + wxFileNameFromPath(f) + wxT(" </title>") + newline ; s = wxT( " <title>SVG Picture created as " ) + wxFileNameFromPath( f ) + wxT( " </title>" ) + newline; write( s ); write( s ); s = wxString (wxT(" <desc>Picture generated by wxSVG ")) + wxSVGVersion + wxT(" </desc>")+ newline ; s = wxString( wxT( " <desc>Picture generated by wxSVG " ) ) + wxSVGVersion + wxT( " </desc>" ) + newline; write( s ); write( s ); s = wxT( " <g style=\"fill:black; stroke:black; stroke-width:1\">" ) + newline; s = wxT( " <g style=\"fill:black; stroke:black; stroke-width:1\">" ) + newline; write( s ); write( s ); } } } } Loading @@ -177,6 +188,7 @@ wxSVGFileDC::wxSVGFileDC (wxString f, int Width, int Height, float dpi) wxSVGFileDC::~wxSVGFileDC() wxSVGFileDC::~wxSVGFileDC() { { wxString s = wxT( "</g> \n</svg> \n" ); wxString s = wxT( "</g> \n</svg> \n" ); write( s ); write( s ); delete m_outfile; delete m_outfile; } } Loading @@ -186,7 +198,8 @@ wxSVGFileDC::~wxSVGFileDC() void wxSVGFileDC::DoDrawLine( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2 ) void wxSVGFileDC::DoDrawLine( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2 ) { { if (m_graphics_changed) NewGraphics (); if( m_graphics_changed ) NewGraphics(); wxString s; wxString s; s.Printf( wxT( "<path d=\"M%d %d L%d %d\" /> \n" ), x1, y1, x2, y2 ); s.Printf( wxT( "<path d=\"M%d %d L%d %d\" /> \n" ), x1, y1, x2, y2 ); if( m_OK ) if( m_OK ) Loading @@ -212,7 +225,9 @@ void wxSVGFileDC::DoDrawLines(int n, wxPoint points[], wxCoord xoffset , wxCoord void wxSVGFileDC::DoDrawPoint( wxCoord x1, wxCoord y1 ) void wxSVGFileDC::DoDrawPoint( wxCoord x1, wxCoord y1 ) { { wxString s; wxString s; if (m_graphics_changed) NewGraphics (); if( m_graphics_changed ) NewGraphics(); s = wxT( "<g style = \"stroke-linecap:round;\" > " ) + newline; s = wxT( "<g style = \"stroke-linecap:round;\" > " ) + newline; write( s ); write( s ); DrawLine( x1, y1, x1, y1 ); DrawLine( x1, y1, x1, y1 ); Loading @@ -237,7 +252,8 @@ void wxSVGFileDC::DoDrawText(const wxString& text, wxCoord x1, wxCoord y1) void wxSVGFileDC::DoDrawRotatedText( const wxString& sText, wxCoord x, wxCoord y, double angle ) void wxSVGFileDC::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 //known bug; if the font is drawn in a scaled DC, it will not behave exactly as wxMSW if (m_graphics_changed) NewGraphics (); if( m_graphics_changed ) NewGraphics(); wxString s, sTmp; wxString s, sTmp; // calculate bounding box // calculate bounding box Loading @@ -261,30 +277,40 @@ void wxSVGFileDC::DoDrawRotatedText(const wxString& sText, wxCoord x, wxCoord y, // draw background first // 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 // just like DoDrawRectangle except we pass the text color to it and set the border to a 1 pixel wide text background wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::Draw Rotated Text Call plotting text background")) ; wxASSERT_MSG( !wxSVG_DEBUG, sTmp.Printf ( wxT(" <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" "), x,y+desc-h, w, h ); wxT( "wxSVGFileDC::Draw Rotated Text Call plotting text background" ) ); sTmp.Printf( wxT( " <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" " ), x, y + desc - h, w, h ); s = sTmp + wxT( "style=\"fill:#" ) + wxColStr( m_textBackgroundColour ) + wxT( "; " ); s = sTmp + wxT( "style=\"fill:#" ) + wxColStr( m_textBackgroundColour ) + wxT( "; " ); s = s + wxT( "stroke-width:1; stroke:#" ) + wxColStr( m_textBackgroundColour ) + wxT( "; " ); s = s + wxT( "stroke-width:1; stroke:#" ) + wxColStr( m_textBackgroundColour ) + wxT( "; " ); sTmp.Printf( wxT( "\" transform=\"rotate( %.2g %d %d ) \">" ), -angle, x, y ); sTmp.Printf( wxT( "\" transform=\"rotate( %.2g %d %d ) \">" ), -angle, x, y ); s = s + sTmp + newline; s = s + sTmp + newline; write( s ); write( s ); } } //now do the text itself //now do the text itself s.Printf( wxT( " <text x=\"%d\" y=\"%d\" " ), x, y ); s.Printf( wxT( " <text x=\"%d\" y=\"%d\" " ), x, y ); sTmp = m_font.GetFaceName(); sTmp = m_font.GetFaceName(); if (sTmp.Len () > 0) s = s + wxT("style=\"font-family:") + sTmp + wxT("; "); if( sTmp.Len() > 0 ) else s = s + wxT("style=\" ") ; s = s + wxT( "style=\"font-family:" ) + sTmp + wxT( "; " ); else s = s + wxT( "style=\" " ); wxString fontweights[3] = { wxT( "normal" ), wxT( "lighter" ), wxT( "bold" ) }; wxString fontweights[3] = { wxT( "normal" ), wxT( "lighter" ), wxT( "bold" ) }; s = s + wxT( "font-weight:" ) + fontweights[m_font.GetWeight() - wxNORMAL] + semicolon + space; s = s + wxT( "font-weight:" ) + fontweights[m_font.GetWeight() - wxNORMAL] + semicolon + space; wxString fontstyles [5] = { wxT("normal"), wxT("style error"), wxT("style error"), wxT("italic"), wxT("oblique") }; wxString fontstyles[5] = { wxT( "normal" ), wxT( "style error" ), wxT( "style error" ), wxT( "italic" ), wxT( "oblique" ) }; s = s + wxT( "font-style:" ) + fontstyles[m_font.GetStyle() - wxNORMAL] + semicolon + space; s = s + wxT( "font-style:" ) + fontstyles[m_font.GetStyle() - wxNORMAL] + semicolon + space; sTmp.Printf( wxT( "font-size:%dpt; fill:#" ), m_font.GetPointSize() ); sTmp.Printf( wxT( "font-size:%dpt; fill:#" ), m_font.GetPointSize() ); s = s + sTmp; s = s + sTmp; s = s + wxColStr (m_textForegroundColour) + wxT("; stroke:#") + wxColStr (m_textForegroundColour) + wxT("; ") ; s = s + wxColStr( m_textForegroundColour ) + wxT( "; stroke:#" ) + wxColStr( m_textForegroundColour ) + wxT( "; " ); sTmp.Printf( wxT( "stroke-width:0;\" transform=\"rotate( %.2g %d %d ) \" >" ), -angle, x, y ); sTmp.Printf( wxT( "stroke-width:0;\" transform=\"rotate( %.2g %d %d ) \" >" ), -angle, x, y ); s = s + sTmp + sText + wxT( "</text> " ) + newline; s = s + sTmp + sText + wxT( "</text> " ) + newline; if( m_OK ) if( m_OK ) Loading @@ -292,7 +318,6 @@ void wxSVGFileDC::DoDrawRotatedText(const wxString& sText, wxCoord x, wxCoord y, write( s ); write( s ); } } wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::DrawRotatedText Call executed" ) ); wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::DrawRotatedText Call executed" ) ); } } Loading @@ -302,10 +327,15 @@ void wxSVGFileDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord h } } void wxSVGFileDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius ) void wxSVGFileDC::DoDrawRoundedRectangle( wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius ) { { if (m_graphics_changed) NewGraphics (); if( m_graphics_changed ) NewGraphics(); wxString s; wxString s; s.Printf( wxT( " <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" rx=\"%.2g\" " ), s.Printf( wxT( " <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" rx=\"%.2g\" " ), Loading @@ -317,13 +347,17 @@ void wxSVGFileDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wx wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::DoDrawRoundedRectangle Call executed" ) ); wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::DoDrawRoundedRectangle Call executed" ) ); CalcBoundingBox( x, y ); CalcBoundingBox( x, y ); CalcBoundingBox( x + width, y + height ); CalcBoundingBox( x + width, y + height ); } } void wxSVGFileDC::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset,int fillStyle) void wxSVGFileDC::DoDrawPolygon( int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset, int fillStyle ) { { if (m_graphics_changed) NewGraphics (); if( m_graphics_changed ) NewGraphics(); wxString s, sTmp; wxString s, sTmp; s = wxT( "<polygon style=\"" ); s = wxT( "<polygon style=\"" ); if( fillStyle == wxODDEVEN_RULE ) if( fillStyle == wxODDEVEN_RULE ) Loading @@ -339,6 +373,7 @@ void wxSVGFileDC::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoor s = s + sTmp + newline; s = s + sTmp + newline; CalcBoundingBox( points[i].x + xoffset, points[i].y + yoffset ); CalcBoundingBox( points[i].x + xoffset, points[i].y + yoffset ); } } s = s + wxT( "\" /> " ); s = s + wxT( "\" /> " ); s = s + newline; s = s + newline; write( s ); write( s ); Loading @@ -350,7 +385,8 @@ void wxSVGFileDC::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoor void wxSVGFileDC::DoDrawEllipse( wxCoord x, wxCoord y, wxCoord width, wxCoord height ) void wxSVGFileDC::DoDrawEllipse( wxCoord x, wxCoord y, wxCoord width, wxCoord height ) { { if (m_graphics_changed) NewGraphics (); if( m_graphics_changed ) NewGraphics(); int rh = height / 2; int rh = height / 2; int rw = width / 2; int rw = width / 2; Loading @@ -367,23 +403,30 @@ void wxSVGFileDC::DoDrawEllipse (wxCoord x, wxCoord y, wxCoord width, wxCoord he } } void wxSVGFileDC::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCoord xc, wxCoord yc) void wxSVGFileDC::DoDrawArc( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCoord xc, wxCoord yc ) { { /* Draws an arc of a circle, centred on (xc, yc), with starting point /* Draws an arc of a circle, centred on (xc, yc), with starting point (x1, y1) and ending at (x2, y2). The current pen is used for the outline * (x1, y1) and ending at (x2, y2). The current pen is used for the outline and the current brush for filling the shape. * and the current brush for filling the shape. * The arc is drawn in an anticlockwise direction from the start point to * The arc is drawn in an anticlockwise direction from the start point to the end point. */ * the end point. */ if (m_graphics_changed) NewGraphics (); if( m_graphics_changed ) NewGraphics(); wxString s; wxString s; // we need the radius of the circle which has two estimates // we need the radius of the circle which has two estimates double r1 = sqrt( double ( (x1 - xc) * (x1 - xc) ) + double ( (y1 - yc) * (y1 - yc) ) ); double r1 = sqrt( double ( (x1 - xc) * (x1 - xc) ) + double ( (y1 - yc) * (y1 - yc) ) ); double r2 = sqrt( double ( (x2 - xc) * (x2 - xc) ) + double ( (y2 - yc) * (y2 - yc) ) ); double r2 = sqrt( double ( (x2 - xc) * (x2 - xc) ) + double ( (y2 - yc) * (y2 - yc) ) ); wxASSERT_MSG( (fabs ( r2-r1 ) <= 3), wxT("wxSVGFileDC::DoDrawArc Error in getting radii of circle")) ; wxASSERT_MSG( (fabs( r2 - r1 ) <= 3), wxT( "wxSVGFileDC::DoDrawArc Error in getting radii of circle" ) ); if( fabs( r2 - r1 ) > 3 ) //pixels if( fabs( r2 - r1 ) > 3 ) //pixels { { s = wxT( "<!--- wxSVGFileDC::DoDrawArc Error in getting radii of circle --> \n" ); s = wxT( "<!--- wxSVGFileDC::DoDrawArc Error in getting radii of circle --> \n" ); Loading @@ -391,20 +434,35 @@ void wxSVGFileDC::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCo } } double theta1 = atan2( (double) (yc - y1), (double) (x1 - xc) ); double theta1 = atan2( (double) (yc - y1), (double) (x1 - xc) ); if ( theta1 < 0 ) theta1 = theta1 + M_PI * 2; if( theta1 < 0 ) theta1 = theta1 + M_PI * 2; double theta2 = atan2( (double) (yc - y2), (double) (x2 - xc) ); double theta2 = atan2( (double) (yc - y2), (double) (x2 - xc) ); if ( theta2 < 0 ) theta2 = theta2 + M_PI * 2; if( theta2 < 0 ) if ( theta2 < theta1 ) theta2 = theta2 + M_PI *2 ; theta2 = theta2 + M_PI * 2; if( theta2 < theta1 ) theta2 = theta2 + M_PI * 2; int fArc; // flag for large or small arc 0 means less than 180 degrees int fArc; // flag for large or small arc 0 means less than 180 degrees if ( fabs(theta2 - theta1) > M_PI ) fArc = 1; else fArc = 0 ; if( fabs( theta2 - theta1 ) > M_PI ) fArc = 1;else fArc = 0; int fSweep = 0 ; // flag for sweep always 0 int fSweep; if( (theta2 - theta1) > 0 ) fSweep = 0;else fSweep = 1; float Axis_rotation = 0.0; // Draw arc as pie: // s.Printf ( wxT("<path d=\"M%d %d A%.2g %.2g 0.0 %d %d %d %d L%d %d z "), // s.Printf ( wxT("<path d=\"M%d %d A%.2g %.2g 0.0 %d %d %d %d L%d %d z "), // the z means close the path and fill (usefull to draw a pie) // the z means close the path and fill (usefull to draw a pie) s.Printf ( wxT("<path d=\"M%d %d A%.2g %.2g 0.0 %d %d %d %d"), // x1, y1, r1, r2, fArc, fSweep, x2, y2, xc ,yc ); x1, y1, r1, r2, fArc, fSweep, x2, y2, xc, yc ); // Draw a single arc: s.Printf( wxT( "<path d=\"M%d %d A%.2g %.2g %g %d %d %d %d" ), x1, y1, r1, r2, Axis_rotation, fArc, fSweep, x2, y2 ); s = s + wxT( " \" /> " ) + newline; s = s + wxT( " \" /> " ) + newline; Loading @@ -418,41 +476,52 @@ void wxSVGFileDC::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCo } } void wxSVGFileDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,double sa,double ea) void wxSVGFileDC::DoDrawEllipticArc( wxCoord x, wxCoord y, wxCoord w, wxCoord h, double sa, double ea ) { { /* /* Draws an arc of an ellipse. The current pen is used for drawing the arc * Draws an arc of an ellipse. The current pen is used for drawing the arc and the current brush is used for drawing the pie. This function is * and the current brush is used for drawing the pie. This function is currently only available for X window and PostScript device contexts. * currently only available for X window and PostScript device contexts. * x and y specify the x and y coordinates of the upper-left corner of the * x and y specify the x and y coordinates of the upper-left corner of the rectangle that contains the ellipse. * rectangle that contains the ellipse. * width and height specify the width and height of the rectangle that * width and height specify the width and height of the rectangle that contains the ellipse. * contains the ellipse. * start and end specify the start and end of the arc relative to the * start and end specify the start and end of the arc relative to the three-o'clock position from the center of the rectangle. Angles are * three-o'clock position from the center of the rectangle. Angles are specified in degrees (360 is a complete circle). Positive values mean * specified in degrees (360 is a complete circle). Positive values mean counter-clockwise motion. If start is equal to end, a complete ellipse * counter-clockwise motion. If start is equal to end, a complete ellipse will be drawn. */ * will be drawn. */ //known bug: SVG draws with the current pen along the radii, but this does not happen in wxMSW //known bug: SVG draws with the current pen along the radii, but this does not happen in wxMSW if (m_graphics_changed) NewGraphics (); if( m_graphics_changed ) NewGraphics(); wxString s; wxString s; //radius //radius double rx = w / 2; double rx = w / 2; double ry = h / 2; double ry = h / 2; // center // center double xc = x + rx; double xc = x + rx; double yc = y + ry; double yc = y + ry; double xs, ys, xe, ye; double xs, ys, xe, ye; xs = xc + rx* cos( DegToRad (sa) ); xs = xc + rx* cos( DegToRad (sa) ); xe = xc + rx* cos( DegToRad (ea) ); xe = xc + rx* cos( DegToRad (ea) ); ys = yc - ry* sin( DegToRad (sa) ); ys = yc - ry* sin( DegToRad (sa) ); ye = yc - ry* sin( DegToRad (ea) ); ye = yc - ry* sin( DegToRad (ea) ); ///now same as circle arc... ///now same as circle arc... Loading @@ -461,15 +530,22 @@ void wxSVGFileDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,doub double theta2 = atan2( ye - yc, xe - xc ); double theta2 = atan2( ye - yc, xe - xc ); int fArc; // flag for large or small arc 0 means less than 180 degrees int fArc; // flag for large or small arc 0 means less than 180 degrees if ( (theta2 - theta1) > 0 ) fArc = 1; else fArc = 0 ; if( fabs( theta2 - theta1 ) > M_PI ) fArc = 1;else fArc = 0; int fSweep; int fSweep; if ( fabs(theta2 - theta1) > M_PI) fSweep = 1; else fSweep = 0 ; if( (theta2 - theta1) > 0 ) fSweep = 0;else fSweep = 1; float Axis_rotation = 0.0; // s.Printf ( wxT("<path d=\"M%d %d A%d %d 0.0 %d %d %d %d L %d %d z "), // Draw a single arc: s.Printf ( wxT("<path d=\"M%d %d A%d %d 0.0 %d %d %d %d L %d %d "), s.Printf( wxT( "<path d=\"M%d,%d A%d,%d %g %d %d %d,%d" ), int(xs), int(ys), int(rx), int(ry), int (xs), int (ys), fArc, fSweep, int(xe), int(ye), int(xc), int(yc) ); int (rx), int (ry), Axis_rotation, fArc, fSweep, int (xe), int (ye) ); s = s + wxT( " \" /> " ) + newline; s = s + wxT( " \" /> " ) + newline; Loading @@ -483,13 +559,19 @@ void wxSVGFileDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,doub } } void wxSVGFileDC::DoGetTextExtent(const wxString& string, wxCoord *w, wxCoord *h, wxCoord *descent , wxCoord *externalLeading , wxFont *font) const void wxSVGFileDC::DoGetTextExtent( const wxString& string, wxCoord* w, wxCoord* h, wxCoord* descent, wxCoord* externalLeading, wxFont* font ) const { { wxScreenDC sDC; wxScreenDC sDC; sDC.SetFont( m_font ); sDC.SetFont( m_font ); if ( font != NULL ) sDC.SetFont ( *font ); if( font != NULL ) sDC.SetFont( *font ); sDC.GetTextExtent( string, w, h, descent, externalLeading ); sDC.GetTextExtent( string, w, h, descent, externalLeading ); wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::GetTextExtent Call executed" ) ); wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::GetTextExtent Call executed" ) ); } } Loading @@ -499,29 +581,28 @@ wxCoord wxSVGFileDC::GetCharHeight() const { { wxScreenDC sDC; wxScreenDC sDC; sDC.SetFont( m_font ); sDC.SetFont( m_font ); wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::GetCharHeight Call executing" ) ); wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::GetCharHeight Call executing" ) ); return ( sDC.GetCharHeight() ); return sDC.GetCharHeight(); } } wxCoord wxSVGFileDC::GetCharWidth() const wxCoord wxSVGFileDC::GetCharWidth() const { { wxScreenDC sDC; wxScreenDC sDC; sDC.SetFont( m_font ); sDC.SetFont( m_font ); wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::GetCharWidth Call executing" ) ); wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::GetCharWidth Call executing" ) ); return ( sDC.GetCharWidth() ) ; return sDC.GetCharWidth(); } } /// Set Functions ///////////////////////////////////////////////////////////////// /// Set Functions ///////////////////////////////////////////////////////////////// void wxSVGFileDC::SetBackground( const wxBrush& brush ) void wxSVGFileDC::SetBackground( const wxBrush& brush ) { { m_backgroundBrush = brush; m_backgroundBrush = brush; return; return; } } Loading Loading @@ -554,9 +635,9 @@ void wxSVGFileDC::SetPen(const wxPen& pen) wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::SetPen Call executed" ) ); wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::SetPen Call executed" ) ); } } void wxSVGFileDC::NewGraphics() void wxSVGFileDC::NewGraphics() { { int w = m_pen.GetWidth(); int w = m_pen.GetWidth(); wxColour c = m_pen.GetColour(); wxColour c = m_pen.GetColour(); Loading @@ -570,40 +651,55 @@ void wxSVGFileDC::NewGraphics () case wxCAP_PROJECTING: case wxCAP_PROJECTING: sPenCap = wxT( "stroke-linecap:square; " ); sPenCap = wxT( "stroke-linecap:square; " ); break; break; case wxCAP_BUTT: case wxCAP_BUTT: sPenCap = wxT( "stroke-linecap:butt; " ); sPenCap = wxT( "stroke-linecap:butt; " ); break; break; case wxCAP_ROUND: case wxCAP_ROUND: default: default: sPenCap = wxT( "stroke-linecap:round; " ); sPenCap = wxT( "stroke-linecap:round; " ); }; } ; switch( m_pen.GetJoin() ) switch( m_pen.GetJoin() ) { { case wxJOIN_BEVEL: case wxJOIN_BEVEL: sPenJoin = wxT( "stroke-linejoin:bevel; " ); sPenJoin = wxT( "stroke-linejoin:bevel; " ); break; break; case wxJOIN_MITER: case wxJOIN_MITER: sPenJoin = wxT( "stroke-linejoin:miter; " ); sPenJoin = wxT( "stroke-linejoin:miter; " ); break; break; case wxJOIN_ROUND: case wxJOIN_ROUND: default: default: sPenJoin = wxT( "stroke-linejoin:round; " ); sPenJoin = wxT( "stroke-linejoin:round; " ); }; } ; switch( m_pen.GetStyle() ) switch( m_pen.GetStyle() ) { { case wxSOLID: case wxSOLID: sPenStyle = wxT( "stroke-opacity:1.0; stroke-opacity:1.0; " ); sPenStyle = wxT( "stroke-opacity:1.0; stroke-opacity:1.0; " ); break; break; case wxTRANSPARENT: case wxTRANSPARENT: sPenStyle = wxT( "stroke-opacity:0.0; stroke-opacity:0.0; " ); sPenStyle = wxT( "stroke-opacity:0.0; stroke-opacity:0.0; " ); break; break; default: default: wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::SetPen Call called to set a Style which is not available")) ; wxASSERT_MSG( FALSE, sWarn = sWarn + wxT("<!--- wxSVGFileDC::SetPen Call called to set a Style which is not available --> \n") ; wxT( "wxSVGFileDC::SetPen Call called to set a Style which is not available" ) ); sWarn = sWarn + wxT( "<!--- wxSVGFileDC::SetPen Call called to set a Style which is not available --> \n" ); } } sLast.Printf ( wxT("stroke-width:%d\" \n transform=\"translate(%.2g %.2g) scale(%.2g %.2g)\">"), sLast.Printf( wxT( "stroke-width:%d\" \n transform=\"translate(%.2g %.2g) scale(%.2g %.2g)\">" ), w, m_OriginX, m_OriginY, m_scaleX, m_scaleY ); w, m_OriginX, m_OriginY, m_scaleX, m_scaleY ); s = sBrush + sPenCap + sPenJoin + sPenStyle + sLast + newline + sWarn; s = sBrush + sPenCap + sPenJoin + sPenStyle + sLast + newline + sWarn; Loading Loading @@ -645,28 +741,33 @@ void wxSVGFileDC::SetMapMode( int mode ) case wxMM_TWIPS: case wxMM_TWIPS: SetLogicalScale( twips2mm * m_mm_to_pix_x, twips2mm * m_mm_to_pix_y ); SetLogicalScale( twips2mm * m_mm_to_pix_x, twips2mm * m_mm_to_pix_y ); break; break; case wxMM_POINTS: case wxMM_POINTS: SetLogicalScale( pt2mm * m_mm_to_pix_x, pt2mm * m_mm_to_pix_y ); SetLogicalScale( pt2mm * m_mm_to_pix_x, pt2mm * m_mm_to_pix_y ); break; break; case wxMM_METRIC: case wxMM_METRIC: SetLogicalScale( m_mm_to_pix_x, m_mm_to_pix_y ); SetLogicalScale( m_mm_to_pix_x, m_mm_to_pix_y ); break; break; case wxMM_LOMETRIC: case wxMM_LOMETRIC: SetLogicalScale( m_mm_to_pix_x / 10.0, m_mm_to_pix_y / 10.0 ); SetLogicalScale( m_mm_to_pix_x / 10.0, m_mm_to_pix_y / 10.0 ); break; break; default: default: case wxMM_TEXT: case wxMM_TEXT: SetLogicalScale( 1.0, 1.0 ); SetLogicalScale( 1.0, 1.0 ); break; break; } } m_mappingMode = mode; m_mappingMode = mode; /* we don't do this mega optimisation /* we don't do this mega optimisation if (mode != wxMM_TEXT) * if (mode != wxMM_TEXT) { * { m_needComputeScaleX = TRUE; * m_needComputeScaleX = TRUE; m_needComputeScaleY = TRUE; * m_needComputeScaleY = TRUE; } * } */ */ } } Loading Loading @@ -731,12 +832,16 @@ bool wxSVGFileDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord he { { if( logicalFunc != wxCOPY ) if( logicalFunc != wxCOPY ) { { wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::DoBlit Call requested nonCopy mode; this is not possible")) ; wxASSERT_MSG( FALSE, wxT( "wxSVGFileDC::DoBlit Call requested nonCopy mode; this is not possible" ) ); return FALSE; return FALSE; } } if( useMask != FALSE ) if( useMask != FALSE ) { { wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::DoBlit Call requested False mask ; this is not possible")) ; wxASSERT_MSG( FALSE, wxT( "wxSVGFileDC::DoBlit Call requested False mask ; this is not possible" ) ); return FALSE; return FALSE; } } wxBitmap myBitmap( width, height ); wxBitmap myBitmap( width, height ); Loading @@ -754,6 +859,7 @@ void wxSVGFileDC::DoDrawIcon(const class wxIcon & myIcon, wxCoord x, wxCoord y) { { wxBitmap myBitmap( myIcon.GetWidth(), myIcon.GetHeight() ); wxBitmap myBitmap( myIcon.GetWidth(), myIcon.GetHeight() ); wxMemoryDC memDC; wxMemoryDC memDC; memDC.SelectObject( myBitmap ); memDC.SelectObject( myBitmap ); memDC.DrawIcon( myIcon, 0, 0 ); memDC.DrawIcon( myIcon, 0, 0 ); memDC.SelectObject( wxNullBitmap ); memDC.SelectObject( wxNullBitmap ); Loading @@ -763,10 +869,13 @@ void wxSVGFileDC::DoDrawIcon(const class wxIcon & myIcon, wxCoord x, wxCoord y) } } void wxSVGFileDC::DoDrawBitmap( const class wxBitmap& bmp, void wxSVGFileDC::DoDrawBitmap(const class wxBitmap & bmp, wxCoord x, wxCoord y , bool WXUNUSED(bTransparent) /*=0*/ ) wxCoord x, wxCoord y, bool WXUNUSED ( bTransparent) /*=0*/ ) { { if (m_graphics_changed) NewGraphics (); if( m_graphics_changed ) NewGraphics(); wxString sTmp, s, sPNG; wxString sTmp, s, sPNG; wxImage::AddHandler( new wxPNGHandler ); wxImage::AddHandler( new wxPNGHandler ); Loading @@ -783,6 +892,7 @@ void wxSVGFileDC::DoDrawBitmap(const class wxBitmap & bmp, wxCoord x, wxCoord y //create copy of bitmap (wxGTK doesn't like saving a constant bitmap) //create copy of bitmap (wxGTK doesn't like saving a constant bitmap) wxBitmap myBitmap = bmp; wxBitmap myBitmap = bmp; //save it //save it bool bPNG_OK = myBitmap.SaveFile( sPNG, wxBITMAP_TYPE_PNG ); bool bPNG_OK = myBitmap.SaveFile( sPNG, wxBITMAP_TYPE_PNG ); Loading Loading @@ -856,13 +966,16 @@ wxCoord wxSVGFileDC::LogicalToDeviceYRel(wxCoord y) const return YLOG2DEVREL( y ); return YLOG2DEVREL( y ); } } void wxSVGFileDC::write( const wxString& s ) void wxSVGFileDC::write( const wxString& s ) { { const wxWX2MBbuf buf = s.mb_str( wxConvUTF8 ); const wxWX2MBbuf buf = s.mb_str( wxConvUTF8 ); m_outfile->Write( buf, strlen( (const char*) buf ) ); m_outfile->Write( buf, strlen( (const char*) buf ) ); m_OK = m_outfile->Ok(); m_OK = m_outfile->Ok(); } } #ifdef __BORLANDC__ #ifdef __BORLANDC__ #pragma warn .rch #pragma warn .rch #pragma warn .ccc #pragma warn .ccc Loading Loading
change_log.txt +12 −0 Original line number Original line Diff line number Diff line Loading @@ -4,6 +4,18 @@ Started 2007-June-11 Please add newer entries at the top, list the date and your name with Please add newer entries at the top, list the date and your name with email address. email address. 2007-sept-22 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr> ================================================================================ + all * small change in hotkeys handling (Ki_HotkeyInfo: new member m_IdMenuEvent to call an existing event handler from a hotkey list) + eeschema: * added drag component in pop up menu and hotkeys * plot svg format: incorrect arc draw fixed 2007-Sep-22 UPDATE Dick Hollenbeck <dick@softplc.com> 2007-Sep-22 UPDATE Dick Hollenbeck <dick@softplc.com> ================================================================================ ================================================================================ + pcbnew + pcbnew Loading
common/common_plotPS_functions.cpp +5 −4 Original line number Original line Diff line number Diff line Loading @@ -166,10 +166,11 @@ char Line[256]; void PlotPolyPS(int nb_segm, int * coord, int fill, int width) void PlotPolyPS(int nb_segm, int * coord, int fill, int width) /*****************************************************************/ /*****************************************************************/ /* Trace un polygone ( ferme si rempli ) en format POSTSCRIPT /* Draw a polygon ( a filled polygon if fill == 1 ) in POSTSCRIPT format * coord = tableau des coord des sommets * @param nb_segm = corner count * nb_segm = nombre de coord ( 1 coord = 2 elements: X et Y du tableau ) * @param coord = corner list (a corner uses 2 int = X coordinate followed by Y coordinate * fill : si != 0 polygone rempli * @param fill :if == 0 : filled polygon * @param width = line width */ */ { { int ii; int ii; Loading
common/dcsvg.cpp +530 −417 Original line number Original line Diff line number Diff line ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // Name: svg.cpp // Name: svg.cpp // Purpose: SVG plot // Purpose: SVG plot // Author: Chris Elliott // Author: Chris Elliott Loading @@ -23,6 +24,7 @@ #include "wx/image.h" #include "wx/image.h" #define wxSVG_DEBUG FALSE #define wxSVG_DEBUG FALSE // or TRUE to see the calls being executed // or TRUE to see the calls being executed #define newline wxString( wxT( "\n" ) ) #define newline wxString( wxT( "\n" ) ) #define space wxString( wxT( " " ) ) #define space wxString( wxT( " " ) ) Loading @@ -43,11 +45,15 @@ #define pt2mm 0.352777777778 #define pt2mm 0.352777777778 #endif #endif static inline double DegToRad(double deg) { return (deg * M_PI) / 180.0; } ; static inline double DegToRad( double deg ) { return (deg * M_PI) / 180.0; }; wxString wxColStr( wxColour c ) wxString wxColStr( wxColour c ) { { unsigned char r, g, b; unsigned char r, g, b; r = c.Red(); r = c.Red(); g = c.Green(); g = c.Green(); b = c.Blue(); b = c.Blue(); Loading @@ -61,19 +67,21 @@ wxString wxColStr ( wxColour c ) wxString wxBrushString( wxColour c, int style ) wxString wxBrushString( wxColour c, int style ) { { wxString s = wxT( "fill:#" ) + wxColStr( c ) + semicolon + space; wxString s = wxT( "fill:#" ) + wxColStr( c ) + semicolon + space; switch( style ) switch( style ) { { case wxSOLID: case wxSOLID: s = s + wxT( "fill-opacity:1.0; " ); s = s + wxT( "fill-opacity:1.0; " ); break; break; case wxTRANSPARENT: case wxTRANSPARENT: s = s + wxT( "fill-opacity:0.0; " ); s = s + wxT( "fill-opacity:0.0; " ); break; break; default: default: wxASSERT_MSG( FALSE, wxT( "wxSVGFileDC::Requested Brush Style not available" ) ); wxASSERT_MSG( FALSE, wxT( "wxSVGFileDC::Requested Brush Style not available" ) ); } } s = s + newline; s = s + newline; return s; return s; } } Loading @@ -82,6 +90,7 @@ wxString wxBrushString ( wxColour c, int style ) /***********************************************************************/ /***********************************************************************/ void wxSVGFileDC::Init( wxString f, int Width, int Height, float dpi ) void wxSVGFileDC::Init( wxString f, int Width, int Height, float dpi ) /***********************************************************************/ /***********************************************************************/ /* set up things first wxDCBase does all this? /* set up things first wxDCBase does all this? */ */ { { Loading Loading @@ -141,18 +150,20 @@ void wxSVGFileDC::Init (wxString f, int Width, int Height, float dpi) write( s ); write( s ); s.Printf( wxT( " version=\"1.1\"\n" ) ); s.Printf( wxT( " version=\"1.1\"\n" ) ); write( s ); write( s ); s.Printf ( wxT(" width=\"%.2gcm\" height=\"%.2gcm\" viewBox=\"0 0 %d %d \"\n"), float(Width)/dpi*2.54, float(Height)/dpi*2.54, Width, Height ); s.Printf( wxT( " width=\"%.2gcm\" height=\"%.2gcm\" viewBox=\"0 0 %d %d \"\n" ), float (Width) / dpi * 2.54, float (Height) / dpi * 2.54, Width, Height ); write( s ); write( s ); s.Printf( wxT( ">\n" ) ); s.Printf( wxT( ">\n" ) ); write( s ); write( s ); s = wxT(" <title>SVG Picture created as ") + wxFileNameFromPath(f) + wxT(" </title>") + newline ; s = wxT( " <title>SVG Picture created as " ) + wxFileNameFromPath( f ) + wxT( " </title>" ) + newline; write( s ); write( s ); s = wxString (wxT(" <desc>Picture generated by wxSVG ")) + wxSVGVersion + wxT(" </desc>")+ newline ; s = wxString( wxT( " <desc>Picture generated by wxSVG " ) ) + wxSVGVersion + wxT( " </desc>" ) + newline; write( s ); write( s ); s = wxT( " <g style=\"fill:black; stroke:black; stroke-width:1\">" ) + newline; s = wxT( " <g style=\"fill:black; stroke:black; stroke-width:1\">" ) + newline; write( s ); write( s ); } } } } Loading @@ -177,6 +188,7 @@ wxSVGFileDC::wxSVGFileDC (wxString f, int Width, int Height, float dpi) wxSVGFileDC::~wxSVGFileDC() wxSVGFileDC::~wxSVGFileDC() { { wxString s = wxT( "</g> \n</svg> \n" ); wxString s = wxT( "</g> \n</svg> \n" ); write( s ); write( s ); delete m_outfile; delete m_outfile; } } Loading @@ -186,7 +198,8 @@ wxSVGFileDC::~wxSVGFileDC() void wxSVGFileDC::DoDrawLine( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2 ) void wxSVGFileDC::DoDrawLine( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2 ) { { if (m_graphics_changed) NewGraphics (); if( m_graphics_changed ) NewGraphics(); wxString s; wxString s; s.Printf( wxT( "<path d=\"M%d %d L%d %d\" /> \n" ), x1, y1, x2, y2 ); s.Printf( wxT( "<path d=\"M%d %d L%d %d\" /> \n" ), x1, y1, x2, y2 ); if( m_OK ) if( m_OK ) Loading @@ -212,7 +225,9 @@ void wxSVGFileDC::DoDrawLines(int n, wxPoint points[], wxCoord xoffset , wxCoord void wxSVGFileDC::DoDrawPoint( wxCoord x1, wxCoord y1 ) void wxSVGFileDC::DoDrawPoint( wxCoord x1, wxCoord y1 ) { { wxString s; wxString s; if (m_graphics_changed) NewGraphics (); if( m_graphics_changed ) NewGraphics(); s = wxT( "<g style = \"stroke-linecap:round;\" > " ) + newline; s = wxT( "<g style = \"stroke-linecap:round;\" > " ) + newline; write( s ); write( s ); DrawLine( x1, y1, x1, y1 ); DrawLine( x1, y1, x1, y1 ); Loading @@ -237,7 +252,8 @@ void wxSVGFileDC::DoDrawText(const wxString& text, wxCoord x1, wxCoord y1) void wxSVGFileDC::DoDrawRotatedText( const wxString& sText, wxCoord x, wxCoord y, double angle ) void wxSVGFileDC::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 //known bug; if the font is drawn in a scaled DC, it will not behave exactly as wxMSW if (m_graphics_changed) NewGraphics (); if( m_graphics_changed ) NewGraphics(); wxString s, sTmp; wxString s, sTmp; // calculate bounding box // calculate bounding box Loading @@ -261,30 +277,40 @@ void wxSVGFileDC::DoDrawRotatedText(const wxString& sText, wxCoord x, wxCoord y, // draw background first // 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 // just like DoDrawRectangle except we pass the text color to it and set the border to a 1 pixel wide text background wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::Draw Rotated Text Call plotting text background")) ; wxASSERT_MSG( !wxSVG_DEBUG, sTmp.Printf ( wxT(" <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" "), x,y+desc-h, w, h ); wxT( "wxSVGFileDC::Draw Rotated Text Call plotting text background" ) ); sTmp.Printf( wxT( " <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" " ), x, y + desc - h, w, h ); s = sTmp + wxT( "style=\"fill:#" ) + wxColStr( m_textBackgroundColour ) + wxT( "; " ); s = sTmp + wxT( "style=\"fill:#" ) + wxColStr( m_textBackgroundColour ) + wxT( "; " ); s = s + wxT( "stroke-width:1; stroke:#" ) + wxColStr( m_textBackgroundColour ) + wxT( "; " ); s = s + wxT( "stroke-width:1; stroke:#" ) + wxColStr( m_textBackgroundColour ) + wxT( "; " ); sTmp.Printf( wxT( "\" transform=\"rotate( %.2g %d %d ) \">" ), -angle, x, y ); sTmp.Printf( wxT( "\" transform=\"rotate( %.2g %d %d ) \">" ), -angle, x, y ); s = s + sTmp + newline; s = s + sTmp + newline; write( s ); write( s ); } } //now do the text itself //now do the text itself s.Printf( wxT( " <text x=\"%d\" y=\"%d\" " ), x, y ); s.Printf( wxT( " <text x=\"%d\" y=\"%d\" " ), x, y ); sTmp = m_font.GetFaceName(); sTmp = m_font.GetFaceName(); if (sTmp.Len () > 0) s = s + wxT("style=\"font-family:") + sTmp + wxT("; "); if( sTmp.Len() > 0 ) else s = s + wxT("style=\" ") ; s = s + wxT( "style=\"font-family:" ) + sTmp + wxT( "; " ); else s = s + wxT( "style=\" " ); wxString fontweights[3] = { wxT( "normal" ), wxT( "lighter" ), wxT( "bold" ) }; wxString fontweights[3] = { wxT( "normal" ), wxT( "lighter" ), wxT( "bold" ) }; s = s + wxT( "font-weight:" ) + fontweights[m_font.GetWeight() - wxNORMAL] + semicolon + space; s = s + wxT( "font-weight:" ) + fontweights[m_font.GetWeight() - wxNORMAL] + semicolon + space; wxString fontstyles [5] = { wxT("normal"), wxT("style error"), wxT("style error"), wxT("italic"), wxT("oblique") }; wxString fontstyles[5] = { wxT( "normal" ), wxT( "style error" ), wxT( "style error" ), wxT( "italic" ), wxT( "oblique" ) }; s = s + wxT( "font-style:" ) + fontstyles[m_font.GetStyle() - wxNORMAL] + semicolon + space; s = s + wxT( "font-style:" ) + fontstyles[m_font.GetStyle() - wxNORMAL] + semicolon + space; sTmp.Printf( wxT( "font-size:%dpt; fill:#" ), m_font.GetPointSize() ); sTmp.Printf( wxT( "font-size:%dpt; fill:#" ), m_font.GetPointSize() ); s = s + sTmp; s = s + sTmp; s = s + wxColStr (m_textForegroundColour) + wxT("; stroke:#") + wxColStr (m_textForegroundColour) + wxT("; ") ; s = s + wxColStr( m_textForegroundColour ) + wxT( "; stroke:#" ) + wxColStr( m_textForegroundColour ) + wxT( "; " ); sTmp.Printf( wxT( "stroke-width:0;\" transform=\"rotate( %.2g %d %d ) \" >" ), -angle, x, y ); sTmp.Printf( wxT( "stroke-width:0;\" transform=\"rotate( %.2g %d %d ) \" >" ), -angle, x, y ); s = s + sTmp + sText + wxT( "</text> " ) + newline; s = s + sTmp + sText + wxT( "</text> " ) + newline; if( m_OK ) if( m_OK ) Loading @@ -292,7 +318,6 @@ void wxSVGFileDC::DoDrawRotatedText(const wxString& sText, wxCoord x, wxCoord y, write( s ); write( s ); } } wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::DrawRotatedText Call executed" ) ); wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::DrawRotatedText Call executed" ) ); } } Loading @@ -302,10 +327,15 @@ void wxSVGFileDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord h } } void wxSVGFileDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius ) void wxSVGFileDC::DoDrawRoundedRectangle( wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius ) { { if (m_graphics_changed) NewGraphics (); if( m_graphics_changed ) NewGraphics(); wxString s; wxString s; s.Printf( wxT( " <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" rx=\"%.2g\" " ), s.Printf( wxT( " <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" rx=\"%.2g\" " ), Loading @@ -317,13 +347,17 @@ void wxSVGFileDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wx wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::DoDrawRoundedRectangle Call executed" ) ); wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::DoDrawRoundedRectangle Call executed" ) ); CalcBoundingBox( x, y ); CalcBoundingBox( x, y ); CalcBoundingBox( x + width, y + height ); CalcBoundingBox( x + width, y + height ); } } void wxSVGFileDC::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset,int fillStyle) void wxSVGFileDC::DoDrawPolygon( int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset, int fillStyle ) { { if (m_graphics_changed) NewGraphics (); if( m_graphics_changed ) NewGraphics(); wxString s, sTmp; wxString s, sTmp; s = wxT( "<polygon style=\"" ); s = wxT( "<polygon style=\"" ); if( fillStyle == wxODDEVEN_RULE ) if( fillStyle == wxODDEVEN_RULE ) Loading @@ -339,6 +373,7 @@ void wxSVGFileDC::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoor s = s + sTmp + newline; s = s + sTmp + newline; CalcBoundingBox( points[i].x + xoffset, points[i].y + yoffset ); CalcBoundingBox( points[i].x + xoffset, points[i].y + yoffset ); } } s = s + wxT( "\" /> " ); s = s + wxT( "\" /> " ); s = s + newline; s = s + newline; write( s ); write( s ); Loading @@ -350,7 +385,8 @@ void wxSVGFileDC::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoor void wxSVGFileDC::DoDrawEllipse( wxCoord x, wxCoord y, wxCoord width, wxCoord height ) void wxSVGFileDC::DoDrawEllipse( wxCoord x, wxCoord y, wxCoord width, wxCoord height ) { { if (m_graphics_changed) NewGraphics (); if( m_graphics_changed ) NewGraphics(); int rh = height / 2; int rh = height / 2; int rw = width / 2; int rw = width / 2; Loading @@ -367,23 +403,30 @@ void wxSVGFileDC::DoDrawEllipse (wxCoord x, wxCoord y, wxCoord width, wxCoord he } } void wxSVGFileDC::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCoord xc, wxCoord yc) void wxSVGFileDC::DoDrawArc( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCoord xc, wxCoord yc ) { { /* Draws an arc of a circle, centred on (xc, yc), with starting point /* Draws an arc of a circle, centred on (xc, yc), with starting point (x1, y1) and ending at (x2, y2). The current pen is used for the outline * (x1, y1) and ending at (x2, y2). The current pen is used for the outline and the current brush for filling the shape. * and the current brush for filling the shape. * The arc is drawn in an anticlockwise direction from the start point to * The arc is drawn in an anticlockwise direction from the start point to the end point. */ * the end point. */ if (m_graphics_changed) NewGraphics (); if( m_graphics_changed ) NewGraphics(); wxString s; wxString s; // we need the radius of the circle which has two estimates // we need the radius of the circle which has two estimates double r1 = sqrt( double ( (x1 - xc) * (x1 - xc) ) + double ( (y1 - yc) * (y1 - yc) ) ); double r1 = sqrt( double ( (x1 - xc) * (x1 - xc) ) + double ( (y1 - yc) * (y1 - yc) ) ); double r2 = sqrt( double ( (x2 - xc) * (x2 - xc) ) + double ( (y2 - yc) * (y2 - yc) ) ); double r2 = sqrt( double ( (x2 - xc) * (x2 - xc) ) + double ( (y2 - yc) * (y2 - yc) ) ); wxASSERT_MSG( (fabs ( r2-r1 ) <= 3), wxT("wxSVGFileDC::DoDrawArc Error in getting radii of circle")) ; wxASSERT_MSG( (fabs( r2 - r1 ) <= 3), wxT( "wxSVGFileDC::DoDrawArc Error in getting radii of circle" ) ); if( fabs( r2 - r1 ) > 3 ) //pixels if( fabs( r2 - r1 ) > 3 ) //pixels { { s = wxT( "<!--- wxSVGFileDC::DoDrawArc Error in getting radii of circle --> \n" ); s = wxT( "<!--- wxSVGFileDC::DoDrawArc Error in getting radii of circle --> \n" ); Loading @@ -391,20 +434,35 @@ void wxSVGFileDC::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCo } } double theta1 = atan2( (double) (yc - y1), (double) (x1 - xc) ); double theta1 = atan2( (double) (yc - y1), (double) (x1 - xc) ); if ( theta1 < 0 ) theta1 = theta1 + M_PI * 2; if( theta1 < 0 ) theta1 = theta1 + M_PI * 2; double theta2 = atan2( (double) (yc - y2), (double) (x2 - xc) ); double theta2 = atan2( (double) (yc - y2), (double) (x2 - xc) ); if ( theta2 < 0 ) theta2 = theta2 + M_PI * 2; if( theta2 < 0 ) if ( theta2 < theta1 ) theta2 = theta2 + M_PI *2 ; theta2 = theta2 + M_PI * 2; if( theta2 < theta1 ) theta2 = theta2 + M_PI * 2; int fArc; // flag for large or small arc 0 means less than 180 degrees int fArc; // flag for large or small arc 0 means less than 180 degrees if ( fabs(theta2 - theta1) > M_PI ) fArc = 1; else fArc = 0 ; if( fabs( theta2 - theta1 ) > M_PI ) fArc = 1;else fArc = 0; int fSweep = 0 ; // flag for sweep always 0 int fSweep; if( (theta2 - theta1) > 0 ) fSweep = 0;else fSweep = 1; float Axis_rotation = 0.0; // Draw arc as pie: // s.Printf ( wxT("<path d=\"M%d %d A%.2g %.2g 0.0 %d %d %d %d L%d %d z "), // s.Printf ( wxT("<path d=\"M%d %d A%.2g %.2g 0.0 %d %d %d %d L%d %d z "), // the z means close the path and fill (usefull to draw a pie) // the z means close the path and fill (usefull to draw a pie) s.Printf ( wxT("<path d=\"M%d %d A%.2g %.2g 0.0 %d %d %d %d"), // x1, y1, r1, r2, fArc, fSweep, x2, y2, xc ,yc ); x1, y1, r1, r2, fArc, fSweep, x2, y2, xc, yc ); // Draw a single arc: s.Printf( wxT( "<path d=\"M%d %d A%.2g %.2g %g %d %d %d %d" ), x1, y1, r1, r2, Axis_rotation, fArc, fSweep, x2, y2 ); s = s + wxT( " \" /> " ) + newline; s = s + wxT( " \" /> " ) + newline; Loading @@ -418,41 +476,52 @@ void wxSVGFileDC::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCo } } void wxSVGFileDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,double sa,double ea) void wxSVGFileDC::DoDrawEllipticArc( wxCoord x, wxCoord y, wxCoord w, wxCoord h, double sa, double ea ) { { /* /* Draws an arc of an ellipse. The current pen is used for drawing the arc * Draws an arc of an ellipse. The current pen is used for drawing the arc and the current brush is used for drawing the pie. This function is * and the current brush is used for drawing the pie. This function is currently only available for X window and PostScript device contexts. * currently only available for X window and PostScript device contexts. * x and y specify the x and y coordinates of the upper-left corner of the * x and y specify the x and y coordinates of the upper-left corner of the rectangle that contains the ellipse. * rectangle that contains the ellipse. * width and height specify the width and height of the rectangle that * width and height specify the width and height of the rectangle that contains the ellipse. * contains the ellipse. * start and end specify the start and end of the arc relative to the * start and end specify the start and end of the arc relative to the three-o'clock position from the center of the rectangle. Angles are * three-o'clock position from the center of the rectangle. Angles are specified in degrees (360 is a complete circle). Positive values mean * specified in degrees (360 is a complete circle). Positive values mean counter-clockwise motion. If start is equal to end, a complete ellipse * counter-clockwise motion. If start is equal to end, a complete ellipse will be drawn. */ * will be drawn. */ //known bug: SVG draws with the current pen along the radii, but this does not happen in wxMSW //known bug: SVG draws with the current pen along the radii, but this does not happen in wxMSW if (m_graphics_changed) NewGraphics (); if( m_graphics_changed ) NewGraphics(); wxString s; wxString s; //radius //radius double rx = w / 2; double rx = w / 2; double ry = h / 2; double ry = h / 2; // center // center double xc = x + rx; double xc = x + rx; double yc = y + ry; double yc = y + ry; double xs, ys, xe, ye; double xs, ys, xe, ye; xs = xc + rx* cos( DegToRad (sa) ); xs = xc + rx* cos( DegToRad (sa) ); xe = xc + rx* cos( DegToRad (ea) ); xe = xc + rx* cos( DegToRad (ea) ); ys = yc - ry* sin( DegToRad (sa) ); ys = yc - ry* sin( DegToRad (sa) ); ye = yc - ry* sin( DegToRad (ea) ); ye = yc - ry* sin( DegToRad (ea) ); ///now same as circle arc... ///now same as circle arc... Loading @@ -461,15 +530,22 @@ void wxSVGFileDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,doub double theta2 = atan2( ye - yc, xe - xc ); double theta2 = atan2( ye - yc, xe - xc ); int fArc; // flag for large or small arc 0 means less than 180 degrees int fArc; // flag for large or small arc 0 means less than 180 degrees if ( (theta2 - theta1) > 0 ) fArc = 1; else fArc = 0 ; if( fabs( theta2 - theta1 ) > M_PI ) fArc = 1;else fArc = 0; int fSweep; int fSweep; if ( fabs(theta2 - theta1) > M_PI) fSweep = 1; else fSweep = 0 ; if( (theta2 - theta1) > 0 ) fSweep = 0;else fSweep = 1; float Axis_rotation = 0.0; // s.Printf ( wxT("<path d=\"M%d %d A%d %d 0.0 %d %d %d %d L %d %d z "), // Draw a single arc: s.Printf ( wxT("<path d=\"M%d %d A%d %d 0.0 %d %d %d %d L %d %d "), s.Printf( wxT( "<path d=\"M%d,%d A%d,%d %g %d %d %d,%d" ), int(xs), int(ys), int(rx), int(ry), int (xs), int (ys), fArc, fSweep, int(xe), int(ye), int(xc), int(yc) ); int (rx), int (ry), Axis_rotation, fArc, fSweep, int (xe), int (ye) ); s = s + wxT( " \" /> " ) + newline; s = s + wxT( " \" /> " ) + newline; Loading @@ -483,13 +559,19 @@ void wxSVGFileDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,doub } } void wxSVGFileDC::DoGetTextExtent(const wxString& string, wxCoord *w, wxCoord *h, wxCoord *descent , wxCoord *externalLeading , wxFont *font) const void wxSVGFileDC::DoGetTextExtent( const wxString& string, wxCoord* w, wxCoord* h, wxCoord* descent, wxCoord* externalLeading, wxFont* font ) const { { wxScreenDC sDC; wxScreenDC sDC; sDC.SetFont( m_font ); sDC.SetFont( m_font ); if ( font != NULL ) sDC.SetFont ( *font ); if( font != NULL ) sDC.SetFont( *font ); sDC.GetTextExtent( string, w, h, descent, externalLeading ); sDC.GetTextExtent( string, w, h, descent, externalLeading ); wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::GetTextExtent Call executed" ) ); wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::GetTextExtent Call executed" ) ); } } Loading @@ -499,29 +581,28 @@ wxCoord wxSVGFileDC::GetCharHeight() const { { wxScreenDC sDC; wxScreenDC sDC; sDC.SetFont( m_font ); sDC.SetFont( m_font ); wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::GetCharHeight Call executing" ) ); wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::GetCharHeight Call executing" ) ); return ( sDC.GetCharHeight() ); return sDC.GetCharHeight(); } } wxCoord wxSVGFileDC::GetCharWidth() const wxCoord wxSVGFileDC::GetCharWidth() const { { wxScreenDC sDC; wxScreenDC sDC; sDC.SetFont( m_font ); sDC.SetFont( m_font ); wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::GetCharWidth Call executing" ) ); wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::GetCharWidth Call executing" ) ); return ( sDC.GetCharWidth() ) ; return sDC.GetCharWidth(); } } /// Set Functions ///////////////////////////////////////////////////////////////// /// Set Functions ///////////////////////////////////////////////////////////////// void wxSVGFileDC::SetBackground( const wxBrush& brush ) void wxSVGFileDC::SetBackground( const wxBrush& brush ) { { m_backgroundBrush = brush; m_backgroundBrush = brush; return; return; } } Loading Loading @@ -554,9 +635,9 @@ void wxSVGFileDC::SetPen(const wxPen& pen) wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::SetPen Call executed" ) ); wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::SetPen Call executed" ) ); } } void wxSVGFileDC::NewGraphics() void wxSVGFileDC::NewGraphics() { { int w = m_pen.GetWidth(); int w = m_pen.GetWidth(); wxColour c = m_pen.GetColour(); wxColour c = m_pen.GetColour(); Loading @@ -570,40 +651,55 @@ void wxSVGFileDC::NewGraphics () case wxCAP_PROJECTING: case wxCAP_PROJECTING: sPenCap = wxT( "stroke-linecap:square; " ); sPenCap = wxT( "stroke-linecap:square; " ); break; break; case wxCAP_BUTT: case wxCAP_BUTT: sPenCap = wxT( "stroke-linecap:butt; " ); sPenCap = wxT( "stroke-linecap:butt; " ); break; break; case wxCAP_ROUND: case wxCAP_ROUND: default: default: sPenCap = wxT( "stroke-linecap:round; " ); sPenCap = wxT( "stroke-linecap:round; " ); }; } ; switch( m_pen.GetJoin() ) switch( m_pen.GetJoin() ) { { case wxJOIN_BEVEL: case wxJOIN_BEVEL: sPenJoin = wxT( "stroke-linejoin:bevel; " ); sPenJoin = wxT( "stroke-linejoin:bevel; " ); break; break; case wxJOIN_MITER: case wxJOIN_MITER: sPenJoin = wxT( "stroke-linejoin:miter; " ); sPenJoin = wxT( "stroke-linejoin:miter; " ); break; break; case wxJOIN_ROUND: case wxJOIN_ROUND: default: default: sPenJoin = wxT( "stroke-linejoin:round; " ); sPenJoin = wxT( "stroke-linejoin:round; " ); }; } ; switch( m_pen.GetStyle() ) switch( m_pen.GetStyle() ) { { case wxSOLID: case wxSOLID: sPenStyle = wxT( "stroke-opacity:1.0; stroke-opacity:1.0; " ); sPenStyle = wxT( "stroke-opacity:1.0; stroke-opacity:1.0; " ); break; break; case wxTRANSPARENT: case wxTRANSPARENT: sPenStyle = wxT( "stroke-opacity:0.0; stroke-opacity:0.0; " ); sPenStyle = wxT( "stroke-opacity:0.0; stroke-opacity:0.0; " ); break; break; default: default: wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::SetPen Call called to set a Style which is not available")) ; wxASSERT_MSG( FALSE, sWarn = sWarn + wxT("<!--- wxSVGFileDC::SetPen Call called to set a Style which is not available --> \n") ; wxT( "wxSVGFileDC::SetPen Call called to set a Style which is not available" ) ); sWarn = sWarn + wxT( "<!--- wxSVGFileDC::SetPen Call called to set a Style which is not available --> \n" ); } } sLast.Printf ( wxT("stroke-width:%d\" \n transform=\"translate(%.2g %.2g) scale(%.2g %.2g)\">"), sLast.Printf( wxT( "stroke-width:%d\" \n transform=\"translate(%.2g %.2g) scale(%.2g %.2g)\">" ), w, m_OriginX, m_OriginY, m_scaleX, m_scaleY ); w, m_OriginX, m_OriginY, m_scaleX, m_scaleY ); s = sBrush + sPenCap + sPenJoin + sPenStyle + sLast + newline + sWarn; s = sBrush + sPenCap + sPenJoin + sPenStyle + sLast + newline + sWarn; Loading Loading @@ -645,28 +741,33 @@ void wxSVGFileDC::SetMapMode( int mode ) case wxMM_TWIPS: case wxMM_TWIPS: SetLogicalScale( twips2mm * m_mm_to_pix_x, twips2mm * m_mm_to_pix_y ); SetLogicalScale( twips2mm * m_mm_to_pix_x, twips2mm * m_mm_to_pix_y ); break; break; case wxMM_POINTS: case wxMM_POINTS: SetLogicalScale( pt2mm * m_mm_to_pix_x, pt2mm * m_mm_to_pix_y ); SetLogicalScale( pt2mm * m_mm_to_pix_x, pt2mm * m_mm_to_pix_y ); break; break; case wxMM_METRIC: case wxMM_METRIC: SetLogicalScale( m_mm_to_pix_x, m_mm_to_pix_y ); SetLogicalScale( m_mm_to_pix_x, m_mm_to_pix_y ); break; break; case wxMM_LOMETRIC: case wxMM_LOMETRIC: SetLogicalScale( m_mm_to_pix_x / 10.0, m_mm_to_pix_y / 10.0 ); SetLogicalScale( m_mm_to_pix_x / 10.0, m_mm_to_pix_y / 10.0 ); break; break; default: default: case wxMM_TEXT: case wxMM_TEXT: SetLogicalScale( 1.0, 1.0 ); SetLogicalScale( 1.0, 1.0 ); break; break; } } m_mappingMode = mode; m_mappingMode = mode; /* we don't do this mega optimisation /* we don't do this mega optimisation if (mode != wxMM_TEXT) * if (mode != wxMM_TEXT) { * { m_needComputeScaleX = TRUE; * m_needComputeScaleX = TRUE; m_needComputeScaleY = TRUE; * m_needComputeScaleY = TRUE; } * } */ */ } } Loading Loading @@ -731,12 +832,16 @@ bool wxSVGFileDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord he { { if( logicalFunc != wxCOPY ) if( logicalFunc != wxCOPY ) { { wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::DoBlit Call requested nonCopy mode; this is not possible")) ; wxASSERT_MSG( FALSE, wxT( "wxSVGFileDC::DoBlit Call requested nonCopy mode; this is not possible" ) ); return FALSE; return FALSE; } } if( useMask != FALSE ) if( useMask != FALSE ) { { wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::DoBlit Call requested False mask ; this is not possible")) ; wxASSERT_MSG( FALSE, wxT( "wxSVGFileDC::DoBlit Call requested False mask ; this is not possible" ) ); return FALSE; return FALSE; } } wxBitmap myBitmap( width, height ); wxBitmap myBitmap( width, height ); Loading @@ -754,6 +859,7 @@ void wxSVGFileDC::DoDrawIcon(const class wxIcon & myIcon, wxCoord x, wxCoord y) { { wxBitmap myBitmap( myIcon.GetWidth(), myIcon.GetHeight() ); wxBitmap myBitmap( myIcon.GetWidth(), myIcon.GetHeight() ); wxMemoryDC memDC; wxMemoryDC memDC; memDC.SelectObject( myBitmap ); memDC.SelectObject( myBitmap ); memDC.DrawIcon( myIcon, 0, 0 ); memDC.DrawIcon( myIcon, 0, 0 ); memDC.SelectObject( wxNullBitmap ); memDC.SelectObject( wxNullBitmap ); Loading @@ -763,10 +869,13 @@ void wxSVGFileDC::DoDrawIcon(const class wxIcon & myIcon, wxCoord x, wxCoord y) } } void wxSVGFileDC::DoDrawBitmap( const class wxBitmap& bmp, void wxSVGFileDC::DoDrawBitmap(const class wxBitmap & bmp, wxCoord x, wxCoord y , bool WXUNUSED(bTransparent) /*=0*/ ) wxCoord x, wxCoord y, bool WXUNUSED ( bTransparent) /*=0*/ ) { { if (m_graphics_changed) NewGraphics (); if( m_graphics_changed ) NewGraphics(); wxString sTmp, s, sPNG; wxString sTmp, s, sPNG; wxImage::AddHandler( new wxPNGHandler ); wxImage::AddHandler( new wxPNGHandler ); Loading @@ -783,6 +892,7 @@ void wxSVGFileDC::DoDrawBitmap(const class wxBitmap & bmp, wxCoord x, wxCoord y //create copy of bitmap (wxGTK doesn't like saving a constant bitmap) //create copy of bitmap (wxGTK doesn't like saving a constant bitmap) wxBitmap myBitmap = bmp; wxBitmap myBitmap = bmp; //save it //save it bool bPNG_OK = myBitmap.SaveFile( sPNG, wxBITMAP_TYPE_PNG ); bool bPNG_OK = myBitmap.SaveFile( sPNG, wxBITMAP_TYPE_PNG ); Loading Loading @@ -856,13 +966,16 @@ wxCoord wxSVGFileDC::LogicalToDeviceYRel(wxCoord y) const return YLOG2DEVREL( y ); return YLOG2DEVREL( y ); } } void wxSVGFileDC::write( const wxString& s ) void wxSVGFileDC::write( const wxString& s ) { { const wxWX2MBbuf buf = s.mb_str( wxConvUTF8 ); const wxWX2MBbuf buf = s.mb_str( wxConvUTF8 ); m_outfile->Write( buf, strlen( (const char*) buf ) ); m_outfile->Write( buf, strlen( (const char*) buf ) ); m_OK = m_outfile->Ok(); m_OK = m_outfile->Ok(); } } #ifdef __BORLANDC__ #ifdef __BORLANDC__ #pragma warn .rch #pragma warn .rch #pragma warn .ccc #pragma warn .ccc Loading