dotgnu-pnet-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Dotgnu-pnet-commits] CVS: pnetlib/Xsharp Color.cs,1.1,1.2 Font.cs,1.2,1


From: Rhys Weatherley <address@hidden>
Subject: [Dotgnu-pnet-commits] CVS: pnetlib/Xsharp Color.cs,1.1,1.2 Font.cs,1.2,1.3 Graphics.cs,1.7,1.8 Xlib.cs.in,1.11,1.12 XsharpSupport.c,1.6,1.7
Date: Mon, 07 Jul 2003 22:09:08 -0400

Update of /cvsroot/dotgnu-pnet/pnetlib/Xsharp
In directory subversions:/tmp/cvs-serv801/Xsharp

Modified Files:
        Color.cs Font.cs Graphics.cs Xlib.cs.in XsharpSupport.c 
Log Message:


Add preliminary support for the Xft extension - currently commented
out because it doesn't work yet.


Index: Color.cs
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnetlib/Xsharp/Color.cs,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -r1.1 -r1.2
*** Color.cs    28 May 2003 04:17:53 -0000      1.1
--- Color.cs    8 Jul 2003 02:09:06 -0000       1.2
***************
*** 43,47 ****
  {
        // Internal state.
!       private uint value;
  
        /// <summary>
--- 43,47 ----
  {
        // Internal state.
!       internal uint value;
  
        /// <summary>

Index: Font.cs
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnetlib/Xsharp/Font.cs,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -r1.2 -r1.3
*** Font.cs     7 Jun 2003 07:40:16 -0000       1.2
--- Font.cs     8 Jul 2003 02:09:06 -0000       1.3
***************
*** 359,363 ****
                                                        infoList = info.next;
                                                }
!                                               Xlib.XFreeFontSet(dpy.dpy, 
info.fontSet);
                                        }
                                }
--- 359,363 ----
                                                        infoList = info.next;
                                                }
!                                               Xlib.XSharpFreeFont(dpy.dpy, 
info.fontSet);
                                        }
                                }

Index: Graphics.cs
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnetlib/Xsharp/Graphics.cs,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -r1.7 -r1.8
*** Graphics.cs 20 Jun 2003 23:28:28 -0000      1.7
--- Graphics.cs 8 Jul 2003 02:09:06 -0000       1.8
***************
*** 2216,2220 ****
                                        Xlib.XSharpDrawString
                                                        (display, 
drawableHandle, gc,
!                                                        fontSet, x, y, str, 
(int)(font.Style));
                                }
                                finally
--- 2216,2221 ----
                                        Xlib.XSharpDrawString
                                                        (display, 
drawableHandle, gc,
!                                                        fontSet, x, y, str, 
(int)(font.Style),
!                                                        IntPtr.Zero, 
foreground.value);
                                }
                                finally
***************
*** 2311,2316 ****
                                XRectangle overall_ink;
                                XRectangle overall_logical;
!                               Xlib.XSharpTextExtents
!                                       (fontSet, str, out overall_ink, out 
overall_logical);
                                width = overall_logical.width;
                                ascent = -(overall_logical.y);
--- 2312,2326 ----
                                XRectangle overall_ink;
                                XRectangle overall_logical;
!                               try
!                               {
!                                       IntPtr display = dpy.Lock();
!                                       Xlib.XSharpTextExtents
!                                               (display, fontSet, str,
!                                                out overall_ink, out 
overall_logical);
!                               }
!                               finally
!                               {
!                                       dpy.Unlock();
!                               }
                                width = overall_logical.width;
                                ascent = -(overall_logical.y);

Index: Xlib.cs.in
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnetlib/Xsharp/Xlib.cs.in,v
retrieving revision 1.11
retrieving revision 1.12
diff -C2 -r1.11 -r1.12
*** Xlib.cs.in  24 Jun 2003 02:18:56 -0000      1.11
--- Xlib.cs.in  8 Jul 2003 02:09:06 -0000       1.12
***************
*** 492,500 ****
                        (IntPtr display, String name, Bool only_if_exists);
  
-       // Declare font-related external functions.
- 
-       [DllImport("X11")]
-       extern public static void XFreeFontSet(IntPtr display, IntPtr fontSet);
- 
        // Declare property-related external functions.
  
--- 492,495 ----
***************
*** 526,537 ****
  
        [DllImport("XsharpSupport")]
        extern public static void XSharpDrawString
                        (IntPtr display, Drawable drawable, IntPtr gc,
                         IntPtr fontSet, @X_int@ x, @X_int@ y,
!                        String str, @X_int@ style);
  
        [DllImport("XsharpSupport")]
        extern public static void XSharpTextExtents
!                       (IntPtr fontSet, String str,
                         out XRectangle overall_ink_return,
                         out XRectangle overall_logical_return);
--- 521,536 ----
  
        [DllImport("XsharpSupport")]
+       extern public static void XSharpFreeFont(IntPtr display, IntPtr 
fontSet);
+ 
+       [DllImport("XsharpSupport")]
        extern public static void XSharpDrawString
                        (IntPtr display, Drawable drawable, IntPtr gc,
                         IntPtr fontSet, @X_int@ x, @X_int@ y,
!                        String str, @X_int@ style, IntPtr clipRegion,
!                        @X_ulong@ colorValue);
  
        [DllImport("XsharpSupport")]
        extern public static void XSharpTextExtents
!                       (IntPtr display, IntPtr fontSet, String str,
                         out XRectangle overall_ink_return,
                         out XRectangle overall_logical_return);

Index: XsharpSupport.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnetlib/Xsharp/XsharpSupport.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -r1.6 -r1.7
*** XsharpSupport.c     24 Jun 2003 18:30:44 -0000      1.6
--- XsharpSupport.c     8 Jul 2003 02:09:06 -0000       1.7
***************
*** 21,29 ****
--- 21,36 ----
  #if !defined(X_DISPLAY_MISSING) && HAVE_SELECT
  
+ /* XFT support doesn't work yet */
+ /*#define     USE_XFT_EXTENSION       1*/
+ 
  #include <X11/Xlib.h>
+ #include <X11/Xutil.h>
  #include <X11/Xatom.h>
  #ifdef WIN32
        #include <X11/Xwinsock.h>
  #endif
+ #ifdef USE_XFT_EXTENSION
+       #include <X11/Xft/Xft.h>
+ #endif
  #if TIME_WITH_SYS_TIME
        #include <sys/time.h>
***************
*** 91,94 ****
--- 98,103 ----
  #define       FontStyle_StrikeOut             8
  
+ #ifndef USE_XFT_EXTENSION
+ 
  /*
   * Try to create a font with specific parameters.
***************
*** 160,169 ****
  }
  
  /*
   * Create a font from a description.
   */
! XFontSet XSharpCreateFont(Display *dpy, const char *family,
!                                                 int pointSize, int style)
  {
        XFontSet fontSet;
  
--- 169,237 ----
  }
  
+ #endif /* USE_XFT_EXTENSION */
+ 
  /*
   * Create a font from a description.
   */
! void *XSharpCreateFont(Display *dpy, const char *family,
!                                          int pointSize, int style)
  {
+ #ifdef USE_XFT_EXTENSION
+ 
+       XftPattern *pattern;
+       XftPattern *matched;
+       XftFont *font;
+       XftResult result;
+ 
+       /* Create the font pattern to be used */
+       pattern = XftPatternCreate();
+       if(!pattern)
+       {
+               return 0;
+       }
+       if(!XftPatternAddString(pattern, XFT_FAMILY, family))
+       {
+               XftPatternDestroy(pattern);
+               return 0;
+       }
+       if(!XftPatternAddDouble(pattern, XFT_SIZE, ((double)pointSize) / 10.0))
+       {
+               XftPatternDestroy(pattern);
+               return 0;
+       }
+       if((style & FontStyle_Bold) != 0)
+       {
+               if(!XftPatternAddInteger(pattern, XFT_WEIGHT, XFT_WEIGHT_BOLD))
+               {
+                       XftPatternDestroy(pattern);
+                       return 0;
+               }
+       }
+       if((style & FontStyle_Italic) != 0)
+       {
+               if(!XftPatternAddInteger(pattern, XFT_SLANT, XFT_SLANT_ITALIC))
+               {
+                       XftPatternDestroy(pattern);
+                       return 0;
+               }
+       }
+ 
+       /* Perform font matching to find the closest possible font */
+       matched = XftFontMatch(dpy, DefaultScreen(dpy), pattern, &result);
+       XftPatternDestroy(pattern);
+       if(!matched)
+       {
+               return 0;
+       }
+ 
+       /* Create an Xft font based on the matched pattern */
+       font = XftFontOpenPattern(dpy, matched);
+       XftPatternDestroy(matched);
+ 
+       /* Return the font to the caller */
+       return font;
+ 
+ #else /* !USE_XFT_EXTENSION */
+ 
        XFontSet fontSet;
  
***************
*** 198,219 ****
        /* Remove everything - this will succeed unless X has no fonts at all! 
*/
        return TryCreateFont(dpy, 0, -1, FontStyle_Normal);
  }
  
  /*
   * Draw a string using a font set.
   */
  void XSharpDrawString(Display *dpy, Drawable drawable, GC gc,
!                                         XFontSet fontSet, int x, int y,
!                                         const char *str, int style)
  {
        XRectangle overall_ink_return;
        XRectangle overall_logical_return;
        XFontSetExtents *extents;
        int line1, line2;
  
!       /* Draw the string itself */
!       XmbDrawString(dpy, drawable, fontSet, gc, x, y,
                                  str, strlen(str));
  
        /* Calculate the positions of the underline and strike-out */
        if((style & FontStyle_Underline) != 0)
--- 266,346 ----
        /* Remove everything - this will succeed unless X has no fonts at all! 
*/
        return TryCreateFont(dpy, 0, -1, FontStyle_Normal);
+ 
+ #endif
  }
  
  /*
+  * Free a font set.
+  */
+ void XSharpFreeFont(Display *dpy, void *fontSet)
+ {
+ #ifdef USE_XFT_EXTENSION
+       XftFontClose(dpy, (XftFont *)fontSet);
+ #else
+       XFreeFontSet(dpy, (XFontSet)fontSet);
+ #endif
+ }
+ 
+ /*
+  * Forward declaration.
+  */
+ void XSharpTextExtents(Display *dpy, void *fontSet, const char *str,
+                                          XRectangle *overall_ink_return,
+                                          XRectangle *overall_logical_return);
+ 
+ /*
   * Draw a string using a font set.
   */
  void XSharpDrawString(Display *dpy, Drawable drawable, GC gc,
!                                         void *fontSet, int x, int y,
!                                         const char *str, int style, Region 
clipRegion,
!                                         unsigned long colorValue)
  {
        XRectangle overall_ink_return;
        XRectangle overall_logical_return;
+ #ifdef USE_XFT_EXTENSION
+       XftDraw *draw;
+       XftColor color;
+       XGCValues values;
+ #else
        XFontSetExtents *extents;
+ #endif
        int line1, line2;
  
! #ifdef USE_XFT_EXTENSION
! 
!       /* TODO: 16-bit fonts */
! 
!       /* Set up the Xft color value to draw with */
!       XGetGCValues(dpy, gc, GCForeground, &values);
!       color.pixel = values.foreground;
!       color.color.red = (unsigned short)(((colorValue >> 16) & 0xFF) << 8);
!       color.color.green = (unsigned short)(((colorValue >> 8) & 0xFF) << 8);
!       color.color.blue = (unsigned short)((colorValue & 0xFF) << 8);
!       color.color.alpha = (unsigned short)0xFFFF;
! 
!       /* Draw the string */
!       draw = XftDrawCreate(dpy, drawable,
!                                                DefaultVisual(dpy, 
DefaultScreen(dpy)),
!                                                DefaultColormap(dpy, 
DefaultScreen(dpy)));
!       if(draw)
!       {
!               if(clipRegion)
!               {
!                       XftDrawSetClip(draw, clipRegion);
!               }
!               XftDrawString8(draw, &color, (XftFont *)fontSet,
!                                          x, y, (XftChar8 *)str, strlen(str));
!               XftDrawDestroy(draw);
!       }
! 
! #else
! 
!       /* Draw the string using the core API */
!       XmbDrawString(dpy, drawable, (XFontSet)fontSet, gc, x, y,
                                  str, strlen(str));
  
+ #endif
+ 
        /* Calculate the positions of the underline and strike-out */
        if((style & FontStyle_Underline) != 0)
***************
*** 227,230 ****
--- 354,360 ----
        if((style & FontStyle_StrikeOut) != 0)
        {
+       #ifdef USE_XFT_EXTENSION
+               line2 = y + (((XftFont *)fontSet)->height / 2);
+       #else
                extents = XExtentsOfFontSet(fontSet);
                if(extents)
***************
*** 236,239 ****
--- 366,370 ----
                        line2 = y;
                }
+       #endif
        }
        else
***************
*** 245,250 ****
        if(line1 != y || line2 != y)
        {
!               XmbTextExtents(fontSet, str, strlen(str),
!                                          &overall_ink_return, 
&overall_logical_return);
                XSetLineAttributes(dpy, gc, 1, LineSolid, CapNotLast, 
JoinMiter);
                if(line1 != y)
--- 376,381 ----
        if(line1 != y || line2 != y)
        {
!               XSharpTextExtents(dpy, fontSet, str,
!                                             &overall_ink_return, 
&overall_logical_return);
                XSetLineAttributes(dpy, gc, 1, LineSolid, CapNotLast, 
JoinMiter);
                if(line1 != y)
***************
*** 264,273 ****
   * Calculate the extent information for a string.
   */
! void XSharpTextExtents(XFontSet fontSet, const char *str,
                                           XRectangle *overall_ink_return,
                                           XRectangle *overall_logical_return)
  {
!       XmbTextExtents(fontSet, str, strlen(str),
                                   overall_ink_return, overall_logical_return);
  }
  
--- 395,423 ----
   * Calculate the extent information for a string.
   */
! void XSharpTextExtents(Display *dpy, void *fontSet, const char *str,
                                           XRectangle *overall_ink_return,
                                           XRectangle *overall_logical_return)
  {
! #ifdef USE_XFT_EXTENSION
! 
!       /* TODO: 16-bit fonts */
! 
!       XGlyphInfo extents;
!       XftTextExtents8(dpy, fontSet, (XftChar8 *)str, strlen(str), &extents);
! 
!       overall_ink_return->x = -(extents.x);
!       overall_ink_return->y = -(extents.y);
!       overall_ink_return->width = extents.width;
!       overall_ink_return->height = extents.height;
! 
!       overall_logical_return->x = -(extents.x);
!       overall_logical_return->y = -(extents.y);
!       overall_logical_return->width = extents.x + extents.xOff;
!       overall_logical_return->height = extents.y + extents.yOff;
! 
! #else
!       XmbTextExtents((XFontSet)fontSet, str, strlen(str),
                                   overall_ink_return, overall_logical_return);
+ #endif
  }
  
***************
*** 275,284 ****
   * Calculate the extent information for a font.
   */
! void XSharpFontExtents(XFontSet fontSet,
                                           XRectangle *max_ink_return,
                                           XRectangle *max_logical_return)
  {
        XFontSetExtents *extents;
!       extents = XExtentsOfFontSet(fontSet);
        if(extents)
        {
--- 425,446 ----
   * Calculate the extent information for a font.
   */
! void XSharpFontExtents(void *fontSet,
                                           XRectangle *max_ink_return,
                                           XRectangle *max_logical_return)
  {
+ #ifdef USE_XFT_EXTENSION
+ 
+       /* Synthesize enough information to keep "Xsharp.FontExtents" happy */
+       max_logical_return->x = 0;
+       max_logical_return->y = -(((XftFont *)fontSet)->ascent);
+       max_logical_return->width = ((XftFont *)fontSet)->max_advance_width;
+       max_logical_return->height = ((XftFont *)fontSet)->ascent +
+                                                                ((XftFont 
*)fontSet)->descent;
+       *max_ink_return = *max_logical_return;
+ 
+ #else
+ 
        XFontSetExtents *extents;
!       extents = XExtentsOfFontSet((XFontSet)fontSet);
        if(extents)
        {
***************
*** 286,289 ****
--- 448,453 ----
                *max_logical_return = extents->max_logical_extent;
        }
+ 
+ #endif
  }
  
***************
*** 351,362 ****
  }
  
  void XSharpDrawString(void *dpy, unsigned long drawable, void *gc,
                                          void *fontSet, int x, int y,
!                                         const char *str, int style)
  {
        /* Nothing to do here */
  }
  
! void XSharpTextExtents(void *fontSet, const char *str,
                                           void *overall_ink_return,
                                           void *overall_logical_return)
--- 515,532 ----
  }
  
+ void XSharpFreeFont(void *dpy, void *fontSet)
+ {
+       /* Nothing to do here */
+ }
+ 
  void XSharpDrawString(void *dpy, unsigned long drawable, void *gc,
                                          void *fontSet, int x, int y,
!                                         const char *str, int style, void 
*clipRegion,
!                                         unsigned long colorValue)
  {
        /* Nothing to do here */
  }
  
! void XSharpTextExtents(void *dpy, void *fontSet, const char *str,
                                           void *overall_ink_return,
                                           void *overall_logical_return)





reply via email to

[Prev in Thread] Current Thread [Next in Thread]