X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/080b749f7d0f4d168902ba868af4c8ebbb655508..8c23ed4e210434ceea7edaa45382fd749a0256db:/src/generic/dcpsg.cpp diff --git a/src/generic/dcpsg.cpp b/src/generic/dcpsg.cpp index c85d15e173..7468a61881 100644 --- a/src/generic/dcpsg.cpp +++ b/src/generic/dcpsg.cpp @@ -21,8 +21,6 @@ #endif #ifndef WX_PRECOMP - #include "wx/setup.h" - #include "wx/defs.h" #endif // WX_PRECOMP #if wxUSE_PRINTING_ARCHITECTURE @@ -39,7 +37,7 @@ #include "wx/image.h" #include "wx/log.h" #include "wx/generic/dcpsg.h" -#include "wx/generic/prntdlgg.h" +#include "wx/printdlg.h" #include "wx/button.h" #include "wx/stattext.h" #include "wx/radiobox.h" @@ -244,7 +242,7 @@ int wxPostScriptDC::GetResolution() { return (int)(ms_PSScaleFactor * 72.0); } - + wxPostScriptDC::wxPostScriptDC () @@ -1230,8 +1228,8 @@ void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y ) fprintf( m_pstream, "(" ); const wxWX2MBbuf textbuf = text.mb_str(); - int len = strlen(textbuf); - int i; + size_t len = strlen(textbuf); + size_t i; for (i = 0; i < len; i++) { int c = (unsigned char) textbuf[i]; @@ -1340,14 +1338,14 @@ void wxPostScriptDC::DoDrawRotatedText( const wxString& text, wxCoord x, wxCoord char buffer[100]; sprintf(buffer, "%.8f rotate\n", angle); - int i; + size_t i; for (i = 0; i < 100; i++) if (buffer[i] == ',') buffer[i] = '.'; fprintf(m_pstream, buffer); fprintf( m_pstream, "(" ); const wxWX2MBbuf textbuf = text.mb_str(); - int len = strlen(textbuf); + size_t len = strlen(textbuf); for (i = 0; i < len; i++) { int c = (unsigned char) textbuf[i]; @@ -1564,7 +1562,7 @@ void wxPostScriptDC::DoGetSizeMM(int *width, int *height) const // Resolution in pixels per logical inch wxSize wxPostScriptDC::GetPPI(void) const { - return wxSize((int)(72 * ms_PSScaleFactor), + return wxSize((int)(72 * ms_PSScaleFactor), (int)(72 * ms_PSScaleFactor)); } @@ -1579,7 +1577,7 @@ bool wxPostScriptDC::StartDoc( const wxString& message ) m_printData.SetFilename(filename); } - m_pstream = fopen( m_printData.GetFilename().fn_str(), "w+" ); + m_pstream = wxFopen( m_printData.GetFilename().fn_str(), wxT("w+") ); if (!m_pstream) { @@ -1668,10 +1666,26 @@ void wxPostScriptDC::EndDoc () // Compute the bounding box. Note that it is in the default user // coordinate system, thus we have to convert the values. - wxCoord llx = (wxCoord) ((XLOG2DEV(m_minX)+wx_printer_translate_x)*wx_printer_scale_x); - wxCoord lly = (wxCoord) ((YLOG2DEV(m_minY)+wx_printer_translate_y)*wx_printer_scale_y); - wxCoord urx = (wxCoord) ((XLOG2DEV(m_maxX)+wx_printer_translate_x)*wx_printer_scale_x); - wxCoord ury = (wxCoord) ((YLOG2DEV(m_maxY)+wx_printer_translate_y)*wx_printer_scale_y); + wxCoord minX = (wxCoord) XLOG2DEV(m_minX); + wxCoord minY = (wxCoord) YLOG2DEV(m_minY); + wxCoord maxX = (wxCoord) XLOG2DEV(m_maxX); + wxCoord maxY = (wxCoord) YLOG2DEV(m_maxY); + + // LOG2DEV may have changed the minimum to maximum vice versa + if ( minX > maxX ) { wxCoord tmp = minX; minX = maxX; maxX = tmp; } + if ( minY > maxY ) { wxCoord tmp = minY; minY = maxY; maxY = tmp; } + + // account for used scaling (boundingbox is before scaling in ps-file) + double scale_x = m_printData.GetPrinterScaleX() / ms_PSScaleFactor; + double scale_y = m_printData.GetPrinterScaleY() / ms_PSScaleFactor; + + wxCoord llx, lly, urx, ury; + llx = (wxCoord) ((minX+wx_printer_translate_x)*scale_x); + lly = (wxCoord) ((minY+wx_printer_translate_y)*scale_y); + urx = (wxCoord) ((maxX+wx_printer_translate_x)*scale_x); + ury = (wxCoord) ((maxY+wx_printer_translate_y)*scale_y); + // (end of bounding box computation) + // If we're landscape, our sense of "x" and "y" is reversed. if (m_printData.GetOrientation() == wxLANDSCAPE) @@ -1801,7 +1815,7 @@ void wxPostScriptDC::StartPage() } char buffer[100]; - sprintf( buffer, "%.8f %.8f scale\n", scale_x / ms_PSScaleFactor, + sprintf( buffer, "%.8f %.8f scale\n", scale_x / ms_PSScaleFactor, scale_y / ms_PSScaleFactor); for (int i = 0; i < 100; i++) if (buffer[i] == ',') buffer[i] = '.'; @@ -1821,7 +1835,7 @@ bool wxPostScriptDC::DoBlit( wxCoord xdest, wxCoord ydest, wxCoord fwidth, wxCoord fheight, wxDC *source, wxCoord xsrc, wxCoord ysrc, - int rop, bool WXUNUSED(useMask) ) + int rop, bool WXUNUSED(useMask), wxCoord WXUNUSED(xsrcMask), wxCoord WXUNUSED(ysrcMask) ) { wxCHECK_MSG( m_ok && m_pstream, FALSE, wxT("invalid postscript dc") ); @@ -2006,7 +2020,7 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string, afmName << name; FILE *afmFile = wxFopen(afmName,wxT("r")); - + if (afmFile==NULL) { afmName = wxThePrintSetupData->GetAFMPath(); @@ -2020,10 +2034,8 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string, - afmFile = fopen() may fail and in that case the next if branch MUST be executed - and it would not if there was "else" */ { - afmName = wxINSTALL_PREFIX; + afmName = wxGetDataDir(); afmName << wxFILE_SEP_PATH - << wxT("share") << wxFILE_SEP_PATH - << wxT("wx") << wxFILE_SEP_PATH #if defined(__LINUX__) || defined(__FREEBSD__) << wxT("gs_afm") << wxFILE_SEP_PATH #else @@ -2036,8 +2048,8 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string, if (afmFile==NULL) { - wxLogDebug( wxT("GetTextExtent: can't open AFM file '%hs'\n"), afmName.c_str() ); - wxLogDebug( wxT(" using approximate values\n")); + wxLogDebug( wxT("GetTextExtent: can't open AFM file '%hs'"), afmName.c_str() ); + wxLogDebug( wxT(" using approximate values")); for (int i=0; i<256; i++) lastWidths[i] = 500; /* an approximate value */ lastDescender = -150; /* dito. */ } @@ -2059,7 +2071,7 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string, if ((sscanf(line,"%s%d",descString,&lastDescender)!=2) || (strcmp(descString,"Descender")!=0)) { - wxLogDebug( wxT("AFM-file '%hs': line '%hs' has error (bad descender)\n"), afmName.c_str(),line ); + wxLogDebug( wxT("AFM-file '%hs': line '%hs' has error (bad descender)"), afmName.c_str(),line ); } } /* JC 1.) check for UnderlinePosition */ @@ -2068,7 +2080,7 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string, if ((sscanf(line,"%s%lf",upString,&UnderlinePosition)!=2) || (strcmp(upString,"UnderlinePosition")!=0)) { - wxLogDebug( wxT("AFM-file '%hs': line '%hs' has error (bad UnderlinePosition)\n"), afmName.c_str(), line ); + wxLogDebug( wxT("AFM-file '%hs': line '%hs' has error (bad UnderlinePosition)"), afmName.c_str(), line ); } } /* JC 2.) check for UnderlineThickness */ @@ -2077,7 +2089,7 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string, if ((sscanf(line,"%s%lf",utString,&UnderlineThickness)!=2) || (strcmp(utString,"UnderlineThickness")!=0)) { - wxLogDebug( wxT("AFM-file '%hs': line '%hs' has error (bad UnderlineThickness)\n"), afmName.c_str(), line ); + wxLogDebug( wxT("AFM-file '%hs': line '%hs' has error (bad UnderlineThickness)"), afmName.c_str(), line ); } } /* JC 3.) check for EncodingScheme */ @@ -2086,11 +2098,11 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string, if ((sscanf(line,"%s%s",utString,encString)!=2) || (strcmp(utString,"EncodingScheme")!=0)) { - wxLogDebug( wxT("AFM-file '%hs': line '%hs' has error (bad EncodingScheme)\n"), afmName.c_str(), line ); + wxLogDebug( wxT("AFM-file '%hs': line '%hs' has error (bad EncodingScheme)"), afmName.c_str(), line ); } else if (strncmp(encString, "AdobeStandardEncoding", 21)) { - wxLogDebug( wxT("AFM-file '%hs': line '%hs' has error (unsupported EncodingScheme %hs)\n"), + wxLogDebug( wxT("AFM-file '%hs': line '%hs' has error (unsupported EncodingScheme %hs)"), afmName.c_str(),line, encString); } } @@ -2099,11 +2111,11 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string, { if (sscanf(line,"%s%d%s%s%d",cString,&ascii,semiString,WXString,&cWidth)!=5) { - wxLogDebug(wxT("AFM-file '%hs': line '%hs' has an error (bad character width)\n"),afmName.c_str(),line); + wxLogDebug(wxT("AFM-file '%hs': line '%hs' has an error (bad character width)"),afmName.c_str(),line); } if(strcmp(cString,"C")!=0 || strcmp(semiString,";")!=0 || strcmp(WXString,"WX")!=0) { - wxLogDebug(wxT("AFM-file '%hs': line '%hs' has a format error\n"),afmName.c_str(),line); + wxLogDebug(wxT("AFM-file '%hs': line '%hs' has a format error"),afmName.c_str(),line); } /* printf(" char '%c'=%d has width '%d'\n",ascii,ascii,cWidth); */ if (ascii>=0 && ascii<256) @@ -2113,7 +2125,7 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string, else { /* MATTHEW: this happens a lot; don't print an error */ - /* wxLogDebug("AFM-file '%s': ASCII value %d out of range\n",afmName.c_str(),ascii); */ + /* wxLogDebug("AFM-file '%s': ASCII value %d out of range",afmName.c_str(),ascii); */ } } /* C.) ignore other entries. */ @@ -2155,7 +2167,7 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string, { if(lastWidths[*p]== INT_MIN) { - wxLogDebug(wxT("GetTextExtent: undefined width for character '%hc' (%d)\n"), *p,*p); + wxLogDebug(wxT("GetTextExtent: undefined width for character '%hc' (%d)"), *p,*p); sum += lastWidths[' ']; /* assume space */ } else @@ -2163,11 +2175,11 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string, sum += lastWidths[*p]; } } - + double widthSum = sum; widthSum *= Size; widthSum /= 1000.0F; - + /* add descender to height (it is usually a negative value) */ //if (lastDescender != INT_MIN) //{