1
/* This software is subject to the terms of the Common Public License
2
You must accept the terms of this license to use this software.
4
Copyright (C) 2002, International Business Machines Corporation
5
and others. All Rights Reserved.
7
Further information about Common Public License Version 0.5 is obtained
8
from url http://oss.software.ibm.com/developer/opensource/license-cpl.html */
10
#include <fribidi/fribidi.h>
15
#include "iterm/vtlayout.h"
17
struct ConcreteVTLayout {
24
static int mbstoFriBidichars(FriBidiChar *fribidi_string,
28
/* We asume that wchar_t is UCS-4, this sould be somehow removed */
29
wchar_t *wstr = (wchar_t *)fribidi_string;
34
memset(&ps,0,sizeof(ps));
36
ret = mbsrtowcs(wstr, &string, *fribidi_length, &ps);
38
if( ret == (size_t)(-1) )
43
/* on IA64 FriBidiChar is 8 bytes */
44
if(4 < sizeof(FriBidiChar))
48
fribidi_string[i] = wstr[i];
51
fribidi_string[ret] = 0;
52
*fribidi_length = ret;
57
static int FriBidiCharstombs(char *out, size_t *out_len,
58
FriBidiChar *fribidi_string)
60
/* We asume that wchar_t is UCS-4, this sould be somehow removed */
61
wchar_t *wstr = (wchar_t *)fribidi_string;
66
/* on IA64 FriBidiChar is 8 bytes */
67
if(4 < sizeof(FriBidiChar))
69
for(i=0;fribidi_string[i];i++)
71
wstr[i] = fribidi_string[i];
75
memset(&ps,0,sizeof(ps));
77
ret = wcsrtombs(out,(const wchar_t **)&wstr,*out_len,&ps);
79
if( ret == (size_t)(-1) || errno )
86
static int VTLayout_transform(VTLayout *vtlayout,
88
size_t logical_length,
90
size_t *visual_length,
91
size_t *logical2visual_index,
92
size_t *visual2logical_index,
93
size_t *embedding_level)
96
FriBidiChar *fribidi_logical = NULL;
97
int fribidi_logical_length;
98
FriBidiChar *fribidi_visual = NULL;
99
int fribidi_visual_length;
100
FriBidiStrIndex *l2v_index = NULL;
101
FriBidiStrIndex *v2l_index = NULL;
102
FriBidiLevel *embedding_level_list = NULL;
103
FriBidiCharType fribidi_type;
108
if(fribidi_logical) \
109
free(fribidi_logical); \
111
free(fribidi_visual); \
116
if(embedding_level_list) \
117
free(embedding_level_list); \
120
array_size = fribidi_logical_length =
121
fribidi_visual_length = logical_length+1;
123
if( (fribidi_logical = (FriBidiChar *)
124
calloc(array_size,sizeof(FriBidiChar))) == NULL)
127
if( (fribidi_visual = (FriBidiChar *)
128
calloc(array_size,sizeof(FriBidiChar))) == NULL)
131
if(logical2visual_index)
133
if( (l2v_index = (FriBidiStrIndex *)
134
calloc(array_size,sizeof(FriBidiStrIndex))) == NULL)
138
if(visual2logical_index)
140
if( (v2l_index = (FriBidiStrIndex *)
141
calloc(array_size,sizeof(FriBidiStrIndex))) == NULL)
147
if( (embedding_level_list = (FriBidiLevel *)
148
calloc(array_size,sizeof(FriBidiLevel))) == NULL)
152
logical[logical_length] = '\0';
153
if(mbstoFriBidichars(fribidi_logical,
154
&fribidi_logical_length,
158
if(vtlayout->concrete_layout->is_LTR)
159
fribidi_type = FRIBIDI_TYPE_LTR;
161
fribidi_type = FRIBIDI_TYPE_RTL;
162
fribidi_log2vis(fribidi_logical,
163
fribidi_logical_length,
168
embedding_level_list);
172
for(i=0;i<array_size;i++)
173
logical2visual_index[i] = l2v_index[i];
177
for(i=0;i<array_size;i++)
178
visual2logical_index[i] = v2l_index[i];
180
if(embedding_level_list)
181
for(i=0;i<array_size;i++)
182
embedding_level[i] = embedding_level_list[i];
184
if(FriBidiCharstombs(visual,visual_length,fribidi_visual))
194
static void VTLayout_set_global_direction(VTLayout *vtlayout,
200
vtlayout->concrete_layout->is_LTR = 0;
203
vtlayout->concrete_layout->is_LTR = 1;
210
static int VTLayout_is_direction_LTR(VTLayout *vtlayout)
212
return vtlayout->concrete_layout->is_LTR;
216
VTLayout *VTLayout_new()
220
if((vtlayout = (VTLayout *)malloc(sizeof(VTLayout))) == NULL)
223
if((vtlayout->concrete_layout =
224
(struct ConcreteVTLayout *)malloc(sizeof(struct ConcreteVTLayout)))
231
vtlayout->concrete_layout->is_LTR = 1;
232
vtlayout->concrete_layout->is_nonimal = 1;
233
vtlayout->concrete_layout->is_shaped = 1;
234
vtlayout->transform = VTLayout_transform;
235
vtlayout->set_global_direction = VTLayout_set_global_direction;
236
vtlayout->is_direction_LTR = VTLayout_is_direction_LTR;
237
vtlayout->set_numerals = NULL;
242
void VTLayout_destroy(VTLayout *vtlayout)
246
if(vtlayout->concrete_layout)
247
free(vtlayout->concrete_layout);