Commit ba04f832 authored by CHARRAS's avatar CHARRAS
Browse files

small change on hotkey management. Added: drag component

parent 3e3ae892
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -4,6 +4,18 @@ Started 2007-June-11
Please add newer entries at the top, list the date and your name with 
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>
================================================================================
+ pcbnew
+5 −4
Original line number Diff line number Diff line
@@ -166,10 +166,11 @@ char Line[256];
void PlotPolyPS(int nb_segm, int * coord, int fill, int width)
/*****************************************************************/

/* Trace un polygone ( ferme si rempli ) en format POSTSCRIPT
 * coord = tableau des coord des sommets
 * nb_segm = nombre de coord ( 1 coord = 2 elements: X et Y du tableau )
 * fill : si != 0 polygone rempli
/* Draw a polygon ( a filled polygon if fill == 1 ) in POSTSCRIPT format
 * @param nb_segm = corner count
 * @param coord = corner list (a corner uses 2 int = X coordinate followed by Y  coordinate
 * @param fill :if == 0 : filled polygon
 * @param  width = line width
 */
{
int ii;
+530 −417
Original line number Diff line number Diff line
/////////////////////////////////////////////////////////////////////////////

// Name:        svg.cpp
// Purpose:     SVG plot
// Author:      Chris Elliott
@@ -23,6 +24,7 @@
#include "wx/image.h"

#define wxSVG_DEBUG FALSE

// or TRUE to see the calls being executed
#define newline    wxString( wxT( "\n" ) )
#define space      wxString( wxT( " " ) )
@@ -43,11 +45,15 @@
#define pt2mm            0.352777777778
#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 )
{
    unsigned char r, g, b;

    r = c.Red();
    g = c.Green();
    b = c.Blue();
@@ -61,19 +67,21 @@ wxString wxColStr ( wxColour c )
wxString wxBrushString( wxColour c, int style )
{
    wxString s = wxT( "fill:#" ) + wxColStr( c ) + semicolon + space;

    switch( style )
    {
    case wxSOLID:
        s = s + wxT( "fill-opacity:1.0; " );
        break;

    case wxTRANSPARENT:
        s = s + wxT( "fill-opacity:0.0; " );
        break;

    default:
        wxASSERT_MSG( FALSE, wxT( "wxSVGFileDC::Requested Brush Style not available" ) );

    }

    s = s + newline;
    return s;
}
@@ -82,6 +90,7 @@ wxString wxBrushString ( wxColour c, int style )
/***********************************************************************/
void wxSVGFileDC::Init( wxString f, int Width, int Height, float dpi )
/***********************************************************************/

/* set up things first  wxDCBase does all this?
 */
{
@@ -141,18 +150,20 @@ void wxSVGFileDC::Init (wxString f, int Width, int Height, float dpi)
        write( s );
        s.Printf( wxT( "  version=\"1.1\"\n" ) );
        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 );
        s.Printf( wxT( ">\n" ) );
        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 );
        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 );
        s = wxT( "  <g style=\"fill:black; stroke:black; stroke-width:1\">" ) + newline;
        write( s );

    }
}

@@ -177,6 +188,7 @@ wxSVGFileDC::wxSVGFileDC (wxString f, int Width, int Height, float dpi)
wxSVGFileDC::~wxSVGFileDC()
{
    wxString s = wxT( "</g> \n</svg> \n" );

    write( s );
    delete m_outfile;
}
@@ -186,7 +198,8 @@ wxSVGFileDC::~wxSVGFileDC()

void wxSVGFileDC::DoDrawLine( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2 )
{
    if (m_graphics_changed) NewGraphics ();
    if( m_graphics_changed )
        NewGraphics();
    wxString s;
    s.Printf( wxT( "<path d=\"M%d %d L%d %d\" /> \n" ), x1, y1, x2, y2 );
    if( m_OK )
@@ -212,7 +225,9 @@ void wxSVGFileDC::DoDrawLines(int n, wxPoint points[], wxCoord xoffset , wxCoord
void wxSVGFileDC::DoDrawPoint( wxCoord x1, wxCoord y1 )
{
    wxString s;
    if (m_graphics_changed) NewGraphics ();

    if( m_graphics_changed )
        NewGraphics();
    s = wxT( "<g style = \"stroke-linecap:round;\" > " ) + newline;
    write( s );
    DrawLine( x1, y1, x1, y1 );
@@ -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 )
{
    //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;

    // calculate bounding box
@@ -261,30 +277,40 @@ void wxSVGFileDC::DoDrawRotatedText(const wxString& sText, wxCoord x, wxCoord y,
        // 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

        wxASSERT_MSG(!wxSVG_DEBUG, 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 );
        wxASSERT_MSG( !wxSVG_DEBUG,
                     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 = s + wxT( "stroke-width:1; stroke:#" ) + wxColStr( m_textBackgroundColour ) + wxT( "; " );
        sTmp.Printf( wxT( "\" transform=\"rotate( %.2g %d %d )  \">" ), -angle, x, y );
        s = s + sTmp + newline;
        write( s );
    }

    //now do the text itself
    s.Printf( wxT( " <text x=\"%d\" y=\"%d\" " ), x, y );

    sTmp = m_font.GetFaceName();
    if (sTmp.Len () > 0)  s = s + wxT("style=\"font-family:") + sTmp + wxT("; ");
    else s = s + wxT("style=\" ") ;
    if( sTmp.Len() > 0 )
        s = s + wxT( "style=\"font-family:" ) + sTmp + wxT( "; " );
    else
        s = s + wxT( "style=\" " );

    wxString fontweights[3] = { wxT( "normal" ), wxT( "lighter" ), wxT( "bold" ) };
    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;

    sTmp.Printf( wxT( "font-size:%dpt; fill:#" ), m_font.GetPointSize() );
    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 );
    s = s + sTmp + sText + wxT( "</text> " ) + newline;
    if( m_OK )
@@ -292,7 +318,6 @@ void wxSVGFileDC::DoDrawRotatedText(const wxString& sText, wxCoord x, wxCoord y,
        write( s );
    }
    wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::DrawRotatedText Call executed" ) );

}


@@ -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;

    s.Printf( wxT( " <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" rx=\"%.2g\" " ),
@@ -317,13 +347,17 @@ void wxSVGFileDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wx
    wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::DoDrawRoundedRectangle Call executed" ) );
    CalcBoundingBox( x, y );
    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;
    s = wxT( "<polygon style=\"" );
    if( fillStyle == wxODDEVEN_RULE )
@@ -339,6 +373,7 @@ void wxSVGFileDC::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoor
        s = s + sTmp + newline;
        CalcBoundingBox( points[i].x + xoffset, points[i].y + yoffset );
    }

    s = s + wxT( "\" /> " );
    s = s + newline;
    write( s );
@@ -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 )

{
    if (m_graphics_changed) NewGraphics ();
    if( m_graphics_changed )
        NewGraphics();

    int      rh = height / 2;
    int      rw = width / 2;
@@ -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
    (x1, y1) and ending at (x2, y2). The current pen is used for the outline
    and the current brush for filling the shape.

    The arc is drawn in an anticlockwise direction from the start point to
    the end point. */

    if (m_graphics_changed) NewGraphics ();
     *  (x1, y1) and ending at (x2, y2). The current pen is used for the outline
     *  and the current brush for filling the shape.
     *
     *  The arc is drawn in an anticlockwise direction from the start point to
     *  the end point. */

    if( m_graphics_changed )
        NewGraphics();
    wxString s;

    // 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   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
    {
        s = wxT( "<!--- wxSVGFileDC::DoDrawArc Error in getting radii of circle --> \n" );
@@ -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) );
    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) );
    if ( theta2 < 0 ) theta2 = theta2 + M_PI * 2;
    if ( theta2 < theta1 ) theta2 = theta2 + M_PI *2 ;
    if( theta2 < 0 )
        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
    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 "),
//	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;

@@ -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
    and the current brush is used for drawing the pie. This function is
    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
    rectangle that contains the ellipse.

    width and height specify the width and height of the rectangle that
    contains the ellipse.

    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
    specified in degrees (360 is a complete circle). Positive values mean
    counter-clockwise motion. If start is equal to end, a complete ellipse
    will be drawn. */
     *  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
     *  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
     *  rectangle that contains the ellipse.
     *
     *  width and height specify the width and height of the rectangle that
     *  contains the ellipse.
     *
     *  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
     *  specified in degrees (360 is a complete circle). Positive values mean
     *  counter-clockwise motion. If start is equal to end, a complete ellipse
     *  will be drawn. */

    //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;

    //radius
    double   rx = w / 2;
    double   ry = h / 2;

    // center
    double   xc = x + rx;
    double   yc = y + ry;

    double   xs, ys, xe, ye;
    xs = xc + rx*   cos( DegToRad (sa) );

    xe = xc + rx*   cos( DegToRad (ea) );

    ys = yc - ry*   sin( DegToRad (sa) );

    ye = yc - ry*   sin( DegToRad (ea) );

    ///now same as circle arc...
@@ -461,15 +530,22 @@ void wxSVGFileDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,doub
    double theta2 = atan2( ye - yc, xe - xc );

    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;
    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 "),
    s.Printf ( wxT("<path d=\"M%d %d A%d %d 0.0 %d %d  %d %d L %d %d "),
        int(xs), int(ys), int(rx), int(ry),
        fArc, fSweep, int(xe), int(ye), int(xc), int(yc)  );
    // Draw a single arc:
    s.Printf( wxT( "<path d=\"M%d,%d A%d,%d %g %d %d %d,%d" ),
             int (xs), int (ys),
             int (rx), int (ry),
             Axis_rotation,
             fArc, fSweep, int (xe), int (ye) );


    s = s + wxT( " \" /> " ) + newline;
@@ -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;

    sDC.SetFont( m_font );
    if ( font != NULL ) sDC.SetFont ( *font );
    if( font != NULL )
        sDC.SetFont( *font );
    sDC.GetTextExtent( string, w, h, descent, externalLeading );
    wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::GetTextExtent Call executed" ) );
}
@@ -499,29 +581,28 @@ wxCoord wxSVGFileDC::GetCharHeight() const

{
    wxScreenDC sDC;

    sDC.SetFont( m_font );

    wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::GetCharHeight Call executing" ) );
    return ( sDC.GetCharHeight() );

    return sDC.GetCharHeight();
}


wxCoord wxSVGFileDC::GetCharWidth() const
{
    wxScreenDC sDC;

    sDC.SetFont( m_font );

    wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::GetCharWidth Call executing" ) );
    return ( sDC.GetCharWidth() ) ;

    return sDC.GetCharWidth();
}


/// Set Functions /////////////////////////////////////////////////////////////////
void wxSVGFileDC::SetBackground( const wxBrush& brush )
{

    m_backgroundBrush = brush;
    return;
}
@@ -554,9 +635,9 @@ void wxSVGFileDC::SetPen(const wxPen& pen)
    wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::SetPen Call executed" ) );
}


void wxSVGFileDC::NewGraphics()
{

    int      w = m_pen.GetWidth();
    wxColour c = m_pen.GetColour();

@@ -570,40 +651,55 @@ void wxSVGFileDC::NewGraphics ()
    case  wxCAP_PROJECTING:
        sPenCap = wxT( "stroke-linecap:square; " );
        break;

    case  wxCAP_BUTT:
        sPenCap = wxT( "stroke-linecap:butt; " );
        break;

    case    wxCAP_ROUND:
    default:
        sPenCap = wxT( "stroke-linecap:round; " );
    };
    }

    ;

    switch( m_pen.GetJoin() )
    {
    case  wxJOIN_BEVEL:
        sPenJoin = wxT( "stroke-linejoin:bevel; " );
        break;

    case  wxJOIN_MITER:
        sPenJoin = wxT( "stroke-linejoin:miter; " );
        break;

    case    wxJOIN_ROUND:
    default:
        sPenJoin = wxT( "stroke-linejoin:round; " );
    };
    }

    ;

    switch( m_pen.GetStyle() )
    {
    case  wxSOLID:
        sPenStyle = wxT( "stroke-opacity:1.0; stroke-opacity:1.0; " );
        break;

    case  wxTRANSPARENT:
        sPenStyle = wxT( "stroke-opacity:0.0; stroke-opacity:0.0; " );
        break;

    default:
            wxASSERT_MSG(FALSE, 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") ;
        wxASSERT_MSG( FALSE,
                      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  );

    s = sBrush + sPenCap + sPenJoin + sPenStyle + sLast + newline + sWarn;
@@ -645,28 +741,33 @@ void wxSVGFileDC::SetMapMode( int mode )
    case wxMM_TWIPS:
        SetLogicalScale( twips2mm * m_mm_to_pix_x, twips2mm * m_mm_to_pix_y );
        break;

    case wxMM_POINTS:
        SetLogicalScale( pt2mm * m_mm_to_pix_x, pt2mm * m_mm_to_pix_y );
        break;

    case wxMM_METRIC:
        SetLogicalScale( m_mm_to_pix_x, m_mm_to_pix_y );
        break;

    case wxMM_LOMETRIC:
        SetLogicalScale( m_mm_to_pix_x / 10.0, m_mm_to_pix_y / 10.0 );
        break;

    default:
    case wxMM_TEXT:
        SetLogicalScale( 1.0, 1.0 );
        break;
    }

    m_mappingMode = mode;

    /*  we don't do this mega optimisation
        if (mode != wxMM_TEXT)
        {
            m_needComputeScaleX = TRUE;
            m_needComputeScaleY = TRUE;
        }
     *  if (mode != wxMM_TEXT)
     *  {
     *      m_needComputeScaleX = TRUE;
     *      m_needComputeScaleY = TRUE;
     *  }
     */
}

@@ -731,12 +832,16 @@ bool wxSVGFileDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord he
{
    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;
    }
    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;
    }
    wxBitmap   myBitmap( width, height );
@@ -754,6 +859,7 @@ void wxSVGFileDC::DoDrawIcon(const class wxIcon & myIcon, wxCoord x, wxCoord y)
{
    wxBitmap   myBitmap( myIcon.GetWidth(), myIcon.GetHeight() );
    wxMemoryDC memDC;

    memDC.SelectObject( myBitmap );
    memDC.DrawIcon( myIcon, 0, 0 );
    memDC.SelectObject( wxNullBitmap );
@@ -763,10 +869,13 @@ void wxSVGFileDC::DoDrawIcon(const class wxIcon & myIcon, wxCoord x, wxCoord y)
}



void wxSVGFileDC::DoDrawBitmap(const class wxBitmap & bmp, wxCoord x, wxCoord y , bool  WXUNUSED(bTransparent) /*=0*/ )
void wxSVGFileDC::DoDrawBitmap( const class wxBitmap& bmp,
                                wxCoord               x,
                                wxCoord               y,
                                bool WXUNUSED (       bTransparent) /*=0*/ )
{
    if (m_graphics_changed) NewGraphics ();
    if( m_graphics_changed )
        NewGraphics();

    wxString sTmp, s, sPNG;
    wxImage::AddHandler( new wxPNGHandler );
@@ -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)
    wxBitmap myBitmap = bmp;

//save it
    bool     bPNG_OK = myBitmap.SaveFile( sPNG, wxBITMAP_TYPE_PNG );

@@ -856,13 +966,16 @@ wxCoord wxSVGFileDC::LogicalToDeviceYRel(wxCoord y) const
    return YLOG2DEVREL( y );
}


void wxSVGFileDC::write( const wxString& s )
{
    const wxWX2MBbuf buf = s.mb_str( wxConvUTF8 );

    m_outfile->Write( buf, strlen( (const char*) buf ) );
    m_OK = m_outfile->Ok();
}


#ifdef __BORLANDC__
#pragma warn .rch
#pragma warn .ccc
Loading