Rotated text patch from Hans-Joachim Baader (with some corrections)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4833 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
1999-12-06 09:35:27 +00:00
parent 43543d985b
commit 95724b1aa2
14 changed files with 503 additions and 13 deletions

View File

@@ -1240,6 +1240,116 @@ void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y )
CalcBoundingBox( x + size * text.Length() * 2/3 , y );
}
void wxPostScriptDC::DoDrawRotatedText( const wxString& text, wxCoord x, wxCoord y, double angle )
{
if (angle == 0.0)
{
DoDrawText(text, x, y);
return;
}
wxCHECK_RET( m_ok && m_pstream, wxT("invalid postscript dc") );
SetFont( m_font );
if (m_textForegroundColour.Ok())
{
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;
fprintf( m_pstream,
"%.8f %.8f %.8f setrgbcolor\n",
redPS, greenPS, bluePS );
m_currentRed = red;
m_currentBlue = blue;
m_currentGreen = green;
}
}
int size = m_font.GetPointSize();
long by = y + (long)floor( double(size) * 2.0 / 3.0 ); // approximate baseline
// XXX only correct for 90 degrees
fprintf( m_pstream, "%ld %ld moveto\n", XLOG2DEV(x + size), YLOG2DEV(by) );
fprintf(m_pstream, "%.8f rotate\n", angle);
/* 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;
for (i = 0; i < len; i++)
{
int c = (unsigned char) textbuf[i];
if (c == ')' || c == '(' || c == '\\')
{
/* Cope with special characters */
fprintf( m_pstream, "\\" );
tmpbuf[0] = (char) c;
fprintf( m_pstream, tmpbuf );
}
else if ( c >= 128 )
{
/* Cope with character codes > 127 */
fprintf(m_pstream, "\\%o", c);
}
else
{
tmpbuf[0] = (char) c;
fprintf( m_pstream, tmpbuf );
}
}
fprintf( m_pstream, ") show\n" );
fprintf( m_pstream, "%.8f rotate\n", -angle );
if (m_font.GetUnderlined())
{
long uy = (long)(y + size - m_underlinePosition);
long w, h;
GetTextExtent(text, &w, &h);
fprintf( m_pstream,
"gsave\n"
"%ld %ld moveto\n"
"%ld setlinewidth\n"
"%ld %ld lineto\n"
"stroke\n"
"grestore\n",
XLOG2DEV(x), YLOG2DEV(uy),
(long)m_underlineThickness,
XLOG2DEV(x + w), YLOG2DEV(uy) );
}
CalcBoundingBox( x, y );
CalcBoundingBox( x + size * text.Length() * 2/3 , y );
}
void wxPostScriptDC::SetBackground (const wxBrush& brush)
{