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