Move Applications tab before Libraries tab.
[wine.git] / dlls / gdi / bidi.c
blob13e2d59a4c723c58d73a11e05fef73c8493ee7ad
2 /*
3 * GDI BiDirectional handling
5 * Copyright 2003 Shachar Shemesh
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include "config.h"
24 #include <stdarg.h>
25 #ifdef HAVE_UNICODE_UBIDI_H
26 #include <unicode/ubidi.h>
27 #endif
29 #include "windef.h"
30 #include "winbase.h"
31 #include "wingdi.h"
32 #include "wine/debug.h"
33 #include "gdi.h"
35 WINE_DEFAULT_DEBUG_CHANNEL(bidi);
37 #if HAVE_ICU
38 BOOL BidiAvail = TRUE;
39 #else
40 BOOL BidiAvail = FALSE;
41 #endif
44 /*************************************************************
45 * BIDI_Reorder
47 BOOL BIDI_Reorder(
48 LPCWSTR lpString, /* [in] The string for which information is to be returned */
49 INT uCount, /* [in] Number of WCHARs in string. */
50 DWORD dwFlags, /* [in] GetCharacterPlacement compatible flags specifying how to process the string */
51 DWORD dwWineGCP_Flags, /* [in] Wine internal flags - Force paragraph direction */
52 LPWSTR lpOutString, /* [out] Reordered string */
53 INT uCountOut, /* [in] Size of output buffer */
54 UINT *lpOrder /* [out] Logical -> Visual order map */
57 #ifdef HAVE_ICU
58 TRACE("%s, %d, 0x%08lx\n",
59 debugstr_wn(lpString, uCount), uCount, dwFlags);
61 TRACE("lpOutString=%p, lpOrder=%p", lpOutString, lpOrder );
63 if ((dwFlags & GCP_REORDER) != 0) {
64 UBiDi *bidi;
65 UErrorCode err=0;
66 UBiDiLevel level;
68 bidi=ubidi_open();
69 if( bidi==NULL ) {
70 WARN("Failed to allocate structure\n");
71 SetLastError(ERROR_NOT_ENOUGH_MEMORY);
72 return FALSE;
75 switch( dwWineGCP_Flags&WINE_GCPW_DIR_MASK )
77 case WINE_GCPW_FORCE_LTR:
78 level=0;
79 break;
80 case WINE_GCPW_FORCE_RTL:
81 level=1;
82 break;
83 case WINE_GCPW_LOOSE_LTR:
84 level=UBIDI_DEFAULT_LTR;
85 break;
86 case WINE_GCPW_LOOSE_RTL:
87 level=UBIDI_DEFAULT_RTL;
88 break;
91 ubidi_setPara( bidi, lpString, uCount, level, NULL, &err );
92 if( lpOutString!=NULL ) {
93 ubidi_writeReordered( bidi, lpOutString, uCount,
94 (dwFlags&GCP_SYMSWAPOFF)?0:UBIDI_DO_MIRRORING, &err );
97 if( lpOrder!=NULL ) {
98 ubidi_getLogicalMap( bidi, lpOrder, &err );
101 ubidi_close( bidi );
103 if( U_FAILURE(err) ) {
104 FIXME("ICU Library return error code %d.\n", err );
105 FIXME("Please report this error to wine-devel@winehq.org so we can place "
106 "descriptive Windows error codes here\n");
107 SetLastError(ERROR_INVALID_LEVEL); /* This error is cryptic enough not to mean anything, I hope */
109 return FALSE;
112 return TRUE;
113 #else /* HAVE_ICU */
114 return FALSE;
115 #endif /* HAVE_ICU */