+void wxDC::DoDrawText(const wxString& text, wxCoord x, wxCoord y)
+{
+ DrawAnyText(text, x, y);
+
+ // update the bounding box
+ CalcBoundingBox(x, y);
+
+ wxCoord w, h;
+ GetTextExtent(text, &w, &h);
+ CalcBoundingBox(x + w, y + h);
+}
+
+void wxDC::DrawAnyText(const wxString& text, wxCoord x, wxCoord y)
+{
+ // prepare for drawing the text
+ if ( m_textForegroundColour.Ok() )
+ SetTextColor(GetHdc(), m_textForegroundColour.GetPixel());
+
+ DWORD old_background = 0;
+ if ( m_textBackgroundColour.Ok() )
+ {
+ old_background = SetBkColor(GetHdc(), m_textBackgroundColour.GetPixel() );
+ }
+
+ SetBkMode(GetHdc(), m_backgroundMode == wxTRANSPARENT ? TRANSPARENT
+ : OPAQUE);
+
+ if ( ::TextOut(GetHdc(), XLOG2DEV(x), YLOG2DEV(y),
+ text.c_str(), text.length()) == 0 )
+ {
+ wxLogLastError("TextOut");
+ }
+
+ // restore the old parameters (text foreground colour may be left because
+ // it never is set to anything else, but background should remain
+ // transparent even if we just drew an opaque string)
+ if ( m_textBackgroundColour.Ok() )
+ (void)SetBkColor(GetHdc(), old_background);
+
+ SetBkMode(GetHdc(), TRANSPARENT);
+}
+
+void wxDC::DoDrawRotatedText(const wxString& text,
+ wxCoord x, wxCoord y,
+ double angle)
+{
+ // we test that we have some font because otherwise we should still use the
+ // "else" part below to avoid that DrawRotatedText(angle = 180) and
+ // DrawRotatedText(angle = 0) use different fonts (we can't use the default
+ // font for drawing rotated fonts unfortunately)
+ if ( (angle == 0.0) && m_font.Ok() )
+ {
+ DoDrawText(text, x, y);
+ }
+ else
+ {
+ // NB: don't take DEFAULT_GUI_FONT because it's not TrueType and so
+ // can't have non zero orientation/escapement
+ wxFont font = m_font.Ok() ? m_font : *wxNORMAL_FONT;
+ HFONT hfont = (HFONT)font.GetResourceHandle();
+ LOGFONT lf;
+ if ( ::GetObject(hfont, sizeof(lf), &lf) == 0 )
+ {
+ wxLogLastError("GetObject(hfont)");
+ }
+
+ // GDI wants the angle in tenth of degree
+ long angle10 = (long)(angle * 10);
+ lf.lfEscapement = angle10;
+ lf. lfOrientation = angle10;
+
+ hfont = ::CreateFontIndirect(&lf);
+ if ( !hfont )
+ {
+ wxLogLastError("CreateFont");
+ }
+ else
+ {
+ HFONT hfontOld = (HFONT)::SelectObject(GetHdc(), hfont);
+
+ DrawAnyText(text, x, y);
+
+ (void)::SelectObject(GetHdc(), hfontOld);
+ }
+
+ // call the bounding box by adding all four vertices of the rectangle
+ // containing the text to it (simpler and probably not slower than
+ // determining which of them is really topmost/leftmost/...)
+ wxCoord w, h;
+ GetTextExtent(text, &w, &h);
+
+ double rad = DegToRad(angle);
+
+ // "upper left" and "upper right"
+ CalcBoundingBox(x, y);
+ CalcBoundingBox(x + w*cos(rad), y - h*sin(rad));
+
+ // "bottom left" and "bottom right"
+ x += (wxCoord)(h*sin(rad));
+ y += (wxCoord)(h*cos(rad));
+ CalcBoundingBox(x, y);
+ CalcBoundingBox(x + h*sin(rad), y + h*cos(rad));
+ }
+}
+
+// ---------------------------------------------------------------------------
+// set GDI objects
+// ---------------------------------------------------------------------------
+
+void wxDC::SetPalette(const wxPalette& palette)
+{
+ // Set the old object temporarily, in case the assignment deletes an object
+ // that's not yet selected out.
+ if (m_oldPalette)
+ {
+ ::SelectPalette(GetHdc(), (HPALETTE) m_oldPalette, TRUE);
+ m_oldPalette = 0;
+ }
+
+ m_palette = palette;
+
+ if (!m_palette.Ok())
+ {
+ // Setting a NULL colourmap is a way of restoring
+ // the original colourmap
+ if (m_oldPalette)
+ {
+ ::SelectPalette(GetHdc(), (HPALETTE) m_oldPalette, TRUE);
+ m_oldPalette = 0;
+ }
+
+ return;
+ }
+
+ if (m_palette.Ok() && m_palette.GetHPALETTE())
+ {
+ HPALETTE oldPal = ::SelectPalette(GetHdc(), (HPALETTE) m_palette.GetHPALETTE(), TRUE);
+ if (!m_oldPalette)
+ m_oldPalette = (WXHPALETTE) oldPal;
+
+ ::RealizePalette(GetHdc());
+ }
+}
+