Add BiDi infrastructure

Shachar Shemesh sun at consumer.org.il
Thu Aug 15 11:08:24 CDT 2002


The following patch adds reliance on the fribidi infrastructure into Wine.

License: LGPL

Changelog:
    Shachar Shemesh <winecode at sun.consumer.org.il>

    configure.ac:
        Added a check for the existance of the fribidi include file. No 
check for the library, as we do not statically link with it.

    include/config.h.in:
        Added a couple of defines marking whether the libfribidi headers 
are available during compilation (a run time check is performed as well).

    include/bidi.h: (new file)
        Prototyping the bidi system.

    dlls/gdi/Makefile.in:
        Added "fribidi.c" to the makefile.

    dlls/gdi/fribidi.c: (new file)
        Initial code. Just try to load libfribidi.so and link with the 
relecant functions. Mark a global variable upon success.

    objects/gdiobj.c:
        Added a call to initialize the BiDi system.

-------------- next part --------------
Index: configure.ac
===================================================================
RCS file: /home/sun/sources/wine/cvs/wine/configure.ac,v
retrieving revision 1.69
diff -u -r1.69 configure.ac
--- configure.ac	9 Aug 2002 19:49:32 -0000	1.69
+++ configure.ac	14 Aug 2002 18:45:09 -0000
@@ -434,6 +434,18 @@
 fi
 AC_SUBST(FREETYPEINCL)
 
+dnl **** Check for fribidi ****
+# AC_CHECK_LIB(libfribidi,fribidi_log2vis,fribidi_lib=yes,fribidi_lib=no,)
+AC_CHECK_HEADER([fribidi/fribidi.h],fbd_lib=yes,fbd_lib=no)
+if test "$fbd_lib"="yes"
+then
+	AC_DEFINE(HAVE_FRIBIDI,1)
+	AC_DEFINE(HAVE_FRIBIDI_H,1)
+else		
+	AC_DEFINE(HAVE_FRIBIDI,0)
+	AC_DEFINE(HAVE_FRIBIDI_H,0)
+fi
+
 dnl **** Check for parport (currently Linux only) ****
 AC_CACHE_CHECK([for parport header/ppdev.h], ac_cv_c_ppdev,
  AC_TRY_COMPILE(
Index: dlls/gdi/Makefile.in
===================================================================
RCS file: /home/sun/sources/wine/cvs/wine/dlls/gdi/Makefile.in,v
retrieving revision 1.31
diff -u -r1.31 Makefile.in
--- dlls/gdi/Makefile.in	1 Aug 2002 18:36:58 -0000	1.31
+++ dlls/gdi/Makefile.in	14 Aug 2002 18:32:40 -0000
@@ -42,6 +42,7 @@
 	enhmfdrv/mapping.c \
 	enhmfdrv/objects.c \
 	freetype.c \
+	fribidi.c \
 	gdi_main.c \
 	mfdrv/bitblt.c \
 	mfdrv/dc.c \
Index: include/config.h.in
===================================================================
RCS file: /home/sun/sources/wine/cvs/wine/include/config.h.in,v
retrieving revision 1.127
diff -u -r1.127 config.h.in
--- include/config.h.in	9 Aug 2002 19:49:32 -0000	1.127
+++ include/config.h.in	14 Aug 2002 18:48:23 -0000
@@ -113,6 +113,12 @@
 /* Define to 1 if you have the <freetype/tttables.h> header file. */
 #undef HAVE_FREETYPE_TTTABLES_H
 
+/* Define to 1 if fribidi is available during compilation */
+#undef HAVE_FRIBIDI
+
+/* Define to 1 if you have the <fribidi/fribidi.h> header file. */
+#undef HAVE_FRIBIDI_H
+
 /* Define to 1 if you have the `ftruncate' function. */
 #undef HAVE_FTRUNCATE
 
Index: objects/gdiobj.c
===================================================================
RCS file: /home/sun/sources/wine/cvs/wine/objects/gdiobj.c,v
retrieving revision 1.76
diff -u -r1.76 gdiobj.c
--- objects/gdiobj.c	13 Jun 2002 23:59:53 -0000	1.76
+++ objects/gdiobj.c	14 Aug 2002 19:25:39 -0000
@@ -633,6 +633,10 @@
 
     WineEngInit();
 
+#if HAVE_FRIBIDI
+    WineBidiInit();
+#endif
+
     return TRUE;
 }
 
--- /dev/null	2002-07-08 21:54:59.000000000 +0300
+++ dlls/gdi/fribidi.c	2002-08-15 17:33:03.000000000 +0300
@@ -0,0 +1,108 @@
+/*
+ * The main BiDirectional functions, and interface to FriBiDi
+ *
+ * Copyright 2002 Shachar Shemesh.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include "config.h"
+
+#include "windef.h"
+#include "winerror.h"
+#include "winreg.h"
+#include "wingdi.h"
+#include "wine/unicode.h"
+#include "wine/port.h"
+#include "wine/debug.h"
+#include "gdi.h"
+#include "font.h"
+
+#include "bidi.h"
+#if HAVE_FRIBIDI_H
+#include <fribidi/fribidi.h>
+#endif /* HAVE_FRIBIDI_H */
+
+#ifndef SONAME_LIBFRIBIDI
+#define SONAME_LIBFRIBIDI "libfribidi.so"
+#endif
+
+WINE_DEFAULT_DEBUG_CHANNEL(text);
+
+/*
+ * A global variable stating whether runtime support for BiDi
+ * is available
+ */
+BOOL bidi_available=FALSE;
+
+static void *fbd_handle = NULL;
+
+#define MAKE_FUNCPTR(f) static typeof(f) * p##f = NULL;
+
+MAKE_FUNCPTR(fribidi_log2vis)
+MAKE_FUNCPTR(fribidi_remove_bidi_marks)
+MAKE_FUNCPTR(fribidi_mirroring_status)
+MAKE_FUNCPTR(fribidi_set_mirroring)
+
+
+/*
+ * Load the fribidi library, and initialize the "bidi_available" var.
+ */
+BOOL WineBidiInit(void)
+{
+	if( bidi_available || fbd_handle!=NULL )
+	{
+		WARN("WineBidiInit called after already being initialized\n");
+
+		return TRUE;
+	}
+
+	fbd_handle = wine_dlopen(SONAME_LIBFRIBIDI, RTLD_NOW, NULL, 0 );
+	if( !fbd_handle ) {
+		TRACE("Wine cannot find the FriBiDi library. Wine will not have Bidirectional\n"
+		      "support. To gain BiDirectional support, install libfribidi (available\n"
+		      "as a package to your system, or from http://fribidi.sourceforge.net)\n"
+		     );
+
+		return FALSE;
+	}
+
+#define LOAD_FUNCPTR(f) if((p##f = wine_dlsym(fbd_handle, #f, NULL, 0)) == NULL){WARN("Can't find symbol %s\n", #f); goto sym_not_found;}
+	
+	LOAD_FUNCPTR(fribidi_log2vis)
+	LOAD_FUNCPTR(fribidi_remove_bidi_marks)
+	LOAD_FUNCPTR(fribidi_mirroring_status)
+	LOAD_FUNCPTR(fribidi_set_mirroring)
+	
+#undef LOAD_FUNCPTR
+
+	bidi_available=TRUE;
+
+	return TRUE;
+
+sym_not_found:
+	WINE_MESSAGE(
+	  "Wine cannot find some of the libfribidi function necessary for proper BiDirectional\n"
+	  "support. Please make sure you are using at least version 0.10.4 of libfribidi. If\n"
+	  "it is not available as a package for your system, you can download it from\n"
+	  "http://fribidi.sf.net/\n"
+		    );
+
+	wine_dlclose(fbd_handle, NULL, 0);
+	fbd_handle=NULL;
+	
+	return FALSE;
+}
+
--- /dev/null	2002-07-08 21:54:59.000000000 +0300
+++ include/bidi.h	2002-08-15 16:59:35.000000000 +0300
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2002 Shachar Shemesh
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#if HAVE_FRIBIDI
+
+/*
+ * A global variable stating whether runtime support for BiDi
+ * is available
+ */
+extern BOOL bidi_available;
+
+/*
+ * Load the fribidi library, and initialize the "bidi_available" var.
+ */
+BOOL WineBidiInit(void);
+
+#endif /* HAVE_FRIBIDI */
+


More information about the wine-patches mailing list