X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/10992a81d39da31b79063387b7b71c0ff68737ce..e7ca6139d062c37cc7c056b6647097e999b714cd:/src/generic/dcpsg.cpp diff --git a/src/generic/dcpsg.cpp b/src/generic/dcpsg.cpp index ccc8a4e8f8..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 () @@ -650,9 +648,6 @@ void wxPostScriptDC::DoDrawPolygon (int n, wxPoint points[], wxCoord xoffset, wx wxCoord xx = XLOG2DEV(points[0].x + xoffset); wxCoord yy = YLOG2DEV(points[0].y + yoffset); - wxCoord xx0 = xx; - wxCoord yy0 = yy; - fprintf( m_pstream, "%d %d moveto\n", xx, yy ); CalcBoundingBox( points[0].x + xoffset, points[0].y + yoffset ); @@ -667,7 +662,7 @@ void wxPostScriptDC::DoDrawPolygon (int n, wxPoint points[], wxCoord xoffset, wx CalcBoundingBox( points[i].x + xoffset, points[i].y + yoffset); } - fprintf( m_pstream, "%d %d lineto\n", xx0, yy0 ); + fprintf( m_pstream, "closepath\n" ); fprintf( m_pstream, "stroke\n" ); } } @@ -942,87 +937,83 @@ void wxPostScriptDC::SetFont( const wxFont& font ) m_font = font; - const char *name; - const char *style = ""; int Style = m_font.GetStyle(); int Weight = m_font.GetWeight(); + const char *name; switch (m_font.GetFamily()) { case wxTELETYPE: case wxMODERN: - name = "/Courier"; - break; - case wxSWISS: - name = "/Helvetica"; + { + if (Style == wxITALIC) + { + if (Weight == wxBOLD) + name = "/Courier-BoldOblique"; + else + name = "/Courier-Oblique"; + } + else + { + if (Weight == wxBOLD) + name = "/Courier-Bold"; + else + name = "/Courier"; + } break; + } case wxROMAN: -// name = "/Times-Roman"; - name = "/Times"; // Altered by EDZ + { + if (Style == wxITALIC) + { + if (Weight == wxBOLD) + name = "/Times-BoldItalic"; + else + name = "/Times-Italic"; + } + else + { + if (Weight == wxBOLD) + name = "/Times-Bold"; + else + name = "/Times-Roman"; + } break; + } case wxSCRIPT: - name = "/Zapf-Chancery-MediumItalic"; + { + name = "/ZapfChancery-MediumItalic"; Style = wxNORMAL; Weight = wxNORMAL; break; + } + case wxSWISS: default: - case wxDEFAULT: // Sans Serif Font - name = "/LucidaSans"; - } - - if (Style == wxNORMAL && (Weight == wxNORMAL || Weight == wxLIGHT)) - { - if (m_font.GetFamily () == wxROMAN) - style = "-Roman"; - else - style = ""; - } - else if (Style == wxNORMAL && Weight == wxBOLD) - { - style = "-Bold"; - } - else if (Style == wxITALIC && (Weight == wxNORMAL || Weight == wxLIGHT)) - { - if (m_font.GetFamily () == wxROMAN) - style = "-Italic"; - else - style = "-Oblique"; - } - else if (Style == wxITALIC && Weight == wxBOLD) - { - if (m_font.GetFamily () == wxROMAN) - style = "-BoldItalic"; - else - style = "-BoldOblique"; - } - else if (Style == wxSLANT && (Weight == wxNORMAL || Weight == wxLIGHT)) - { - if (m_font.GetFamily () == wxROMAN) - style = "-Italic"; - else - style = "-Oblique"; - } - else if (Style == wxSLANT && Weight == wxBOLD) - { - if (m_font.GetFamily () == wxROMAN) - style = "-BoldItalic"; - else - style = "-BoldOblique"; - } - else - { - style = ""; + { + if (Style == wxITALIC) + { + if (Weight == wxBOLD) + name = "/Helvetica-BoldOblique"; + else + name = "/Helvetica-Oblique"; + } + else + { + if (Weight == wxBOLD) + name = "/Helvetica-Bold"; + else + name = "/Helvetica"; + } + break; + } } - char buffer[100]; - strcpy( buffer, name ); - strcat( buffer, style ); - - fprintf( m_pstream, buffer ); + fprintf( m_pstream, name ); fprintf( m_pstream, " reencodeISO def\n" ); - fprintf( m_pstream, buffer ); + fprintf( m_pstream, name ); fprintf( m_pstream, " findfont\n" ); + char buffer[100]; sprintf( buffer, "%f scalefont setfont\n", YLOG2DEVREL(m_font.GetPointSize() * 1000) / 1000.0F); // this is a hack - we must scale font size (in pts) according to m_scaleY but // YLOG2DEVREL works with wxCoord type (int or longint). Se we first convert font size @@ -1183,7 +1174,9 @@ void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y ) GetTextExtent(text, &text_w, &text_h, &text_descent); - SetFont( m_font ); + // VZ: this seems to be unnecessary, so taking it out for now, if it + // doesn't create any problems, remove this comment entirely + //SetFont( m_font ); if (m_textForegroundColour.Ok()) { @@ -1233,14 +1226,10 @@ void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y ) wxCoord by = y + size - text_descent; // baseline fprintf( m_pstream, "%d %d moveto\n", XLOG2DEV(x), YLOG2DEV(by) ); - /* I don't know how to write char to a stream, so I use a mini string */ - char tmpbuf[2]; - tmpbuf[1] = 0; - 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]; @@ -1248,8 +1237,7 @@ void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y ) { /* Cope with special characters */ fprintf( m_pstream, "\\" ); - tmpbuf[0] = (char) c; - fprintf( m_pstream, tmpbuf ); + fputc(c, m_pstream); } else if ( c >= 128 ) { @@ -1258,8 +1246,7 @@ void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y ) } else { - tmpbuf[0] = (char) c; - fprintf( m_pstream, tmpbuf ); + fputc(c, m_pstream); } } @@ -1351,18 +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); - /* I don't know how to write char to a stream, so I use a mini string */ - char tmpbuf[2]; - tmpbuf[1] = 0; - 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]; @@ -1370,8 +1353,7 @@ void wxPostScriptDC::DoDrawRotatedText( const wxString& text, wxCoord x, wxCoord { /* Cope with special characters */ fprintf( m_pstream, "\\" ); - tmpbuf[0] = (char) c; - fprintf( m_pstream, tmpbuf ); + fputc(c, m_pstream); } else if ( c >= 128 ) { @@ -1380,8 +1362,7 @@ void wxPostScriptDC::DoDrawRotatedText( const wxString& text, wxCoord x, wxCoord } else { - tmpbuf[0] = (char) c; - fprintf( m_pstream, tmpbuf ); + fputc(c, m_pstream); } } @@ -1581,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)); } @@ -1596,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) { @@ -1685,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) @@ -1818,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] = '.'; @@ -1838,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") ); @@ -1946,10 +1943,10 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string, double UnderlineThickness = 0.0; /* get actual parameters */ - const int Family = fontToUse->GetFamily(); - const int Size = fontToUse->GetPointSize(); - const int Style = fontToUse->GetStyle(); - const int Weight = fontToUse->GetWeight(); + int Family = fontToUse->GetFamily(); + int Size = fontToUse->GetPointSize(); + int Style = fontToUse->GetStyle(); + int Weight = fontToUse->GetWeight(); /* if we have another font, read the font-metrics */ if (Family!=lastFamily || Size!=lastSize || Style!=lastStyle || Weight!=lastWeight) @@ -1964,31 +1961,38 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string, switch (Family) { - case wxTELETYPE: case wxMODERN: - { - if ((Style == wxITALIC) && (Weight == wxBOLD)) name = "CourBoO"; - else if ((Style != wxITALIC) && (Weight == wxBOLD)) name = "CourBo"; - else if ((Style == wxITALIC) && (Weight != wxBOLD)) name = "CourO"; - else name = "Cour"; - } + case wxTELETYPE: + { + if ((Style == wxITALIC) && (Weight == wxBOLD)) name = "CourBoO.afm"; + else if ((Style != wxITALIC) && (Weight == wxBOLD)) name = "CourBo.afm"; + else if ((Style == wxITALIC) && (Weight != wxBOLD)) name = "CourO.afm"; + else name = "Cour.afm"; break; + } case wxROMAN: - { - if ((Style == wxITALIC) && (Weight == wxBOLD)) name = "TimesBoO"; - else if ((Style != wxITALIC) && (Weight == wxBOLD)) name = "TimesBo"; - else if ((Style == wxITALIC) && (Weight != wxBOLD)) name = "TimesO"; - else name = "TimesRo"; - } + { + if ((Style == wxITALIC) && (Weight == wxBOLD)) name = "TimesBoO.afm"; + else if ((Style != wxITALIC) && (Weight == wxBOLD)) name = "TimesBo.afm"; + else if ((Style == wxITALIC) && (Weight != wxBOLD)) name = "TimesO.afm"; + else name = "TimesRo.afm"; break; + } + case wxSCRIPT: + { + name = "Zapf.afm"; + Style = wxNORMAL; + Weight = wxNORMAL; + } + case wxSWISS: default: - { - if ((Style == wxITALIC) && (Weight == wxBOLD)) name = "HelvBoO"; - else if ((Style != wxITALIC) && (Weight == wxBOLD)) name = "HelvBo"; - else if ((Style == wxITALIC) && (Weight != wxBOLD)) name = "HelvO"; - else name = "Helv"; - } + { + if ((Style == wxITALIC) && (Weight == wxBOLD)) name = "HelvBoO.afm"; + else if ((Style != wxITALIC) && (Weight == wxBOLD)) name = "HelvBo.afm"; + else if ((Style == wxITALIC) && (Weight != wxBOLD)) name = "HelvO.afm"; + else name = "Helv.afm"; break; + } } /* get the directory of the AFM files */ @@ -2014,37 +2018,38 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string, /* new elements JC Sun Aug 25 23:21:44 MET DST 1996 */ - afmName << name << wxT(".afm"); + afmName << name; FILE *afmFile = wxFopen(afmName,wxT("r")); + if (afmFile==NULL) { afmName = wxThePrintSetupData->GetAFMPath(); - afmName << wxFILE_SEP_PATH << name << wxT(".afm"); + afmName << wxFILE_SEP_PATH << name; afmFile = wxFopen(afmName,wxT("r")); } -#ifdef __UNIX__ -#ifndef __VMS__ +#if defined(__UNIX__) && !defined(__VMS__) if (afmFile==NULL) /* please do NOT change the line above to "else if (afmFile==NULL)" - - 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 << wxT("afm") << wxFILE_SEP_PATH - << name << wxT(".afm"); +#endif + << name; afmFile = wxFopen(afmName,wxT("r")); } -#endif #endif 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. */ } @@ -2066,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 */ @@ -2075,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 */ @@ -2084,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 */ @@ -2093,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); } } @@ -2106,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) @@ -2120,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,22 +2160,26 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string, / is done by adding the widths of the characters in the / string. they are given in 1/1000 of the size! */ - double widthSum=0; + long sum=0; wxCoord height=Size; /* by default */ unsigned char *p; for(p=(unsigned char *)wxMBSTRINGCAST strbuf; *p; p++) { if(lastWidths[*p]== INT_MIN) { - wxLogDebug(wxT("GetTextExtent: undefined width for character '%hc' (%d)\n"), *p,*p); - widthSum += (lastWidths[' ']/1000.0F * Size); /* assume space */ + wxLogDebug(wxT("GetTextExtent: undefined width for character '%hc' (%d)"), *p,*p); + sum += lastWidths[' ']; /* assume space */ } else { - widthSum += ((lastWidths[*p]/1000.0F)*Size); + 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) //{