Hi,

People have pointed out that AbiWord on Unix uses a small bit of XLib for
drawing and measuring text. Since I love playing with GDK, I went ahead
and wrote a patch to eliminate all use of XLib that I could find. I can't
detect a visible difference with this patch in speed or quality (and I
am suprized - I don't know any XLib and I barely know GDK). Anyway, this
patch probably should be tested a bit before it is commited, but It Works
Fine Here :). If any GDK work needs to be done in the future, contact
me... GDK is fun.

Aaron Lehmann
Index: src/af/gr/unix/gr_UnixGraphics.cpp
===================================================================
RCS file: /cvsroot/abi/src/af/gr/unix/gr_UnixGraphics.cpp,v
retrieving revision 1.68
diff -u -r1.68 gr_UnixGraphics.cpp
--- src/af/gr/unix/gr_UnixGraphics.cpp  2000/01/29 01:07:12     1.68
+++ src/af/gr/unix/gr_UnixGraphics.cpp  2000/03/22 04:12:02
@@ -19,7 +19,6 @@
 
 #include <stdlib.h>
 #include <string.h>
-#include <X11/Xlib.h>
 #include <stdio.h>
 
 #include "xap_UnixApp.h"
@@ -98,40 +97,33 @@
 {
        if (!m_pFontManager)
                return;
-       
-       GdkWindowPrivate *drawable_private;
-       GdkFontPrivate *font_private;
-       GdkGCPrivate *gc_private;
 
-       drawable_private = (GdkWindowPrivate*) m_pWin;
-       if (drawable_private->destroyed)
-       {
-               return;
-       }
-       gc_private = (GdkGCPrivate*) m_pGC;
        UT_ASSERT(m_pFont);
-       font_private = (GdkFontPrivate*) m_pFont->getGdkFont();
-
-       XFontStruct *xfont = (XFontStruct *) font_private->xfont;
-       XSetFont(drawable_private->xdisplay, gc_private->xgc, xfont->fid);
 
        /*
          TODO -  We need to seriously look for a way to avoid this.
          Doing a memory allocation on every draw is painful.
        */
 
-       XChar2b *pNChars = new XChar2b[iLength];
 
+       GdkFont *font = m_pFont->getGdkFont();
+
+       // Blargh... GDK wants strings in 32 bits, we use 16 internally
+    GdkWChar *pNChars = new GdkWChar[iLength];
+
        for (int i = 0; i < iLength; i++)
     {
-               pNChars[i].byte1 = pChars[i + iCharOffset] & 0xff00;
-               pNChars[i].byte2 = pChars[i + iCharOffset] & 0x00ff;
+               pNChars[i] = pChars[i + iCharOffset];
     }
   
-       XDrawString16 (drawable_private->xdisplay, drawable_private->xwindow,
-                                  gc_private->xgc, xoff, yoff + xfont->ascent, 
pNChars,
-                                  iLength);
 
+       // Use "wide-char" function
+       gdk_draw_text_wc (m_pWin, m_pFont->getGdkFont(), m_pGC,
+                                         xoff, yoff+font->ascent, pNChars, iLength);
+       //XDrawString16 (drawable_private->xdisplay, drawable_private->xwindow,
+       //                         gc_private->xgc, xoff, yoff + xfont->ascent, 
+pNChars,
+       //                         iLength);
+
        delete pNChars;
 
 #if 1
@@ -152,18 +144,10 @@
        GdkFont * newGdkFont = pUFont->getGdkFont();
        UT_ASSERT(newGdkFont);
        
-       if (m_pFont)
-    {
-               XFontStruct* pCurFont = (XFontStruct 
*)((GdkFontPrivate*)m_pFont->getGdkFont())->xfont;
-               XFontStruct* pNewFont = (XFontStruct 
*)((GdkFontPrivate*)newGdkFont)->xfont;
-
-               UT_ASSERT(pCurFont && pNewFont);
-               
-               if (!pCurFont->fid == pNewFont->fid)
-               {
-                       return;
-               }
-    }
+       if (m_pFont && gdk_font_equal (newGdkFont, m_pFont->getGdkFont()))
+       {
+               return;
+       }
                     
        m_pFont = pUFont;
   
@@ -173,15 +157,12 @@
 UT_uint32 GR_UnixGraphics::getFontHeight()
 {
        if (!m_pFontManager)
-               return NULL;
+               return 0;
 
        UT_ASSERT(m_pFont);
-       UT_ASSERT(m_pGC);
-
-       GdkFontPrivate* prFont = (GdkFontPrivate*) m_pFont->getGdkFont();
-       XFontStruct* pXFont = (XFontStruct *)prFont->xfont;
 
-       return pXFont->ascent + pXFont->descent;
+       GdkFont* font = m_pFont->getGdkFont();
+       return font->ascent + font->descent;
 }
 
 UT_uint32 GR_UnixGraphics::measureString(const UT_UCSChar* s, int iOffset,
@@ -195,35 +176,26 @@
        // trouble (and cost more cycles) to maintain than they save.... -- jeff
        
        if (!m_pFontManager)
-               return NULL;
+               return 0;
 
        UT_ASSERT(m_pFont);
        UT_ASSERT(m_pGC);
        UT_ASSERT(s);
 
-       int charWidth = 0;
+       int charWidth = 0, width;
+       GdkWChar cChar;
 
        GdkFont* pFont = m_pFont->getGdkFont();
-
-       // TODO the following assignment looks suspicious...
-       XFontStruct* pXFont = (XFontStruct *)(((GdkFontPrivate*)pFont)->xfont);
        
        for (int i = 0; i < num; i++)
     {
-               XChar2b c2b;
-               XCharStruct overall;
-               int des, dir, asc;
-                       
-               c2b.byte1 = s[i + iOffset] & 0xff00;
-               c2b.byte2 = s[i + iOffset] & 0x00ff;
+               cChar = s[i + iOffset];
                
-               XTextExtents16(pXFont, & c2b, 1, &dir, &asc, &des, &overall);
-
-               int len = overall.width;
-      
-               charWidth += len;
+               width = gdk_text_width_wc (pFont, &cChar, 1);
+               
+               charWidth += width;
                if (pWidths)
-                       pWidths[i] = len;
+                       pWidths[i] = width;
     }
   
        return charWidth;
@@ -255,22 +227,12 @@
        gint ret = gdk_color_alloc(m_pColormap, &c);
 
        UT_ASSERT(ret == TRUE);
-       
-       GdkGCPrivate *pgc = (GdkGCPrivate*)m_pXORGC;
-       GdkGCPrivate *pogc = (GdkGCPrivate*)m_pGC;
 
        gdk_gc_set_foreground(m_pGC, &c);
 
        /* Set up the XOR gc */
-       XGCValues gcv;
-
-       XGetGCValues(pogc->xdisplay, pogc->xgc, GCForeground, &gcv);
-
-       gcv.foreground = c.pixel;
-       
-       gcv.function = GXxor;
-
-       XChangeGC(pgc->xdisplay, pgc->xgc, GCForeground | GCFunction, &gcv);
+       gdk_gc_set_foreground(m_pXORGC, &c);
+       gdk_gc_set_function(m_pXORGC, GDK_XOR);
 }
 
 GR_Font * GR_UnixGraphics::getGUIFont(void)
@@ -370,30 +332,27 @@
 UT_uint32 GR_UnixGraphics::getFontAscent()
 {
        if (!m_pFontManager)
-               return NULL;
+               return 0;
 
        UT_ASSERT(m_pFont);
        UT_ASSERT(m_pGC);
 
-       GdkFontPrivate* prFont = (GdkFontPrivate*) m_pFont->getGdkFont();
-       // TODO the following assignment looks suspicious...
-       XFontStruct* pXFont = (XFontStruct *)prFont->xfont;
+       GdkFont* pFont = m_pFont->getGdkFont();
 
-       return pXFont->ascent;
+       return pFont->ascent;
 }
 
 UT_uint32 GR_UnixGraphics::getFontDescent()
 {
        if (!m_pFontManager)
-               return NULL;
-
+               return 0;
+  
        UT_ASSERT(m_pFont);
        UT_ASSERT(m_pGC);
 
-       GdkFontPrivate* prFont = (GdkFontPrivate*) m_pFont->getGdkFont();
-       XFontStruct* pXFont = (XFontStruct*) prFont->xfont;
+       GdkFont* pFont = m_pFont->getGdkFont();
 
-       return pXFont->descent;
+       return pFont->descent;
 }
 
 void GR_UnixGraphics::drawLine(UT_sint32 x1, UT_sint32 y1,

Reply via email to