X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cb9d5bd07e7aa0b190c3ee60f5778a974ac9f87b..9bb50fd0b04c824fc7ba14c0dc4ba4a2a9a1e6ad:/src/motif/dcclient.cpp diff --git a/src/motif/dcclient.cpp b/src/motif/dcclient.cpp index e082c7e640..b8276477c3 100644 --- a/src/motif/dcclient.cpp +++ b/src/motif/dcclient.cpp @@ -49,8 +49,7 @@ #include "wx/app.h" #include "wx/image.h" #include "wx/log.h" - -#include +#include "wx/math.h" #ifdef __VMS__ #pragma message disable nosimpint @@ -96,6 +95,9 @@ IMPLEMENT_DYNAMIC_CLASS(wxWindowDC, wxDC) #define IS_HATCH(s) ((s)>=wxFIRST_HATCH && (s)<=wxLAST_HATCH) #endif +// FIXME: left over after removal of wxDC::GetOptimization() +#define GET_OPTIMIZATION false + // ---------------------------------------------------------------------------- // prototypes // ---------------------------------------------------------------------------- @@ -408,7 +410,7 @@ void wxWindowDC::DoDrawEllipticArc( wxCoord x, wxCoord y, wxCoord width, wxCoord if (m_brush.Ok() && m_brush.GetStyle () != wxTRANSPARENT) { - m_autoSetting = TRUE; // must be reset + m_autoSetting = true; // must be reset SetBrush (m_brush); XFillArc ((Display*) m_display, (Pixmap) m_pixmap, (GC) m_gc, xd, yd, wd, hd, start, end); @@ -896,7 +898,7 @@ bool wxWindowDC::DoBlit( wxCoord xdest, wxCoord ydest, source->LogicalToDeviceXRel(width), source->LogicalToDeviceYRel(height), XLOG2DEV_2 (xdest), YLOG2DEV_2 (ydest), - TRUE, &cache); + True, &cache); if ( useMask && source->IsKindOf(CLASSINFO(wxMemoryDC)) ) { @@ -915,7 +917,7 @@ bool wxWindowDC::DoBlit( wxCoord xdest, wxCoord ydest, source->LogicalToDeviceXRel(width), source->LogicalToDeviceYRel(height), XLOG2DEV (xdest), YLOG2DEV (ydest), - FALSE, &cache); + False, &cache); if ( useMask ) { @@ -1033,7 +1035,7 @@ void wxWindowDC::DoDrawText( const wxString &text, wxCoord x, wxCoord y ) int cx = 0; int cy = 0; int ascent = 0; - int slen; + int slen = text.length(); // Set FillStyle, otherwise X will use current stipple! XGCValues gcV, gcBackingV; @@ -1047,27 +1049,9 @@ void wxWindowDC::DoDrawText( const wxString &text, wxCoord x, wxCoord y ) XSetFillStyle ((Display*) m_display, (GC) m_gcBacking, FillSolid); } - slen = strlen(text); - if (m_font.Ok()) - { - WXFontStructPtr pFontStruct = m_font.GetFontStruct(m_userScaleY*m_logicalScaleY, m_display); - int direction, descent; - XCharStruct overall_return; -#if 0 - if (use16) - (void)XTextExtents16((XFontStruct*) pFontStruct, (XChar2b *)(const char*) text, slen, &direction, - &ascent, &descent, &overall_return); - else -#endif // 0 - (void)XTextExtents((XFontStruct*) pFontStruct, - wxConstCast(text.c_str(), char), - slen, &direction, - &ascent, &descent, &overall_return); - - cx = overall_return.width; - cy = ascent + descent; - } + wxGetTextExtent (m_display, m_font, m_userScaleY * m_logicalScaleY, + text, &cx, &cy, &ascent, NULL); // First draw a rectangle representing the text background, if a text // background is specified @@ -1085,7 +1069,7 @@ void wxWindowDC::DoDrawText( const wxString &text, wxCoord x, wxCoord y ) sameColour = (sameColour && (oldPenColour.GetPixel() == m_textBackgroundColour.GetPixel())); - if (!sameColour || !GetOptimization()) + if (!sameColour || !GET_OPTIMIZATION) { int pixel = m_textBackgroundColour.AllocColour(m_display); m_currentColour = m_textBackgroundColour; @@ -1118,7 +1102,7 @@ void wxWindowDC::DoDrawText( const wxString &text, wxCoord x, wxCoord y ) (oldPenColour.Green () == m_currentColour.Green ()) && (oldPenColour.GetPixel() == m_currentColour.GetPixel())); - if (!sameColour || !GetOptimization()) + if (!sameColour || !GET_OPTIMIZATION) { int pixel = CalculatePixel(m_textForegroundColour, m_currentColour, false); @@ -1143,7 +1127,12 @@ void wxWindowDC::DoDrawText( const wxString &text, wxCoord x, wxCoord y ) (XChar2b *)(char*) (const char*) text, slen); else #endif // 0 +#if wxMOTIF_NEW_FONT_HANDLING + XFontSet fset = (XFontSet) m_font.GetFontSet (m_userScaleY * m_logicalScaleY, m_display); + XmbDrawString((Display*) m_display, (Pixmap) m_pixmap, fset, (GC) m_gc, XLOG2DEV (x), YLOG2DEV (y) + ascent, text, slen); +#else XDrawString((Display*) m_display, (Pixmap) m_pixmap, (GC) m_gc, XLOG2DEV (x), YLOG2DEV (y) + ascent, text, slen); +#endif if (m_window && m_window->GetBackingPixmap()) { #if 0 @@ -1153,9 +1142,15 @@ void wxWindowDC::DoDrawText( const wxString &text, wxCoord x, wxCoord y ) (XChar2b *)(char*) (const char*) text, slen); else #endif // 0 +#if wxMOTIF_NEW_FONT_HANDLING + XmbDrawString((Display*) m_display, (Pixmap) m_window->GetBackingPixmap(), fset, (GC) m_gcBacking, + XLOG2DEV_2 (x), YLOG2DEV_2 (y) + ascent, + wxConstCast(text.c_str(), char), slen); +#else XDrawString((Display*) m_display, (Pixmap) m_window->GetBackingPixmap(), (GC) m_gcBacking, XLOG2DEV_2 (x), YLOG2DEV_2 (y) + ascent, wxConstCast(text.c_str(), char), slen); +#endif } // restore fill style @@ -1206,31 +1201,10 @@ void wxWindowDC::DoDrawRotatedText( const wxString &text, wxCoord x, wxCoord y, int cx = 0; int cy = 0; int ascent = 0; - int slen = text.length(); if (m_font.Ok()) - { - // Calculate text extent. - WXFontStructPtr pFontStruct = - m_font.GetFontStruct(m_userScaleY*m_logicalScaleY, m_display); - int direction, descent; - XCharStruct overall_return; -#if 0 - if (use16) - (void)XTextExtents16((XFontStruct*) pFontStruct, - (XChar2b *)(const char*) text, - slen, &direction, - &ascent, &descent, &overall_return); - else -#endif // 0 - (void)XTextExtents((XFontStruct*) pFontStruct, - wxConstCast(text.c_str(), char), - slen, &direction, - &ascent, &descent, &overall_return); - - cx = overall_return.width; - cy = ascent + descent; - } + wxGetTextExtent (m_display, m_font, m_userScaleY * m_logicalScaleY, + text, &cx, &cy, &ascent, NULL); wxBitmap src(cx, cy); wxMemoryDC dc; @@ -1338,9 +1312,7 @@ void wxWindowDC::DoGetTextExtent( const wxString &string, wxCoord *width, wxCoor { wxCHECK_RET( Ok(), "invalid dc" ); - wxFont* theFont = font; - if (!theFont) - theFont = (wxFont *)&m_font; // const_cast + const wxFont* theFont = font ? font : &m_font; if (!theFont->Ok()) { @@ -1352,33 +1324,11 @@ void wxWindowDC::DoGetTextExtent( const wxString &string, wxCoord *width, wxCoor return; } - WXFontStructPtr pFontStruct = theFont->GetFontStruct(m_userScaleY*m_logicalScaleY, m_display); - - int direction, ascent, descent2; - XCharStruct overall; - int slen; - -#if 0 - if (use16) - slen = str16len(string); - else -#endif // 0 - slen = strlen(string); + wxGetTextExtent(m_display, *theFont, m_userScaleY * m_logicalScaleY, + string, width, height, NULL, descent); -#if 0 - if (use16) - XTextExtents16((XFontStruct*) pFontStruct, (XChar2b *) (char*) (const char*) string, slen, &direction, - &ascent, &descent2, &overall); - else -#endif // 0 - XTextExtents((XFontStruct*) pFontStruct, - wxConstCast(string.c_str(), char), slen, &direction, - &ascent, &descent2, &overall); - - if (width) *width = XDEV2LOGREL (overall.width); - if (height) *height = YDEV2LOGREL (ascent + descent2); - if (descent) - *descent = descent2; + if (width) *width = XDEV2LOGREL (*width); + if (height) *height = YDEV2LOGREL (*height); if (externalLeading) *externalLeading = 0; } @@ -1387,14 +1337,13 @@ wxCoord wxWindowDC::GetCharWidth() const { wxCHECK_MSG( Ok(), 0, "invalid dc" ); wxCHECK_MSG( m_font.Ok(), 0, "invalid font" ); + + int width; - WXFontStructPtr pFontStruct = m_font.GetFontStruct(m_userScaleY * m_logicalScaleY, m_display); + wxGetTextExtent (m_display, m_font, m_userScaleY * m_logicalScaleY, + "x", &width, NULL, NULL, NULL); - int direction, ascent, descent; - XCharStruct overall; - XTextExtents ((XFontStruct*) pFontStruct, "x", 1, &direction, &ascent, - &descent, &overall); - return XDEV2LOGREL(overall.width); + return XDEV2LOGREL(width); } wxCoord wxWindowDC::GetCharHeight() const @@ -1402,14 +1351,12 @@ wxCoord wxWindowDC::GetCharHeight() const wxCHECK_MSG( Ok(), 0, "invalid dc" ); wxCHECK_MSG( m_font.Ok(), 0, "invalid font" ); - WXFontStructPtr pFontStruct = m_font.GetFontStruct(m_userScaleY*m_logicalScaleY, m_display); + int height; - int direction, ascent, descent; - XCharStruct overall; - XTextExtents ((XFontStruct*) pFontStruct, "x", 1, &direction, &ascent, - &descent, &overall); - // return XDEV2LOGREL(overall.ascent + overall.descent); - return XDEV2LOGREL(ascent + descent); + wxGetTextExtent (m_display, m_font, m_userScaleY * m_logicalScaleY, + "x", NULL, &height, NULL, NULL); + + return XDEV2LOGREL(height); } void wxWindowDC::DoGetSize( int *width, int *height ) const @@ -1478,6 +1425,7 @@ void wxWindowDC::SetFont( const wxFont &font ) return; } +#if !wxMOTIF_NEW_FONT_HANDLING WXFontStructPtr pFontStruct = m_font.GetFontStruct(m_userScaleY*m_logicalScaleY, m_display); Font fontId = ((XFontStruct*)pFontStruct)->fid; @@ -1485,6 +1433,7 @@ void wxWindowDC::SetFont( const wxFont &font ) if (m_window && m_window->GetBackingPixmap()) XSetFont ((Display*) m_display,(GC) m_gcBacking, fontId); +#endif } void wxWindowDC::SetForegroundPixelWithLogicalFunction(int pixel) @@ -1592,7 +1541,7 @@ void wxWindowDC::SetPen( const wxPen &pen ) (oldPenColour.Green () == m_currentColour.Green ()) && (oldPenColour.GetPixel() == m_currentColour.GetPixel())); - if (!sameStyle || !GetOptimization()) + if (!sameStyle || !GET_OPTIMIZATION) { int scaled_width = (int) XLOG2DEVREL (m_pen.GetWidth ()); if (scaled_width < 0) @@ -1705,7 +1654,7 @@ void wxWindowDC::SetPen( const wxPen &pen ) XSetLineAttributes ((Display*) m_display,(GC) m_gcBacking, scaled_width, style, cap, join); } - if (IS_HATCH(m_currentFill) && ((m_currentFill != oldFill) || !GetOptimization())) + if (IS_HATCH(m_currentFill) && ((m_currentFill != oldFill) || !GET_OPTIMIZATION)) { Pixmap myStipple; @@ -1763,7 +1712,7 @@ void wxWindowDC::SetPen( const wxPen &pen ) XSetStipple ((Display*) m_display,(GC) m_gcBacking, myStipple); } else if (m_currentStipple.Ok() - && ((m_currentStipple != oldStipple) || !GetOptimization())) + && ((m_currentStipple != oldStipple) || !GET_OPTIMIZATION)) { XSetStipple ((Display*) m_display, (GC) m_gc, (Pixmap) m_currentStipple.GetDrawable()); @@ -1771,7 +1720,7 @@ void wxWindowDC::SetPen( const wxPen &pen ) XSetStipple ((Display*) m_display,(GC) m_gcBacking, (Pixmap) m_currentStipple.GetDrawable()); } - if ((m_currentFill != oldFill) || !GetOptimization()) + if ((m_currentFill != oldFill) || !GET_OPTIMIZATION) { int fill_style; @@ -1787,7 +1736,7 @@ void wxWindowDC::SetPen( const wxPen &pen ) } // must test m_logicalFunction, because it involves background! - if (!sameColour || !GetOptimization() + if (!sameColour || !GET_OPTIMIZATION || ((m_logicalFunction == wxXOR) || (m_autoSetting & 0x2))) { int pixel = -1; @@ -1837,7 +1786,7 @@ void wxWindowDC::SetBrush( const wxBrush &brush ) int stippleDepth = -1; - if ((oldFill != m_brush.GetStyle ()) || !GetOptimization()) + if ((oldFill != m_brush.GetStyle ()) || !GET_OPTIMIZATION) { switch (brush.GetStyle ()) { @@ -1876,7 +1825,7 @@ void wxWindowDC::SetBrush( const wxBrush &brush ) } } - if (IS_HATCH(m_currentFill) && ((m_currentFill != oldFill) || !GetOptimization())) + if (IS_HATCH(m_currentFill) && ((m_currentFill != oldFill) || !GET_OPTIMIZATION)) { Pixmap myStipple; @@ -1955,7 +1904,7 @@ void wxWindowDC::SetBrush( const wxBrush &brush ) } // must test m_logicalFunction, because it involves background! - if (!sameColour || !GetOptimization() || m_logicalFunction == wxXOR) + if (!sameColour || !GET_OPTIMIZATION || m_logicalFunction == wxXOR) { int pixel = CalculatePixel(m_brush.GetColour(), m_currentColour, true); @@ -2259,7 +2208,7 @@ static void XCopyRemote(Display *src_display, Display *dest_display, destcm = (Colormap) wxTheApp->GetMainColormap((WXDisplay*) dest_display); cache_pos = 0; - all_cache = FALSE; + all_cache = False; for (i = 0; i < w; i++) for (j = 0; j < h; j++) { @@ -2287,7 +2236,7 @@ static void XCopyRemote(Display *src_display, Display *dest_display, if (++cache_pos >= CACHE_SIZE) { cache_pos = 0; - all_cache = TRUE; + all_cache = true; } install: