Tune APIs of Achar32

This commit is contained in:
Vincent Wei
2019-03-05 18:18:54 +08:00
parent 4b633c801d
commit 36167be7e6
15 changed files with 2017 additions and 2065 deletions
+655 -669
View File
File diff suppressed because it is too large Load Diff
+391 -391
View File
File diff suppressed because it is too large Load Diff
+36 -36
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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 {
-3
View File
@@ -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 */
+1 -1
View File
@@ -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
+198
View File
@@ -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
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -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
View File
File diff suppressed because it is too large Load Diff
+129 -219
View File
@@ -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;
}