mirror of
https://github.com/VincentWei/MiniGUI.git
synced 2026-09-23 16:43:58 +08:00
Tune APIs of Achar32
This commit is contained in:
+655
-669
File diff suppressed because it is too large
Load Diff
+391
-391
File diff suppressed because it is too large
Load Diff
+36
-36
@@ -44,20 +44,20 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct _GLYPHBUF
|
||||
typedef struct _ACHARBUF
|
||||
{
|
||||
GLYPHMAPINFO* glyph_map; /* glyph info array */
|
||||
Glyph32* glyphs; /* glyph array */
|
||||
int glyphs_len; /* glyph array len or buffer used size */
|
||||
ACHARMAPINFO* achar_map; /* achar info array */
|
||||
Achar32* achars; /* achar array */
|
||||
int achars_len; /* achar array len or buffer used size */
|
||||
int blocksize; /* block size, a block is an allocate unit */
|
||||
int glyphs_buffsize; /* glyph string buffer size */
|
||||
int glyphmap_buffsize; /* glyph map buffer size */
|
||||
} GLYPHBUF;
|
||||
int achars_buffsize; /* achar string buffer size */
|
||||
int acharmap_buffsize; /* achar map buffer size */
|
||||
} ACHARBUF;
|
||||
|
||||
typedef struct tagBIDISLEDITDATA
|
||||
{
|
||||
StrBuffer str_content; // string text buffer
|
||||
GLYPHBUF glyph_content; // glyph string buffer
|
||||
ACHARBUF achar_content; // achar string buffer
|
||||
|
||||
int editPos; // current edit position
|
||||
int selStart; // selection start position
|
||||
@@ -91,48 +91,48 @@ typedef struct tagBIDISLEDITDATA
|
||||
typedef BIDISLEDITDATA* PBIDISLEDITDATA;
|
||||
|
||||
static inline void*
|
||||
glyphbuf_alloc (GLYPHBUF* glyph_buff, int len, int block_size)
|
||||
acharbuf_alloc (ACHARBUF* achar_buff, int len, int block_size)
|
||||
{
|
||||
glyph_buff->glyphs_buffsize = (len + (block_size - len % block_size))
|
||||
* sizeof (Glyph32);
|
||||
glyph_buff->glyphs = malloc (glyph_buff->glyphs_buffsize);
|
||||
achar_buff->achars_buffsize = (len + (block_size - len % block_size))
|
||||
* sizeof (Achar32);
|
||||
achar_buff->achars = malloc (achar_buff->achars_buffsize);
|
||||
|
||||
glyph_buff->glyphmap_buffsize = (len + (block_size - len % block_size))
|
||||
* sizeof (GLYPHMAPINFO);
|
||||
glyph_buff->glyph_map = malloc (glyph_buff->glyphmap_buffsize);
|
||||
achar_buff->acharmap_buffsize = (len + (block_size - len % block_size))
|
||||
* sizeof (ACHARMAPINFO);
|
||||
achar_buff->achar_map = malloc (achar_buff->acharmap_buffsize);
|
||||
|
||||
glyph_buff->glyphs_len = len;
|
||||
glyph_buff->blocksize = block_size;
|
||||
achar_buff->achars_len = len;
|
||||
achar_buff->blocksize = block_size;
|
||||
|
||||
return glyph_buff->glyphs;
|
||||
return achar_buff->achars;
|
||||
}
|
||||
|
||||
static inline void glyphbuf_free (GLYPHBUF *glyph_buff)
|
||||
static inline void acharbuf_free (ACHARBUF *achar_buff)
|
||||
{
|
||||
if (glyph_buff) {
|
||||
free (glyph_buff->glyphs);
|
||||
free (glyph_buff->glyph_map);
|
||||
if (achar_buff) {
|
||||
free (achar_buff->achars);
|
||||
free (achar_buff->achar_map);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void* glyphbuf_realloc (GLYPHBUF *glyph_buff, int len)
|
||||
static inline void* acharbuf_realloc (ACHARBUF *achar_buff, int len)
|
||||
{
|
||||
if (len * sizeof(int) > glyph_buff->glyphs_buffsize ||
|
||||
len * sizeof(int) < glyph_buff->glyphs_buffsize - glyph_buff->blocksize) {
|
||||
/* realloc glyph string mem */
|
||||
glyph_buff->glyphs_buffsize = (len + (glyph_buff->blocksize -
|
||||
len % glyph_buff->blocksize))* sizeof(Glyph32);
|
||||
glyph_buff->glyphs = realloc (glyph_buff->glyphs,
|
||||
glyph_buff->glyphs_buffsize);
|
||||
if (len * sizeof(int) > achar_buff->achars_buffsize ||
|
||||
len * sizeof(int) < achar_buff->achars_buffsize - achar_buff->blocksize) {
|
||||
/* realloc achar string mem */
|
||||
achar_buff->achars_buffsize = (len + (achar_buff->blocksize -
|
||||
len % achar_buff->blocksize))* sizeof(Achar32);
|
||||
achar_buff->achars = realloc (achar_buff->achars,
|
||||
achar_buff->achars_buffsize);
|
||||
|
||||
/* realloc glyph map mem */
|
||||
glyph_buff->glyphmap_buffsize = (len + (glyph_buff->blocksize -
|
||||
len % glyph_buff->blocksize))* sizeof(GLYPHMAPINFO);
|
||||
glyph_buff->glyph_map = realloc (glyph_buff->glyph_map,
|
||||
glyph_buff->glyphmap_buffsize);
|
||||
/* realloc achar map mem */
|
||||
achar_buff->acharmap_buffsize = (len + (achar_buff->blocksize -
|
||||
len % achar_buff->blocksize))* sizeof(ACHARMAPINFO);
|
||||
achar_buff->achar_map = realloc (achar_buff->achar_map,
|
||||
achar_buff->acharmap_buffsize);
|
||||
}
|
||||
|
||||
return glyph_buff->glyphs;
|
||||
return achar_buff->achars;
|
||||
}
|
||||
|
||||
BOOL RegisterBIDISLEditControl (void);
|
||||
|
||||
+16
-16
@@ -174,12 +174,12 @@ static unsigned short iso8859_68x_unicode_map [] =
|
||||
0xFEF7, 0xFEF8, 0xFEF9, 0xFEFA, /*0x130~0x133*/
|
||||
};
|
||||
|
||||
static Uchar32 iso8859_6_conv_to_uc32 (Mchar32 chv)
|
||||
static Uchar32 iso8859_6_conv_to_uc32 (Achar32 chv)
|
||||
{
|
||||
if (chv < 0x81)
|
||||
return (Mchar32) (chv);
|
||||
return (Achar32) (chv);
|
||||
else if (chv <= MAX_GLYPH_VALUE )
|
||||
return (Mchar32) iso8859_68x_unicode_map[chv - 0x81];
|
||||
return (Achar32) iso8859_68x_unicode_map[chv - 0x81];
|
||||
else
|
||||
return 0xFFFF;
|
||||
}
|
||||
@@ -454,7 +454,7 @@ static int iso8859_6_len_first_char (const unsigned char* mstr, int len)
|
||||
|
||||
#define ISARABIC_LIG_HALF(s) ((s == 0xa5) || (s == 0xa6))
|
||||
|
||||
static unsigned int iso8859_6_char_type (Mchar32 chv)
|
||||
static unsigned int iso8859_6_char_type (Achar32 chv)
|
||||
{
|
||||
unsigned int ch_type = MCHAR_TYPE_UNKNOWN;
|
||||
|
||||
@@ -586,7 +586,7 @@ static Uint32 __mg_iso8859_68x_type[] = {
|
||||
BIDI_TYPE_AL, BIDI_TYPE_AL, BIDI_TYPE_AL, BIDI_TYPE_AL,
|
||||
};
|
||||
|
||||
static unsigned int iso8859_6_bidi_char_type (Mchar32 chv)
|
||||
static unsigned int iso8859_6_bidi_char_type (Achar32 chv)
|
||||
{
|
||||
return __mg_iso8859_68x_type [chv];
|
||||
}
|
||||
@@ -655,7 +655,7 @@ static int get_next_char(const unsigned char* mchar, int len)
|
||||
#ifndef _DEBUG
|
||||
static
|
||||
#endif
|
||||
Mchar32 iso8859_6_get_char_value (const unsigned char* prev_mchar,
|
||||
Achar32 iso8859_6_get_char_value (const unsigned char* prev_mchar,
|
||||
int prev_len, const unsigned char* mchar, int len)
|
||||
{
|
||||
BOOL next_affects_joining = FALSE, prev_affects_joining = FALSE;
|
||||
@@ -772,18 +772,18 @@ static const unsigned char* iso8859_6_get_next_word (const unsigned char* mstr,
|
||||
|
||||
/*if cur_len>1, search ligature shape,
|
||||
* else search letter or phonetic symbol shape*/
|
||||
static Mchar32 iso8859_6_get_shaped_char_value (const unsigned char* cur_mchar,
|
||||
static Achar32 iso8859_6_get_shaped_char_value (const unsigned char* cur_mchar,
|
||||
int cur_len, int shape_type)
|
||||
{
|
||||
Mchar32 chv = -1;
|
||||
Achar32 chv = -1;
|
||||
int ignore;
|
||||
int index;
|
||||
|
||||
if (cur_len > 1)
|
||||
{
|
||||
if (shape_type == GLYPH_ISOLATED)
|
||||
if (shape_type == ACHAR_ISOLATED)
|
||||
chv = get_ligature (cur_mchar, cur_len, FALSE, &ignore);
|
||||
else if (shape_type != GLYPH_INITIAL) {
|
||||
else if (shape_type != ACHAR_INITIAL) {
|
||||
/* LAM+ALEF+HAMAZ+MADDA ligature. */
|
||||
if (*cur_mchar == LAM)
|
||||
chv = fontset_68x_get_ligature_char(*(cur_mchar+1), TRUE, &ignore);
|
||||
@@ -800,16 +800,16 @@ static Mchar32 iso8859_6_get_shaped_char_value (const unsigned char* cur_mchar,
|
||||
if (index >=0)
|
||||
{
|
||||
switch (shape_type) {
|
||||
case GLYPH_ISOLATED:
|
||||
case ACHAR_ISOLATED:
|
||||
chv = shape_info[index].isolated;
|
||||
break;
|
||||
case GLYPH_FINAL:
|
||||
case ACHAR_FINAL:
|
||||
chv = shape_info[index].final;
|
||||
break;
|
||||
case GLYPH_INITIAL:
|
||||
case ACHAR_INITIAL:
|
||||
chv = shape_info[index].initial;
|
||||
break;
|
||||
case GLYPH_MEDIAL:
|
||||
case ACHAR_MEDIAL:
|
||||
chv = shape_info[index].medial;
|
||||
break;
|
||||
}
|
||||
@@ -839,7 +839,7 @@ static const BIDICHAR_MIRROR_MAP __mg_iso8859_68x_mirror_table [] =
|
||||
// {0x00BB, 0x00AB}
|
||||
};
|
||||
|
||||
static BOOL iso8859_6_bidi_mirror_char (Mchar32 chv, Mchar32* mirrored)
|
||||
static BOOL iso8859_6_bidi_mirror_char (Achar32 chv, Achar32* mirrored)
|
||||
{
|
||||
return get_mirror_char (__mg_iso8859_68x_mirror_table,
|
||||
TABLESIZE (__mg_iso8859_68x_mirror_table), chv, mirrored);
|
||||
@@ -868,7 +868,7 @@ static CHARSETOPS CharsetOps_iso8859_6 = {
|
||||
};
|
||||
|
||||
#ifdef _DEBUG
|
||||
int iso8859_6_test_chv (int char_index, Mchar32 chv)
|
||||
int iso8859_6_test_chv (int char_index, Achar32 chv)
|
||||
{
|
||||
int i = 0;
|
||||
for (i = 0; i<SHAPENUMBER; i++) {
|
||||
|
||||
+43
-56
@@ -133,7 +133,7 @@ static void print_run_types(TYPERUN *pp)
|
||||
fprintf (stderr, "\n");
|
||||
}
|
||||
|
||||
static void print_hexstr(Glyph32* str, int len, BOOL reorder_state)
|
||||
static void print_hexstr(Achar32* str, int len, BOOL reorder_state)
|
||||
{
|
||||
int m = 0;
|
||||
|
||||
@@ -154,7 +154,7 @@ static void print_hexstr(Glyph32* str, int len, BOOL reorder_state)
|
||||
|
||||
#else /* BIDI_DEBUG */
|
||||
|
||||
inline static void print_hexstr(Glyph32* str, int len, BOOL reorder_state)
|
||||
inline static void print_hexstr(Achar32* str, int len, BOOL reorder_state)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -218,7 +218,7 @@ static void compact_neutrals (TYPERUN *list)
|
||||
(p) = (q); \
|
||||
} while (0)
|
||||
|
||||
static TYPERUN* get_runtype_link (const CHARSETOPS* charset_ops, Glyph32* glyphs, int len)
|
||||
static TYPERUN* get_runtype_link (const CHARSETOPS* charset_ops, Achar32* achars, int len)
|
||||
{
|
||||
int type = 0;
|
||||
TYPERUN *list, *last, *link;
|
||||
@@ -231,7 +231,7 @@ static TYPERUN* get_runtype_link (const CHARSETOPS* charset_ops, Glyph32* glyphs
|
||||
last = list;
|
||||
|
||||
for (i = 0; i < len; i++){
|
||||
if ((type = charset_ops->bidi_char_type (glyphs[i])) != last->type){
|
||||
if ((type = charset_ops->bidi_char_type (achars[i])) != last->type){
|
||||
link = calloc(1, sizeof(TYPERUN));
|
||||
link->type = type;
|
||||
link->pos = i;
|
||||
@@ -473,7 +473,7 @@ static int bidi_resolveImplicit(TYPERUN **ptype_rl_list, int base_level)
|
||||
|
||||
/* 6.Resolving Mirrored Char. */
|
||||
static void
|
||||
bidi_resolveMirrorChar (const CHARSETOPS* charset_ops, Glyph32* glyphs, int len,
|
||||
bidi_resolveMirrorChar (const CHARSETOPS* charset_ops, Achar32* achars, int len,
|
||||
TYPERUN **ptype_rl_list, int base_level)
|
||||
{
|
||||
TYPERUN *type_rl_list = *ptype_rl_list, *pp = NULL;
|
||||
@@ -486,9 +486,9 @@ bidi_resolveMirrorChar (const CHARSETOPS* charset_ops, Glyph32* glyphs, int len,
|
||||
int i;
|
||||
for (i = POS (pp); i < POS (pp) + LEN (pp); i++)
|
||||
{
|
||||
Glyph32 mirrored_ch;
|
||||
if (charset_ops->bidi_mirror_char && charset_ops->bidi_mirror_char (glyphs[i], &mirrored_ch))
|
||||
glyphs[i] = mirrored_ch;
|
||||
Achar32 mirrored_ch;
|
||||
if (charset_ops->bidi_mirror_char && charset_ops->bidi_mirror_char (achars[i], &mirrored_ch))
|
||||
achars[i] = mirrored_ch;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -497,7 +497,7 @@ bidi_resolveMirrorChar (const CHARSETOPS* charset_ops, Glyph32* glyphs, int len,
|
||||
}
|
||||
|
||||
static void bidi_resolve_string (const CHARSETOPS* charset_ops,
|
||||
Glyph32* glyphs, int len, int pel,
|
||||
Achar32* achars, int len, int pel,
|
||||
TYPERUN **ptype_rl_list, BYTE *pmax_level)
|
||||
{
|
||||
BYTE base_level = 0;
|
||||
@@ -505,7 +505,7 @@ static void bidi_resolve_string (const CHARSETOPS* charset_ops,
|
||||
TYPERUN *type_rl_list = NULL;
|
||||
|
||||
/* split the text to some runs. */
|
||||
type_rl_list = get_runtype_link (charset_ops, glyphs, len);
|
||||
type_rl_list = get_runtype_link (charset_ops, achars, len);
|
||||
|
||||
/* 1.Find base level */
|
||||
if (pel != 0 && pel != 1) {
|
||||
@@ -529,24 +529,24 @@ static void bidi_resolve_string (const CHARSETOPS* charset_ops,
|
||||
*pmax_level = bidi_resolveImplicit(&type_rl_list, base_level);
|
||||
|
||||
/* 6.Resolving Mirrored Char. */
|
||||
bidi_resolveMirrorChar (charset_ops, glyphs, len, &type_rl_list, base_level);
|
||||
bidi_resolveMirrorChar (charset_ops, achars, len, &type_rl_list, base_level);
|
||||
|
||||
*ptype_rl_list = type_rl_list;
|
||||
}
|
||||
|
||||
typedef struct _REORDER_CONTEXT {
|
||||
Glyph32* glyphs;
|
||||
Achar32* achars;
|
||||
void* extra;
|
||||
CB_REVERSE_EXTRA cb;
|
||||
} REORDER_CONTEXT;
|
||||
|
||||
static void bidi_reverse_glyphs (Glyph32* glyphs, int len, int pos)
|
||||
static void bidi_reverse_achars (Achar32* achars, int len, int pos)
|
||||
{
|
||||
int i;
|
||||
Glyph32* gs = glyphs + pos;
|
||||
Achar32* gs = achars + pos;
|
||||
|
||||
for (i = 0; i < len / 2; i++) {
|
||||
Glyph32 tmp = gs[i];
|
||||
Achar32 tmp = gs[i];
|
||||
gs[i] = gs[len - 1 - i];
|
||||
gs[len - 1 - i] = tmp;
|
||||
}
|
||||
@@ -573,8 +573,8 @@ static void bidi_reorder (REORDER_CONTEXT* context, int len,
|
||||
}
|
||||
pp = pp1->prev;
|
||||
|
||||
if (context->glyphs) {
|
||||
bidi_reverse_glyphs(context->glyphs, len, pos);
|
||||
if (context->achars) {
|
||||
bidi_reverse_achars(context->achars, len, pos);
|
||||
}
|
||||
|
||||
if (context->extra && context->cb) {
|
||||
@@ -599,16 +599,16 @@ static void bidi_reverse_chars (void* context, int len, int pos)
|
||||
}
|
||||
|
||||
void __mg_charset_bidi_get_embeddlevels (const CHARSETOPS* charset_ops,
|
||||
Glyph32* glyphs, int len, int pel, Uint8* embedding_levels, Uint8 type)
|
||||
Achar32* achars, int len, int pel, Uint8* embedding_levels, Uint8 type)
|
||||
{
|
||||
int i = 0;
|
||||
BYTE max_level = 1;
|
||||
TYPERUN *type_rl_list = NULL, *pp;
|
||||
|
||||
print_hexstr(glyphs, len, FALSE);
|
||||
print_hexstr(achars, len, FALSE);
|
||||
|
||||
/* W1~W7, N1~N2, I1~I2, Get the Embedding Level. */
|
||||
bidi_resolve_string (charset_ops, glyphs, len, pel, &type_rl_list,
|
||||
bidi_resolve_string (charset_ops, achars, len, pel, &type_rl_list,
|
||||
&max_level);
|
||||
|
||||
/* type = 0, get the logical embedding level; else visual level.*/
|
||||
@@ -621,7 +621,7 @@ void __mg_charset_bidi_get_embeddlevels (const CHARSETOPS* charset_ops,
|
||||
if (type) {
|
||||
REORDER_CONTEXT rc;
|
||||
|
||||
rc.glyphs = NULL;
|
||||
rc.achars = NULL;
|
||||
rc.extra = embedding_levels;
|
||||
rc.cb = bidi_reverse_chars;
|
||||
bidi_reorder(&rc, len, &type_rl_list, max_level);
|
||||
@@ -630,7 +630,7 @@ void __mg_charset_bidi_get_embeddlevels (const CHARSETOPS* charset_ops,
|
||||
/* free typerun list.*/
|
||||
free_typerun_list(type_rl_list);
|
||||
|
||||
print_hexstr(glyphs, len, TRUE);
|
||||
print_hexstr(achars, len, TRUE);
|
||||
}
|
||||
|
||||
#if 0
|
||||
@@ -646,8 +646,8 @@ static void bidi_map_reverse (void* context, int len, int pos)
|
||||
}
|
||||
}
|
||||
|
||||
Glyph32* __mg_charset_bidi_map_reorder (const CHARSETOPS* charset_ops,
|
||||
Glyph32* glyphs, int len, GLYPHMAPINFO* map, int pel)
|
||||
Achar32* __mg_charset_bidi_map_reorder (const CHARSETOPS* charset_ops,
|
||||
Achar32* achars, int len, GLYPHMAPINFO* map, int pel)
|
||||
{
|
||||
BYTE max_level = 1;
|
||||
TYPERUN *type_rl_list = NULL;
|
||||
@@ -656,10 +656,10 @@ Glyph32* __mg_charset_bidi_map_reorder (const CHARSETOPS* charset_ops,
|
||||
int run_pos;
|
||||
int run_len;
|
||||
|
||||
print_hexstr(glyphs, len, FALSE);
|
||||
print_hexstr(achars, len, FALSE);
|
||||
|
||||
/* W1~W7, N1~N2, I1~I2, Get the Embedding Level. */
|
||||
bidi_resolve_string (charset_ops, glyphs, len, pel, &type_rl_list, &max_level);
|
||||
bidi_resolve_string (charset_ops, achars, len, pel, &type_rl_list, &max_level);
|
||||
|
||||
for (node_p=type_rl_list->next; node_p->next; node_p=node_p->next) {
|
||||
run_pos = node_p->pos;
|
||||
@@ -677,21 +677,21 @@ Glyph32* __mg_charset_bidi_map_reorder (const CHARSETOPS* charset_ops,
|
||||
/* free typerun list.*/
|
||||
free_typerun_list(type_rl_list);
|
||||
|
||||
print_hexstr(glyphs, len, TRUE);
|
||||
print_hexstr(achars, len, TRUE);
|
||||
|
||||
return glyphs;
|
||||
return achars;
|
||||
}
|
||||
|
||||
Glyph32* __mg_charset_bidi_index_reorder (const CHARSETOPS* charset_ops,
|
||||
Glyph32* glyphs, int len, int* index_map, int pel)
|
||||
Achar32* __mg_charset_bidi_index_reorder (const CHARSETOPS* charset_ops,
|
||||
Achar32* achars, int len, int* index_map, int pel)
|
||||
{
|
||||
BYTE max_level = 1;
|
||||
TYPERUN *type_rl_list = NULL;
|
||||
|
||||
print_hexstr(glyphs, len, FALSE);
|
||||
print_hexstr(achars, len, FALSE);
|
||||
|
||||
/* W1~W7, N1~N2, I1~I2, Get the Embedding Level. */
|
||||
bidi_resolve_string (charset_ops, glyphs, len, pel, &type_rl_list, &max_level);
|
||||
bidi_resolve_string (charset_ops, achars, len, pel, &type_rl_list, &max_level);
|
||||
|
||||
bidi_reorder_cb(index_map, len, &type_rl_list, max_level,
|
||||
bidi_string_reverse);
|
||||
@@ -699,27 +699,27 @@ Glyph32* __mg_charset_bidi_index_reorder (const CHARSETOPS* charset_ops,
|
||||
/* free typerun list.*/
|
||||
free_typerun_list(type_rl_list);
|
||||
|
||||
print_hexstr(glyphs, len, TRUE);
|
||||
print_hexstr(achars, len, TRUE);
|
||||
|
||||
return glyphs;
|
||||
return achars;
|
||||
}
|
||||
#endif
|
||||
|
||||
Glyph32* __mg_charset_bidi_glyphs_reorder (const CHARSETOPS* charset_ops,
|
||||
Glyph32* glyphs, int len, int pel,
|
||||
Achar32* __mg_charset_bidi_achars_reorder (const CHARSETOPS* charset_ops,
|
||||
Achar32* achars, int len, int pel,
|
||||
void* extra, CB_REVERSE_EXTRA cb_reverse_extra)
|
||||
{
|
||||
BYTE max_level = 1;
|
||||
TYPERUN *type_rl_list = NULL;
|
||||
REORDER_CONTEXT rc;
|
||||
|
||||
print_hexstr(glyphs, len, FALSE);
|
||||
print_hexstr(achars, len, FALSE);
|
||||
|
||||
/* W1~W7, N1~N2, I1~I2, Get the Embedding Level. */
|
||||
bidi_resolve_string (charset_ops, glyphs, len, pel, &type_rl_list,
|
||||
bidi_resolve_string (charset_ops, achars, len, pel, &type_rl_list,
|
||||
&max_level);
|
||||
|
||||
rc.glyphs = glyphs;
|
||||
rc.achars = achars;
|
||||
rc.extra = extra;
|
||||
rc.cb = cb_reverse_extra;
|
||||
bidi_reorder (&rc, len, &type_rl_list, max_level);
|
||||
@@ -727,20 +727,20 @@ Glyph32* __mg_charset_bidi_glyphs_reorder (const CHARSETOPS* charset_ops,
|
||||
/* free typerun list.*/
|
||||
free_typerun_list (type_rl_list);
|
||||
|
||||
print_hexstr (glyphs, len, TRUE);
|
||||
print_hexstr (achars, len, TRUE);
|
||||
|
||||
return glyphs;
|
||||
return achars;
|
||||
}
|
||||
|
||||
Uint32 __mg_charset_bidi_str_base_dir (const CHARSETOPS* charset_ops,
|
||||
Glyph32* glyphs, int len)
|
||||
Achar32* achars, int len)
|
||||
{
|
||||
BYTE base_level = 0;
|
||||
Uint32 base_dir = BIDI_TYPE_L;
|
||||
TYPERUN *type_rl_list = NULL;
|
||||
|
||||
/* split the text to some runs. */
|
||||
type_rl_list = get_runtype_link (charset_ops, glyphs, len);
|
||||
type_rl_list = get_runtype_link (charset_ops, achars, len);
|
||||
|
||||
/* 1.Find base level */
|
||||
bidi_resolveParagraphs(&type_rl_list, &base_dir, &base_level);
|
||||
@@ -751,16 +751,3 @@ Uint32 __mg_charset_bidi_str_base_dir (const CHARSETOPS* charset_ops,
|
||||
return base_dir;
|
||||
}
|
||||
|
||||
BOOL GetGlyphBIDIType (LOGFONT* log_font, Glyph32 glyph_value,
|
||||
Uint32 *bidi_type)
|
||||
{
|
||||
DEVFONT* devfont = SELECT_DEVFONT(log_font, glyph_value);
|
||||
|
||||
if (devfont == NULL ||
|
||||
devfont->charset_ops->bidi_char_type == NULL)
|
||||
return FALSE;
|
||||
|
||||
*bidi_type = devfont->charset_ops->bidi_char_type (glyph_value);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
+49
-49
@@ -57,13 +57,13 @@ static int sb_len_first_char (const unsigned char* mstr, int len)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static Mchar32 sb_get_char_value (const unsigned char* pre_mchar, int pre_len,
|
||||
static Achar32 sb_get_char_value (const unsigned char* pre_mchar, int pre_len,
|
||||
const unsigned char* cur_mchar, int cur_len)
|
||||
{
|
||||
return (Mchar32)(*cur_mchar);
|
||||
return (Achar32)(*cur_mchar);
|
||||
}
|
||||
|
||||
static unsigned int sb_char_type (Mchar32 chv)
|
||||
static unsigned int sb_char_type (Achar32 chv)
|
||||
{
|
||||
unsigned int ch_type = MCHAR_TYPE_UNKNOWN;
|
||||
|
||||
@@ -195,7 +195,7 @@ static int ascii_is_this_charset (const unsigned char* charset)
|
||||
}
|
||||
|
||||
#ifdef _MGCHARSET_UNICODE
|
||||
static Uchar32 ascii_conv_to_uc32 (Mchar32 chv)
|
||||
static Uchar32 ascii_conv_to_uc32 (Achar32 chv)
|
||||
{
|
||||
if (chv < 128)
|
||||
return chv;
|
||||
@@ -261,7 +261,7 @@ static int iso8859_1_is_this_charset (const unsigned char* charset)
|
||||
}
|
||||
|
||||
#ifdef _MGCHARSET_UNICODE
|
||||
static Uchar32 iso8859_1_conv_to_uc32 (Mchar32 chv)
|
||||
static Uchar32 iso8859_1_conv_to_uc32 (Achar32 chv)
|
||||
{
|
||||
return chv;
|
||||
}
|
||||
@@ -360,7 +360,7 @@ static unsigned short iso8859_2_unicode_map [] =
|
||||
0x00FD, 0x0163, 0x02D9
|
||||
};
|
||||
|
||||
static Uchar32 iso8859_2_conv_to_uc32 (Mchar32 chv)
|
||||
static Uchar32 iso8859_2_conv_to_uc32 (Achar32 chv)
|
||||
{
|
||||
if (chv < 0xA1)
|
||||
return chv;
|
||||
@@ -473,7 +473,7 @@ static unsigned short iso8859_3_unicode_map [] =
|
||||
0x015D, 0x02D9
|
||||
};
|
||||
|
||||
static Uchar32 iso8859_3_conv_to_uc32 (Mchar32 chv)
|
||||
static Uchar32 iso8859_3_conv_to_uc32 (Achar32 chv)
|
||||
{
|
||||
if (chv < 0xA1)
|
||||
return chv;
|
||||
@@ -585,7 +585,7 @@ static unsigned short iso8859_4_unicode_map [] =
|
||||
0x016B, 0x02D9
|
||||
};
|
||||
|
||||
static Uchar32 iso8859_4_conv_to_uc32 (Mchar32 chv)
|
||||
static Uchar32 iso8859_4_conv_to_uc32 (Achar32 chv)
|
||||
{
|
||||
if (chv < 0xA1)
|
||||
return chv;
|
||||
@@ -662,7 +662,7 @@ static int iso8859_5_is_this_charset (const unsigned char* charset)
|
||||
}
|
||||
|
||||
#ifdef _MGCHARSET_UNICODE
|
||||
static Uchar32 iso8859_5_conv_to_uc32 (Mchar32 chv)
|
||||
static Uchar32 iso8859_5_conv_to_uc32 (Achar32 chv)
|
||||
{
|
||||
if (chv < 0xA1)
|
||||
return chv;
|
||||
@@ -735,7 +735,7 @@ static CHARSETOPS CharsetOps_iso8859_5 = {
|
||||
|
||||
#include "bidi.h"
|
||||
|
||||
static BOOL get_mirror_char (const BIDICHAR_MIRROR_MAP* map, int n, Mchar32 chv, Mchar32* mirrored)
|
||||
static BOOL get_mirror_char (const BIDICHAR_MIRROR_MAP* map, int n, Achar32 chv, Achar32* mirrored)
|
||||
{
|
||||
int pos, step;
|
||||
BOOL found = FALSE;
|
||||
@@ -743,7 +743,7 @@ static BOOL get_mirror_char (const BIDICHAR_MIRROR_MAP* map, int n, Mchar32 chv,
|
||||
pos = step = (n / 2) + 1;
|
||||
|
||||
while (step > 1) {
|
||||
Mchar32 cmp_char = map[pos].chv;
|
||||
Achar32 cmp_char = map[pos].chv;
|
||||
step = (step + 1) / 2;
|
||||
|
||||
if (cmp_char < chv) {
|
||||
@@ -815,7 +815,7 @@ static unsigned short iso8859_7_unicode_map [] =
|
||||
0x038C, 0x00BD
|
||||
};
|
||||
|
||||
static Uchar32 iso8859_7_conv_to_uc32 (Mchar32 chv)
|
||||
static Uchar32 iso8859_7_conv_to_uc32 (Achar32 chv)
|
||||
{
|
||||
if (chv >= 0xBE && chv <= 0xFE) {
|
||||
return chv - 0xBE + 0x038E;
|
||||
@@ -1040,7 +1040,7 @@ static Uint32 __mg_iso8859_8_type[] = {
|
||||
BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN,
|
||||
};
|
||||
|
||||
static unsigned int iso8859_8_bidi_char_type (Mchar32 chv)
|
||||
static unsigned int iso8859_8_bidi_char_type (Achar32 chv)
|
||||
{
|
||||
return __mg_iso8859_8_type [chv];
|
||||
}
|
||||
@@ -1059,14 +1059,14 @@ static const BIDICHAR_MIRROR_MAP __mg_iso8859_8_mirror_table [] =
|
||||
// {0x00BB, 0x00AB}
|
||||
};
|
||||
|
||||
static BOOL iso8859_8_bidi_mirror_char (Mchar32 chv, Mchar32* mirrored)
|
||||
static BOOL iso8859_8_bidi_mirror_char (Achar32 chv, Achar32* mirrored)
|
||||
{
|
||||
return get_mirror_char (__mg_iso8859_8_mirror_table,
|
||||
TABLESIZE (__mg_iso8859_8_mirror_table), chv, mirrored);
|
||||
}
|
||||
|
||||
#ifdef _MGCHARSET_UNICODE
|
||||
static Uchar32 iso8859_8_conv_to_uc32 (Mchar32 chv)
|
||||
static Uchar32 iso8859_8_conv_to_uc32 (Achar32 chv)
|
||||
{
|
||||
if (chv >= 0xE0 && chv <= 0xFA) {
|
||||
return chv - 0xE0 + 0x05D0;
|
||||
@@ -1169,7 +1169,7 @@ static int iso8859_9_is_this_charset (const unsigned char* charset)
|
||||
}
|
||||
|
||||
#ifdef _MGCHARSET_UNICODE
|
||||
static Uchar32 iso8859_9_conv_to_uc32 (Mchar32 chv)
|
||||
static Uchar32 iso8859_9_conv_to_uc32 (Achar32 chv)
|
||||
{
|
||||
switch (chv) {
|
||||
case 0xD0:
|
||||
@@ -1306,7 +1306,7 @@ static unsigned short iso8859_10_unicode_map [] =
|
||||
0x00FE, 0x0138
|
||||
};
|
||||
|
||||
static Uchar32 iso8859_10_conv_to_uc32 (Mchar32 chv)
|
||||
static Uchar32 iso8859_10_conv_to_uc32 (Achar32 chv)
|
||||
{
|
||||
if (chv < 0xA1)
|
||||
return chv;
|
||||
@@ -1419,7 +1419,7 @@ static unsigned short iso8859_11_unicode_map [] =
|
||||
0x00FE, 0x00FF
|
||||
};
|
||||
|
||||
static Uchar32 iso8859_11_conv_to_uc32 (Mchar32 chv)
|
||||
static Uchar32 iso8859_11_conv_to_uc32 (Achar32 chv)
|
||||
{
|
||||
if (chv < 0xA1)
|
||||
return chv;
|
||||
@@ -1531,7 +1531,7 @@ static unsigned short iso8859_13_unicode_map [] =
|
||||
0x017E, 0x2019
|
||||
};
|
||||
|
||||
static Uchar32 iso8859_13_conv_to_uc32 (Mchar32 chv)
|
||||
static Uchar32 iso8859_13_conv_to_uc32 (Achar32 chv)
|
||||
{
|
||||
if (chv < 0xA1)
|
||||
return chv;
|
||||
@@ -1643,7 +1643,7 @@ static unsigned short iso8859_14_unicode_map [] =
|
||||
0x0177, 0x00FF
|
||||
};
|
||||
|
||||
static Uchar32 iso8859_14_conv_to_uc32 (Mchar32 chv)
|
||||
static Uchar32 iso8859_14_conv_to_uc32 (Achar32 chv)
|
||||
{
|
||||
if (chv < 0xA1)
|
||||
return chv;
|
||||
@@ -1719,7 +1719,7 @@ static int iso8859_15_is_this_charset (const unsigned char* charset)
|
||||
}
|
||||
|
||||
#ifdef _MGCHARSET_UNICODE
|
||||
static Uchar32 iso8859_15_conv_to_uc32 (Mchar32 chv)
|
||||
static Uchar32 iso8859_15_conv_to_uc32 (Achar32 chv)
|
||||
{
|
||||
switch (chv) {
|
||||
case 0xA4:
|
||||
@@ -1829,7 +1829,7 @@ static int iso8859_16_is_this_charset (const unsigned char* charset)
|
||||
}
|
||||
|
||||
#ifdef _MGCHARSET_UNICODE
|
||||
static Uchar32 iso8859_16_conv_to_uc32 (Mchar32 chv)
|
||||
static Uchar32 iso8859_16_conv_to_uc32 (Achar32 chv)
|
||||
{
|
||||
switch (chv) {
|
||||
case 0xA1: return 0x0104;
|
||||
@@ -1961,7 +1961,7 @@ static CHARSETOPS CharsetOps_iso8859_16 = {
|
||||
| defined(_MGCHARSET_SHIFTJIS) \
|
||||
| defined(_MGCHARSET_UNICODE)
|
||||
|
||||
static unsigned int mb_char_type (Mchar32 chv)
|
||||
static unsigned int mb_char_type (Achar32 chv)
|
||||
{
|
||||
/* TODO: get the subtype of the char */
|
||||
return MCHAR_TYPE_GENERIC;
|
||||
@@ -2015,7 +2015,7 @@ static int gb2312_0_len_first_char (const unsigned char* mstr, int len)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static Mchar32 gb2312_0_get_char_value (const unsigned char* pre_mchar,
|
||||
static Achar32 gb2312_0_get_char_value (const unsigned char* pre_mchar,
|
||||
int pre_len, const unsigned char* cur_mchar, int cur_len)
|
||||
{
|
||||
int area = cur_mchar [0] - 0xA1;
|
||||
@@ -2102,7 +2102,7 @@ static int gb2312_0_pos_first_char (const unsigned char* mstr, int mstrlen)
|
||||
}
|
||||
|
||||
#ifdef _MGCHARSET_UNICODE
|
||||
static Uchar32 gb2312_0_conv_to_uc32 (Mchar32 chv)
|
||||
static Uchar32 gb2312_0_conv_to_uc32 (Achar32 chv)
|
||||
{
|
||||
return (Uchar32)__mg_gbunicode_map [chv];
|
||||
}
|
||||
@@ -2175,7 +2175,7 @@ static int gbk_len_first_char (const unsigned char* mstr, int len)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static Mchar32 gbk_get_char_value (const unsigned char* pre_mchar, int pre_len,
|
||||
static Achar32 gbk_get_char_value (const unsigned char* pre_mchar, int pre_len,
|
||||
const unsigned char* cur_mchar, int cur_len)
|
||||
{
|
||||
if (cur_mchar [1] > 0x7F)
|
||||
@@ -2260,7 +2260,7 @@ static int gbk_pos_first_char (const unsigned char* mstr, int mstrlen)
|
||||
}
|
||||
|
||||
#ifdef _MGCHARSET_UNICODE
|
||||
static Uchar32 gbk_conv_to_uc32 (Mchar32 chv)
|
||||
static Uchar32 gbk_conv_to_uc32 (Achar32 chv)
|
||||
{
|
||||
return (Uchar32)__mg_gbkunicode_map[chv];
|
||||
}
|
||||
@@ -2340,7 +2340,7 @@ static int gb18030_0_len_first_char (const unsigned char* mstr, int len)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static Mchar32 gb18030_0_get_char_value (const unsigned char* pre_mchar,
|
||||
static Achar32 gb18030_0_get_char_value (const unsigned char* pre_mchar,
|
||||
int pre_len, const unsigned char* cur_mchar, int cur_len)
|
||||
{
|
||||
unsigned char ch1;
|
||||
@@ -2504,7 +2504,7 @@ static const unsigned char* gb18030_0_get_next_word (const unsigned char* mstr,
|
||||
}
|
||||
|
||||
#ifdef _MGCHARSET_UNICODE
|
||||
static Uchar32 gb18030_0_conv_to_uc32 (Mchar32 chv)
|
||||
static Uchar32 gb18030_0_conv_to_uc32 (Achar32 chv)
|
||||
{
|
||||
/* from 0x90308130 to 0xE3329A35 */
|
||||
if (chv > 63611) {
|
||||
@@ -2597,7 +2597,7 @@ static int big5_len_first_char (const unsigned char* mstr, int len)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static Mchar32 big5_get_char_value (const unsigned char* pre_mchar, int pre_len,
|
||||
static Achar32 big5_get_char_value (const unsigned char* pre_mchar, int pre_len,
|
||||
const unsigned char* cur_mchar, int cur_len)
|
||||
{
|
||||
if (cur_mchar [1] & 0x80)
|
||||
@@ -2678,7 +2678,7 @@ static int big5_pos_first_char (const unsigned char* mstr, int mstrlen)
|
||||
}
|
||||
|
||||
#ifdef _MGCHARSET_UNICODE
|
||||
static Uchar32 big5_conv_to_uc32 (Mchar32 chv)
|
||||
static Uchar32 big5_conv_to_uc32 (Achar32 chv)
|
||||
{
|
||||
unsigned short ucs_code = __mg_big5_unicode_map [chv];
|
||||
|
||||
@@ -2753,7 +2753,7 @@ static int ksc5601_0_len_first_char (const unsigned char* mstr, int len)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static Mchar32 ksc5601_0_get_char_value (const unsigned char* pre_mchar,
|
||||
static Achar32 ksc5601_0_get_char_value (const unsigned char* pre_mchar,
|
||||
int pre_len, const unsigned char* cur_mchar, int cur_len)
|
||||
{
|
||||
#if 1
|
||||
@@ -2837,7 +2837,7 @@ static int ksc5601_0_pos_first_char (const unsigned char* mstr, int mstrlen)
|
||||
}
|
||||
|
||||
#ifdef _MGCHARSET_UNICODE
|
||||
static Uchar32 ksc5601_0_conv_to_uc32 (Mchar32 chv)
|
||||
static Uchar32 ksc5601_0_conv_to_uc32 (Achar32 chv)
|
||||
{
|
||||
unsigned short ucs_code = __mg_ksc5601_0_unicode_map [chv];
|
||||
|
||||
@@ -2900,7 +2900,7 @@ static int jisx0201_0_len_first_char (const unsigned char* mstr, int len)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static Mchar32 jisx0201_0_get_char_value (const unsigned char* pre_mchar,
|
||||
static Achar32 jisx0201_0_get_char_value (const unsigned char* pre_mchar,
|
||||
int pre_len, const unsigned char* cur_mchar, int cur_len)
|
||||
{
|
||||
if (cur_mchar [0] == 0x8E)
|
||||
@@ -2958,7 +2958,7 @@ static int jisx0201_0_is_this_charset (const unsigned char* charset)
|
||||
|
||||
|
||||
#ifdef _MGCHARSET_UNICODE
|
||||
static Uchar32 jisx0201_0_conv_to_uc32 (Mchar32 chv)
|
||||
static Uchar32 jisx0201_0_conv_to_uc32 (Achar32 chv)
|
||||
{
|
||||
if (chv >= 0xA1 && chv <= 0xDF)
|
||||
return 0xFF61 + chv - 0xA1;
|
||||
@@ -3018,7 +3018,7 @@ static int jisx0208_0_len_first_char (const unsigned char* mstr, int len)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static Mchar32 jisx0208_0_get_char_value (const unsigned char* pre_mchar,
|
||||
static Achar32 jisx0208_0_get_char_value (const unsigned char* pre_mchar,
|
||||
int pre_len, const unsigned char* cur_mchar, int cur_len)
|
||||
{
|
||||
#if 1
|
||||
@@ -3102,7 +3102,7 @@ static int jisx0208_0_pos_first_char (const unsigned char* mstr, int mstrlen)
|
||||
}
|
||||
|
||||
#ifdef _MGCHARSET_UNICODE
|
||||
static Uchar32 jisx0208_0_conv_to_uc32 (Mchar32 chv)
|
||||
static Uchar32 jisx0208_0_conv_to_uc32 (Achar32 chv)
|
||||
{
|
||||
unsigned short ucs_code;
|
||||
|
||||
@@ -3169,7 +3169,7 @@ static int jisx0201_1_is_this_charset (const unsigned char* charset)
|
||||
|
||||
|
||||
#ifdef _MGCHARSET_UNICODE
|
||||
static Uchar32 jisx0201_1_conv_to_uc32 (Mchar32 chv)
|
||||
static Uchar32 jisx0201_1_conv_to_uc32 (Achar32 chv)
|
||||
{
|
||||
if (chv >= 0xA1 && chv <= 0xDF)
|
||||
return 0xFF61 + chv - 0xA1;
|
||||
@@ -3247,7 +3247,7 @@ static int jisx0208_1_len_first_char (const unsigned char* mstr, int len)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static Mchar32 jisx0208_1_get_char_value (const unsigned char* pre_mchar,
|
||||
static Achar32 jisx0208_1_get_char_value (const unsigned char* pre_mchar,
|
||||
int pre_len, const unsigned char* cur_mchar, int cur_len)
|
||||
{
|
||||
unsigned char ch1 = cur_mchar [0];
|
||||
@@ -3358,7 +3358,7 @@ static int jisx0208_1_pos_first_char (const unsigned char* mstr, int mstrlen)
|
||||
}
|
||||
|
||||
#ifdef _MGCHARSET_UNICODE
|
||||
static Uchar32 jisx0208_1_conv_to_uc32 (Mchar32 chv)
|
||||
static Uchar32 jisx0208_1_conv_to_uc32 (Achar32 chv)
|
||||
{
|
||||
unsigned short ucs_code;
|
||||
|
||||
@@ -3432,7 +3432,7 @@ static int utf8_len_first_char (const unsigned char* mstr, int len)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static Mchar32 utf8_get_char_value (const unsigned char* pre_mchar, int pre_len,
|
||||
static Achar32 utf8_get_char_value (const unsigned char* pre_mchar, int pre_len,
|
||||
const unsigned char* cur_mchar, int cur_len)
|
||||
{
|
||||
Uchar32 wc = *((unsigned char *)(cur_mchar++));
|
||||
@@ -3528,7 +3528,7 @@ static Mchar32 utf8_get_char_value (const unsigned char* pre_mchar, int pre_len,
|
||||
? TPROP_PART2 (((Char) - 0xe0000) >> 8, (Char) & 0xff) \
|
||||
: UCHAR_BREAK_UNKNOWN))
|
||||
|
||||
static unsigned int unicode_char_type (Mchar32 chv)
|
||||
static unsigned int unicode_char_type (Achar32 chv)
|
||||
{
|
||||
unsigned int mchar_type = MCHAR_TYPE_UNKNOWN;
|
||||
unsigned int basic_type = 0, break_type = 0;
|
||||
@@ -3557,11 +3557,11 @@ static unsigned int unicode_char_type (Mchar32 chv)
|
||||
|
||||
#include "unicode-bidi-tables.h"
|
||||
|
||||
static unsigned int unicode_bidi_char_type (Mchar32 chv)
|
||||
static unsigned int unicode_bidi_char_type (Achar32 chv)
|
||||
{
|
||||
Mchar32 chv_first = 0;
|
||||
Mchar32 chv_last = (Mchar32)TABLESIZE (__mg_unicode_bidi_char_type_map);
|
||||
Mchar32 chv_mid;
|
||||
Achar32 chv_first = 0;
|
||||
Achar32 chv_last = (Achar32)TABLESIZE (__mg_unicode_bidi_char_type_map);
|
||||
Achar32 chv_mid;
|
||||
|
||||
while (chv_last >= chv_first) {
|
||||
chv_mid = (chv_first + chv_last)/2;
|
||||
@@ -3585,7 +3585,7 @@ static unsigned int unicode_bidi_char_type (Mchar32 chv)
|
||||
return BIDI_TYPE_LTR;
|
||||
}
|
||||
|
||||
static BOOL unicode_bidi_mirror_char (Mchar32 chv, Mchar32* mirrored)
|
||||
static BOOL unicode_bidi_mirror_char (Achar32 chv, Achar32* mirrored)
|
||||
{
|
||||
return get_mirror_char (__mg_unicode_mirror_table,
|
||||
TABLESIZE (__mg_unicode_mirror_table), chv, mirrored);
|
||||
@@ -3820,7 +3820,7 @@ static int utf16le_len_first_char (const unsigned char* mstr, int len)
|
||||
return 4;
|
||||
}
|
||||
|
||||
static Mchar32 utf16le_get_char_value (const unsigned char* pre_mchar,
|
||||
static Achar32 utf16le_get_char_value (const unsigned char* pre_mchar,
|
||||
int pre_len, const unsigned char* cur_mchar, int cur_len)
|
||||
{
|
||||
Uchar16 w1, w2;
|
||||
@@ -4046,7 +4046,7 @@ static int utf16be_len_first_char (const unsigned char* mstr, int len)
|
||||
return 4;
|
||||
}
|
||||
|
||||
static Mchar32 utf16be_get_char_value (const unsigned char* pre_mchar,
|
||||
static Achar32 utf16be_get_char_value (const unsigned char* pre_mchar,
|
||||
int pre_len, const unsigned char* cur_mchar, int cur_len)
|
||||
{
|
||||
Uchar16 w1, w2;
|
||||
|
||||
+10
-10
@@ -62,27 +62,27 @@ extern "C" {
|
||||
typedef struct _TYPERUN TYPERUN;
|
||||
|
||||
typedef struct _BIDICHAR_MIRROR_MAP {
|
||||
Mchar32 chv;
|
||||
Mchar32 mirrored;
|
||||
Achar32 chv;
|
||||
Achar32 mirrored;
|
||||
} BIDICHAR_MIRROR_MAP;
|
||||
|
||||
Glyph32* __mg_charset_bidi_glyphs_reorder (const CHARSETOPS* charset_ops,
|
||||
Glyph32* glyphs, int len, int pel,
|
||||
Achar32* __mg_charset_bidi_achars_reorder (const CHARSETOPS* charset_ops,
|
||||
Achar32* achars, int len, int pel,
|
||||
void* extra, CB_REVERSE_EXTRA cb_reverse_extra);
|
||||
|
||||
/*
|
||||
Glyph32* __mg_charset_bidi_map_reorder (const CHARSETOPS* charset_ops,
|
||||
Glyph32* glyphs, int len, GLYPHMAPINFO* map, int pel);
|
||||
Achar32* __mg_charset_bidi_map_reorder (const CHARSETOPS* charset_ops,
|
||||
Achar32* achars, int len, GLYPHMAPINFO* map, int pel);
|
||||
|
||||
Glyph32* __mg_charset_bidi_index_reorder (const CHARSETOPS* charset_ops,
|
||||
Glyph32* glyphs, int len, int* index_map, int pel);
|
||||
Achar32* __mg_charset_bidi_index_reorder (const CHARSETOPS* charset_ops,
|
||||
Achar32* achars, int len, int* index_map, int pel);
|
||||
*/
|
||||
|
||||
void __mg_charset_bidi_get_embeddlevels (const CHARSETOPS* charset_ops,
|
||||
Glyph32* glyphs, int len, int pel, Uint8* embedding_levels, Uint8 type);
|
||||
Achar32* achars, int len, int pel, Uint8* embedding_levels, Uint8 type);
|
||||
|
||||
Uint32 __mg_charset_bidi_str_base_dir (const CHARSETOPS* charset_ops,
|
||||
Glyph32* glyphs, int len);
|
||||
Achar32* achars, int len);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
+54
-13
@@ -40,6 +40,52 @@
|
||||
#ifndef GUI_DEVFONT_H
|
||||
#define GUI_DEVFONT_H
|
||||
|
||||
#define ACHAR_MBC_FLAG 0x80000000
|
||||
|
||||
#define IS_MBCHV(chv) ((chv) & ACHAR_MBC_FLAG)
|
||||
#define SET_MBCHV(chv) ((chv) | ACHAR_MBC_FLAG)
|
||||
#define REAL_ACHAR(chv) ((chv) & ~ACHAR_MBC_FLAG)
|
||||
|
||||
#define SELECT_DEVFONT_BY_ACHAR(logfont, chv) \
|
||||
IS_MBCHV(chv)?(logfont->devfonts[1]):(logfont->devfonts[0])
|
||||
|
||||
#define GLYPH_DEVFONT_INDEX_MASK 0xF0000000
|
||||
#define GLYPH_DEVFONT_INDEX_SHIFT 28
|
||||
|
||||
/**
|
||||
* \def REAL_GLYPH(glyph)
|
||||
* \brief Get the real (DEVFONT) glyph value from a LOGFONT glyph.
|
||||
*
|
||||
* \param glyph The LOGFONT glyph value
|
||||
*/
|
||||
#define REAL_GLYPH(glyph) ((glyph) & ~GLYPH_DEVFONT_INDEX_MASK)
|
||||
|
||||
/**
|
||||
* \def SELECT_DEVFONT_BY_GLYPH(logfont, glyph)
|
||||
* \brief Select a DEVFONT according to the LOGFONT glyph value.
|
||||
*
|
||||
* \param logfont The pointer to a logical font.
|
||||
* \param glyph The logical glyph value.
|
||||
*
|
||||
*/
|
||||
#define SELECT_DEVFONT_BY_GLYPH(logfont, glyph) \
|
||||
(logfont)->devfonts[((glyph) >> GLYPH_DEVFONT_INDEX_SHIFT) & 0x07]
|
||||
|
||||
#define DFI_IN_GLYPH(glyph) \
|
||||
(((glyph) >> GLYPH_DEVFONT_INDEX_SHIFT) & 0x07)
|
||||
|
||||
/**
|
||||
* \def IS_MBC_GLYPH(glyph)
|
||||
* \brief Determine wether the glyph is multibyte glyph
|
||||
*
|
||||
* \param glyph The logfont glyph value
|
||||
*/
|
||||
#define IS_MBC_GLYPH(glyph) ((glyph) & GLYPH_DEVFONT_INDEX_MASK)
|
||||
|
||||
#define SET_GLYPH_DFI(glyph, dfi) \
|
||||
(((glyph) & ~GLYPH_DEVFONT_INDEX_MASK) | \
|
||||
(((Glyph32)((dfi) & 0x07)) << GLYPH_DEVFONT_INDEX_SHIFT))
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
@@ -133,11 +179,6 @@ static inline long get_opened_file_size (FILE* fp)
|
||||
return size;
|
||||
}
|
||||
|
||||
typedef unsigned int Mchar32;
|
||||
#define IS_MBCHV(chv) ((chv) & 0x80000000)
|
||||
#define SET_MBCHV(chv) ((chv) | 0x80000000)
|
||||
#define REAL_CHV(chv) ((chv) & 0x7FFFFFFF)
|
||||
|
||||
/** The character set operation structure. */
|
||||
struct _CHARSETOPS
|
||||
{
|
||||
@@ -151,21 +192,21 @@ struct _CHARSETOPS
|
||||
const char* name;
|
||||
|
||||
/** Default character. */
|
||||
Mchar32 def_char_value;
|
||||
Achar32 def_char_value;
|
||||
|
||||
/** The method to get the length of the first character. */
|
||||
int (*len_first_char) (const unsigned char* mstr, int mstrlen);
|
||||
|
||||
/** The method to get the character index. */
|
||||
Mchar32 (*get_char_value) (const unsigned char* pre_mchar, int pre_len,
|
||||
Achar32 (*get_char_value) (const unsigned char* pre_mchar, int pre_len,
|
||||
const unsigned char* cur_mchar, int cur_len);
|
||||
|
||||
/** The method to get the require shape type of a mchar. */
|
||||
Mchar32 (*get_shaped_char_value) (const unsigned char* cur_mchar, int cur_len,
|
||||
Achar32 (*get_shaped_char_value) (const unsigned char* cur_mchar, int cur_len,
|
||||
int shape_type);
|
||||
|
||||
/** The method to get the type of one character. */
|
||||
unsigned int (*char_type) (Mchar32 chv);
|
||||
unsigned int (*char_type) (Achar32 chv);
|
||||
|
||||
/** The method to get character number in the string function. */
|
||||
int (*nr_chars_in_str) (const unsigned char* mstr, int mstrlen);
|
||||
@@ -186,14 +227,14 @@ struct _CHARSETOPS
|
||||
int (*pos_first_char) (const unsigned char* mstr, int mstrlen);
|
||||
|
||||
/** The method to get the BIDI type of one character. */
|
||||
unsigned int (*bidi_char_type) (Mchar32 chv);
|
||||
unsigned int (*bidi_char_type) (Achar32 chv);
|
||||
|
||||
/** Get mirrored character */
|
||||
BOOL (*bidi_mirror_char) (Mchar32 chv, Mchar32* mirrored);
|
||||
BOOL (*bidi_mirror_char) (Achar32 chv, Achar32* mirrored);
|
||||
|
||||
#ifdef _MGCHARSET_UNICODE
|
||||
/** The method to convert a mchar32 value to 32 bit UNICODE function. */
|
||||
Uchar32 (*conv_to_uc32) (Mchar32 chv);
|
||||
Uchar32 (*conv_to_uc32) (Achar32 chv);
|
||||
|
||||
/** The method to convert \a wc to multily byte character function. */
|
||||
int (*conv_from_uc32) (Uchar32 wc, unsigned char* mchar);
|
||||
@@ -283,7 +324,7 @@ struct _FONTOPS
|
||||
*
|
||||
* Since 3.4.0.
|
||||
*/
|
||||
Glyph32 (*get_glyph_value) (LOGFONT* logfont, DEVFONT* devfont, Mchar32 chv);
|
||||
Glyph32 (*get_glyph_value) (LOGFONT* logfont, DEVFONT* devfont, Achar32 chv);
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
|
||||
@@ -45,9 +45,6 @@
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
Glyph32 _gdi_select_glyph_dfi(LOGFONT* lf, Glyph32 gv);
|
||||
Glyph32 _gdi_get_glyph_value(LOGFONT* lf, Mchar32 chv);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
@@ -13,7 +13,7 @@ SRC_FILES = gdi.c attr.c clip.c map.c coor.c rect.c \
|
||||
region.c generators.c polygon.c flood.c \
|
||||
advapi.c midash.c mispans.c miwideline.c \
|
||||
mifillarc.c mifpolycon.c miarc.c rotatebmp.c \
|
||||
text.c glyph.c bidi.c glyph-unicode.c \
|
||||
text.c achar.c glyph.c bidi.c glyph-unicode.c \
|
||||
textout.c tabbedtextout.c drawtext.c
|
||||
endif
|
||||
|
||||
|
||||
@@ -0,0 +1,198 @@
|
||||
/*
|
||||
* This file is part of MiniGUI, a mature cross-platform windowing
|
||||
* and Graphics User Interface (GUI) support system for embedded systems
|
||||
* and smart IoT devices.
|
||||
*
|
||||
* Copyright (C) 2002~2018, Beijing FMSoft Technologies Co., Ltd.
|
||||
* Copyright (C) 1998~2002, WEI Yongming
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Or,
|
||||
*
|
||||
* As this program is a library, any link to this program must follow
|
||||
* GNU General Public License version 3 (GPLv3). If you cannot accept
|
||||
* GPLv3, you need to be licensed from FMSoft.
|
||||
*
|
||||
* If you have got a commercial license of this program, please use it
|
||||
* under the terms and conditions of the commercial license.
|
||||
*
|
||||
* For more information about the commercial license, please refer to
|
||||
* <http://www.minigui.com/en/about/licensing-policy/>.
|
||||
*/
|
||||
/*
|
||||
** achar.c: API implementation for abstract character.
|
||||
**
|
||||
** Create date: 2019/03/05
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "minigui.h"
|
||||
#include "gdi.h"
|
||||
#include "window.h"
|
||||
#include "devfont.h"
|
||||
|
||||
Achar32 GUIAPI GetACharValue (LOGFONT* logfont, const char* mchar,
|
||||
int mchar_len, const char* pre_mchar, int pre_len)
|
||||
{
|
||||
int len_cur_char;
|
||||
Achar32 chv = INV_ACHAR_VALUE;
|
||||
DEVFONT* sbc_devfont = logfont->devfonts[0];
|
||||
DEVFONT* mbc_devfont = logfont->devfonts[1];
|
||||
|
||||
if (mbc_devfont) {
|
||||
len_cur_char = mbc_devfont->charset_ops->len_first_char
|
||||
((const unsigned char*)mchar, mchar_len);
|
||||
|
||||
if (len_cur_char > 0) {
|
||||
chv = mbc_devfont->charset_ops->get_char_value
|
||||
((Uint8*)pre_mchar, pre_len, (Uint8*)mchar, mchar_len);
|
||||
|
||||
return SET_MBCHV(chv);
|
||||
}
|
||||
}
|
||||
|
||||
len_cur_char = sbc_devfont->charset_ops->len_first_char
|
||||
((const unsigned char*)mchar, mchar_len);
|
||||
|
||||
if (len_cur_char > 0) {
|
||||
chv = sbc_devfont->charset_ops->get_char_value
|
||||
(NULL, 0, (Uint8*)mchar, mchar_len);
|
||||
}
|
||||
|
||||
return chv;
|
||||
}
|
||||
|
||||
Achar32 GUIAPI GetShapedAChar (LOGFONT* logfont, const char* mchar,
|
||||
int mchar_len, ACHARSHAPETYPE shape_type)
|
||||
{
|
||||
int len_cur_char;
|
||||
|
||||
Achar32 chv = INV_ACHAR_VALUE;
|
||||
DEVFONT* sbc_devfont = logfont->devfonts[0];
|
||||
DEVFONT* mbc_devfont = logfont->devfonts[1];
|
||||
|
||||
if (mbc_devfont) {
|
||||
len_cur_char = mbc_devfont->charset_ops->len_first_char (
|
||||
(const unsigned char*)mchar, mchar_len);
|
||||
|
||||
if (len_cur_char > 0) {
|
||||
if (mbc_devfont->charset_ops->get_shaped_char_value)
|
||||
chv = mbc_devfont->charset_ops->get_shaped_char_value(
|
||||
(const unsigned char*)mchar, mchar_len, shape_type);
|
||||
else
|
||||
chv = mbc_devfont->charset_ops->get_char_value
|
||||
(NULL, 0, (Uint8*)mchar, len_cur_char);
|
||||
|
||||
return SET_MBCHV(chv);
|
||||
}
|
||||
}
|
||||
|
||||
len_cur_char = sbc_devfont->charset_ops->len_first_char
|
||||
((const unsigned char*)mchar, mchar_len);
|
||||
|
||||
if (len_cur_char > 0) {
|
||||
if (sbc_devfont->charset_ops->get_shaped_char_value)
|
||||
chv = sbc_devfont->charset_ops->get_shaped_char_value(
|
||||
(const unsigned char*)mchar, mchar_len, shape_type);
|
||||
else
|
||||
chv = sbc_devfont->charset_ops->get_char_value
|
||||
(NULL, 0, (Uint8*)mchar, len_cur_char);
|
||||
|
||||
}
|
||||
|
||||
return chv;
|
||||
}
|
||||
|
||||
BOOL GUIAPI GetMirrorAChar (LOGFONT* logfont, Achar32 chv, Achar32* mirrored)
|
||||
{
|
||||
DEVFONT* devfont = SELECT_DEVFONT_BY_ACHAR(logfont, chv);
|
||||
|
||||
*mirrored = INV_ACHAR_VALUE;
|
||||
if (devfont->charset_ops->bidi_mirror_char) {
|
||||
return devfont->charset_ops->bidi_mirror_char(REAL_ACHAR(chv),
|
||||
mirrored);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Uint32 GUIAPI GetACharType (LOGFONT* logfont, Achar32 chv)
|
||||
{
|
||||
DEVFONT* devfont = SELECT_DEVFONT_BY_ACHAR(logfont, chv);
|
||||
return devfont->charset_ops->char_type (REAL_ACHAR (chv));
|
||||
}
|
||||
|
||||
Uint32 GetGlyphBIDIType (LOGFONT* log_font, Achar32 chv)
|
||||
{
|
||||
DEVFONT* devfont = SELECT_DEVFONT_BY_ACHAR(log_font, chv);
|
||||
|
||||
if (devfont == NULL ||
|
||||
devfont->charset_ops->bidi_char_type == NULL)
|
||||
return BIDI_TYPE_INVALID;
|
||||
|
||||
return devfont->charset_ops->bidi_char_type (REAL_ACHAR (chv));
|
||||
}
|
||||
|
||||
#ifdef _MGCHARSET_UNICODE
|
||||
|
||||
Uchar32 GUIAPI Achar2UChar(LOGFONT* logfont, Achar32 chv)
|
||||
{
|
||||
Uchar32 uc;
|
||||
DEVFONT* devfont = SELECT_DEVFONT_BY_ACHAR(logfont, chv);
|
||||
|
||||
if (devfont) {
|
||||
chv = REAL_ACHAR(chv);
|
||||
if (devfont->charset_ops->conv_to_uc32)
|
||||
uc = devfont->charset_ops->conv_to_uc32(chv);
|
||||
else
|
||||
uc = chv;
|
||||
|
||||
return uc;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int GUIAPI AChars2UChars(LOGFONT* logfont, const Achar32* chs,
|
||||
Uchar32* ucs, int n)
|
||||
{
|
||||
int i;
|
||||
Uchar32 uc;
|
||||
DEVFONT* devfont;
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
Achar32 chv = chs[i];
|
||||
devfont = SELECT_DEVFONT_BY_ACHAR(logfont, chv);
|
||||
if (devfont) {
|
||||
chv = REAL_ACHAR(chv);
|
||||
if (devfont->charset_ops->conv_to_uc32)
|
||||
uc = devfont->charset_ops->conv_to_uc32(chv);
|
||||
else
|
||||
uc = chv;
|
||||
|
||||
ucs[i] = uc;
|
||||
}
|
||||
else
|
||||
return i + 1;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#endif /* _MGCHARSET_UNICODE */
|
||||
+276
-381
File diff suppressed because it is too large
Load Diff
@@ -69,7 +69,7 @@ static inline int _gdi_get_glyph_advance (PDC pdc, Glyph32 glyph_value,
|
||||
BOOL direction, int x, int y, int* adv_x, int* adv_y, BBOX* bbox)
|
||||
{
|
||||
LOGFONT* logfont = pdc->pLogFont;
|
||||
DEVFONT* devfont = SELECT_DEVFONT(logfont, glyph_value);
|
||||
DEVFONT* devfont = SELECT_DEVFONT_BY_GLYPH(logfont, glyph_value);
|
||||
glyph_value = REAL_GLYPH (glyph_value);
|
||||
|
||||
return _font_get_glyph_advance (logfont, devfont, glyph_value,
|
||||
|
||||
+158
-220
File diff suppressed because it is too large
Load Diff
+129
-219
@@ -71,184 +71,66 @@ int ft2IsFreeTypeDevfont (DEVFONT* devfont);
|
||||
|
||||
#define FS_WEIGHT_AUTOBOLD 29
|
||||
|
||||
Glyph32 GUIAPI GetGlyphValue (LOGFONT* logfont, const char* mchar,
|
||||
int mchar_len, const char* pre_mchar, int pre_len)
|
||||
Glyph32 GetGlyphValue(LOGFONT* lf, Achar32 chv)
|
||||
{
|
||||
int len_cur_char;
|
||||
Glyph32 gv = INV_GLYPH_VALUE;
|
||||
DEVFONT* sbc_devfont = logfont->devfonts[0];
|
||||
DEVFONT* mbc_devfont = logfont->devfonts[1];
|
||||
Glyph32 gv = INV_GLYPH_VALUE;
|
||||
int i, dfi = 0;
|
||||
DEVFONT* df;
|
||||
|
||||
if (mbc_devfont) {
|
||||
int i, dfi;
|
||||
DEVFONT* df;
|
||||
if (IS_MBCHV(chv)) {
|
||||
chv = REAL_ACHAR(chv);
|
||||
for (i = 1; i < MAXNR_DEVFONTS; i++) {
|
||||
if ((df = lf->devfonts[i])) {
|
||||
if (df->font_ops->get_glyph_value)
|
||||
gv = df->font_ops->get_glyph_value(lf, df, chv);
|
||||
else
|
||||
gv = chv;
|
||||
|
||||
len_cur_char = mbc_devfont->charset_ops->len_first_char
|
||||
((const unsigned char*)mchar, mchar_len);
|
||||
|
||||
if (len_cur_char > 0) {
|
||||
gv = mbc_devfont->charset_ops->get_char_value
|
||||
((Uint8*)pre_mchar, pre_len, (Uint8*)mchar, mchar_len);
|
||||
|
||||
dfi = 1;
|
||||
for (i = 1; i < MAXNR_DEVFONTS; i++) {
|
||||
if ((df = logfont->devfonts[i])) {
|
||||
if (df->font_ops->is_glyph_existed(logfont, df, gv)) {
|
||||
dfi = i;
|
||||
break;
|
||||
}
|
||||
if (df->font_ops->is_glyph_existed(lf, df, gv)) {
|
||||
dfi = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// return the first devfont as the default
|
||||
return SET_GLYPH_DFI(gv, dfi);
|
||||
}
|
||||
}
|
||||
|
||||
len_cur_char = sbc_devfont->charset_ops->len_first_char
|
||||
((const unsigned char*)mchar, mchar_len);
|
||||
|
||||
if (len_cur_char > 0) {
|
||||
gv = sbc_devfont->charset_ops->get_char_value
|
||||
(NULL, 0, (Uint8*)mchar, mchar_len);
|
||||
}
|
||||
|
||||
return gv;
|
||||
}
|
||||
|
||||
Glyph32 GUIAPI GetShapedGlyph (LOGFONT* logfont, const char* mchar,
|
||||
int mchar_len, GLYPHSHAPETYPE shape_type)
|
||||
{
|
||||
int len_cur_char;
|
||||
|
||||
Glyph32 glyph_value = INV_GLYPH_VALUE;
|
||||
DEVFONT* sbc_devfont = logfont->devfonts[0];
|
||||
DEVFONT* mbc_devfont = logfont->devfonts[1];
|
||||
|
||||
if (mbc_devfont) {
|
||||
len_cur_char = mbc_devfont->charset_ops->len_first_char (
|
||||
(const unsigned char*)mchar, mchar_len);
|
||||
|
||||
if (len_cur_char > 0) {
|
||||
int i, dfi;
|
||||
DEVFONT* df;
|
||||
|
||||
if (mbc_devfont->charset_ops->get_shaped_char_value)
|
||||
glyph_value = mbc_devfont->charset_ops->get_shaped_char_value(
|
||||
(const unsigned char*)mchar, mchar_len, shape_type);
|
||||
if (dfi == 0) {
|
||||
if ((df = lf->devfonts[1])) {
|
||||
dfi = 1;
|
||||
if (df->font_ops->get_glyph_value)
|
||||
gv = df->font_ops->get_glyph_value(lf, df, chv);
|
||||
else
|
||||
gv = chv;
|
||||
}
|
||||
else
|
||||
glyph_value = mbc_devfont->charset_ops->get_char_value
|
||||
(NULL, 0, (Uint8*)mchar, len_cur_char);
|
||||
|
||||
dfi = 1;
|
||||
for (i = 1; i < MAXNR_DEVFONTS; i++) {
|
||||
if ((df = logfont->devfonts[i])) {
|
||||
if (df->font_ops->is_glyph_existed(logfont, df, glyph_value)) {
|
||||
dfi = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return SET_GLYPH_DFI(glyph_value, dfi);
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
len_cur_char = sbc_devfont->charset_ops->len_first_char
|
||||
((const unsigned char*)mchar, mchar_len);
|
||||
|
||||
if (len_cur_char > 0) {
|
||||
if (sbc_devfont->charset_ops->get_shaped_char_value)
|
||||
glyph_value = sbc_devfont->charset_ops->get_shaped_char_value(
|
||||
(const unsigned char*)mchar, mchar_len, shape_type);
|
||||
else
|
||||
glyph_value = sbc_devfont->charset_ops->get_char_value
|
||||
(NULL, 0, (Uint8*)mchar, len_cur_char);
|
||||
|
||||
}
|
||||
|
||||
return glyph_value;
|
||||
}
|
||||
|
||||
BOOL GUIAPI GetMirrorGlyph (LOGFONT* logfont, Glyph32 gv,
|
||||
Glyph32* mirrored)
|
||||
{
|
||||
*mirrored = INV_GLYPH_VALUE;
|
||||
|
||||
DEVFONT* devfont = SELECT_DEVFONT(logfont, gv);
|
||||
if (devfont->charset_ops->bidi_mirror_char) {
|
||||
return devfont->charset_ops->bidi_mirror_char(gv, mirrored);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
int GUIAPI DrawGlyph (HDC hdc, int x, int y, Glyph32 glyph_value,
|
||||
int* adv_x, int* adv_y)
|
||||
{
|
||||
int advance;
|
||||
int char_type;
|
||||
|
||||
PDC pdc = dc_HDC2PDC(hdc);
|
||||
DEVFONT* devfont = SELECT_DEVFONT(pdc->pLogFont, glyph_value);
|
||||
|
||||
/* Transfer logical to device to screen here. */
|
||||
coor_LP2SP (pdc, &x, &y);
|
||||
pdc->rc_output = pdc->DevRC;
|
||||
|
||||
char_type = devfont->charset_ops->char_type (glyph_value);
|
||||
if (check_zero_width(char_type)) {
|
||||
if (adv_x) *adv_x = 0;
|
||||
if (adv_y) *adv_y = 0;
|
||||
advance = 0;
|
||||
}
|
||||
else {
|
||||
int my_adv_x, my_adv_y;
|
||||
/* convert to the start point on baseline. */
|
||||
_gdi_get_baseline_point (pdc, &x, &y);
|
||||
|
||||
advance = _gdi_draw_one_glyph (pdc, glyph_value,
|
||||
(pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
||||
x, y, &my_adv_x, &my_adv_y);
|
||||
|
||||
if (adv_x) *adv_x = my_adv_x;
|
||||
if (adv_y) *adv_y = my_adv_y;
|
||||
dfi = 0;
|
||||
if ((df = lf->devfonts[0])) {
|
||||
if (df->font_ops->get_glyph_value)
|
||||
gv = df->font_ops->get_glyph_value(lf, df, chv);
|
||||
else
|
||||
gv = chv;
|
||||
}
|
||||
else
|
||||
goto error;
|
||||
}
|
||||
|
||||
return advance;
|
||||
}
|
||||
return SET_GLYPH_DFI(gv, dfi);
|
||||
|
||||
unsigned int GUIAPI GetGlyphType (LOGFONT* logfont, Glyph32 glyph_value)
|
||||
{
|
||||
/* get the relative device font */
|
||||
DEVFONT* devfont = SELECT_DEVFONT(logfont, glyph_value);
|
||||
glyph_value = REAL_GLYPH (glyph_value);
|
||||
return devfont->charset_ops->char_type (glyph_value);
|
||||
error:
|
||||
return INV_GLYPH_VALUE;
|
||||
}
|
||||
|
||||
int GUIAPI GetGlyphInfo (LOGFONT* logfont, Glyph32 glyph_value,
|
||||
GLYPHINFO* glyph_info)
|
||||
{
|
||||
/* get the relative device font */
|
||||
DEVFONT* devfont = SELECT_DEVFONT(logfont, glyph_value);
|
||||
DEVFONT* devfont = SELECT_DEVFONT_BY_GLYPH(logfont, glyph_value);
|
||||
glyph_value = REAL_GLYPH (glyph_value);
|
||||
SIZE sz;
|
||||
|
||||
/* get glyph type */
|
||||
if (glyph_info->mask & GLYPH_INFO_TYPE)
|
||||
glyph_info->char_type = devfont->charset_ops->char_type (glyph_value);
|
||||
|
||||
/* get glyph type */
|
||||
if (glyph_info->mask & GLYPH_INFO_BIDI_TYPE) {
|
||||
if (devfont->charset_ops->bidi_char_type) {
|
||||
glyph_info->bidi_char_type
|
||||
= devfont->charset_ops->bidi_char_type (glyph_value);
|
||||
}
|
||||
else {
|
||||
glyph_info->bidi_char_type = BIDI_TYPE_INVALID;
|
||||
}
|
||||
}
|
||||
|
||||
/* get metrics of the glyph */
|
||||
if ((glyph_info->mask & GLYPH_INFO_METRICS) ||
|
||||
(glyph_info->mask & GLYPH_INFO_BMP)) {
|
||||
@@ -274,29 +156,18 @@ int GUIAPI GetGlyphInfo (LOGFONT* logfont, Glyph32 glyph_value,
|
||||
case GLYPHBMP_TYPE_MONO:
|
||||
glyph_info->bits = devfont->font_ops->get_glyph_monobitmap (
|
||||
logfont, devfont, glyph_value, &sz, &glyph_info->bmp_pitch, NULL);
|
||||
glyph_info->bbox_w = sz.cx;
|
||||
glyph_info->bbox_h = sz.cy;
|
||||
glyph_info->bmp_size = glyph_info->bmp_pitch * glyph_info->bbox_h;
|
||||
break;
|
||||
|
||||
case GLYPHBMP_TYPE_GREY:
|
||||
glyph_info->bits = devfont->font_ops->get_glyph_greybitmap (
|
||||
logfont, devfont, glyph_value,
|
||||
&sz, &glyph_info->bmp_pitch, NULL);
|
||||
glyph_info->bbox_w = sz.cx;
|
||||
glyph_info->bbox_h = sz.cy;
|
||||
glyph_info->bmp_size =
|
||||
glyph_info->bmp_pitch * glyph_info->bbox_h;
|
||||
break;
|
||||
|
||||
case GLYPHBMP_TYPE_SUBPIXEL:
|
||||
glyph_info->bits = devfont->font_ops->get_glyph_greybitmap (
|
||||
logfont, devfont, glyph_value,
|
||||
&sz, &glyph_info->bmp_pitch, NULL);
|
||||
glyph_info->bbox_w = sz.cx;
|
||||
glyph_info->bbox_h = sz.cy;
|
||||
glyph_info->bmp_size =
|
||||
glyph_info->bmp_pitch * glyph_info->bbox_h;
|
||||
break;
|
||||
|
||||
case GLYPHBMP_TYPE_PRERENDER:
|
||||
@@ -306,26 +177,44 @@ int GUIAPI GetGlyphInfo (LOGFONT* logfont, Glyph32 glyph_value,
|
||||
}
|
||||
}
|
||||
|
||||
glyph_info->bmp_width = sz.cx;
|
||||
glyph_info->bmp_height = sz.cy;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void GUIAPI GetGlyphBitmap (LOGFONT* logfont, const char* mchar,
|
||||
int mchar_len, GLYPHBITMAP* glyph_bitmap)
|
||||
int GUIAPI DrawGlyph (HDC hdc, int x, int y, Glyph32 glyph_value,
|
||||
int* adv_x, int* adv_y)
|
||||
{
|
||||
GLYPHINFO glyph_info;
|
||||
Glyph32 glyph_value = INV_GLYPH_VALUE;
|
||||
int advance;
|
||||
int char_type;
|
||||
|
||||
memset(&glyph_info, 0, sizeof(GLYPHINFO));
|
||||
glyph_value = GetGlyphValue(logfont, (const char*)mchar,
|
||||
mchar_len, NULL, 0);
|
||||
PDC pdc = dc_HDC2PDC(hdc);
|
||||
DEVFONT* devfont = SELECT_DEVFONT_BY_GLYPH(pdc->pLogFont, glyph_value);
|
||||
|
||||
glyph_info.mask = GLYPH_INFO_METRICS | GLYPH_INFO_BMP;
|
||||
glyph_info.bmp_type = GLYPHBMP_TYPE_MONO;
|
||||
/* Transfer logical to device to screen here. */
|
||||
coor_LP2SP (pdc, &x, &y);
|
||||
pdc->rc_output = pdc->DevRC;
|
||||
|
||||
if (glyph_value != INV_GLYPH_VALUE)
|
||||
GetGlyphInfo(logfont, glyph_value, &glyph_info);
|
||||
char_type = devfont->charset_ops->char_type (glyph_value);
|
||||
if (check_zero_width(char_type)) {
|
||||
if (adv_x) *adv_x = 0;
|
||||
if (adv_y) *adv_y = 0;
|
||||
advance = 0;
|
||||
}
|
||||
else {
|
||||
int my_adv_x, my_adv_y;
|
||||
/* convert to the start point on baseline. */
|
||||
_gdi_get_baseline_point (pdc, &x, &y);
|
||||
|
||||
memcpy(glyph_bitmap, &glyph_info.bbox_x, sizeof(GLYPHBITMAP));
|
||||
advance = _gdi_draw_one_glyph (pdc, glyph_value,
|
||||
(pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
||||
x, y, &my_adv_x, &my_adv_y);
|
||||
|
||||
if (adv_x) *adv_x = my_adv_x;
|
||||
if (adv_y) *adv_y = my_adv_y;
|
||||
}
|
||||
|
||||
return advance;
|
||||
}
|
||||
|
||||
static int mult (fixed op1, fixed op2)
|
||||
@@ -2011,7 +1900,7 @@ static BOOL _gdi_get_glyph_data (PDC pdc, Glyph32 glyph_value,
|
||||
unsigned short scale = 1;
|
||||
BYTE* data = NULL;
|
||||
PLOGFONT logfont = pdc->pLogFont;
|
||||
DEVFONT* devfont = SELECT_DEVFONT(pdc->pLogFont, glyph_value);
|
||||
DEVFONT* devfont = SELECT_DEVFONT_BY_GLYPH(pdc->pLogFont, glyph_value);
|
||||
glyph_value = REAL_GLYPH(glyph_value);
|
||||
|
||||
DWORD bmptype = devfont->font_ops->get_glyph_bmptype (logfont, devfont);
|
||||
@@ -2813,7 +2702,7 @@ int _gdi_draw_one_glyph (PDC pdc, Glyph32 glyph_value, BOOL direction,
|
||||
x, y, adv_x, adv_y, &bbox);
|
||||
|
||||
logfont = pdc->pLogFont;
|
||||
devfont = SELECT_DEVFONT (logfont, glyph_value);
|
||||
devfont = SELECT_DEVFONT_BY_GLYPH (logfont, glyph_value);
|
||||
|
||||
glyph_bmptype = devfont->font_ops->get_glyph_bmptype (logfont, devfont)
|
||||
& DEVFONTGLYPHTYPE_MASK_BMPTYPE;
|
||||
@@ -2938,59 +2827,80 @@ void _gdi_start_new_line (PDC pdc)
|
||||
}
|
||||
}
|
||||
|
||||
Glyph32 _gdi_select_glyph_dfi(LOGFONT* lf, Glyph32 gv)
|
||||
int GUIAPI GetGlyphsExtentPoint(HDC hdc, Glyph32* glyphs, int nr_glyphs,
|
||||
int max_extent, SIZE* size)
|
||||
{
|
||||
int i, dfi = 0;
|
||||
DEVFONT* df;
|
||||
int i = 0;
|
||||
int advance = 0;
|
||||
int adv_x, adv_y;
|
||||
PDC pdc = dc_HDC2PDC(hdc);
|
||||
PLOGFONT log_font = pdc->pLogFont;
|
||||
DEVFONT* devfont = NULL;
|
||||
unsigned int char_type = 0;
|
||||
|
||||
for (i = 1; i < MAXNR_DEVFONTS; i++) {
|
||||
if ((df = lf->devfonts[i])) {
|
||||
if (df->font_ops->is_glyph_existed(lf, df, gv)) {
|
||||
dfi = i;
|
||||
break;
|
||||
}
|
||||
size->cx = 0;
|
||||
size->cy = 0;
|
||||
|
||||
while(i < nr_glyphs){
|
||||
devfont = SELECT_DEVFONT_BY_GLYPH(log_font, glyphs[i]);
|
||||
char_type = devfont->charset_ops->char_type(glyphs[i]);
|
||||
|
||||
if (check_zero_width (char_type)) {
|
||||
adv_x = adv_y = 0;
|
||||
}
|
||||
else {
|
||||
advance += _gdi_get_glyph_advance (pdc, glyphs[i],
|
||||
(pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
||||
0, 0, &adv_x, &adv_y, NULL);
|
||||
}
|
||||
|
||||
if (max_extent > 0 && advance > max_extent)
|
||||
break;
|
||||
|
||||
size->cx += adv_x;
|
||||
size->cy += adv_y;
|
||||
i ++;
|
||||
}
|
||||
|
||||
if (dfi == 0) {
|
||||
if (REAL_GLYPH(gv) < 0x80)
|
||||
dfi = 0;
|
||||
else
|
||||
dfi = 1;
|
||||
}
|
||||
_gdi_calc_glyphs_size_from_two_points (pdc, 0, 0,
|
||||
size->cx, size->cy, size);
|
||||
|
||||
return SET_GLYPH_DFI(gv, dfi);
|
||||
return i;
|
||||
}
|
||||
|
||||
Glyph32 _gdi_get_glyph_value(LOGFONT* lf, Mchar32 chv)
|
||||
int GUIAPI GetGlyphsExtent(HDC hdc, Glyph32* glyphs, int nr_glyphs, SIZE* size)
|
||||
{
|
||||
Glyph32 gv = INV_GLYPH_VALUE;
|
||||
int i, dfi = 0;
|
||||
DEVFONT* df;
|
||||
int i = 0;
|
||||
int advance = 0;
|
||||
int adv_x, adv_y;
|
||||
unsigned int char_type;
|
||||
Glyph32 glyph_value = INV_GLYPH_VALUE;
|
||||
PDC pdc = dc_HDC2PDC(hdc);
|
||||
PLOGFONT log_font = pdc->pLogFont;
|
||||
DEVFONT* devfont = SELECT_DEVFONT_BY_GLYPH(log_font, glyph_value);
|
||||
|
||||
if (IS_MBCHV(chv)) {
|
||||
for (i = 1; i < MAXNR_DEVFONTS; i++) {
|
||||
if ((df = lf->devfonts[i])) {
|
||||
if (df->font_ops->get_glyph_value)
|
||||
gv = df->font_ops->get_glyph_value(lf, df, chv);
|
||||
else
|
||||
gv = REAL_CHV(chv);
|
||||
size->cx = 0;
|
||||
size->cy = 0;
|
||||
while (i < nr_glyphs) {
|
||||
devfont = SELECT_DEVFONT_BY_GLYPH(log_font, glyphs[i]);
|
||||
char_type = devfont->charset_ops->char_type(glyphs[i]);
|
||||
|
||||
if (df->font_ops->is_glyph_existed(lf, df, gv)) {
|
||||
dfi = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (check_zero_width (char_type)) {
|
||||
adv_x = adv_y = 0;
|
||||
}
|
||||
else {
|
||||
advance += _gdi_get_glyph_advance (pdc, glyphs[i],
|
||||
(pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
||||
0, 0, &adv_x, &adv_y, NULL);
|
||||
}
|
||||
size->cx += adv_x;
|
||||
size->cy += adv_y;
|
||||
i ++;
|
||||
}
|
||||
|
||||
if (dfi == 0) {
|
||||
if (REAL_CHV(chv) < 0x80)
|
||||
dfi = 0;
|
||||
else
|
||||
dfi = 1;
|
||||
}
|
||||
_gdi_calc_glyphs_size_from_two_points (pdc, 0, 0,
|
||||
size->cx, size->cy, size);
|
||||
|
||||
return SET_GLYPH_DFI(gv, dfi);
|
||||
return advance;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user