Clean up DrawText() and DrawRotatedText() (wxPostScriptDC)
Move shared code to the separate method DrawAnyText() instead of duplicating it.
This commit is contained in:
@@ -137,6 +137,9 @@ protected:
|
|||||||
void DoGetSize(int* width, int* height) const wxOVERRIDE;
|
void DoGetSize(int* width, int* height) const wxOVERRIDE;
|
||||||
void DoGetSizeMM(int *width, int *height) const wxOVERRIDE;
|
void DoGetSizeMM(int *width, int *height) const wxOVERRIDE;
|
||||||
|
|
||||||
|
// Common part of DoDrawText() and DoDrawRotatedText()
|
||||||
|
void DrawAnyText(const wxWX2MBbuf& textbuf, wxCoord testDescent);
|
||||||
|
|
||||||
FILE* m_pstream; // PostScript output stream
|
FILE* m_pstream; // PostScript output stream
|
||||||
unsigned char m_currentRed;
|
unsigned char m_currentRed;
|
||||||
unsigned char m_currentGreen;
|
unsigned char m_currentGreen;
|
||||||
|
@@ -1309,13 +1309,12 @@ void wxPostScriptDCImpl::SetBrush( const wxBrush& brush )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxPostScriptDCImpl::DoDrawText( const wxString& text, wxCoord x, wxCoord y )
|
// Common part of DoDrawText() and DoDrawRotatedText()
|
||||||
|
void wxPostScriptDCImpl::DrawAnyText(const wxWX2MBbuf& textbuf, wxCoord textDescent)
|
||||||
{
|
{
|
||||||
wxCHECK_RET( m_ok, wxT("invalid postscript dc") );
|
wxCHECK_RET( textbuf, wxS("Invalid text buffer") );
|
||||||
|
|
||||||
const wxWX2MBbuf textbuf = text.mb_str();
|
wxString buffer;
|
||||||
if ( !textbuf )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (m_textForegroundColour.IsOk())
|
if (m_textForegroundColour.IsOk())
|
||||||
{
|
{
|
||||||
@@ -1343,7 +1342,6 @@ void wxPostScriptDCImpl::DoDrawText( const wxString& text, wxCoord x, wxCoord y
|
|||||||
double bluePS = (double)(blue) / 255.0;
|
double bluePS = (double)(blue) / 255.0;
|
||||||
double greenPS = (double)(green) / 255.0;
|
double greenPS = (double)(green) / 255.0;
|
||||||
|
|
||||||
wxString buffer;
|
|
||||||
buffer.Printf( "%f %f %f setrgbcolor\n", redPS, greenPS, bluePS );
|
buffer.Printf( "%f %f %f setrgbcolor\n", redPS, greenPS, bluePS );
|
||||||
buffer.Replace( ",", "." );
|
buffer.Replace( ",", "." );
|
||||||
PsPrint( buffer );
|
PsPrint( buffer );
|
||||||
@@ -1354,23 +1352,7 @@ void wxPostScriptDCImpl::DoDrawText( const wxString& text, wxCoord x, wxCoord y
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
wxCoord text_descent;
|
|
||||||
|
|
||||||
GetOwner()->GetTextExtent(text, NULL, NULL, &text_descent);
|
|
||||||
|
|
||||||
int size = m_font.GetPointSize();
|
|
||||||
|
|
||||||
// wxCoord by = y + (wxCoord)floor( double(size) * 2.0 / 3.0 ); // approximate baseline
|
|
||||||
// commented by V. Slavik and replaced by accurate version
|
|
||||||
// - note that there is still rounding error in text_descent!
|
|
||||||
wxCoord by = y + size - text_descent; // baseline
|
|
||||||
|
|
||||||
wxString buffer;
|
|
||||||
buffer.Printf( "%f %f moveto\n", XLOG2DEV(x), YLOG2DEV(by) );
|
|
||||||
buffer.Replace( ",", "." );
|
|
||||||
PsPrint( buffer );
|
|
||||||
PsPrint( "(" );
|
PsPrint( "(" );
|
||||||
|
|
||||||
for ( const char *p = textbuf; *p != '\0'; p++ )
|
for ( const char *p = textbuf; *p != '\0'; p++ )
|
||||||
{
|
{
|
||||||
int c = (unsigned char)*p;
|
int c = (unsigned char)*p;
|
||||||
@@ -1391,7 +1373,6 @@ void wxPostScriptDCImpl::DoDrawText( const wxString& text, wxCoord x, wxCoord y
|
|||||||
PsPrint( (char) c );
|
PsPrint( (char) c );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PsPrint( ")\n" );
|
PsPrint( ")\n" );
|
||||||
|
|
||||||
if (m_font.GetUnderlined())
|
if (m_font.GetUnderlined())
|
||||||
@@ -1408,13 +1389,40 @@ void wxPostScriptDCImpl::DoDrawText( const wxString& text, wxCoord x, wxCoord y
|
|||||||
"dup stringwidth rlineto\n"
|
"dup stringwidth rlineto\n"
|
||||||
"stroke\n"
|
"stroke\n"
|
||||||
"grestore\n",
|
"grestore\n",
|
||||||
-YLOG2DEVREL(text_descent - m_underlinePosition),
|
-YLOG2DEVREL(textDescent - m_underlinePosition),
|
||||||
m_underlineThickness );
|
m_underlineThickness );
|
||||||
buffer.Replace( ",", "." );
|
buffer.Replace( ",", "." );
|
||||||
PsPrint( buffer );
|
PsPrint( buffer );
|
||||||
}
|
}
|
||||||
|
|
||||||
PsPrint("show\n");
|
PsPrint("show\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxPostScriptDCImpl::DoDrawText( const wxString& text, wxCoord x, wxCoord y )
|
||||||
|
{
|
||||||
|
wxCHECK_RET( m_ok, wxT("invalid postscript dc") );
|
||||||
|
|
||||||
|
const wxWX2MBbuf textbuf = text.mb_str();
|
||||||
|
if ( !textbuf )
|
||||||
|
return;
|
||||||
|
|
||||||
|
SetFont( m_font );
|
||||||
|
|
||||||
|
wxCoord text_descent;
|
||||||
|
GetOwner()->GetTextExtent(text, NULL, NULL, &text_descent);
|
||||||
|
int size = m_font.GetPointSize();
|
||||||
|
|
||||||
|
// wxCoord by = y + (wxCoord)floor( double(size) * 2.0 / 3.0 ); // approximate baseline
|
||||||
|
// commented by V. Slavik and replaced by accurate version
|
||||||
|
// - note that there is still rounding error in text_descent!
|
||||||
|
wxCoord by = y + size - text_descent; // baseline
|
||||||
|
|
||||||
|
wxString buffer;
|
||||||
|
buffer.Printf( "%f %f moveto\n", XLOG2DEV(x), YLOG2DEV(by) );
|
||||||
|
buffer.Replace( ",", "." );
|
||||||
|
PsPrint( buffer );
|
||||||
|
|
||||||
|
DrawAnyText(textbuf, text_descent);
|
||||||
|
|
||||||
CalcBoundingBox( x, y );
|
CalcBoundingBox( x, y );
|
||||||
CalcBoundingBox( x + size * text.length() * 2/3 , y );
|
CalcBoundingBox( x + size * text.length() * 2/3 , y );
|
||||||
@@ -1430,45 +1438,12 @@ void wxPostScriptDCImpl::DoDrawRotatedText( const wxString& text, wxCoord x, wxC
|
|||||||
|
|
||||||
wxCHECK_RET( m_ok, wxT("invalid postscript dc") );
|
wxCHECK_RET( m_ok, wxT("invalid postscript dc") );
|
||||||
|
|
||||||
|
const wxWX2MBbuf textbuf = text.mb_str();
|
||||||
|
if ( !textbuf )
|
||||||
|
return;
|
||||||
|
|
||||||
SetFont( m_font );
|
SetFont( m_font );
|
||||||
|
|
||||||
if (m_textForegroundColour.IsOk())
|
|
||||||
{
|
|
||||||
unsigned char red = m_textForegroundColour.Red();
|
|
||||||
unsigned char blue = m_textForegroundColour.Blue();
|
|
||||||
unsigned char green = m_textForegroundColour.Green();
|
|
||||||
|
|
||||||
if (!m_colour)
|
|
||||||
{
|
|
||||||
// Anything not white is black
|
|
||||||
if (! (red == (unsigned char) 255 &&
|
|
||||||
blue == (unsigned char) 255 &&
|
|
||||||
green == (unsigned char) 255))
|
|
||||||
{
|
|
||||||
red = (unsigned char) 0;
|
|
||||||
green = (unsigned char) 0;
|
|
||||||
blue = (unsigned char) 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// maybe setgray here ?
|
|
||||||
if (!(red == m_currentRed && green == m_currentGreen && blue == m_currentBlue))
|
|
||||||
{
|
|
||||||
double redPS = (double)(red) / 255.0;
|
|
||||||
double bluePS = (double)(blue) / 255.0;
|
|
||||||
double greenPS = (double)(green) / 255.0;
|
|
||||||
|
|
||||||
wxString buffer;
|
|
||||||
buffer.Printf( "%f %f %f setrgbcolor\n", redPS, greenPS, bluePS );
|
|
||||||
buffer.Replace( ",", "." );
|
|
||||||
PsPrint( buffer );
|
|
||||||
|
|
||||||
m_currentRed = red;
|
|
||||||
m_currentBlue = blue;
|
|
||||||
m_currentGreen = green;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Calculate bottom-left coordinates of the rotated text
|
// Calculate bottom-left coordinates of the rotated text
|
||||||
wxCoord text_descent;
|
wxCoord text_descent;
|
||||||
GetOwner()->GetTextExtent(text, NULL, NULL, &text_descent);
|
GetOwner()->GetTextExtent(text, NULL, NULL, &text_descent);
|
||||||
@@ -1486,55 +1461,8 @@ void wxPostScriptDCImpl::DoDrawRotatedText( const wxString& text, wxCoord x, wxC
|
|||||||
buffer.Replace( ",", "." );
|
buffer.Replace( ",", "." );
|
||||||
PsPrint( buffer );
|
PsPrint( buffer );
|
||||||
|
|
||||||
PsPrint( "(" );
|
DrawAnyText(textbuf, text_descent);
|
||||||
const wxWX2MBbuf textbuf = text.mb_str();
|
|
||||||
if ( textbuf )
|
|
||||||
{
|
|
||||||
for ( const char *p = textbuf; *p != '\0'; p++ )
|
|
||||||
{
|
|
||||||
int c = (unsigned char)*p;
|
|
||||||
if (c == ')' || c == '(' || c == '\\')
|
|
||||||
{
|
|
||||||
/* Cope with special characters */
|
|
||||||
PsPrint( "\\" );
|
|
||||||
PsPrint( (char) c );
|
|
||||||
}
|
|
||||||
else if ( c >= 128 )
|
|
||||||
{
|
|
||||||
/* Cope with character codes > 127 */
|
|
||||||
buffer.Printf( "\\%o", c);
|
|
||||||
PsPrint( buffer );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PsPrint( (char) c );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PsPrint( ")\n" );
|
|
||||||
|
|
||||||
if (m_font.GetUnderlined())
|
|
||||||
{
|
|
||||||
// We need relative underline position with reference
|
|
||||||
// to the baseline in rotated coordinate system:
|
|
||||||
// uy = y + size - m_underlinePosition =>
|
|
||||||
// uy = by + text_descent - m_underlinePosition =>
|
|
||||||
// dy = -(text_descent - m_underlinePosition)
|
|
||||||
// It's negated due to the orientation of Y-axis.
|
|
||||||
buffer.Printf( "gsave\n"
|
|
||||||
"0.0 %f rmoveto\n"
|
|
||||||
"%f setlinewidth\n"
|
|
||||||
"dup stringwidth rlineto\n"
|
|
||||||
"stroke\n"
|
|
||||||
"grestore\n",
|
|
||||||
-YLOG2DEVREL(text_descent - m_underlinePosition),
|
|
||||||
m_underlineThickness );
|
|
||||||
buffer.Replace( ",", "." );
|
|
||||||
PsPrint( buffer );
|
|
||||||
}
|
|
||||||
|
|
||||||
PsPrint("show\n");
|
|
||||||
buffer.Printf( "%f rotate\n", -angle );
|
buffer.Printf( "%f rotate\n", -angle );
|
||||||
buffer.Replace( ",", "." );
|
buffer.Replace( ",", "." );
|
||||||
PsPrint( buffer );
|
PsPrint( buffer );
|
||||||
|
Reference in New Issue
Block a user