⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dcsvg.cpp

📁 wxGTK 是 wxWidgets 的 linux GTK+ (>2.2.3)版本。wxWidgets 是一个跨平台的 GUI 框架
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    //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...    double theta1 = atan2(ys-yc, xs-xc);    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 ;    int fSweep ;    if ( fabs(theta2 - theta1) > M_PI) fSweep = 1; else fSweep = 0 ;    s.Printf ( wxT("<path d=\"M%d %d A%d %d 0.0 %d %d  %d %d L %d %d z "),        int(xs), int(ys), int(rx), int(ry),        fArc, fSweep, int(xe), int(ye), int(xc), int(yc)  );    s = s + wxT(" \" /> ") + newline ;    if (m_OK)    {        write(s);    }    wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawEllipticArc Call executed")) ;}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 );    sDC.GetTextExtent(string, w,  h, descent, externalLeading );    wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::GetTextExtent Call executed")) ;}wxCoord wxSVGFileDC::GetCharHeight() const{    wxScreenDC sDC ;    sDC.SetFont (m_font);    wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::GetCharHeight Call executing")) ;    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() ) ;}/// Set Functions /////////////////////////////////////////////////////////////////void wxSVGFileDC::SetBackground( const wxBrush &brush ){    m_backgroundBrush = brush;    return;}void wxSVGFileDC::SetBackgroundMode( int mode ){    m_backgroundMode = mode;    return;}void wxSVGFileDC::SetBrush(const wxBrush& brush){    m_brush = brush ;    m_graphics_changed = TRUE ;    wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::SetBrush Call executed")) ;}void wxSVGFileDC::SetPen(const wxPen& pen){    // width, color, ends, joins : currently implemented    // dashes, stipple :  not implemented    m_pen = pen ;    m_graphics_changed = TRUE ;    wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::SetPen Call executed")) ;}void wxSVGFileDC::NewGraphics (){    int w = m_pen.GetWidth ();    wxColour c = m_pen.GetColour () ;    wxString s, sBrush, sPenCap, sPenJoin, sPenStyle, sLast, sWarn;    sBrush = wxT("</g>\n<g style=\"") + wxBrushString ( m_brush.GetColour (), m_brush.GetStyle () )             + wxT("  stroke:#") + wxColStr (c) + wxT("; ") ;    switch ( m_pen.GetCap () )    {        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") ;    }    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;    write(s);    m_graphics_changed = FALSE ;    wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::NewGraphics Call executed")) ;}void wxSVGFileDC::SetFont(const wxFont& font){    m_font = font ;    wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::SetFont Call executed")) ;}void wxSVGFileDC::ComputeScaleAndOrigin(){    m_scaleX = m_logicalScaleX * m_userScaleX;    m_scaleY = m_logicalScaleY * m_userScaleY;    m_OriginX = m_logicalOriginX * m_logicalScaleX + m_deviceOriginX ;    m_OriginY = m_logicalOriginY * m_logicalScaleY + m_deviceOriginY ;    m_graphics_changed = TRUE;}int wxSVGFileDC::GetMapMode(){    return m_mappingMode ;}void wxSVGFileDC::SetMapMode( int mode ){    switch (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;        }    */}void wxSVGFileDC::GetUserScale(double *x, double *y) const{    *x = m_userScaleX ;    *y = m_userScaleY ;}void wxSVGFileDC::SetUserScale( double x, double y ){    // allow negative ? -> no    m_userScaleX = x;    m_userScaleY = y;    ComputeScaleAndOrigin();}void wxSVGFileDC::SetLogicalScale( double x, double y ){    // allow negative ?    m_logicalScaleX = x;    m_logicalScaleY = y;    ComputeScaleAndOrigin();}void wxSVGFileDC::SetLogicalOrigin( wxCoord x, wxCoord y ){    // is this still correct ?    m_logicalOriginX = x * m_signX;    m_logicalOriginY = y * m_signY;    ComputeScaleAndOrigin();}void wxSVGFileDC::SetDeviceOrigin( wxCoord x, wxCoord y ){    // only wxPostScripDC has m_signX = -1,    m_deviceOriginX = x;    m_deviceOriginY = y;    ComputeScaleAndOrigin();}void wxSVGFileDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp ){    // only wxPostScripDC has m_signX = -1,    m_signX = (xLeftRight ?  1 : -1);    m_signY = (yBottomUp  ? -1 :  1);    ComputeScaleAndOrigin();}// export a bitmap as a raster image in pngbool wxSVGFileDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,                         wxDC* source, wxCoord xsrc, wxCoord ysrc,                         int logicalFunc /*= wxCOPY*/, bool useMask /*= FALSE*/,                         wxCoord /*xsrcMask = -1*/, wxCoord /*ysrcMask = -1*/){    if (logicalFunc != wxCOPY)    {        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")) ;        return FALSE ;    }    wxBitmap myBitmap (width, height) ;    wxMemoryDC memDC;    memDC.SelectObject( myBitmap );    memDC.Blit(0, 0, width, height, source, xsrc, ysrc);    memDC.SelectObject( wxNullBitmap );    DoDrawBitmap(myBitmap, xdest, ydest);    wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoBlit Call executed")) ;    return FALSE ;}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 );    DoDrawBitmap(myBitmap, x, y);    wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawIcon Call executed")) ;    return ;}void wxSVGFileDC::DoDrawBitmap(const class wxBitmap & bmp, wxCoord x, wxCoord y , bool  WXUNUSED(bTransparent) /*=0*/ ){    if (m_graphics_changed) NewGraphics ();    wxString sTmp, s, sPNG ;    wxImage::AddHandler(new wxPNGHandler);// create suitable file name    sTmp.Printf ( wxT("_image%d.png"), m_sub_images);    sPNG = m_filename.BeforeLast(wxT('.')) + sTmp;    while (wxFile::Exists(sPNG) )    {        m_sub_images ++ ;        sTmp.Printf ( wxT("_image%d.png"), m_sub_images);        sPNG = m_filename.BeforeLast(wxT('.')) + sTmp;    }//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);// refrence the bitmap from the SVG doc    int w = myBitmap.GetWidth();    int h = myBitmap.GetHeight();    sTmp.Printf ( wxT(" <image x=\"%d\" y=\"%d\" width=\"%dpx\" height=\"%dpx\" "), x,y,w,h );    s = s + sTmp ;    sTmp.Printf ( wxT(" xlink:href=\"%s\"> \n"), sPNG.c_str() );    s = s + sTmp + wxT("<title>Image from wxSVG</title>  </image>") + newline;    if (m_OK && bPNG_OK)    {        write(s);    }    m_OK = m_outfile->Ok () && bPNG_OK;    wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawBitmap Call executed")) ;    return  ;}// ---------------------------------------------------------------------------// coordinates transformations// ---------------------------------------------------------------------------wxCoord wxSVGFileDC::DeviceToLogicalX(wxCoord x) const{    return XDEV2LOG(x);}wxCoord wxSVGFileDC::DeviceToLogicalY(wxCoord y) const{    return YDEV2LOG(y);}wxCoord wxSVGFileDC::DeviceToLogicalXRel(wxCoord x) const{    return XDEV2LOGREL(x);}wxCoord wxSVGFileDC::DeviceToLogicalYRel(wxCoord y) const{    return YDEV2LOGREL(y);}wxCoord wxSVGFileDC::LogicalToDeviceX(wxCoord x) const{    return XLOG2DEV(x);}wxCoord wxSVGFileDC::LogicalToDeviceY(wxCoord y) const{    return YLOG2DEV(y);}wxCoord wxSVGFileDC::LogicalToDeviceXRel(wxCoord x) const{    return XLOG2DEVREL(x);}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#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -