Ported DrawPolygone fix and new PS font name

matching from stable branch.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@8784 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling 2000-11-23 21:42:55 +00:00
parent 96997d6511
commit 733b25e1a9

View File

@ -650,9 +650,6 @@ void wxPostScriptDC::DoDrawPolygon (int n, wxPoint points[], wxCoord xoffset, wx
wxCoord xx = XLOG2DEV(points[0].x + xoffset); wxCoord xx = XLOG2DEV(points[0].x + xoffset);
wxCoord yy = YLOG2DEV(points[0].y + yoffset); wxCoord yy = YLOG2DEV(points[0].y + yoffset);
wxCoord xx0 = xx;
wxCoord yy0 = yy;
fprintf( m_pstream, "%d %d moveto\n", xx, yy ); fprintf( m_pstream, "%d %d moveto\n", xx, yy );
CalcBoundingBox( points[0].x + xoffset, points[0].y + yoffset ); CalcBoundingBox( points[0].x + xoffset, points[0].y + yoffset );
@ -667,7 +664,7 @@ void wxPostScriptDC::DoDrawPolygon (int n, wxPoint points[], wxCoord xoffset, wx
CalcBoundingBox( points[i].x + xoffset, points[i].y + yoffset); 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" ); fprintf( m_pstream, "stroke\n" );
} }
} }
@ -942,87 +939,83 @@ void wxPostScriptDC::SetFont( const wxFont& font )
m_font = font; m_font = font;
const char *name;
const char *style = "";
int Style = m_font.GetStyle(); int Style = m_font.GetStyle();
int Weight = m_font.GetWeight(); int Weight = m_font.GetWeight();
const char *name;
switch (m_font.GetFamily()) switch (m_font.GetFamily())
{ {
case wxTELETYPE: case wxTELETYPE:
case wxMODERN: case wxMODERN:
name = "/Courier"; {
break; if (Style == wxITALIC)
case wxSWISS: {
name = "/Helvetica"; if (Weight == wxBOLD)
name = "/Courier-BoldOblique";
else
name = "/Courier-Oblique";
}
else
{
if (Weight == wxBOLD)
name = "/Courier-Bold";
else
name = "/Courier";
}
break; break;
}
case wxROMAN: 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; break;
}
case wxSCRIPT: case wxSCRIPT:
name = "/Zapf-Chancery-MediumItalic"; {
name = "/ZapfChancery-MediumItalic";
Style = wxNORMAL; Style = wxNORMAL;
Weight = wxNORMAL; Weight = wxNORMAL;
break; break;
}
case wxSWISS:
default: default:
case wxDEFAULT: // Sans Serif Font {
name = "/LucidaSans"; if (Style == wxITALIC)
{
if (Weight == wxBOLD)
name = "/Helvetica-BoldOblique";
else
name = "/Helvetica-Oblique";
}
else
{
if (Weight == wxBOLD)
name = "/Helvetica-Bold";
else
name = "/Helvetica";
}
break;
}
} }
if (Style == wxNORMAL && (Weight == wxNORMAL || Weight == wxLIGHT)) fprintf( m_pstream, name );
{
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 = "";
}
char buffer[100];
strcpy( buffer, name );
strcat( buffer, style );
fprintf( m_pstream, buffer );
fprintf( m_pstream, " reencodeISO def\n" ); fprintf( m_pstream, " reencodeISO def\n" );
fprintf( m_pstream, buffer ); fprintf( m_pstream, name );
fprintf( m_pstream, " findfont\n" ); fprintf( m_pstream, " findfont\n" );
char buffer[100];
sprintf( buffer, "%f scalefont setfont\n", YLOG2DEVREL(m_font.GetPointSize() * 1000) / 1000.0F); 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 // 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 // YLOG2DEVREL works with wxCoord type (int or longint). Se we first convert font size
@ -1946,10 +1939,10 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string,
double UnderlineThickness = 0.0; double UnderlineThickness = 0.0;
/* get actual parameters */ /* get actual parameters */
const int Family = fontToUse->GetFamily(); int Family = fontToUse->GetFamily();
const int Size = fontToUse->GetPointSize(); int Size = fontToUse->GetPointSize();
const int Style = fontToUse->GetStyle(); int Style = fontToUse->GetStyle();
const int Weight = fontToUse->GetWeight(); int Weight = fontToUse->GetWeight();
/* if we have another font, read the font-metrics */ /* if we have another font, read the font-metrics */
if (Family!=lastFamily || Size!=lastSize || Style!=lastStyle || Weight!=lastWeight) if (Family!=lastFamily || Size!=lastSize || Style!=lastStyle || Weight!=lastWeight)
@ -1964,31 +1957,38 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string,
switch (Family) switch (Family)
{ {
case wxTELETYPE:
case wxMODERN: case wxMODERN:
{ case wxTELETYPE:
if ((Style == wxITALIC) && (Weight == wxBOLD)) name = "CourBoO"; {
else if ((Style != wxITALIC) && (Weight == wxBOLD)) name = "CourBo"; if ((Style == wxITALIC) && (Weight == wxBOLD)) name = "CourBoO.afm";
else if ((Style == wxITALIC) && (Weight != wxBOLD)) name = "CourO"; else if ((Style != wxITALIC) && (Weight == wxBOLD)) name = "CourBo.afm";
else name = "Cour"; else if ((Style == wxITALIC) && (Weight != wxBOLD)) name = "CourO.afm";
} else name = "Cour.afm";
break; break;
}
case wxROMAN: case wxROMAN:
{ {
if ((Style == wxITALIC) && (Weight == wxBOLD)) name = "TimesBoO"; if ((Style == wxITALIC) && (Weight == wxBOLD)) name = "TimesBoO.afm";
else if ((Style != wxITALIC) && (Weight == wxBOLD)) name = "TimesBo"; else if ((Style != wxITALIC) && (Weight == wxBOLD)) name = "TimesBo.afm";
else if ((Style == wxITALIC) && (Weight != wxBOLD)) name = "TimesO"; else if ((Style == wxITALIC) && (Weight != wxBOLD)) name = "TimesO.afm";
else name = "TimesRo"; else name = "TimesRo.afm";
}
break; break;
}
case wxSCRIPT:
{
name = "Zapf.afm";
Style = wxNORMAL;
Weight = wxNORMAL;
}
case wxSWISS:
default: default:
{ {
if ((Style == wxITALIC) && (Weight == wxBOLD)) name = "HelvBoO"; if ((Style == wxITALIC) && (Weight == wxBOLD)) name = "HelvBoO.afm";
else if ((Style != wxITALIC) && (Weight == wxBOLD)) name = "HelvBo"; else if ((Style != wxITALIC) && (Weight == wxBOLD)) name = "HelvBo.afm";
else if ((Style == wxITALIC) && (Weight != wxBOLD)) name = "HelvO"; else if ((Style == wxITALIC) && (Weight != wxBOLD)) name = "HelvO.afm";
else name = "Helv"; else name = "Helv.afm";
}
break; break;
}
} }
/* get the directory of the AFM files */ /* get the directory of the AFM files */
@ -2014,17 +2014,17 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string,
/* new elements JC Sun Aug 25 23:21:44 MET DST 1996 */ /* new elements JC Sun Aug 25 23:21:44 MET DST 1996 */
afmName << name << wxT(".afm"); afmName << name;
FILE *afmFile = wxFopen(afmName,wxT("r")); FILE *afmFile = wxFopen(afmName,wxT("r"));
if (afmFile==NULL) if (afmFile==NULL)
{ {
afmName = wxThePrintSetupData->GetAFMPath(); afmName = wxThePrintSetupData->GetAFMPath();
afmName << wxFILE_SEP_PATH << name << wxT(".afm"); afmName << wxFILE_SEP_PATH << name;
afmFile = wxFopen(afmName,wxT("r")); afmFile = wxFopen(afmName,wxT("r"));
} }
#ifdef __UNIX__ #if defined(__UNIX__) && !defined(__VMS__)
#ifndef __VMS__
if (afmFile==NULL) if (afmFile==NULL)
/* please do NOT change the line above to "else 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 - afmFile = fopen() may fail and in that case the next if branch
@ -2034,11 +2034,14 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string,
afmName << wxFILE_SEP_PATH afmName << wxFILE_SEP_PATH
<< wxT("share") << wxFILE_SEP_PATH << wxT("share") << wxFILE_SEP_PATH
<< wxT("wx") << 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 << wxT("afm") << wxFILE_SEP_PATH
<< name << wxT(".afm"); #endif
<< name;
afmFile = wxFopen(afmName,wxT("r")); afmFile = wxFopen(afmName,wxT("r"));
} }
#endif
#endif #endif
if (afmFile==NULL) if (afmFile==NULL)
@ -2155,7 +2158,7 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string,
/ is done by adding the widths of the characters in the / is done by adding the widths of the characters in the
/ string. they are given in 1/1000 of the size! */ / string. they are given in 1/1000 of the size! */
double widthSum=0; long sum=0;
wxCoord height=Size; /* by default */ wxCoord height=Size; /* by default */
unsigned char *p; unsigned char *p;
for(p=(unsigned char *)wxMBSTRINGCAST strbuf; *p; p++) for(p=(unsigned char *)wxMBSTRINGCAST strbuf; *p; p++)
@ -2163,14 +2166,18 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string,
if(lastWidths[*p]== INT_MIN) 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)\n"), *p,*p);
widthSum += (lastWidths[' ']/1000.0F * Size); /* assume space */ sum += lastWidths[' ']; /* assume space */
} }
else 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) */ /* add descender to height (it is usually a negative value) */
//if (lastDescender != INT_MIN) //if (lastDescender != INT_MIN)
//{ //{