rename glyph type macros and glyph type now includes MCHAR_TYPE_XXX for ASCII characters

This commit is contained in:
Vincent Wei
2019-01-17 11:59:29 +08:00
parent 6e54d4a7d7
commit e68ee00b85
22 changed files with 39435 additions and 39427 deletions
+93 -116
View File
@@ -5775,8 +5775,12 @@ typedef struct _WORDINFO WORDINFO;
typedef unsigned short UChar16;
typedef int UChar32;
#define MCHAR_TYPE_UNKNOWN 0xFFFF
#define MCHAR_TYPE_NUL 0x0000
#define MCHAR_TYPE_NOSPACING_MARK 0x0001
#define MCHAR_TYPE_ABOVE_MARK 0x0002
#define MCHAR_TYPE_BELLOW_MARK 0x0004
#define MCHAR_TYPE_UNKNOWN 0x0000
#define MCHAR_TYPE_NUL (0x0000 | MCHAR_TYPE_NOSPACING_MARK)
#define MCHAR_TYPE_CTRL1 0x0100
#define MCHAR_TYPE_BEL 0x0200
#define MCHAR_TYPE_BS 0x0300
@@ -5789,124 +5793,94 @@ typedef int UChar32;
#define MCHAR_TYPE_SPACE 0x0A00
#define MCHAR_TYPE_ZEROWIDTH 0x0B00
#define MCHAR_TYPE_GENERIC 0x0C00
#define MCHAR_TYPE_NOSPACING_MARK 0x0001
#define MCHAR_TYPE_LIGATURE (MCHAR_TYPE_NOSPACING_MARK |0x0D00)
#define MCHAR_TYPE_VOWEL (MCHAR_TYPE_NOSPACING_MARK |0x0E00)
#define MCHAR_TYPE_VOWEL_ABOVE (MCHAR_TYPE_VOWEL |0x0002)
#define MCHAR_TYPE_VOWEL_BELLOW (MCHAR_TYPE_VOWEL |0x0004)
#define MCHAR_TYPE_ASCII 0x0080
#define MCHAR_TYPE_LATIN1 0x0081
#define MCHAR_TYPE_LATIN2 0x0082
#define MCHAR_TYPE_LATIN3 0x0083
#define MCHAR_TYPE_LATIN4 0x0084
#define MCHAR_TYPE_LATIN5 0x0085
#define MCHAR_TYPE_LATIN6 0x0086
#define MCHAR_TYPE_LATIN7 0x0087
#define MCHAR_TYPE_LATIN8 0x0088
#define MCHAR_TYPE_LATIN9 0x0089
#define MCHAR_TYPE_LATIN10 0x008A
#define MCHAR_TYPE_CYRILLIC 0x008B
#define MCHAR_TYPE_ARABIC 0x008C
#define MCHAR_TYPE_GREEK 0x008D
#define MCHAR_TYPE_HEBREW 0x008E
#define MCHAR_TYPE_THAI 0x008F
#define MCHAR_TYPE_DIGIT 0x0091
#define MCHAR_TYPE_SYMBOL_PUNCT 0x0092
#define MCHAR_TYPE_SYMBOL_MATH 0x0093
#define MCHAR_TYPE_SYMBOL_OTHER 0x0094
#define MCHAR_TYPE_FW_DIGIT 0x0095
#define MCHAR_TYPE_FW_SYM_PUNCT 0x0096
#define MCHAR_TYPE_FW_SYM_MATH 0x0097
#define MCHAR_TYPE_FW_SYM_OTHER 0x0098
#define MCHAR_TYPE_HANGUL 0x00A1
#define MCHAR_TYPE_KATAKANA 0x00A2
#define MCHAR_TYPE_CJK 0x00A3
#define MCHAR_TYPE_LIGATURE (0x0D00 | MCHAR_TYPE_NOSPACING_MARK)
#define MCHAR_TYPE_VOWEL (0x0E00 | MCHAR_TYPE_NOSPACING_MARK)
#define MCHAR_TYPE_VOWEL_ABOVE (MCHAR_TYPE_VOWEL | MCHAR_TYPE_ABOVE_MARK)
#define MCHAR_TYPE_VOWEL_BELLOW (MCHAR_TYPE_VOWEL | MCHAR_TYPE_BELLOW_MARK)
/* These are the basic UNICODE character classifications.
* See http://www.unicode.org/Public/UNIDATA/UCD.html#General_Category_Values
*/
#define G_UNICODE_CONTROL 0x00
#define G_UNICODE_FORMAT 0x01
#define G_UNICODE_UNASSIGNED 0x02
#define G_UNICODE_PRIVATE_USE 0x03
#define G_UNICODE_SURROGATE 0x04
#define G_UNICODE_LOWERCASE_LETTER 0x05
#define G_UNICODE_MODIFIER_LETTER 0x06
#define G_UNICODE_OTHER_LETTER 0x07
#define G_UNICODE_TITLECASE_LETTER 0x08
#define G_UNICODE_UPPERCASE_LETTER 0x09
#define G_UNICODE_SPACING_MARK 0x0A
#define G_UNICODE_ENCLOSING_MARK 0x0B
#define G_UNICODE_NON_SPACING_MARK 0x0C
#define G_UNICODE_DECIMAL_NUMBER 0x0D
#define G_UNICODE_LETTER_NUMBER 0x0E
#define G_UNICODE_OTHER_NUMBER 0x0F
#define G_UNICODE_CONNECT_PUNCTUATION 0x10
#define G_UNICODE_DASH_PUNCTUATION 0x11
#define G_UNICODE_CLOSE_PUNCTUATION 0x12
#define G_UNICODE_FINAL_PUNCTUATION 0x13
#define G_UNICODE_INITIAL_PUNCTUATION 0x14
#define G_UNICODE_OTHER_PUNCTUATION 0x15
#define G_UNICODE_OPEN_PUNCTUATION 0x16
#define G_UNICODE_CURRENCY_SYMBOL 0x17
#define G_UNICODE_MODIFIER_SYMBOL 0x18
#define G_UNICODE_MATH_SYMBOL 0x19
#define G_UNICODE_OTHER_SYMBOL 0x1A
#define G_UNICODE_LINE_SEPARATOR 0x1B
#define G_UNICODE_PARAGRAPH_SEPARATOR 0x1C
#define G_UNICODE_SPACE_SEPARATOR 0x1D
#define UCHAR_TYPE_CONTROL 0x00
#define UCHAR_TYPE_FORMAT 0x01
#define UCHAR_TYPE_UNASSIGNED 0x02
#define UCHAR_TYPE_PRIVATE_USE 0x03
#define UCHAR_TYPE_SURROGATE 0x04
#define UCHAR_TYPE_LOWERCASE_LETTER 0x05
#define UCHAR_TYPE_MODIFIER_LETTER 0x06
#define UCHAR_TYPE_OTHER_LETTER 0x07
#define UCHAR_TYPE_TITLECASE_LETTER 0x08
#define UCHAR_TYPE_UPPERCASE_LETTER 0x09
#define UCHAR_TYPE_SPACING_MARK 0x0A
#define UCHAR_TYPE_ENCLOSING_MARK 0x0B
#define UCHAR_TYPE_NON_SPACING_MARK 0x0C
#define UCHAR_TYPE_DECIMAL_NUMBER 0x0D
#define UCHAR_TYPE_LETTER_NUMBER 0x0E
#define UCHAR_TYPE_OTHER_NUMBER 0x0F
#define UCHAR_TYPE_CONNECT_PUNCTUATION 0x10
#define UCHAR_TYPE_DASH_PUNCTUATION 0x11
#define UCHAR_TYPE_CLOSE_PUNCTUATION 0x12
#define UCHAR_TYPE_FINAL_PUNCTUATION 0x13
#define UCHAR_TYPE_INITIAL_PUNCTUATION 0x14
#define UCHAR_TYPE_OTHER_PUNCTUATION 0x15
#define UCHAR_TYPE_OPEN_PUNCTUATION 0x16
#define UCHAR_TYPE_CURRENCY_SYMBOL 0x17
#define UCHAR_TYPE_MODIFIER_SYMBOL 0x18
#define UCHAR_TYPE_MATH_SYMBOL 0x19
#define UCHAR_TYPE_OTHER_SYMBOL 0x1A
#define UCHAR_TYPE_LINE_SEPARATOR 0x1B
#define UCHAR_TYPE_PARAGRAPH_SEPARATOR 0x1C
#define UCHAR_TYPE_SPACE_SEPARATOR 0x1D
/* These are the possible line break classifications.
* Note that new types may be added in the future.
* Implementations may regard unknown values like G_UNICODE_BREAK_UNKNOWN
* Implementations may regard unknown values like UCHAR_BREAK_UNKNOWN
* See http://www.unicode.org/unicode/reports/tr14/
*/
#define G_UNICODE_BREAK_MANDATORY 0x00
#define G_UNICODE_BREAK_CARRIAGE_RETURN 0x01
#define G_UNICODE_BREAK_LINE_FEED 0x02
#define G_UNICODE_BREAK_COMBINING_MARK 0x03
#define G_UNICODE_BREAK_SURROGATE 0x04
#define G_UNICODE_BREAK_ZERO_WIDTH_SPACE 0x05
#define G_UNICODE_BREAK_INSEPARABLE 0x06
#define G_UNICODE_BREAK_NON_BREAKING_GLUE 0x07
#define G_UNICODE_BREAK_CONTINGENT 0x08
#define G_UNICODE_BREAK_SPACE 0x09
#define G_UNICODE_BREAK_AFTER 0x0A
#define G_UNICODE_BREAK_BEFORE 0x0B
#define G_UNICODE_BREAK_BEFORE_AND_AFTER 0x0C
#define G_UNICODE_BREAK_HYPHEN 0x0D
#define G_UNICODE_BREAK_NON_STARTER 0x0E
#define G_UNICODE_BREAK_OPEN_PUNCTUATION 0x0F
#define G_UNICODE_BREAK_CLOSE_PUNCTUATION 0x10
#define G_UNICODE_BREAK_QUOTATION 0x11
#define G_UNICODE_BREAK_EXCLAMATION 0x12
#define G_UNICODE_BREAK_IDEOGRAPHIC 0x13
#define G_UNICODE_BREAK_NUMERIC 0x14
#define G_UNICODE_BREAK_INFIX_SEPARATOR 0x15
#define G_UNICODE_BREAK_SYMBOL 0x16
#define G_UNICODE_BREAK_ALPHABETIC 0x17
#define G_UNICODE_BREAK_PREFIX 0x18
#define G_UNICODE_BREAK_POSTFIX 0x19
#define G_UNICODE_BREAK_COMPLEX_CONTEXT 0x1A
#define G_UNICODE_BREAK_AMBIGUOUS 0x1B
#define G_UNICODE_BREAK_UNKNOWN 0x1C
#define G_UNICODE_BREAK_NEXT_LINE 0x1D
#define G_UNICODE_BREAK_WORD_JOINER 0x1E
#define G_UNICODE_BREAK_HANGUL_L_JAMO 0x1F
#define G_UNICODE_BREAK_HANGUL_V_JAMO 0x20
#define G_UNICODE_BREAK_HANGUL_T_JAMO 0x21
#define G_UNICODE_BREAK_HANGUL_LV_SYLLABLE 0x22
#define G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE 0x23
#define G_UNICODE_BREAK_CLOSE_PARANTHESIS 0x24
#define G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER 0x25
#define G_UNICODE_BREAK_HEBREW_LETTER 0x26
#define G_UNICODE_BREAK_REGIONAL_INDICATOR 0x27
#define G_UNICODE_BREAK_EMOJI_BASE 0x28
#define G_UNICODE_BREAK_EMOJI_MODIFIER 0x29
#define G_UNICODE_BREAK_ZERO_WIDTH_JOINER 0x2A
#define UCHAR_BREAK_MANDATORY 0x00
#define UCHAR_BREAK_CARRIAGE_RETURN 0x01
#define UCHAR_BREAK_LINE_FEED 0x02
#define UCHAR_BREAK_COMBINING_MARK 0x03
#define UCHAR_BREAK_SURROGATE 0x04
#define UCHAR_BREAK_ZERO_WIDTH_SPACE 0x05
#define UCHAR_BREAK_INSEPARABLE 0x06
#define UCHAR_BREAK_NON_BREAKING_GLUE 0x07
#define UCHAR_BREAK_CONTINGENT 0x08
#define UCHAR_BREAK_SPACE 0x09
#define UCHAR_BREAK_AFTER 0x0A
#define UCHAR_BREAK_BEFORE 0x0B
#define UCHAR_BREAK_BEFORE_AND_AFTER 0x0C
#define UCHAR_BREAK_HYPHEN 0x0D
#define UCHAR_BREAK_NON_STARTER 0x0E
#define UCHAR_BREAK_OPEN_PUNCTUATION 0x0F
#define UCHAR_BREAK_CLOSE_PUNCTUATION 0x10
#define UCHAR_BREAK_QUOTATION 0x11
#define UCHAR_BREAK_EXCLAMATION 0x12
#define UCHAR_BREAK_IDEOGRAPHIC 0x13
#define UCHAR_BREAK_NUMERIC 0x14
#define UCHAR_BREAK_INFIX_SEPARATOR 0x15
#define UCHAR_BREAK_SYMBOL 0x16
#define UCHAR_BREAK_ALPHABETIC 0x17
#define UCHAR_BREAK_PREFIX 0x18
#define UCHAR_BREAK_POSTFIX 0x19
#define UCHAR_BREAK_COMPLEX_CONTEXT 0x1A
#define UCHAR_BREAK_AMBIGUOUS 0x1B
#define UCHAR_BREAK_UNKNOWN 0x1C
#define UCHAR_BREAK_NEXT_LINE 0x1D
#define UCHAR_BREAK_WORD_JOINER 0x1E
#define UCHAR_BREAK_HANGUL_L_JAMO 0x1F
#define UCHAR_BREAK_HANGUL_V_JAMO 0x20
#define UCHAR_BREAK_HANGUL_T_JAMO 0x21
#define UCHAR_BREAK_HANGUL_LV_SYLLABLE 0x22
#define UCHAR_BREAK_HANGUL_LVT_SYLLABLE 0x23
#define UCHAR_BREAK_CLOSE_PARANTHESIS 0x24
#define UCHAR_BREAK_CONDITIONAL_JAPANESE_STARTER 0x25
#define UCHAR_BREAK_HEBREW_LETTER 0x26
#define UCHAR_BREAK_REGIONAL_INDICATOR 0x27
#define UCHAR_BREAK_EMOJI_BASE 0x28
#define UCHAR_BREAK_EMOJI_MODIFIER 0x29
#define UCHAR_BREAK_ZERO_WIDTH_JOINER 0x2A
struct _FONTOPS;
struct _CHARSETOPS;
@@ -8901,9 +8875,10 @@ typedef int Glyph32;
/**
* \def GLYPH2UCHAR(glyph)
* \brief get real glyph value from a glyph
* \brief get real glyph value from a glyph.
* Only valid for UNICODE.
*
* \param glyph glyph value
* \param glyph glyph value.
*/
#define GLYPH2UCHAR(glyph) ((glyph) & 0x7FFFFFFF)
@@ -9092,10 +9067,12 @@ MG_EXPORT int GUIAPI DrawGlyphString (HDC hdc, int x, int y, Glyph32* glyphs,
/** The type of glyph bitmap: pre-rendered BITMAP object */
#define GLYPHBMP_TYPE_PRERENDER 0x03
/** The bits mask for glyph type */
#define GLYPHTYPE_BASIC_MASK 0x00FF
/** The bits mask for break type */
#define GLYPHTYPE_BREAK_MASK 0xFF00
/** The bits mask of glyph type for multi-byte character */
#define GLYPHTYPE_MCHAR_MASK 0x0000FFFF
/** The bits mask of glyph type for unicode charachter */
#define GLYPHTYPE_BASIC_MASK 0x00FF0000
/** The bits mask of break type for unicode charachter */
#define GLYPHTYPE_BREAK_MASK 0xFF000000
/**
* \var typedef struct _GLYPHINFO GLYPHINFO
+2 -2
View File
@@ -190,7 +190,7 @@ static void destroy (GLYPHTREENODE *root)
/*** device font ops ***/
static DWORD get_glyph_type (LOGFONT* logfont, DEVFONT* devfont)
static DWORD get_glyph_bmptype (LOGFONT* logfont, DEVFONT* devfont)
{
return DEVFONTGLYPHTYPE_PRERDRBMP;
}
@@ -365,7 +365,7 @@ static int get_glyph_bbox (LOGFONT* logfont, DEVFONT* devfont,
/**************************** Global data ************************************/
FONTOPS __mg_bitmap_font_ops = {
get_glyph_type,
get_glyph_bmptype,
get_ave_width,
get_max_width,
get_font_height,
+93 -75
View File
@@ -740,12 +740,14 @@ static BOOL get_mirror_glyph (const BIDICHAR_MIRROR_MAP* map, int n, Glyph32 gly
{
int pos, step;
BOOL found = FALSE;
BOOL is_mbc;
pos = step = (n / 2) + 1;
#if 0 // VincentWei: caller should handle MBC flag in glyph
BOOL is_mbc;
is_mbc = IS_MBC_GLYPH(glyph);
glyph = REAL_GLYPH(glyph);
#endif
while (step > 1) {
Glyph32 cmp_glyph = map[pos].glyph;
@@ -769,9 +771,12 @@ static BOOL get_mirror_glyph (const BIDICHAR_MIRROR_MAP* map, int n, Glyph32 gly
if (mirrored){
*mirrored = found ? map[pos].mirrored : glyph;
#if 0 // VincentWei: caller should handle MBC flag in glyph
/* use the same mbc font for mirror char. */
if(is_mbc)
*mirrored = SET_MBC_GLYPH(*mirrored);
#endif
}
return found;
@@ -1050,7 +1055,7 @@ static Uint32 __mg_iso8859_8_type[] = {
static unsigned int iso8859_8_bidi_glyph_type (Glyph32 glyph_value)
{
return __mg_iso8859_8_type [REAL_GLYPH(glyph_value)];
return __mg_iso8859_8_type [glyph_value];
}
static const BIDICHAR_MIRROR_MAP __mg_iso8859_8_mirror_table [] =
@@ -3468,82 +3473,95 @@ static Glyph32 utf8_char_glyph_value (const unsigned char* pre_mchar, int pre_le
#include "gunichartables.h"
#include "gunibreak.h"
#define ATTR_TABLE(Page) (((Page) <= G_UNICODE_LAST_PAGE_PART1) \
#define ATTR_TABLE(Page) (((Page) <= UCHAR_TYPE_LAST_PAGE_PART1) \
? attr_table_part1[Page] \
: attr_table_part2[(Page) - 0xe00])
#define ATTTABLE(Page, Char) \
((ATTR_TABLE(Page) == G_UNICODE_MAX_TABLE_INDEX) ? 0 : (attr_data[ATTR_TABLE(Page)][Char]))
((ATTR_TABLE(Page) == UCHAR_TYPE_MAX_TABLE_INDEX) ? 0 : (attr_data[ATTR_TABLE(Page)][Char]))
#define TTYPE_PART1(Page, Char) \
((type_table_part1[Page] >= G_UNICODE_MAX_TABLE_INDEX) \
? (type_table_part1[Page] - G_UNICODE_MAX_TABLE_INDEX) \
((type_table_part1[Page] >= UCHAR_TYPE_MAX_TABLE_INDEX) \
? (type_table_part1[Page] - UCHAR_TYPE_MAX_TABLE_INDEX) \
: (type_data[type_table_part1[Page]][Char]))
#define TTYPE_PART2(Page, Char) \
((type_table_part2[Page] >= G_UNICODE_MAX_TABLE_INDEX) \
? (type_table_part2[Page] - G_UNICODE_MAX_TABLE_INDEX) \
((type_table_part2[Page] >= UCHAR_TYPE_MAX_TABLE_INDEX) \
? (type_table_part2[Page] - UCHAR_TYPE_MAX_TABLE_INDEX) \
: (type_data[type_table_part2[Page]][Char]))
#define TYPE(Char) \
(((Char) <= G_UNICODE_LAST_CHAR_PART1) \
(((Char) <= UCHAR_TYPE_LAST_CHAR_PART1) \
? TTYPE_PART1 ((Char) >> 8, (Char) & 0xff) \
: (((Char) >= 0xe0000 && (Char) <= G_UNICODE_LAST_CHAR) \
: (((Char) >= 0xe0000 && (Char) <= UCHAR_TYPE_LAST_CHAR) \
? TTYPE_PART2 (((Char) - 0xe0000) >> 8, (Char) & 0xff) \
: G_UNICODE_UNASSIGNED))
: UCHAR_TYPE_UNASSIGNED))
#define IS(Type, Class) (((unsigned int)1 << (Type)) & (Class))
#define OR(Type, Rest) (((unsigned int)1 << (Type)) | (Rest))
#define ISALPHA(Type) IS ((Type), \
OR (G_UNICODE_LOWERCASE_LETTER, \
OR (G_UNICODE_UPPERCASE_LETTER, \
OR (G_UNICODE_TITLECASE_LETTER, \
OR (G_UNICODE_MODIFIER_LETTER, \
OR (G_UNICODE_OTHER_LETTER, 0))))))
OR (UCHAR_TYPE_LOWERCASE_LETTER, \
OR (UCHAR_TYPE_UPPERCASE_LETTER, \
OR (UCHAR_TYPE_TITLECASE_LETTER, \
OR (UCHAR_TYPE_MODIFIER_LETTER, \
OR (UCHAR_TYPE_OTHER_LETTER, 0))))))
#define ISALDIGIT(Type) IS ((Type), \
OR (G_UNICODE_DECIMAL_NUMBER, \
OR (G_UNICODE_LETTER_NUMBER, \
OR (G_UNICODE_OTHER_NUMBER, \
OR (G_UNICODE_LOWERCASE_LETTER, \
OR (G_UNICODE_UPPERCASE_LETTER, \
OR (G_UNICODE_TITLECASE_LETTER, \
OR (G_UNICODE_MODIFIER_LETTER, \
OR (G_UNICODE_OTHER_LETTER, 0)))))))))
OR (UCHAR_TYPE_DECIMAL_NUMBER, \
OR (UCHAR_TYPE_LETTER_NUMBER, \
OR (UCHAR_TYPE_OTHER_NUMBER, \
OR (UCHAR_TYPE_LOWERCASE_LETTER, \
OR (UCHAR_TYPE_UPPERCASE_LETTER, \
OR (UCHAR_TYPE_TITLECASE_LETTER, \
OR (UCHAR_TYPE_MODIFIER_LETTER, \
OR (UCHAR_TYPE_OTHER_LETTER, 0)))))))))
#define ISMARK(Type) IS ((Type), \
OR (G_UNICODE_NON_SPACING_MARK, \
OR (G_UNICODE_SPACING_MARK, \
OR (G_UNICODE_ENCLOSING_MARK, 0))))
OR (UCHAR_TYPE_NON_SPACING_MARK, \
OR (UCHAR_TYPE_SPACING_MARK, \
OR (UCHAR_TYPE_ENCLOSING_MARK, 0))))
#define ISZEROWIDTHTYPE(Type) IS ((Type), \
OR (G_UNICODE_NON_SPACING_MARK, \
OR (G_UNICODE_ENCLOSING_MARK, \
OR (G_UNICODE_FORMAT, 0))))
OR (UCHAR_TYPE_NON_SPACING_MARK, \
OR (UCHAR_TYPE_ENCLOSING_MARK, \
OR (UCHAR_TYPE_FORMAT, 0))))
#define TPROP_PART1(Page, Char) \
((break_property_table_part1[Page] >= G_UNICODE_MAX_TABLE_INDEX) \
? (break_property_table_part1[Page] - G_UNICODE_MAX_TABLE_INDEX) \
((break_property_table_part1[Page] >= UCHAR_TYPE_MAX_TABLE_INDEX) \
? (break_property_table_part1[Page] - UCHAR_TYPE_MAX_TABLE_INDEX) \
: (break_property_data[break_property_table_part1[Page]][Char]))
#define TPROP_PART2(Page, Char) \
((break_property_table_part2[Page] >= G_UNICODE_MAX_TABLE_INDEX) \
? (break_property_table_part2[Page] - G_UNICODE_MAX_TABLE_INDEX) \
((break_property_table_part2[Page] >= UCHAR_TYPE_MAX_TABLE_INDEX) \
? (break_property_table_part2[Page] - UCHAR_TYPE_MAX_TABLE_INDEX) \
: (break_property_data[break_property_table_part2[Page]][Char]))
#define PROP(Char) \
(((Char) <= G_UNICODE_LAST_CHAR_PART1) \
(((Char) <= UCHAR_TYPE_LAST_CHAR_PART1) \
? TPROP_PART1 ((Char) >> 8, (Char) & 0xff) \
: (((Char) >= 0xe0000 && (Char) <= G_UNICODE_LAST_CHAR) \
: (((Char) >= 0xe0000 && (Char) <= UCHAR_TYPE_LAST_CHAR) \
? TPROP_PART2 (((Char) - 0xe0000) >> 8, (Char) & 0xff) \
: G_UNICODE_BREAK_UNKNOWN))
: UCHAR_BREAK_UNKNOWN))
static unsigned int unicode_glyph_type (Glyph32 glyph_value)
{
unsigned int basic_type = TYPE(glyph_value);
unsigned int break_type = PROP(glyph_value);
return basic_type | (break_type << 8);
unsigned int mchar_type = MCHAR_TYPE_UNKNOWN;
unsigned int basic_type = 0, break_type = 0;
if (glyph_value < 0x80) {
mchar_type = sb_glyph_type(glyph_value);
}
else {
basic_type = TYPE(glyph_value);
break_type = PROP(glyph_value);
if (ISZEROWIDTHTYPE(basic_type)) {
mchar_type = MCHAR_TYPE_ZEROWIDTH;
}
}
return (break_type << 24) | (basic_type << 16) | mchar_type;
}
#include "unicode-bidi-tables.h"
@@ -4381,59 +4399,59 @@ BOOL GUIAPI IsUCharAlpha(UChar32 uc)
BOOL GUIAPI IsUCharControl(UChar32 uc)
{
return TYPE(uc) == G_UNICODE_CONTROL;
return TYPE(uc) == UCHAR_TYPE_CONTROL;
}
BOOL GUIAPI IsUCharDigit(UChar32 uc)
{
return TYPE(uc) == G_UNICODE_DECIMAL_NUMBER;
return TYPE(uc) == UCHAR_TYPE_DECIMAL_NUMBER;
}
BOOL GUIAPI IsUCharGraph(UChar32 uc)
{
return !IS (TYPE(uc),
OR (G_UNICODE_CONTROL,
OR (G_UNICODE_FORMAT,
OR (G_UNICODE_UNASSIGNED,
OR (G_UNICODE_SURROGATE,
OR (G_UNICODE_SPACE_SEPARATOR,
OR (UCHAR_TYPE_CONTROL,
OR (UCHAR_TYPE_FORMAT,
OR (UCHAR_TYPE_UNASSIGNED,
OR (UCHAR_TYPE_SURROGATE,
OR (UCHAR_TYPE_SPACE_SEPARATOR,
0))))));
}
BOOL GUIAPI IsUCharLowercase(UChar32 uc)
{
return TYPE(uc) == G_UNICODE_LOWERCASE_LETTER;
return TYPE(uc) == UCHAR_TYPE_LOWERCASE_LETTER;
}
BOOL GUIAPI IsUCharPrint(UChar32 uc)
{
return !IS (TYPE(uc),
OR (G_UNICODE_CONTROL,
OR (G_UNICODE_FORMAT,
OR (G_UNICODE_UNASSIGNED,
OR (G_UNICODE_SURROGATE,
OR (UCHAR_TYPE_CONTROL,
OR (UCHAR_TYPE_FORMAT,
OR (UCHAR_TYPE_UNASSIGNED,
OR (UCHAR_TYPE_SURROGATE,
0)))));
}
BOOL GUIAPI IsUCharUppercase(UChar32 uc)
{
return TYPE(uc) == G_UNICODE_UPPERCASE_LETTER;
return TYPE(uc) == UCHAR_TYPE_UPPERCASE_LETTER;
}
BOOL GUIAPI IsUCharPunct(UChar32 uc)
{
return IS (TYPE(uc),
OR (G_UNICODE_CONNECT_PUNCTUATION,
OR (G_UNICODE_DASH_PUNCTUATION,
OR (G_UNICODE_CLOSE_PUNCTUATION,
OR (G_UNICODE_FINAL_PUNCTUATION,
OR (G_UNICODE_INITIAL_PUNCTUATION,
OR (G_UNICODE_OTHER_PUNCTUATION,
OR (G_UNICODE_OPEN_PUNCTUATION,
OR (G_UNICODE_CURRENCY_SYMBOL,
OR (G_UNICODE_MODIFIER_SYMBOL,
OR (G_UNICODE_MATH_SYMBOL,
OR (G_UNICODE_OTHER_SYMBOL,
OR (UCHAR_TYPE_CONNECT_PUNCTUATION,
OR (UCHAR_TYPE_DASH_PUNCTUATION,
OR (UCHAR_TYPE_CLOSE_PUNCTUATION,
OR (UCHAR_TYPE_FINAL_PUNCTUATION,
OR (UCHAR_TYPE_INITIAL_PUNCTUATION,
OR (UCHAR_TYPE_OTHER_PUNCTUATION,
OR (UCHAR_TYPE_OPEN_PUNCTUATION,
OR (UCHAR_TYPE_CURRENCY_SYMBOL,
OR (UCHAR_TYPE_MODIFIER_SYMBOL,
OR (UCHAR_TYPE_MATH_SYMBOL,
OR (UCHAR_TYPE_OTHER_SYMBOL,
0))))))))))));
}
@@ -4449,9 +4467,9 @@ BOOL GUIAPI IsUCharSpace(UChar32 uc)
default: {
if (IS (TYPE(uc),
OR (G_UNICODE_SPACE_SEPARATOR,
OR (G_UNICODE_LINE_SEPARATOR,
OR (G_UNICODE_PARAGRAPH_SEPARATOR,
OR (UCHAR_TYPE_SPACE_SEPARATOR,
OR (UCHAR_TYPE_LINE_SEPARATOR,
OR (UCHAR_TYPE_PARAGRAPH_SEPARATOR,
0)))))
return TRUE;
}
@@ -4483,14 +4501,14 @@ BOOL GUIAPI IsUCharXDigit(UChar32 uc)
{
return ((uc >= 'a' && uc <= 'f')
|| (uc >= 'A' && uc <= 'F')
|| (TYPE(uc) == G_UNICODE_DECIMAL_NUMBER));
|| (TYPE(uc) == UCHAR_TYPE_DECIMAL_NUMBER));
}
BOOL GUIAPI IsUCharDefined(UChar32 uc)
{
return !IS (TYPE(uc),
OR (G_UNICODE_UNASSIGNED,
OR (G_UNICODE_SURROGATE,
OR (UCHAR_TYPE_UNASSIGNED,
OR (UCHAR_TYPE_SURROGATE,
0)));
}
@@ -4576,7 +4594,7 @@ BOOL GUIAPI IsUCharWideCJK (UChar32 uc)
UChar32 UCharToUpper (UChar32 uc)
{
int t = TYPE (uc);
if (t == G_UNICODE_LOWERCASE_LETTER) {
if (t == UCHAR_TYPE_LOWERCASE_LETTER) {
UChar32 val = ATTTABLE (uc >> 8, uc & 0xff);
if (val >= 0x1000000) {
const unsigned char *p = special_case_table + val - 0x1000000;
@@ -4588,7 +4606,7 @@ UChar32 UCharToUpper (UChar32 uc)
*/
return val ? val : uc;
}
else if (t == G_UNICODE_TITLECASE_LETTER) {
else if (t == UCHAR_TYPE_TITLECASE_LETTER) {
unsigned int i;
for (i = 0; i < TABLESIZE (title_table); ++i) {
if (title_table[i][0] == uc)
@@ -4605,7 +4623,7 @@ UChar32 UCharToUpper (UChar32 uc)
UChar32 GUIAPI UCharToLower (UChar32 uc)
{
int t = TYPE (uc);
if (t == G_UNICODE_UPPERCASE_LETTER) {
if (t == UCHAR_TYPE_UPPERCASE_LETTER) {
UChar32 val = ATTTABLE (uc >> 8, uc & 0xff);
if (val >= 0x1000000) {
const unsigned char *p = special_case_table + val - 0x1000000;
@@ -4617,7 +4635,7 @@ UChar32 GUIAPI UCharToLower (UChar32 uc)
return val ? val : uc;
}
}
else if (t == G_UNICODE_TITLECASE_LETTER) {
else if (t == UCHAR_TYPE_TITLECASE_LETTER) {
unsigned int i;
for (i = 0; i < TABLESIZE (title_table); ++i) {
if (title_table[i][0] == uc)
@@ -4639,7 +4657,7 @@ UChar32 GUIAPI UCharToTitle (UChar32 uc)
return title_table[i][0];
}
if (TYPE (uc) == G_UNICODE_LOWERCASE_LETTER)
if (TYPE (uc) == UCHAR_TYPE_LOWERCASE_LETTER)
return UCharToUpper (uc);
return uc;
+1 -1
View File
@@ -153,7 +153,7 @@ static DEVFONT* get_matched_devfont (LOGFONT* log_font, DEVFONT* list_head,
if (weight_req == FS_WEIGHT_ANY || weight_req == weight_cur) {
match_bits [i] |= MATCHED_WEIGHT;
}
else if (dev_font->font_ops->get_glyph_type(log_font, dev_font)
else if (dev_font->font_ops->get_glyph_bmptype(log_font, dev_font)
== DEVFONTGLYPHTYPE_MONOBMP
&& weight_req > FS_WEIGHT_DEMIBOLD
&& weight_cur < FS_WEIGHT_MEDIUM) {
+110 -110
View File
File diff suppressed because it is too large Load Diff
+4 -4
View File
@@ -212,7 +212,7 @@ print_bitmap_grey (void* buffer, int width, int rows, int pitch)
}
#endif
static DWORD get_glyph_type (LOGFONT* logfont, DEVFONT* devfont)
static DWORD get_glyph_bmptype (LOGFONT* logfont, DEVFONT* devfont)
{
switch (logfont->style & FS_RENDER_MASK) {
case FS_RENDER_SUBPIXEL:
@@ -394,7 +394,7 @@ get_glyph_bbox (LOGFONT* logfont, DEVFONT* devfont,
#endif /* _MGFONT_TTF_CACHE */
if (load_or_search_glyph (ft_inst_info, &face, uni_char,
get_glyph_type(logfont, devfont))) {
get_glyph_bmptype(logfont, devfont))) {
_ERR_PRINTF ("FONT>FT2: load_or_search_glyph error in freetype2\n");
goto error;
}
@@ -523,7 +523,7 @@ char_bitmap_pixmap (LOGFONT* logfont, DEVFONT* devfont,
#endif /* _MGFONT_TTF_CACHE */
if (load_or_search_glyph (ft_inst_info, &face, uni_char,
get_glyph_type(logfont, devfont))) {
get_glyph_bmptype(logfont, devfont))) {
_ERR_PRINTF ("FONT>FT2: load_or_search_glyph failed in freetype2\n");
goto error;
}
@@ -1130,7 +1130,7 @@ void font_TermFreetypeLibrary (void)
/**************************** Global data ************************************/
FONTOPS __mg_ttf_ops = {
get_glyph_type,
get_glyph_bmptype,
get_ave_width,
get_max_width,
get_font_height,
+23119 -23119
View File
File diff suppressed because it is too large Load Diff
+15422 -15422
View File
File diff suppressed because it is too large Load Diff
+138 -138
View File
@@ -32,8 +32,8 @@
* <http://www.minigui.com/en/about/licensing-policy/>.
*/
#ifndef __G_UNICODE_H__
#define __G_UNICODE_H__
#ifndef __UCHAR_TYPE_H__
#define __UCHAR_TYPE_H__
/* These are the possible character classifications.
@@ -42,160 +42,160 @@
#if 0 /* VincentWei: Moved to gid.h */
typedef enum
{
G_UNICODE_CONTROL,
G_UNICODE_FORMAT,
G_UNICODE_UNASSIGNED,
G_UNICODE_PRIVATE_USE,
G_UNICODE_SURROGATE,
G_UNICODE_LOWERCASE_LETTER,
G_UNICODE_MODIFIER_LETTER,
G_UNICODE_OTHER_LETTER,
G_UNICODE_TITLECASE_LETTER,
G_UNICODE_UPPERCASE_LETTER,
G_UNICODE_COMBINING_MARK,
G_UNICODE_ENCLOSING_MARK,
G_UNICODE_NON_SPACING_MARK,
G_UNICODE_DECIMAL_NUMBER,
G_UNICODE_LETTER_NUMBER,
G_UNICODE_OTHER_NUMBER,
G_UNICODE_CONNECT_PUNCTUATION,
G_UNICODE_DASH_PUNCTUATION,
G_UNICODE_CLOSE_PUNCTUATION,
G_UNICODE_FINAL_PUNCTUATION,
G_UNICODE_INITIAL_PUNCTUATION,
G_UNICODE_OTHER_PUNCTUATION,
G_UNICODE_OPEN_PUNCTUATION,
G_UNICODE_CURRENCY_SYMBOL,
G_UNICODE_MODIFIER_SYMBOL,
G_UNICODE_MATH_SYMBOL,
G_UNICODE_OTHER_SYMBOL,
G_UNICODE_LINE_SEPARATOR,
G_UNICODE_PARAGRAPH_SEPARATOR,
G_UNICODE_SPACE_SEPARATOR
UCHAR_TYPE_CONTROL,
UCHAR_TYPE_FORMAT,
UCHAR_TYPE_UNASSIGNED,
UCHAR_TYPE_PRIVATE_USE,
UCHAR_TYPE_SURROGATE,
UCHAR_TYPE_LOWERCASE_LETTER,
UCHAR_TYPE_MODIFIER_LETTER,
UCHAR_TYPE_OTHER_LETTER,
UCHAR_TYPE_TITLECASE_LETTER,
UCHAR_TYPE_UPPERCASE_LETTER,
UCHAR_TYPE_COMBINING_MARK,
UCHAR_TYPE_ENCLOSING_MARK,
UCHAR_TYPE_NON_SPACING_MARK,
UCHAR_TYPE_DECIMAL_NUMBER,
UCHAR_TYPE_LETTER_NUMBER,
UCHAR_TYPE_OTHER_NUMBER,
UCHAR_TYPE_CONNECT_PUNCTUATION,
UCHAR_TYPE_DASH_PUNCTUATION,
UCHAR_TYPE_CLOSE_PUNCTUATION,
UCHAR_TYPE_FINAL_PUNCTUATION,
UCHAR_TYPE_INITIAL_PUNCTUATION,
UCHAR_TYPE_OTHER_PUNCTUATION,
UCHAR_TYPE_OPEN_PUNCTUATION,
UCHAR_TYPE_CURRENCY_SYMBOL,
UCHAR_TYPE_MODIFIER_SYMBOL,
UCHAR_TYPE_MATH_SYMBOL,
UCHAR_TYPE_OTHER_SYMBOL,
UCHAR_TYPE_LINE_SEPARATOR,
UCHAR_TYPE_PARAGRAPH_SEPARATOR,
UCHAR_TYPE_SPACE_SEPARATOR
} GUnicodeType;
/* These are the possible line break classifications.
* Note that new types may be added in the future.
* Implementations may regard unknown values like G_UNICODE_BREAK_UNKNOWN
* Implementations may regard unknown values like UCHAR_BREAK_UNKNOWN
* See http://www.unicode.org/unicode/reports/tr14/
*/
typedef enum
{
G_UNICODE_BREAK_MANDATORY,
G_UNICODE_BREAK_CARRIAGE_RETURN,
G_UNICODE_BREAK_LINE_FEED,
G_UNICODE_BREAK_COMBINING_MARK,
G_UNICODE_BREAK_SURROGATE,
G_UNICODE_BREAK_ZERO_WIDTH_SPACE,
G_UNICODE_BREAK_INSEPARABLE,
G_UNICODE_BREAK_NON_BREAKING_GLUE,
G_UNICODE_BREAK_CONTINGENT,
G_UNICODE_BREAK_SPACE,
G_UNICODE_BREAK_AFTER,
G_UNICODE_BREAK_BEFORE,
G_UNICODE_BREAK_BEFORE_AND_AFTER,
G_UNICODE_BREAK_HYPHEN,
G_UNICODE_BREAK_NON_STARTER,
G_UNICODE_BREAK_OPEN_PUNCTUATION,
G_UNICODE_BREAK_CLOSE_PUNCTUATION,
G_UNICODE_BREAK_QUOTATION,
G_UNICODE_BREAK_EXCLAMATION,
G_UNICODE_BREAK_IDEOGRAPHIC,
G_UNICODE_BREAK_NUMERIC,
G_UNICODE_BREAK_INFIX_SEPARATOR,
G_UNICODE_BREAK_SYMBOL,
G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_PREFIX,
G_UNICODE_BREAK_POSTFIX,
G_UNICODE_BREAK_COMPLEX_CONTEXT,
G_UNICODE_BREAK_AMBIGUOUS,
G_UNICODE_BREAK_UNKNOWN,
G_UNICODE_BREAK_NEXT_LINE,
G_UNICODE_BREAK_WORD_JOINER,
G_UNICODE_BREAK_HANGUL_L_JAMO,
G_UNICODE_BREAK_HANGUL_V_JAMO,
G_UNICODE_BREAK_HANGUL_T_JAMO,
G_UNICODE_BREAK_HANGUL_LV_SYLLABLE,
G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
UCHAR_BREAK_MANDATORY,
UCHAR_BREAK_CARRIAGE_RETURN,
UCHAR_BREAK_LINE_FEED,
UCHAR_BREAK_COMBINING_MARK,
UCHAR_BREAK_SURROGATE,
UCHAR_BREAK_ZERO_WIDTH_SPACE,
UCHAR_BREAK_INSEPARABLE,
UCHAR_BREAK_NON_BREAKING_GLUE,
UCHAR_BREAK_CONTINGENT,
UCHAR_BREAK_SPACE,
UCHAR_BREAK_AFTER,
UCHAR_BREAK_BEFORE,
UCHAR_BREAK_BEFORE_AND_AFTER,
UCHAR_BREAK_HYPHEN,
UCHAR_BREAK_NON_STARTER,
UCHAR_BREAK_OPEN_PUNCTUATION,
UCHAR_BREAK_CLOSE_PUNCTUATION,
UCHAR_BREAK_QUOTATION,
UCHAR_BREAK_EXCLAMATION,
UCHAR_BREAK_IDEOGRAPHIC,
UCHAR_BREAK_NUMERIC,
UCHAR_BREAK_INFIX_SEPARATOR,
UCHAR_BREAK_SYMBOL,
UCHAR_BREAK_ALPHABETIC,
UCHAR_BREAK_PREFIX,
UCHAR_BREAK_POSTFIX,
UCHAR_BREAK_COMPLEX_CONTEXT,
UCHAR_BREAK_AMBIGUOUS,
UCHAR_BREAK_UNKNOWN,
UCHAR_BREAK_NEXT_LINE,
UCHAR_BREAK_WORD_JOINER,
UCHAR_BREAK_HANGUL_L_JAMO,
UCHAR_BREAK_HANGUL_V_JAMO,
UCHAR_BREAK_HANGUL_T_JAMO,
UCHAR_BREAK_HANGUL_LV_SYLLABLE,
UCHAR_BREAK_HANGUL_LVT_SYLLABLE
} GUnicodeBreakType;
#endif /* VincentWei: Moved to gid.h */
typedef enum
{ /* ISO 15924 code */
G_UNICODE_SCRIPT_INVALID_CODE = -1,
G_UNICODE_SCRIPT_COMMON = 0, /* Zyyy */
G_UNICODE_SCRIPT_INHERITED, /* Qaai */
G_UNICODE_SCRIPT_ARABIC, /* Arab */
G_UNICODE_SCRIPT_ARMENIAN, /* Armn */
G_UNICODE_SCRIPT_BENGALI, /* Beng */
G_UNICODE_SCRIPT_BOPOMOFO, /* Bopo */
G_UNICODE_SCRIPT_CHEROKEE, /* Cher */
G_UNICODE_SCRIPT_COPTIC, /* Qaac */
G_UNICODE_SCRIPT_CYRILLIC, /* Cyrl (Cyrs) */
G_UNICODE_SCRIPT_DESERET, /* Dsrt */
G_UNICODE_SCRIPT_DEVANAGARI, /* Deva */
G_UNICODE_SCRIPT_ETHIOPIC, /* Ethi */
G_UNICODE_SCRIPT_GEORGIAN, /* Geor (Geon, Geoa) */
G_UNICODE_SCRIPT_GOTHIC, /* Goth */
G_UNICODE_SCRIPT_GREEK, /* Grek */
G_UNICODE_SCRIPT_GUJARATI, /* Gujr */
G_UNICODE_SCRIPT_GURMUKHI, /* Guru */
G_UNICODE_SCRIPT_HAN, /* Hani */
G_UNICODE_SCRIPT_HANGUL, /* Hang */
G_UNICODE_SCRIPT_HEBREW, /* Hebr */
G_UNICODE_SCRIPT_HIRAGANA, /* Hira */
G_UNICODE_SCRIPT_KANNADA, /* Knda */
G_UNICODE_SCRIPT_KATAKANA, /* Kana */
G_UNICODE_SCRIPT_KHMER, /* Khmr */
G_UNICODE_SCRIPT_LAO, /* Laoo */
G_UNICODE_SCRIPT_LATIN, /* Latn (Latf, Latg) */
G_UNICODE_SCRIPT_MALAYALAM, /* Mlym */
G_UNICODE_SCRIPT_MONGOLIAN, /* Mong */
G_UNICODE_SCRIPT_MYANMAR, /* Mymr */
G_UNICODE_SCRIPT_OGHAM, /* Ogam */
G_UNICODE_SCRIPT_OLD_ITALIC, /* Ital */
G_UNICODE_SCRIPT_ORIYA, /* Orya */
G_UNICODE_SCRIPT_RUNIC, /* Runr */
G_UNICODE_SCRIPT_SINHALA, /* Sinh */
G_UNICODE_SCRIPT_SYRIAC, /* Syrc (Syrj, Syrn, Syre) */
G_UNICODE_SCRIPT_TAMIL, /* Taml */
G_UNICODE_SCRIPT_TELUGU, /* Telu */
G_UNICODE_SCRIPT_THAANA, /* Thaa */
G_UNICODE_SCRIPT_THAI, /* Thai */
G_UNICODE_SCRIPT_TIBETAN, /* Tibt */
G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, /* Cans */
G_UNICODE_SCRIPT_YI, /* Yiii */
G_UNICODE_SCRIPT_TAGALOG, /* Tglg */
G_UNICODE_SCRIPT_HANUNOO, /* Hano */
G_UNICODE_SCRIPT_BUHID, /* Buhd */
G_UNICODE_SCRIPT_TAGBANWA, /* Tagb */
UCHAR_TYPE_SCRIPT_INVALID_CODE = -1,
UCHAR_TYPE_SCRIPT_COMMON = 0, /* Zyyy */
UCHAR_TYPE_SCRIPT_INHERITED, /* Qaai */
UCHAR_TYPE_SCRIPT_ARABIC, /* Arab */
UCHAR_TYPE_SCRIPT_ARMENIAN, /* Armn */
UCHAR_TYPE_SCRIPT_BENGALI, /* Beng */
UCHAR_TYPE_SCRIPT_BOPOMOFO, /* Bopo */
UCHAR_TYPE_SCRIPT_CHEROKEE, /* Cher */
UCHAR_TYPE_SCRIPT_COPTIC, /* Qaac */
UCHAR_TYPE_SCRIPT_CYRILLIC, /* Cyrl (Cyrs) */
UCHAR_TYPE_SCRIPT_DESERET, /* Dsrt */
UCHAR_TYPE_SCRIPT_DEVANAGARI, /* Deva */
UCHAR_TYPE_SCRIPT_ETHIOPIC, /* Ethi */
UCHAR_TYPE_SCRIPT_GEORGIAN, /* Geor (Geon, Geoa) */
UCHAR_TYPE_SCRIPT_GOTHIC, /* Goth */
UCHAR_TYPE_SCRIPT_GREEK, /* Grek */
UCHAR_TYPE_SCRIPT_GUJARATI, /* Gujr */
UCHAR_TYPE_SCRIPT_GURMUKHI, /* Guru */
UCHAR_TYPE_SCRIPT_HAN, /* Hani */
UCHAR_TYPE_SCRIPT_HANGUL, /* Hang */
UCHAR_TYPE_SCRIPT_HEBREW, /* Hebr */
UCHAR_TYPE_SCRIPT_HIRAGANA, /* Hira */
UCHAR_TYPE_SCRIPT_KANNADA, /* Knda */
UCHAR_TYPE_SCRIPT_KATAKANA, /* Kana */
UCHAR_TYPE_SCRIPT_KHMER, /* Khmr */
UCHAR_TYPE_SCRIPT_LAO, /* Laoo */
UCHAR_TYPE_SCRIPT_LATIN, /* Latn (Latf, Latg) */
UCHAR_TYPE_SCRIPT_MALAYALAM, /* Mlym */
UCHAR_TYPE_SCRIPT_MONGOLIAN, /* Mong */
UCHAR_TYPE_SCRIPT_MYANMAR, /* Mymr */
UCHAR_TYPE_SCRIPT_OGHAM, /* Ogam */
UCHAR_TYPE_SCRIPT_OLD_ITALIC, /* Ital */
UCHAR_TYPE_SCRIPT_ORIYA, /* Orya */
UCHAR_TYPE_SCRIPT_RUNIC, /* Runr */
UCHAR_TYPE_SCRIPT_SINHALA, /* Sinh */
UCHAR_TYPE_SCRIPT_SYRIAC, /* Syrc (Syrj, Syrn, Syre) */
UCHAR_TYPE_SCRIPT_TAMIL, /* Taml */
UCHAR_TYPE_SCRIPT_TELUGU, /* Telu */
UCHAR_TYPE_SCRIPT_THAANA, /* Thaa */
UCHAR_TYPE_SCRIPT_THAI, /* Thai */
UCHAR_TYPE_SCRIPT_TIBETAN, /* Tibt */
UCHAR_TYPE_SCRIPT_CANADIAN_ABORIGINAL, /* Cans */
UCHAR_TYPE_SCRIPT_YI, /* Yiii */
UCHAR_TYPE_SCRIPT_TAGALOG, /* Tglg */
UCHAR_TYPE_SCRIPT_HANUNOO, /* Hano */
UCHAR_TYPE_SCRIPT_BUHID, /* Buhd */
UCHAR_TYPE_SCRIPT_TAGBANWA, /* Tagb */
/* Unicode-4.0 additions */
G_UNICODE_SCRIPT_BRAILLE, /* Brai */
G_UNICODE_SCRIPT_CYPRIOT, /* Cprt */
G_UNICODE_SCRIPT_LIMBU, /* Limb */
G_UNICODE_SCRIPT_OSMANYA, /* Osma */
G_UNICODE_SCRIPT_SHAVIAN, /* Shaw */
G_UNICODE_SCRIPT_LINEAR_B, /* Linb */
G_UNICODE_SCRIPT_TAI_LE, /* Tale */
G_UNICODE_SCRIPT_UGARITIC, /* Ugar */
UCHAR_TYPE_SCRIPT_BRAILLE, /* Brai */
UCHAR_TYPE_SCRIPT_CYPRIOT, /* Cprt */
UCHAR_TYPE_SCRIPT_LIMBU, /* Limb */
UCHAR_TYPE_SCRIPT_OSMANYA, /* Osma */
UCHAR_TYPE_SCRIPT_SHAVIAN, /* Shaw */
UCHAR_TYPE_SCRIPT_LINEAR_B, /* Linb */
UCHAR_TYPE_SCRIPT_TAI_LE, /* Tale */
UCHAR_TYPE_SCRIPT_UGARITIC, /* Ugar */
/* Unicode-4.1 additions */
G_UNICODE_SCRIPT_NEW_TAI_LUE, /* Talu */
G_UNICODE_SCRIPT_BUGINESE, /* Bugi */
G_UNICODE_SCRIPT_GLAGOLITIC, /* Glag */
G_UNICODE_SCRIPT_TIFINAGH, /* Tfng */
G_UNICODE_SCRIPT_SYLOTI_NAGRI, /* Sylo */
G_UNICODE_SCRIPT_OLD_PERSIAN, /* Xpeo */
G_UNICODE_SCRIPT_KHAROSHTHI, /* Khar */
UCHAR_TYPE_SCRIPT_NEW_TAI_LUE, /* Talu */
UCHAR_TYPE_SCRIPT_BUGINESE, /* Bugi */
UCHAR_TYPE_SCRIPT_GLAGOLITIC, /* Glag */
UCHAR_TYPE_SCRIPT_TIFINAGH, /* Tfng */
UCHAR_TYPE_SCRIPT_SYLOTI_NAGRI, /* Sylo */
UCHAR_TYPE_SCRIPT_OLD_PERSIAN, /* Xpeo */
UCHAR_TYPE_SCRIPT_KHAROSHTHI, /* Khar */
/* Unicode-5.0 additions */
G_UNICODE_SCRIPT_UNKNOWN, /* Zzzz */
G_UNICODE_SCRIPT_BALINESE, /* Bali */
G_UNICODE_SCRIPT_CUNEIFORM, /* Xsux */
G_UNICODE_SCRIPT_PHOENICIAN, /* Phnx */
G_UNICODE_SCRIPT_PHAGS_PA, /* Phag */
G_UNICODE_SCRIPT_NKO /* Nkoo */
UCHAR_TYPE_SCRIPT_UNKNOWN, /* Zzzz */
UCHAR_TYPE_SCRIPT_BALINESE, /* Bali */
UCHAR_TYPE_SCRIPT_CUNEIFORM, /* Xsux */
UCHAR_TYPE_SCRIPT_PHOENICIAN, /* Phnx */
UCHAR_TYPE_SCRIPT_PHAGS_PA, /* Phag */
UCHAR_TYPE_SCRIPT_NKO /* Nkoo */
} GUnicodeScript;
#endif /* __G_UNICODE_H__ */
#endif /* __UCHAR_TYPE_H__ */
+2 -2
View File
@@ -234,13 +234,13 @@ static PLOGFONT gdiCreateLogFont (const char* type, const char* family,
/* remove HORZVERT style if the glyph bmptype is subpixel */
DWORD glyph_bmptype;
glyph_bmptype = log_font->sbc_devfont->font_ops->get_glyph_type
glyph_bmptype = log_font->sbc_devfont->font_ops->get_glyph_bmptype
(log_font, log_font->sbc_devfont) & DEVFONTGLYPHTYPE_MASK_BMPTYPE;
if (glyph_bmptype == GLYPHBMP_TYPE_SUBPIXEL) {
log_font->style &= ~FS_FLIP_HORZVERT;
}
else if (log_font->mbc_devfont) {
glyph_bmptype = log_font->mbc_devfont->font_ops->get_glyph_type
glyph_bmptype = log_font->mbc_devfont->font_ops->get_glyph_bmptype
(log_font, log_font->mbc_devfont) & DEVFONTGLYPHTYPE_MASK_BMPTYPE;
if (glyph_bmptype == GLYPHBMP_TYPE_SUBPIXEL)
log_font->style &= ~FS_FLIP_HORZVERT;
+2 -2
View File
@@ -275,7 +275,7 @@ static unsigned char def_smooth_bitmap [] =
static QPF_GLYPH def_glyph = {&def_metrics, def_bitmap};
static QPF_GLYPH def_smooth_glyph = {&def_smooth_metrics, def_smooth_bitmap};
static DWORD get_glyph_type (LOGFONT* logfont, DEVFONT* devfont)
static DWORD get_glyph_bmptype (LOGFONT* logfont, DEVFONT* devfont)
{
if (QPFONT_INFO_P (devfont)->fm->flags & FLAG_MODE_SMOOTH)
return DEVFONTGLYPHTYPE_GREYBMP;
@@ -522,7 +522,7 @@ static int is_rotatable (LOGFONT* logfont, DEVFONT* devfont, int rot_desired)
/**************************** Global data ************************************/
FONTOPS __mg_qpf_ops = {
get_glyph_type,
get_glyph_bmptype,
get_ave_width,
get_max_width,
get_font_height,
+2 -2
View File
@@ -139,7 +139,7 @@ static void unload_font_data (DEVFONT* devfont, void* data)
/*************** Raw bitmap font operations *********************************/
static DWORD get_glyph_type (LOGFONT* logfont, DEVFONT* devfont)
static DWORD get_glyph_bmptype (LOGFONT* logfont, DEVFONT* devfont)
{
return DEVFONTGLYPHTYPE_MONOBMP;
}
@@ -264,7 +264,7 @@ static int is_rotatable (LOGFONT* logfont, DEVFONT* devfont, int rot_desired)
/**************************** Global data ************************************/
FONTOPS __mg_rbf_ops = {
get_glyph_type,
get_glyph_bmptype,
get_ave_width,
get_ave_width, // max_width same as ave_width
get_font_height,
+2 -2
View File
@@ -364,7 +364,7 @@ static int get_max_width (LOGFONT* logfont, DEVFONT* devfont)
return logfont->size;
}
static DWORD get_glyph_type (LOGFONT* logfont, DEVFONT* devfont)
static DWORD get_glyph_bmptype (LOGFONT* logfont, DEVFONT* devfont)
{
if (logfont->style & FS_WEIGHT_BOOK)
return DEVFONTGLYPHTYPE_GREYBMP;
@@ -577,7 +577,7 @@ static int is_rotatable (LOGFONT* logfont, DEVFONT* devfont, int rot_desired)
/**************************** Global data ************************************/
static FONTOPS scripteasy_font_ops = {
get_glyph_type,
get_glyph_bmptype,
get_ave_width,
get_max_width,
get_font_height,
+33 -33
View File
@@ -1,33 +1,33 @@
/*
* This file is part of MiniGUI, a mature cross-platform windowing
* 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/>.
*/
@@ -91,7 +91,7 @@ static void* load_font_data (DEVFONT* devfont, const char* font_name, const char
upf_info->file_size = file_size;
#ifdef HAVE_MMAP
upf_info->root_dir = mmap( 0, file_size, PROT_READ,
upf_info->root_dir = mmap( 0, file_size, PROT_READ,
MAP_SHARED, fileno(fp), 0 );
if (!upf_info->root_dir || upf_info->root_dir == MAP_FAILED)
@@ -114,7 +114,7 @@ static void* load_font_data (DEVFONT* devfont, const char* font_name, const char
#endif
goto error;
}
#if 0
if (real_font_name) {
strncpy (real_font_name, filehead->font_name, LEN_DEVFONT_NAME_MAX);
@@ -143,7 +143,7 @@ static void unload_font_data (DEVFONT* devfont, void* data)
free (((UPFINFO*) data));
}
static DWORD get_glyph_type (LOGFONT* logfont, DEVFONT* devfont)
static DWORD get_glyph_bmptype (LOGFONT* logfont, DEVFONT* devfont)
{
Uint8* p_upf = (Uint8 *)UPFONT_INFO_P (devfont)->root_dir;
@@ -156,15 +156,15 @@ static DWORD get_glyph_type (LOGFONT* logfont, DEVFONT* devfont)
static int get_ave_width (LOGFONT* logfont, DEVFONT* devfont)
{
UPFV1_FILE_HEADER * p_upf;
p_upf = (UPFV1_FILE_HEADER *)UPFONT_INFO_P (devfont)->root_dir;
return p_upf->width * GET_DEVFONT_SCALE (logfont, devfont);
}
static int get_max_width (LOGFONT* logfont, DEVFONT* devfont)
{
UPFV1_FILE_HEADER * p_upf;
p_upf = (UPFV1_FILE_HEADER *)UPFONT_INFO_P (devfont)->root_dir;
return p_upf->max_width * GET_DEVFONT_SCALE (logfont, devfont);
}
@@ -172,7 +172,7 @@ static int get_max_width (LOGFONT* logfont, DEVFONT* devfont)
static int get_font_height (LOGFONT* logfont, DEVFONT* devfont)
{
UPFV1_FILE_HEADER * p_upf;
p_upf = (UPFV1_FILE_HEADER *)UPFONT_INFO_P (devfont)->root_dir;
return (p_upf->ascent + p_upf->descent) * GET_DEVFONT_SCALE (logfont, devfont);
}
@@ -182,7 +182,7 @@ static int get_font_size (LOGFONT* logfont, DEVFONT* devfont, int expect)
UPFV1_FILE_HEADER * p_upf;
int height;
unsigned short scale = 1;
p_upf = (UPFV1_FILE_HEADER *)UPFONT_INFO_P (devfont)->root_dir;
#if 0
height = p_upf->ascent + p_upf->descent;
@@ -193,7 +193,7 @@ static int get_font_size (LOGFONT* logfont, DEVFONT* devfont, int expect)
if (logfont->style & FS_OTHER_AUTOSCALE)
scale = font_GetBestScaleFactor (height, expect);
SET_DEVFONT_SCALE (logfont, devfont, scale);
return height * scale;
@@ -202,7 +202,7 @@ static int get_font_size (LOGFONT* logfont, DEVFONT* devfont, int expect)
static int get_font_ascent (LOGFONT* logfont, DEVFONT* devfont)
{
UPFV1_FILE_HEADER * p_upf;
p_upf = (UPFV1_FILE_HEADER *)UPFONT_INFO_P (devfont)->root_dir;
return p_upf->ascent * GET_DEVFONT_SCALE (logfont, devfont);
}
@@ -210,7 +210,7 @@ static int get_font_ascent (LOGFONT* logfont, DEVFONT* devfont)
static int get_font_descent (LOGFONT* logfont, DEVFONT* devfont)
{
UPFV1_FILE_HEADER * p_upf;
p_upf = (UPFV1_FILE_HEADER *)UPFONT_INFO_P (devfont)->root_dir;
return p_upf->descent * GET_DEVFONT_SCALE (logfont, devfont);
}
@@ -245,14 +245,14 @@ static unsigned char def_smooth_bitmap [] =
};
#if 0
static void
static void
print_bitmap(char* bits, int width, int height, int pitch)
{
int y = 0;
int x = 0;
char* p_line_head;
char* p_cur_char;
printf ("width = %d\n", width);
printf ("height = %d\n", height);
printf ("pitch = %d\n", pitch);
@@ -268,7 +268,7 @@ print_bitmap(char* bits, int width, int height, int pitch)
printf(". ");
}
printf("\n");
p_line_head += pitch;
}
}
@@ -280,7 +280,7 @@ static const void* get_glyph_monobitmap (LOGFONT* logfont, DEVFONT* devfont,
unsigned int uc16;
UPFGLYPH* glyph;
Uint8 * p_upf;
p_upf = (Uint8 *)UPFONT_INFO_P (devfont)->root_dir;
#ifdef _MGCHARSET_UNICODE
@@ -327,7 +327,7 @@ static const void* get_glyph_greybitmap (LOGFONT* logfont, DEVFONT* devfont,
unsigned int uc16;
UPFGLYPH* glyph;
Uint8 * p_upf;
p_upf = (Uint8 *)UPFONT_INFO_P (devfont)->root_dir;
if (scale)
@@ -360,15 +360,15 @@ static const void* get_glyph_greybitmap (LOGFONT* logfont, DEVFONT* devfont,
}
static int get_glyph_bbox (LOGFONT* logfont, DEVFONT* devfont,
Glyph32 glyph_value,
static int get_glyph_bbox (LOGFONT* logfont, DEVFONT* devfont,
Glyph32 glyph_value,
int* px, int* py, int* pwidth, int* pheight)
{
unsigned int uc16;
UPFGLYPH* glyph;
unsigned short scale = GET_DEVFONT_SCALE (logfont, devfont);
Uint8 * p_upf;
p_upf = (Uint8 *)UPFONT_INFO_P (devfont)->root_dir;
#ifdef _MGCHARSET_UNICODE
@@ -418,14 +418,14 @@ static int get_glyph_bbox (LOGFONT* logfont, DEVFONT* devfont,
return glyph->width * scale;
}
static int get_glyph_advance (LOGFONT* logfont, DEVFONT* devfont,
static int get_glyph_advance (LOGFONT* logfont, DEVFONT* devfont,
Glyph32 glyph_value, int* px, int* py)
{
unsigned int uc16;
UPFGLYPH* glyph;
Uint8 * p_upf;
int advance;
p_upf = (Uint8 *)UPFONT_INFO_P (devfont)->root_dir;
#ifdef _MGCHARSET_UNICODE
@@ -460,7 +460,7 @@ static DEVFONT* new_instance (LOGFONT* logfont, DEVFONT* devfont,
BOOL need_sbc_font)
{
Uint8 * p_upf;
p_upf = (Uint8 *)UPFONT_INFO_P (devfont)->root_dir;
/*if the devfont is a gray bitmap font,
@@ -484,7 +484,7 @@ static BOOL is_glyph_existed (LOGFONT* logfont, DEVFONT* devfont, Glyph32 glyph_
unsigned int uc16;
UPFGLYPH* glyph;
Uint8 * p_upf;
p_upf = (Uint8 *)UPFONT_INFO_P (devfont)->root_dir;
#ifdef _MGCHARSET_UNICODE
@@ -513,7 +513,7 @@ static int is_rotatable (LOGFONT* logfont, DEVFONT* devfont, int rot_desired)
}
FONTOPS __mg_upf_ops = {
get_glyph_type,
get_glyph_bmptype,
get_ave_width,
get_max_width,
get_font_height,
+2 -2
View File
@@ -96,7 +96,7 @@ typedef struct _FONT_PROPT {
int def_glyph;
} FONT_PROPT;
static DWORD get_glyph_type (LOGFONT* logfont, DEVFONT* devfont)
static DWORD get_glyph_bmptype (LOGFONT* logfont, DEVFONT* devfont)
{
return DEVFONTGLYPHTYPE_MONOBMP;
}
@@ -456,7 +456,7 @@ static void unload_font_data (DEVFONT* devfont, void* data)
}
FONTOPS __mg_vbf_ops = {
get_glyph_type,
get_glyph_bmptype,
get_ave_width,
get_max_width,
get_font_height,
+33 -4
View File
@@ -80,16 +80,45 @@ DEVFONT* font_GetMatchedMBDevFont (LOGFONT* log_font);
unsigned short font_GetBestScaleFactor (int height, int expect);
/* Add for bitmap font interface */
void font_DelSBDevFont (DEVFONT* dev_font);
void font_DelSBDevFont (DEVFONT* dev_font);
void font_DelMBDevFont (DEVFONT* dev_font);
#ifdef _DEBUG
void dbg_dumpDevFonts (void);
#endif
/* A type definition for an glyph value */
#define INV_GLYPH_VALUE -1
static inline BOOL check_zero_width(Glyph32 g, unsigned int t)
{
unsigned int mchar_type = t & GLYPHTYPE_MCHAR_MASK;
if (mchar_type) {
if (mchar_type == MCHAR_TYPE_ZEROWIDTH
|| (mchar_type & MCHAR_TYPE_NOSPACING_MARK))
return TRUE;
else
return FALSE;
}
t = (t & GLYPHTYPE_BASIC_MASK) >> 16;
if (g != 0x00AD
&& (t == UCHAR_TYPE_NON_SPACING_MARK
|| t == UCHAR_TYPE_ENCLOSING_MARK
|| t == UCHAR_TYPE_FORMAT))
return TRUE;
else if ((g >= 0x1160 && g < 0x1200)
|| g == 0x200B)
return TRUE;
return FALSE;
}
static inline BOOL check_vowel(unsigned int t)
{
return ((t & GLYPHTYPE_MCHAR_MASK) == MCHAR_TYPE_VOWEL);
}
static inline long get_file_size (const char* filename)
{
FILE* fp = fopen (filename, "rb");
@@ -188,8 +217,8 @@ struct _CHARSETOPS
/** The font operation structure. */
struct _FONTOPS
{
/** The method to get the glyph type . */
DWORD (*get_glyph_type) (LOGFONT* logfont, DEVFONT* devfont);
/** The method to get the glyph bitmap type . */
DWORD (*get_glyph_bmptype) (LOGFONT* logfont, DEVFONT* devfont);
/** The method to get average width function. */
int (*get_ave_width) (LOGFONT* logfont, DEVFONT* devfont);
+25 -33
View File
@@ -114,13 +114,13 @@ static Glyph32* _gdi_get_glyphs_string(PDC pdc, const unsigned char* text,
return logical_glyphs;
}
static int inline get_glyph_type (LOGFONT* logfont, Glyph32 glyph_value)
static int inline get_glyph_type (LOGFONT* logfont, Glyph32 glyph_value)
{
if (IS_MBC_GLYPH (glyph_value))
return logfont->mbc_devfont->charset_ops->glyph_type
return logfont->mbc_devfont->charset_ops->glyph_type
(REAL_GLYPH (glyph_value));
else
return logfont->sbc_devfont->charset_ops->glyph_type
return logfont->sbc_devfont->charset_ops->glyph_type
(glyph_value);
}
@@ -137,7 +137,7 @@ static int jump_vowels_ltr (PDC pdc, Glyph32* glyphs, int glyph_num, int* bigges
int cur_advance = 0;
for (i=0; i<glyph_num; i++)
{
if (get_glyph_type (pdc->pLogFont, glyphs[i]) != MCHAR_TYPE_VOWEL)
if (!check_vowel(get_glyph_type (pdc->pLogFont, glyphs[i])))
return i;
cur_advance = get_glyph_advance_in_dc (pdc, glyphs[i]);
if (cur_advance > max_advance)
@@ -238,15 +238,12 @@ static int output_vowels_rtl (PDC pdc, Glyph32* end_glyph, int left_num,
pdc->ta_flags = (old_text_align & ~TA_RIGHT) | TA_LEFT;
pdc->bkmode = BM_TRANSPARENT;
*outed_num = 0;
for (i=0; i<left_num; i++)
{
for (i=0; i<left_num; i++) {
glyph_value = *end_glyph--;
glyph_type = get_glyph_type (pdc->pLogFont, glyph_value);
if (glyph_type == MCHAR_TYPE_VOWEL)
{
if (cb_one_glyph(context, glyph_value, glyph_type))
{
if (check_vowel(glyph_type)) {
if (cb_one_glyph(context, glyph_value, glyph_type)) {
(*outed_num) ++;
}
}
@@ -271,7 +268,7 @@ static int output_unowned_vowels_rtl (PDC pdc, Glyph32* end_glyph, int left_num,
int old_text_align = pdc->ta_flags;
*outed_num = 0;
if (get_glyph_type (pdc->pLogFont, *end_glyph) != MCHAR_TYPE_VOWEL)
if (!check_vowel(get_glyph_type (pdc->pLogFont, *end_glyph)))
return 0;
pdc->ta_flags = (old_text_align & ~TA_RIGHT) | TA_LEFT;
@@ -280,7 +277,7 @@ static int output_unowned_vowels_rtl (PDC pdc, Glyph32* end_glyph, int left_num,
glyph_value = end_glyph [-i];
glyph_type = get_glyph_type (pdc->pLogFont, glyph_value);
if (glyph_type != MCHAR_TYPE_VOWEL)
if (!check_vowel(glyph_type))
break;
cur_advance = get_glyph_advance_in_dc (pdc, glyph_value);
@@ -553,7 +550,7 @@ int _gdi_reorder_text (PDC pdc, const unsigned char* text, int text_len,
return i;
}
static Glyph32*
static Glyph32*
_gdi_get_glyphs_string_charbreak(PDC pdc, const unsigned char* text,
int text_len, int* nr_glyphs, void* context)
{
@@ -592,14 +589,14 @@ _gdi_get_glyphs_string_charbreak(PDC pdc, const unsigned char* text,
glyph_type = (*mbc_devfont->charset_ops->glyph_type)
(glyph_value);
if(!(glyph_type & MCHAR_TYPE_NOSPACING_MARK)){
if (!(glyph_type & MCHAR_TYPE_NOSPACING_MARK)){
prev_mchar = text;
}
else{
prev_len += len_cur_char;
}
line_width += _gdi_get_glyph_advance (pdc, logical_glyphs[i-1],
line_width += _gdi_get_glyph_advance (pdc, logical_glyphs[i-1],
TRUE, 0, 0, NULL, NULL, &bbox);
left_bytes -= len_cur_char;
text += len_cur_char;
@@ -612,10 +609,8 @@ _gdi_get_glyphs_string_charbreak(PDC pdc, const unsigned char* text,
glyph_value = sbc_devfont->charset_ops->char_glyph_value
(NULL, 0, text, left_bytes);
logical_glyphs[i++] = glyph_value;
line_width += _gdi_get_glyph_advance (pdc, logical_glyphs[i-1],
TRUE, 0, 0, NULL, NULL, &bbox);
left_bytes -= len_cur_char;
text += len_cur_char;
}
@@ -1087,17 +1082,16 @@ int GUIAPI GetGlyphsExtentPoint(
size->cy = 0;
while(i < nr_glyphs){
Glyph32 rg;
devfont = SELECT_DEVFONT(log_font, glyphs[i]);
glyph_type = devfont->charset_ops->glyph_type
(glyphs[i]);
rg = REAL_GLYPH(glyphs[i]);
glyph_type = devfont->charset_ops->glyph_type(rg);
if (glyph_type == MCHAR_TYPE_ZEROWIDTH
|| (glyph_type & MCHAR_TYPE_NOSPACING_MARK)) {
if (check_zero_width (rg, glyph_type)) {
adv_x = adv_y = 0;
}
else {
advance += _gdi_get_glyph_advance (pdc, glyphs[i],
advance += _gdi_get_glyph_advance (pdc, glyphs[i],
(pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
0, 0, &adv_x, &adv_y, NULL);
@@ -1111,11 +1105,9 @@ int GUIAPI GetGlyphsExtentPoint(
i ++;
}
_gdi_calc_glyphs_size_from_two_points (pdc, 0, 0,
_gdi_calc_glyphs_size_from_two_points (pdc, 0, 0,
size->cx, size->cy, size);
return i;
}
@@ -1144,17 +1136,17 @@ int GUIAPI GetGlyphsExtent(
size->cx = 0;
size->cy = 0;
while(i < nr_glyphs){
while (i < nr_glyphs) {
Glyph32 rg;
rg = REAL_GLYPH(glyphs[i]);
devfont = SELECT_DEVFONT(log_font, glyphs[i]);
glyph_type = devfont->charset_ops->glyph_type
(glyphs[i]);
glyph_type = devfont->charset_ops->glyph_type(rg);
if (glyph_type == MCHAR_TYPE_ZEROWIDTH
|| (glyph_type & MCHAR_TYPE_NOSPACING_MARK)) {
if (check_zero_width (rg, glyph_type)) {
adv_x = adv_y = 0;
}
else {
advance += _gdi_get_glyph_advance (pdc, glyphs[i],
advance += _gdi_get_glyph_advance (pdc, glyphs[i],
(pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
0, 0, &adv_x, &adv_y, NULL);
}
@@ -1163,7 +1155,7 @@ int GUIAPI GetGlyphsExtent(
i ++;
}
_gdi_calc_glyphs_size_from_two_points (pdc, 0, 0,
_gdi_calc_glyphs_size_from_two_points (pdc, 0, 0,
size->cx, size->cy, size);
return advance;
+72 -70
View File
@@ -1,33 +1,33 @@
/*
* This file is part of MiniGUI, a mature cross-platform windowing
* 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/>.
*/
@@ -56,14 +56,14 @@
#ifdef _MGCHARSET_UNICODE
extern size_t __mg_strlen (PLOGFONT log_font, const char* mstr);
extern char* __mg_strnchr (PLOGFONT log_font, const char* s,
extern char* __mg_strnchr (PLOGFONT log_font, const char* s,
size_t n, int c, int* cl);
extern int __mg_substrlen (PLOGFONT log_font, const char* text, int len,
extern int __mg_substrlen (PLOGFONT log_font, const char* text, int len,
int delimiter, int* nr_delim);
static inline BOOL is_utf16_logfont (PDC pdc)
{
DEVFONT* mbc_devfont;
DEVFONT* mbc_devfont;
mbc_devfont = pdc->pLogFont->mbc_devfont;
if (mbc_devfont && strstr (mbc_devfont->charset_ops->name, "UTF-16")) {
return TRUE;
@@ -79,14 +79,14 @@ static inline size_t __mg_strlen (PLOGFONT log_font, const char* mstr)
return strlen (mstr);
}
static inline char* __mg_strnchr (PLOGFONT logfont, const char* s,
static inline char* __mg_strnchr (PLOGFONT logfont, const char* s,
size_t n, int c, int* cl)
{
*cl = 1;
return strnchr (s, n, c);
}
static inline int __mg_substrlen (PLOGFONT logfont, const char* text, int len,
static inline int __mg_substrlen (PLOGFONT logfont, const char* text, int len,
int delimiter, int* nr_delim)
{
return substrlen (text, len, delimiter, nr_delim);
@@ -100,7 +100,7 @@ static inline BOOL is_utf16_logfont (PDC pdc)
#endif
#if 0
static void txtDrawOneLine (PDC pdc, const unsigned char* pText, int nLen,
static void txtDrawOneLine (PDC pdc, const unsigned char* pText, int nLen,
int x, int y, const RECT* prcOutput, UINT nFormat, int nTabWidth)
{
/* set rc_output to the possible clipping rect */
@@ -112,13 +112,13 @@ static void txtDrawOneLine (PDC pdc, const unsigned char* pText, int nLen,
int nSubLen = nLen;
int nOutputLen;
int nTabLen;
while ((left = (unsigned char*) __mg_strnchr (pdc->pLogFont,
while ((left = (unsigned char*) __mg_strnchr (pdc->pLogFont,
(const char*)sub, nSubLen, '\t', &nTabLen))) {
nOutputLen = left - sub;
x += _gdi_text_out (pdc, x, y, sub, nOutputLen, NULL);
nSubLen -= (nOutputLen + nTabLen);
sub = left + nTabLen;
x += nTabWidth;
@@ -131,13 +131,13 @@ static void txtDrawOneLine (PDC pdc, const unsigned char* pText, int nLen,
_gdi_text_out (pdc, x, y, pText, nLen, NULL);
}
static int txtGetWidthOfNextWord (PDC pdc, const unsigned char* pText,
static int txtGetWidthOfNextWord (PDC pdc, const unsigned char* pText,
int nCount, int* nChars)
{
SIZE size;
DEVFONT* sbc_devfont = pdc->pLogFont->sbc_devfont;
DEVFONT* mbc_devfont = pdc->pLogFont->mbc_devfont;
WORDINFO word_info = {0};
WORDINFO word_info = {0};
*nChars = 0;
if (nCount == 0) return 0;
@@ -145,13 +145,13 @@ static int txtGetWidthOfNextWord (PDC pdc, const unsigned char* pText,
if (mbc_devfont) {
int mbc_pos, sub_len;
mbc_pos = (*mbc_devfont->charset_ops->pos_first_char)
mbc_pos = (*mbc_devfont->charset_ops->pos_first_char)
((const unsigned char*)pText, nCount);
if (mbc_pos == 0) {
sub_len = (*mbc_devfont->charset_ops->len_first_substr)
sub_len = (*mbc_devfont->charset_ops->len_first_substr)
((const unsigned char*)pText, nCount);
(*mbc_devfont->charset_ops->get_next_word)
(*mbc_devfont->charset_ops->get_next_word)
((const unsigned char*)pText, sub_len, &word_info);
if (word_info.len == 0) {
@@ -164,14 +164,14 @@ static int txtGetWidthOfNextWord (PDC pdc, const unsigned char* pText,
}
if (word_info.len == 0)
(*sbc_devfont->charset_ops->get_next_word)
(*sbc_devfont->charset_ops->get_next_word)
((const unsigned char*)pText, nCount, &word_info);
_gdi_get_text_extent (pdc, pText, word_info.len, &size);
*nChars = word_info.len;
/* Fixed bug of italic font */
/* Fixed bug of italic font */
return size.cx - _gdi_get_italic_added_width (pdc->pLogFont);
}
@@ -179,21 +179,21 @@ static int txtGetWidthOfNextWord (PDC pdc, const unsigned char* pText,
** This function return the normal characters' number (reference)
** and output width of the line (return value).
*/
static int txtGetOneLine (PDC pdc, const unsigned char* pText, int nCount,
static int txtGetOneLine (PDC pdc, const unsigned char* pText, int nCount,
int nTabWidth, int maxwidth, UINT uFormat, int* nChar)
{
int word_len, char_len;
int word_width, char_width;
int line_width;
SIZE size;
int italic_width = 0;
int italic_width = 0;
*nChar = 0;
if (uFormat & DT_SINGLELINE) {
if (uFormat & DT_EXPANDTABS)
_gdi_tabbed_text_out (pdc, 0, 0, pText, nCount, nTabWidth,
_gdi_tabbed_text_out (pdc, 0, 0, pText, nCount, nTabWidth,
TRUE, NULL, &size);
else
_gdi_get_text_extent (pdc, pText, nCount, &size);
@@ -202,9 +202,9 @@ static int txtGetOneLine (PDC pdc, const unsigned char* pText, int nCount,
return size.cx;
}
italic_width = _gdi_get_italic_added_width(pdc->pLogFont);
/* Fixed bug of italic font */
maxwidth -= italic_width;
italic_width = _gdi_get_italic_added_width(pdc->pLogFont);
/* Fixed bug of italic font */
maxwidth -= italic_width;
word_len = 0; word_width = 0;
char_len = 0; char_width = 0;
@@ -220,26 +220,26 @@ static int txtGetOneLine (PDC pdc, const unsigned char* pText, int nCount,
word_len = 0;
}
else if (uFormat & DT_WORDBREAK) {
word_width = txtGetWidthOfNextWord (pdc, pText, nCount,
word_width = txtGetWidthOfNextWord (pdc, pText, nCount,
&word_len);
if (word_width > maxwidth) {
word_len = GetTextExtentPoint ((HDC)pdc,
(const char*)pText, word_len,
word_len = GetTextExtentPoint ((HDC)pdc,
(const char*)pText, word_len,
maxwidth - line_width, NULL, NULL, NULL, &size);
word_width = size.cx;
if (word_len == 0) { /* eat at least one char */
word_len = GetFirstMCharLen (GetCurFont ((HDC)pdc),
word_len = GetFirstMCharLen (GetCurFont ((HDC)pdc),
(const char*)pText, nCount);
_gdi_get_text_extent (pdc, pText, word_len, &size);
/* Fixed bug of italic font */
/* Fixed bug of italic font */
word_width = size.cx - italic_width;
}
*nChar += word_len;
/* Fixed bug of italic font */
/* Fixed bug of italic font */
line_width += word_width + italic_width;
break;
}
@@ -272,7 +272,7 @@ static int txtGetOneLine (PDC pdc, const unsigned char* pText, int nCount,
}
else {
_gdi_get_text_extent (pdc, pText, 1, &size);
/* Fixed bug of italic font */
/* Fixed bug of italic font */
char_width = size.cx - italic_width;
}
}
@@ -283,12 +283,12 @@ static int txtGetOneLine (PDC pdc, const unsigned char* pText, int nCount,
else if (*pText == ' ') {
char_len = 1;
_gdi_get_text_extent (pdc, pText, 1, &size);
/* Fixed bug of italic font */
/* Fixed bug of italic font */
char_width = size.cx - italic_width;
}
if ((word_len + char_len) == 0) { /* ensure to eat at least one char */
char_len = GetFirstMCharLen (GetCurFont ((HDC)pdc),
char_len = GetFirstMCharLen (GetCurFont ((HDC)pdc),
(const char*)pText, nCount);
_gdi_get_text_extent (pdc, pText, char_len, &size);
@@ -307,21 +307,21 @@ static int txtGetOneLine (PDC pdc, const unsigned char* pText, int nCount,
break;
}
/* Fixed bug of italic font */
/* Fixed bug of italic font */
return line_width + italic_width;
}
#endif
static BOOL cb_drawtextex2 (void* context, Glyph32 glyph_value,
int glyph_type)
static BOOL cb_drawtextex2 (void* context, Glyph32 glyph_value,
unsigned int glyph_type)
{
DRAWTEXTEX2_CTXT* ctxt = (DRAWTEXTEX2_CTXT*)context;
int adv_x = 0, adv_y = 0;
BBOX bbox;
int bkmode;
switch (glyph_type) {
switch (glyph_type & GLYPHTYPE_MCHAR_MASK) {
case MCHAR_TYPE_ZEROWIDTH:
case MCHAR_TYPE_CR:
adv_x = adv_y = 0;
@@ -332,39 +332,41 @@ static BOOL cb_drawtextex2 (void* context, Glyph32 glyph_value,
return TRUE;
_gdi_start_new_line (ctxt->pdc);
if (ctxt->only_extent) {
ctxt->advance += _gdi_get_null_glyph_advance (ctxt->pdc,
ctxt->tab_width,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->advance += _gdi_get_null_glyph_advance (ctxt->pdc,
ctxt->tab_width,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->x, ctxt->y, &adv_x, &adv_y);
}
else {
ctxt->advance += _gdi_draw_null_glyph (ctxt->pdc,
ctxt->tab_width,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->advance += _gdi_draw_null_glyph (ctxt->pdc,
ctxt->tab_width,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->x, ctxt->y, &adv_x, &adv_y);
}
break;
case MCHAR_TYPE_VOWEL:
if (!ctxt->only_extent) {
bkmode = ctxt->pdc->bkmode;
//ctxt->pdc->bkmode = BM_TRANSPARENT;
_gdi_draw_one_glyph (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
_gdi_draw_one_glyph (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->x, ctxt->y, &adv_x, &adv_y);
ctxt->pdc->bkmode = bkmode;
adv_x = adv_y = 0;
}
break;
default:
if (ctxt->only_extent) {
ctxt->advance += _gdi_get_glyph_advance (ctxt->pdc,
glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->advance += _gdi_get_glyph_advance (ctxt->pdc,
glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->x, ctxt->y, &adv_x, &adv_y, &bbox);
}
else {
ctxt->advance += _gdi_draw_one_glyph (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->advance += _gdi_draw_one_glyph (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->x, ctxt->y, &adv_x, &adv_y);
}
break;
@@ -376,7 +378,7 @@ static BOOL cb_drawtextex2 (void* context, Glyph32 glyph_value,
return TRUE;
}
int _gdi_get_drawtext_extent (PDC pdc, const unsigned char* text, int len,
int _gdi_get_drawtext_extent (PDC pdc, const unsigned char* text, int len,
void* context, SIZE* size)
{
DRAWTEXTEX2_CTXT ctxt;
@@ -391,7 +393,7 @@ int _gdi_get_drawtext_extent (PDC pdc, const unsigned char* text, int len,
ctxt.tab_width = _tmp->tab_width;
_gdi_start_new_line (pdc);
_gdi_reorder_text (pdc, text, len,
_gdi_reorder_text (pdc, text, len,
(pdc->ta_flags & TA_X_MASK) != TA_RIGHT, cb_drawtextex2, &ctxt);
if (size) {
@@ -402,15 +404,15 @@ int _gdi_get_drawtext_extent (PDC pdc, const unsigned char* text, int len,
return ctxt.advance;
}
int DrawTextEx2 (HDC hdc, const char* pText, int nCount,
int DrawTextEx2 (HDC hdc, const char* pText, int nCount,
RECT* pRect, int indent, UINT nFormat, DTFIRSTLINE *firstline)
{
DRAWTEXTEX2_CTXT ctxt;
PDC pdc;
int nLines = 0;
int nLines = 0;
int x = 0, y;
RECT rcDraw;
int nTabWidth;
RECT rcDraw;
int nTabWidth;
int line_height, line_len = 0;
int nr_delim_newline = 0;
const unsigned char* pline = NULL;
@@ -431,11 +433,11 @@ int DrawTextEx2 (HDC hdc, const char* pText, int nCount,
line_height = pdc->pLogFont->size + pdc->alExtra + pdc->blExtra;
if (nFormat & DT_TABSTOP)
nTabWidth = HIWORD (nFormat) *
nTabWidth = HIWORD (nFormat) *
(*pdc->pLogFont->sbc_devfont->font_ops->get_ave_width)
(pdc->pLogFont, pdc->pLogFont->sbc_devfont);
else {
nTabWidth = pdc->tabstop *
nTabWidth = pdc->tabstop *
(*pdc->pLogFont->sbc_devfont->font_ops->get_ave_width)
(pdc->pLogFont, pdc->pLogFont->sbc_devfont);
}
@@ -506,7 +508,7 @@ int DrawTextEx2 (HDC hdc, const char* pText, int nCount,
while (nCount > 0) {
int line_x, maxwidth;
line_len = __mg_substrlen (pdc->pLogFont,
line_len = __mg_substrlen (pdc->pLogFont,
pText, nCount, '\n', &nr_delim_newline);
/* line_len == 0 means the first char is '\n' */
@@ -557,7 +559,7 @@ int DrawTextEx2 (HDC hdc, const char* pText, int nCount,
/* only get text extent.*/
ctxt.only_extent = TRUE;
_gdi_reorder_text_break (pdc, pline, line_len,
_gdi_reorder_text_break (pdc, pline, line_len,
(pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
cb_drawtextex2, &ctxt);
@@ -569,12 +571,12 @@ int DrawTextEx2 (HDC hdc, const char* pText, int nCount,
ctxt.only_extent = old_set;
if((nFormat & DT_CALCRECT) && (pRect->left > ctxt.x))
pRect->left = ctxt.x;
_gdi_reorder_text_break (pdc, pline, line_len,
_gdi_reorder_text_break (pdc, pline, line_len,
(pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
cb_drawtextex2, &ctxt);
}
else {
_gdi_reorder_text_break (pdc, pline, line_len,
_gdi_reorder_text_break (pdc, pline, line_len,
(pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
cb_drawtextex2, &ctxt);
if ((nFormat & DT_CALCRECT) && (nFormat & DT_RIGHT)){
+1 -1
View File
@@ -89,7 +89,7 @@ void _gdi_calc_glyphs_size_from_two_points (PDC pdc, int x0, int y0,
int x1, int y1, SIZE* size);
typedef BOOL (*CB_ONE_GLYPH) (void* context, Glyph32 glyph_value,
int glyph_type);
unsigned int glyph_type);
int _gdi_output_visual_glyphs(PDC pdc, Glyph32* visual_glyphs, int nr_glyphs,
BOOL direction, CB_ONE_GLYPH cb_one_glyph, void* context);
+134 -147
View File
@@ -149,14 +149,14 @@ int GUIAPI DrawGlyph (HDC hdc, int x, int y, Glyph32 glyph_value,
PDC pdc = dc_HDC2PDC(hdc);
DEVFONT* devfont = SELECT_DEVFONT(pdc->pLogFont, glyph_value);
glyph_value = REAL_GLYPH (glyph_value);
/* Transfer logical to device to screen here. */
coor_LP2SP (pdc, &x, &y);
pdc->rc_output = pdc->DevRC;
glyph_type = devfont->charset_ops->glyph_type (glyph_value);
if (glyph_type == MCHAR_TYPE_ZEROWIDTH) {
if (check_zero_width(glyph_value, glyph_type)) {
if (adv_x) *adv_x = 0;
if (adv_y) *adv_y = 0;
advance = 0;
@@ -177,20 +177,6 @@ int GUIAPI DrawGlyph (HDC hdc, int x, int y, Glyph32 glyph_value,
return advance;
}
#if 0
static BOOL is_font_support_bmptype (LOGFONT* logfont, DEVFONT* devfont,
int bmptype)
{
DWORD glyph_type = devfont->font_ops->get_glyph_type (logfont, devfont);
glyph_type &= DEVFONTGLYPHTYPE_MASK_BMPTYPE;
if (glyph_type == bmptype)
return TRUE;
return FALSE;
}
#endif
int GUIAPI GetGlyphInfo (LOGFONT* logfont, Glyph32 glyph_value,
GLYPHINFO* glyph_info)
{
@@ -228,37 +214,37 @@ int GUIAPI GetGlyphInfo (LOGFONT* logfont, Glyph32 glyph_value,
}
if (glyph_info->mask & GLYPH_INFO_BMP) {
DWORD glyph_type = devfont->font_ops->get_glyph_type (logfont, devfont);
glyph_info->bmp_type = glyph_type & DEVFONTGLYPHTYPE_MASK_BMPTYPE;
DWORD bmptype = devfont->font_ops->get_glyph_bmptype (logfont, devfont);
glyph_info->bmp_type = bmptype & DEVFONTGLYPHTYPE_MASK_BMPTYPE;
switch (glyph_info->bmp_type) {
case GLYPHBMP_TYPE_MONO:
glyph_info->bits = devfont->font_ops->get_glyph_monobitmap (
logfont, devfont, glyph_value, &pitch, NULL);
glyph_info->bmp_pitch = pitch;
glyph_info->bmp_size = pitch * glyph_info->bbox_h;
break;
case GLYPHBMP_TYPE_MONO:
glyph_info->bits = devfont->font_ops->get_glyph_monobitmap (
logfont, devfont, glyph_value, &pitch, NULL);
glyph_info->bmp_pitch = pitch;
glyph_info->bmp_size = pitch * glyph_info->bbox_h;
break;
case GLYPHBMP_TYPE_GREY:
glyph_info->bits = devfont->font_ops->get_glyph_greybitmap (
logfont, devfont, glyph_value,
&glyph_info->bmp_pitch, NULL);
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,
&glyph_info->bmp_pitch, NULL);
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,
&glyph_info->bmp_pitch, NULL);
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,
&glyph_info->bmp_pitch, NULL);
glyph_info->bmp_size =
glyph_info->bmp_pitch * glyph_info->bbox_h;
break;
case GLYPHBMP_TYPE_PRERENDER:
devfont->font_ops->get_glyph_prbitmap (logfont,
devfont, glyph_value, &glyph_info->prbitmap);
break;
case GLYPHBMP_TYPE_PRERENDER:
devfont->font_ops->get_glyph_prbitmap (logfont,
devfont, glyph_value, &glyph_info->prbitmap);
break;
}
}
@@ -1964,124 +1950,125 @@ static BOOL _gdi_get_glyph_data (PDC pdc, Glyph32 glyph_value,
BYTE* data = NULL;
PLOGFONT logfont = pdc->pLogFont;
DEVFONT* devfont = SELECT_DEVFONT(pdc->pLogFont, glyph_value);
glyph_value = REAL_GLYPH(glyph_value);
DWORD glyph_type = devfont->font_ops->get_glyph_type (logfont, devfont);
switch (glyph_type & DEVFONTGLYPHTYPE_MASK_BMPTYPE) {
case GLYPHBMP_TYPE_MONO:
if ((logfont->style & FS_RENDER_MASK) == FS_RENDER_GREY) {
if (pdc->alpha_pixel_format)
ctxt->cb = _dc_book_scan_line;
}
else if ((logfont->style & FS_RENDER_MASK) == FS_RENDER_SUBPIXEL) {
ctxt->cb = _dc_subpixel_scan_line;
}
else if (logfont->style & FS_DECORATE_OUTLINE) {
if (pdc->textcolor != pdc->bkcolor)
ctxt->cb = _dc_light_scan_line;
}
DWORD bmptype = devfont->font_ops->get_glyph_bmptype (logfont, devfont);
switch (bmptype & DEVFONTGLYPHTYPE_MASK_BMPTYPE) {
case GLYPHBMP_TYPE_MONO:
if ((logfont->style & FS_RENDER_MASK) == FS_RENDER_GREY) {
if (pdc->alpha_pixel_format)
ctxt->cb = _dc_book_scan_line;
}
else if ((logfont->style & FS_RENDER_MASK) == FS_RENDER_SUBPIXEL) {
ctxt->cb = _dc_subpixel_scan_line;
}
else if (logfont->style & FS_DECORATE_OUTLINE) {
if (pdc->textcolor != pdc->bkcolor)
ctxt->cb = _dc_light_scan_line;
}
if (!ctxt->cb) {
ctxt->cb = _dc_regular_scan_line;
}
if (!ctxt->cb) {
ctxt->cb = _dc_regular_scan_line;
}
data = (BYTE*)(*devfont->font_ops->get_glyph_monobitmap) (logfont, devfont,
REAL_GLYPH(glyph_value), &pitch, &scale);
data = (BYTE*)(*devfont->font_ops->get_glyph_monobitmap) (logfont,
devfont, glyph_value, &pitch, &scale);
if (data == NULL)
break;
if (data == NULL)
break;
if (scale > 1 && ctxt->cb != _dc_regular_scan_line) {
data = _gdi_expand_scale_bits (data, bbox, pitch, bold, scale);
/* note: pitch is modified. */
pitch = (bbox->cx + 7) / 8;
}
else if (bold) {
data = _gdi_expand_bold_bits (data, bbox, &pitch, scale);
bbox->cx = bbox->cx / scale;
bbox->cy = bbox->cy / scale;
}
else if (scale > 1 && (ctxt->cb == _dc_regular_scan_line)) {
if (scale > 1 && ctxt->cb != _dc_regular_scan_line) {
data = _gdi_expand_scale_bits (data, bbox, pitch, bold, scale);
/* note: pitch is modified. */
pitch = (bbox->cx + 7) / 8;
}
else if (bold) {
data = _gdi_expand_bold_bits (data, bbox, &pitch, scale);
bbox->cx = bbox->cx / scale;
bbox->cy = bbox->cy / scale;
}
else if (scale > 1 && (ctxt->cb == _dc_regular_scan_line)) {
bbox->cx = bbox->cx / scale;
bbox->cy = bbox->cy / scale;
}
if (data == NULL)
break;
/* flip the monobitmap */
if (logfont->style & FS_FLIP_HORZ)
data = _gdi_flip_monobitmap_horz (data, bbox, pitch);
if (logfont->style & FS_FLIP_VERT)
data = _gdi_flip_bitmap_vert (data, bbox, pitch);
break;
case GLYPHBMP_TYPE_GREY:
/* get preybitmap */
if (devfont->font_ops->get_glyph_greybitmap) {
data = (BYTE*)(*devfont->font_ops->get_glyph_greybitmap) (logfont,
devfont, glyph_value, &pitch, &scale);
ctxt->cb = _dc_bookgrey_scan_line;
if (data && scale > 1) {
bbox->cx = bbox->cx / scale;
bbox->cy = bbox->cy / scale;
}
}
if (data == NULL)
break;
/* flip the greybitmap */
if (logfont->style & FS_FLIP_HORZ)
data = _gdi_flip_greybitmap_horz (data, bbox, pitch);
if (logfont->style & FS_FLIP_VERT)
data = _gdi_flip_bitmap_vert (data, bbox, pitch);
break;
/* flip the monobitmap */
if (logfont->style & FS_FLIP_HORZ)
data = _gdi_flip_monobitmap_horz (data, bbox, pitch);
if (logfont->style & FS_FLIP_VERT)
data = _gdi_flip_bitmap_vert (data, bbox, pitch);
break;
case GLYPHBMP_TYPE_GREY:
/* get preybitmap */
if (devfont->font_ops->get_glyph_greybitmap) {
data = (BYTE*)(*devfont->font_ops->get_glyph_greybitmap) (logfont, devfont,
REAL_GLYPH (glyph_value), &pitch, &scale);
ctxt->cb = _dc_bookgrey_scan_line;
if (data && scale > 1) {
bbox->cx = bbox->cx / scale;
bbox->cy = bbox->cy / scale;
}
}
/* flip the greybitmap */
if (logfont->style & FS_FLIP_HORZ)
data = _gdi_flip_greybitmap_horz (data, bbox, pitch);
if (logfont->style & FS_FLIP_VERT)
data = _gdi_flip_bitmap_vert (data, bbox, pitch);
break;
case GLYPHBMP_TYPE_SUBPIXEL:
case GLYPHBMP_TYPE_SUBPIXEL:
#ifdef _MGFONT_FT2
if (ft2IsFreeTypeDevfont (devfont) &&
ft2GetLcdFilter (devfont) &&
*devfont->font_ops->get_glyph_greybitmap) {
/* the returned bits will be the subpixled pixmap */
data = (BYTE*)(*devfont->font_ops->get_glyph_greybitmap) (logfont, devfont,
REAL_GLYPH(glyph_value), &pitch, &scale);
ctxt->cb = _dc_ft2subpixel_scan_line;
if (ft2IsFreeTypeDevfont (devfont) &&
ft2GetLcdFilter (devfont) &&
*devfont->font_ops->get_glyph_greybitmap) {
/* the returned bits will be the subpixled pixmap */
data = (BYTE*)(*devfont->font_ops->get_glyph_greybitmap) (logfont,
devfont, glyph_value, &pitch, &scale);
ctxt->cb = _dc_ft2subpixel_scan_line;
/* flip the subpixeled pixmap */
if (logfont->style & FS_FLIP_HORZ)
data = _gdi_flip_subpixels_horz (data, bbox, pitch);
if (logfont->style & FS_FLIP_VERT)
data = _gdi_flip_bitmap_vert (data, bbox, pitch);
}
/* flip the subpixeled pixmap */
if (logfont->style & FS_FLIP_HORZ)
data = _gdi_flip_subpixels_horz (data, bbox, pitch);
if (logfont->style & FS_FLIP_VERT)
data = _gdi_flip_bitmap_vert (data, bbox, pitch);
}
#endif
break;
break;
case GLYPHBMP_TYPE_PRERENDER:
if (devfont->font_ops->get_glyph_prbitmap != NULL) {
PBITMAP glyph_bmp = &_pre_rdr_bmp;
if (!(devfont->font_ops->get_glyph_prbitmap) (logfont, devfont,
REAL_GLYPH(glyph_value), glyph_bmp)){
return FALSE;
}
/* FLIP for pre-rendered bitmap glyph. */
if ((logfont->style & FS_FLIP_HORZ) ||
(logfont->style & FS_FLIP_VERT)) {
_prepare_pre_rdr_bmp (pdc,
glyph_bmp->bmWidth, glyph_bmp->bmHeight + 1);
if (logfont->style & FS_FLIP_HORZ) {
HFlipBitmap (glyph_bmp, glyph_bmp->bmBits
+ glyph_bmp->bmPitch * glyph_bmp->bmHeight);
}
if (logfont->style & FS_FLIP_VERT) {
VFlipBitmap (glyph_bmp, glyph_bmp->bmBits
+ glyph_bmp->bmPitch * glyph_bmp->bmHeight);
}
}
data = (BYTE*)glyph_bmp;
ctxt->cb = _dc_bmpfont_scan_line;
case GLYPHBMP_TYPE_PRERENDER:
if (devfont->font_ops->get_glyph_prbitmap != NULL) {
PBITMAP glyph_bmp = &_pre_rdr_bmp;
if (!(devfont->font_ops->get_glyph_prbitmap) (logfont, devfont,
glyph_value, glyph_bmp)) {
return FALSE;
}
break;
/* FLIP for pre-rendered bitmap glyph. */
if ((logfont->style & FS_FLIP_HORZ) ||
(logfont->style & FS_FLIP_VERT)) {
_prepare_pre_rdr_bmp (pdc,
glyph_bmp->bmWidth, glyph_bmp->bmHeight + 1);
if (logfont->style & FS_FLIP_HORZ) {
HFlipBitmap (glyph_bmp, glyph_bmp->bmBits
+ glyph_bmp->bmPitch * glyph_bmp->bmHeight);
}
if (logfont->style & FS_FLIP_VERT) {
VFlipBitmap (glyph_bmp, glyph_bmp->bmBits
+ glyph_bmp->bmPitch * glyph_bmp->bmHeight);
}
}
data = (BYTE*)glyph_bmp;
ctxt->cb = _dc_bmpfont_scan_line;
}
break;
}
if (!data || !ctxt->cb)
@@ -2311,7 +2298,7 @@ int _font_get_glyph_advance (LOGFONT* logfont, DEVFONT* devfont,
int advance = 0;
int glyph_bmptype;
glyph_bmptype = devfont->font_ops->get_glyph_type (logfont, devfont)
glyph_bmptype = devfont->font_ops->get_glyph_bmptype (logfont, devfont)
& DEVFONTGLYPHTYPE_MASK_BMPTYPE;
bbox_x = x;
@@ -2768,7 +2755,7 @@ int _gdi_draw_one_glyph (PDC pdc, Glyph32 glyph_value, BOOL direction,
logfont = pdc->pLogFont;
devfont = SELECT_DEVFONT (logfont, glyph_value);
glyph_bmptype = devfont->font_ops->get_glyph_type (logfont, devfont)
glyph_bmptype = devfont->font_ops->get_glyph_bmptype (logfont, devfont)
& DEVFONTGLYPHTYPE_MASK_BMPTYPE;
// VincentWei: only use auto bold when the weight of devfont does not
+78 -75
View File
@@ -1,39 +1,39 @@
/*
* This file is part of MiniGUI, a mature cross-platform windowing
* 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/>.
*/
/*
** tabbedtextout.c: Implementaion of TabbedTextOut and related functions.
**
**
** Create date: 2008/02/01
*/
@@ -56,14 +56,14 @@
#ifdef _MGCHARSET_UNICODE
extern size_t __mg_strlen (PLOGFONT log_font, const char* mstr);
extern char* __mg_strnchr (PLOGFONT log_font, const char* s,
extern char* __mg_strnchr (PLOGFONT log_font, const char* s,
size_t n, int c, int* cl);
extern int __mg_substrlen (PLOGFONT log_font, const char* text, int len,
extern int __mg_substrlen (PLOGFONT log_font, const char* text, int len,
int delimiter, int* nr_delim);
static inline BOOL is_utf16_logfont (PDC pdc)
{
DEVFONT* mbc_devfont;
DEVFONT* mbc_devfont;
mbc_devfont = pdc->pLogFont->mbc_devfont;
if (mbc_devfont && strstr (mbc_devfont->charset_ops->name, "UTF-16")) {
return TRUE;
@@ -79,14 +79,14 @@ static inline size_t __mg_strlen (PLOGFONT log_font, const char* mstr)
return strlen (mstr);
}
static inline char* __mg_strnchr (PLOGFONT logfont, const char* s,
static inline char* __mg_strnchr (PLOGFONT logfont, const char* s,
size_t n, int c, int* cl)
{
*cl = 1;
return strnchr (s, n, c);
}
static inline int __mg_substrlen (PLOGFONT logfont, const char* text, int len,
static inline int __mg_substrlen (PLOGFONT logfont, const char* text, int len,
int delimiter, int* nr_delim)
{
return substrlen (text, len, delimiter, nr_delim);
@@ -109,21 +109,21 @@ typedef struct _TABBEDTEXTOUT_CTXT
int tab_width;
int line_height;
int x, y;
int x, y;
int advance;
BOOL only_extent;
} TABBEDTEXTOUT_CTXT;
static BOOL cb_tabbedtextout (void* context, Glyph32 glyph_value,
int glyph_type)
static BOOL cb_tabbedtextout (void* context, Glyph32 glyph_value,
unsigned int glyph_type)
{
TABBEDTEXTOUT_CTXT* ctxt = (TABBEDTEXTOUT_CTXT*)context;
int adv_x, adv_y;
BBOX bbox;
int bkmode = ctxt->pdc->bkmode;
switch (glyph_type) {
switch (glyph_type & GLYPHTYPE_MCHAR_MASK) {
case MCHAR_TYPE_ZEROWIDTH:
adv_x = adv_y = 0;
break;
@@ -131,38 +131,40 @@ static BOOL cb_tabbedtextout (void* context, Glyph32 glyph_value,
case MCHAR_TYPE_HT:
_gdi_start_new_line (ctxt->pdc);
if (ctxt->only_extent) {
ctxt->advance += _gdi_get_null_glyph_advance (ctxt->pdc,
ctxt->tab_width,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->advance += _gdi_get_null_glyph_advance (ctxt->pdc,
ctxt->tab_width,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->x, ctxt->y, &adv_x, &adv_y);
}
else {
ctxt->advance += _gdi_draw_null_glyph (ctxt->pdc,
ctxt->tab_width,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->advance += _gdi_draw_null_glyph (ctxt->pdc,
ctxt->tab_width,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->x, ctxt->y, &adv_x, &adv_y);
}
break;
case MCHAR_TYPE_VOWEL:
if (!ctxt->only_extent) {
//ctxt->pdc->bkmode = BM_TRANSPARENT;
_gdi_draw_one_glyph (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
_gdi_draw_one_glyph (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->x, ctxt->y, &adv_x, &adv_y);
ctxt->pdc->bkmode = bkmode;
}
adv_x = adv_y = 0;
break;
default:
if (ctxt->only_extent) {
ctxt->advance += _gdi_get_glyph_advance (ctxt->pdc,
glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->advance += _gdi_get_glyph_advance (ctxt->pdc,
glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->x, ctxt->y, &adv_x, &adv_y, &bbox);
}
else {
ctxt->advance += _gdi_draw_one_glyph (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->advance += _gdi_draw_one_glyph (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->x, ctxt->y, &adv_x, &adv_y);
}
break;
@@ -184,23 +186,23 @@ typedef struct _TABBEDTEXTOUTEX_CTXT
/* para for tab. */
int tab_width;
int nr_tab;
int nr_tab;
int nTabs, nTabOrig;
int *pTabPos;
int *pTabPos;
/* para for current char. */
int x, y;
int x, y;
int advance;
} TABBEDTEXTOUTEX_CTXT;
static BOOL cb_tabbedtextoutex (void* context, Glyph32 glyph_value,
int glyph_type)
static BOOL cb_tabbedtextoutex (void* context, Glyph32 glyph_value,
unsigned int glyph_type)
{
TABBEDTEXTOUTEX_CTXT* ctxt = (TABBEDTEXTOUTEX_CTXT*)context;
int adv_x, adv_y;
int tab_pos = ctxt->nTabOrig;
switch (glyph_type) {
switch (glyph_type & GLYPHTYPE_MCHAR_MASK) {
case MCHAR_TYPE_ZEROWIDTH:
adv_x = adv_y = 0;
break;
@@ -215,22 +217,23 @@ static BOOL cb_tabbedtextoutex (void* context, Glyph32 glyph_value,
else {
tab_pos += (ctxt->nr_tab >= ctxt->nTabs) ? ctxt->tab_width : ctxt->pTabPos[ctxt->nr_tab++];
}
_gdi_draw_null_glyph (ctxt->pdc, tab_pos - ctxt->advance,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
_gdi_draw_null_glyph (ctxt->pdc, tab_pos - ctxt->advance,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->x, ctxt->y, &adv_x, &adv_y);
ctxt->advance = tab_pos;
ctxt->nTabOrig = tab_pos;
break;
case MCHAR_TYPE_VOWEL:
_gdi_draw_one_glyph (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
_gdi_draw_one_glyph (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->x, ctxt->y, &adv_x, &adv_y);
adv_x = adv_y = 0;
break;
default:
ctxt->advance += _gdi_draw_one_glyph (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->advance += _gdi_draw_one_glyph (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->x, ctxt->y, &adv_x, &adv_y);
break;
}
@@ -241,13 +244,13 @@ static BOOL cb_tabbedtextoutex (void* context, Glyph32 glyph_value,
return TRUE;
}
int _gdi_tabbed_text_out (PDC pdc, int x, int y,
int _gdi_tabbed_text_out (PDC pdc, int x, int y,
const unsigned char* text, int len, int tab_width,
BOOL only_extent, POINT* cur_pos, SIZE* size)
BOOL only_extent, POINT* cur_pos, SIZE* size)
{
TABBEDTEXTOUT_CTXT ctxt;
int nr_delim_newline = 0, line_len = 0;
ctxt.pdc = pdc;
ctxt.start_x = x;
ctxt.start_y = y;
@@ -266,7 +269,7 @@ int _gdi_tabbed_text_out (PDC pdc, int x, int y,
pdc->rc_output = pdc->DevRC;
while (len > 0) {
line_len = __mg_substrlen (pdc->pLogFont,
line_len = __mg_substrlen (pdc->pLogFont,
(const char*)text, len, '\n', &nr_delim_newline);
ctxt.x = ctxt.start_x;
@@ -274,8 +277,8 @@ int _gdi_tabbed_text_out (PDC pdc, int x, int y,
if(nr_delim_newline){
_gdi_start_new_line (pdc);
_gdi_reorder_text (pdc, text, line_len,
(pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
_gdi_reorder_text (pdc, text, line_len,
(pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
cb_tabbedtextout, &ctxt);
if (ctxt.max_advance < ctxt.advance) {
ctxt.max_advance = ctxt.advance;
@@ -289,8 +292,8 @@ int _gdi_tabbed_text_out (PDC pdc, int x, int y,
else{
/* output the final line. */
_gdi_start_new_line (pdc);
_gdi_reorder_text (pdc, text, len,
(pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
_gdi_reorder_text (pdc, text, len,
(pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
cb_tabbedtextout, &ctxt);
if (ctxt.max_advance < ctxt.advance) {
@@ -316,8 +319,8 @@ int _gdi_tabbed_text_out (PDC pdc, int x, int y,
return ctxt.max_advance;
}
int GUIAPI TabbedTextOutLen (HDC hdc, int x, int y,
const char* spText, int len)
int GUIAPI TabbedTextOutLen (HDC hdc, int x, int y,
const char* spText, int len)
{
PDC pdc;
int advance;
@@ -329,7 +332,7 @@ int GUIAPI TabbedTextOutLen (HDC hdc, int x, int y,
if (len < 0) len = __mg_strlen (pdc->pLogFont, spText);
if (len == 0) return 0;
tab_width = pdc->pLogFont->sbc_devfont->font_ops->get_ave_width
tab_width = pdc->pLogFont->sbc_devfont->font_ops->get_ave_width
(pdc->pLogFont, pdc->pLogFont->sbc_devfont) * pdc->tabstop;
/* override start point by current text position */
@@ -344,7 +347,7 @@ int GUIAPI TabbedTextOutLen (HDC hdc, int x, int y,
/* convert to the start point on baseline. */
_gdi_get_baseline_point (pdc, &x, &y);
advance = _gdi_tabbed_text_out (pdc, x, y, (const unsigned char*) spText,
advance = _gdi_tabbed_text_out (pdc, x, y, (const unsigned char*) spText,
len, tab_width, FALSE, &cur_pos, NULL);
coor_SP2LP (pdc, &cur_pos.x, &cur_pos.y);
@@ -354,7 +357,7 @@ int GUIAPI TabbedTextOutLen (HDC hdc, int x, int y,
return advance;
}
int GUIAPI GetTabbedTextExtent (HDC hdc, const char* spText, int len,
int GUIAPI GetTabbedTextExtent (HDC hdc, const char* spText, int len,
SIZE* pSize)
{
PDC pdc;
@@ -376,10 +379,10 @@ int GUIAPI GetTabbedTextExtent (HDC hdc, const char* spText, int len,
return 0;
}
tab_width = pdc->pLogFont->sbc_devfont->font_ops->get_ave_width
tab_width = pdc->pLogFont->sbc_devfont->font_ops->get_ave_width
(pdc->pLogFont, pdc->pLogFont->sbc_devfont) * pdc->tabstop;
advance = _gdi_tabbed_text_out (pdc, 0, 0, (const unsigned char*) spText,
advance = _gdi_tabbed_text_out (pdc, 0, 0, (const unsigned char*) spText,
len, tab_width, TRUE, NULL, &size);
if (pSize) *pSize = size;
@@ -387,7 +390,7 @@ int GUIAPI GetTabbedTextExtent (HDC hdc, const char* spText, int len,
return advance;
}
int _gdi_tabbedex_text_out (PDC pdc, int x, int y,
int _gdi_tabbedex_text_out (PDC pdc, int x, int y,
const unsigned char* text, int len, int tab_width,
int nTabs, int *pTabPos, int nTabOrig, POINT* cur_pos)
{
@@ -417,11 +420,11 @@ int _gdi_tabbedex_text_out (PDC pdc, int x, int y,
ctxt.nTabOrig = nTabOrig;
ctxt.pTabPos = pTabPos;
ctxt.nr_tab = 0;
pdc->rc_output = pdc->DevRC;
while (len > 0) {
line_len = __mg_substrlen (pdc->pLogFont,
line_len = __mg_substrlen (pdc->pLogFont,
(const char*)text, len, '\n', &nr_delim_newline);
ctxt.x = ctxt.start_x;
@@ -432,8 +435,8 @@ int _gdi_tabbedex_text_out (PDC pdc, int x, int y,
if(nr_delim_newline){
_gdi_start_new_line (pdc);
_gdi_reorder_text (pdc, text, line_len,
(pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
_gdi_reorder_text (pdc, text, line_len,
(pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
cb_tabbedtextoutex, &ctxt);
if (ctxt.max_advance < ctxt.advance) {
ctxt.max_advance = ctxt.advance;
@@ -445,8 +448,8 @@ int _gdi_tabbedex_text_out (PDC pdc, int x, int y,
else{
/* output the final line. */
_gdi_start_new_line (pdc);
_gdi_reorder_text (pdc, text, len,
(pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
_gdi_reorder_text (pdc, text, len,
(pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
cb_tabbedtextoutex, &ctxt);
if (ctxt.max_advance < ctxt.advance) {
@@ -500,7 +503,7 @@ int GUIAPI TabbedTextOutEx (HDC hdc, int x, int y, const char* spText,
/* convert to the start point on baseline. */
_gdi_get_baseline_point (pdc, &x, &y);
advance = _gdi_tabbedex_text_out (pdc, x, y, (const unsigned char*) spText,
advance = _gdi_tabbedex_text_out (pdc, x, y, (const unsigned char*) spText,
nCount, def_tab, nTabs, pTabPos, nTabOrig, &cur_pos);
coor_SP2LP (pdc, &cur_pos.x, &cur_pos.y);
@@ -510,8 +513,8 @@ int GUIAPI TabbedTextOutEx (HDC hdc, int x, int y, const char* spText,
return advance;
}
int GUIAPI GetTabbedTextExtentPoint (HDC hdc, const char* text,
int len, int max_extent,
int GUIAPI GetTabbedTextExtentPoint (HDC hdc, const char* text,
int len, int max_extent,
int* fit_chars, int* pos_chars, int* dx_chars, SIZE* size)
{
PDC pdc = dc_HDC2PDC (hdc);
@@ -538,7 +541,7 @@ int GUIAPI GetTabbedTextExtentPoint (HDC hdc, const char* text,
tab_width = sbc_devfont->font_ops->get_ave_width (log_font, sbc_devfont)
* pdc->tabstop;
line_height = log_font->size + pdc->alExtra + pdc->blExtra;
size->cy = line_height;
size->cy = line_height;
while (left_bytes > 0) {
if (pos_chars)
@@ -550,13 +553,13 @@ int GUIAPI GetTabbedTextExtentPoint (HDC hdc, const char* text,
len_cur_char = 0;
if (mbc_devfont)
len_cur_char = mbc_devfont->charset_ops->len_first_char
len_cur_char = mbc_devfont->charset_ops->len_first_char
((const unsigned char*)text, left_bytes);
if (len_cur_char > 0)
devfont = mbc_devfont;
else {
len_cur_char = sbc_devfont->charset_ops->len_first_char
len_cur_char = sbc_devfont->charset_ops->len_first_char
((const unsigned char*)text, left_bytes);
if (len_cur_char > 0)
devfont = sbc_devfont;
@@ -572,7 +575,7 @@ int GUIAPI GetTabbedTextExtentPoint (HDC hdc, const char* text,
if(devfont == mbc_devfont)
glyph_value |= 0x80000000;
switch (glyph_type) {
switch (glyph_type & GLYPHTYPE_MCHAR_MASK) {
case MCHAR_TYPE_ZEROWIDTH:
case MCHAR_TYPE_VOWEL:
break;
@@ -591,8 +594,8 @@ int GUIAPI GetTabbedTextExtentPoint (HDC hdc, const char* text,
break;
default:
last_line_width += _gdi_get_glyph_advance (pdc, glyph_value,
(pdc->ta_flags & TA_X_MASK) == TA_LEFT,
last_line_width += _gdi_get_glyph_advance (pdc, glyph_value,
(pdc->ta_flags & TA_X_MASK) == TA_LEFT,
0, 0, NULL, NULL, NULL);
last_line_width += pdc->cExtra;
break;
+67 -67
View File
@@ -1,39 +1,39 @@
/*
* This file is part of MiniGUI, a mature cross-platform windowing
* 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/>.
*/
/*
** textout.c: Implementation of TextOut and related functions.
**
**
** Create date: 2008/02/01
*/
@@ -56,14 +56,14 @@
#ifdef _MGCHARSET_UNICODE
extern size_t __mg_strlen (PLOGFONT log_font, const char* mstr);
extern char* __mg_strnchr (PLOGFONT log_font, const char* s,
extern char* __mg_strnchr (PLOGFONT log_font, const char* s,
size_t n, int c, int* cl);
extern int __mg_substrlen (PLOGFONT log_font, const char* text, int len,
extern int __mg_substrlen (PLOGFONT log_font, const char* text, int len,
int delimiter, int* nr_delim);
static inline BOOL is_utf16_logfont (PDC pdc)
{
DEVFONT* mbc_devfont;
DEVFONT* mbc_devfont;
mbc_devfont = pdc->pLogFont->mbc_devfont;
if (mbc_devfont && strstr (mbc_devfont->charset_ops->name, "UTF-16")) {
return TRUE;
@@ -79,14 +79,14 @@ static inline size_t __mg_strlen (PLOGFONT log_font, const char* mstr)
return strlen (mstr);
}
static inline char* __mg_strnchr (PLOGFONT logfont, const char* s,
static inline char* __mg_strnchr (PLOGFONT logfont, const char* s,
size_t n, int c, int* cl)
{
*cl = 1;
return strnchr (s, n, c);
}
static inline int __mg_substrlen (PLOGFONT logfont, const char* text, int len,
static inline int __mg_substrlen (PLOGFONT logfont, const char* text, int len,
int delimiter, int* nr_delim)
{
return substrlen (text, len, delimiter, nr_delim);
@@ -100,22 +100,22 @@ static inline BOOL is_utf16_logfont (PDC pdc)
#endif
typedef struct _DRAW_GLYPHS_CTXT {
HDC hdc;
int x;
int y;
HDC hdc;
int x;
int y;
int advance;
} DRAW_GLYPHS_CTXT;
static BOOL cb_draw_glyph (void* context, Glyph32 glyph_value, int glyph_type)
static BOOL cb_draw_glyph (void* context, Glyph32 glyph_value, unsigned int glyph_type)
{
DRAW_GLYPHS_CTXT* ctxt = (DRAW_GLYPHS_CTXT*)context;
int adv_x, adv_y;
int bkmode;
if (glyph_type == MCHAR_TYPE_ZEROWIDTH) {
if (check_zero_width(glyph_value, glyph_type)) {
adv_x = adv_y = 0;
}
else if (glyph_type == MCHAR_TYPE_VOWEL){
else if (check_vowel(glyph_type)) {
bkmode = GetBkMode (ctxt->hdc);
//SetBkMode (ctxt->hdc, BM_TRANSPARENT);
DrawGlyph (ctxt->hdc, ctxt->x, ctxt->y, glyph_value, &adv_x, &adv_y);
@@ -138,10 +138,10 @@ int DrawGlyphString (HDC hdc, int startx, int starty, Glyph32* glyph_string, int
DRAW_GLYPHS_CTXT ctxt = {hdc, startx, starty, 0};
if ((((PDC)hdc)->ta_flags & TA_X_MASK) == TA_LEFT)
_gdi_output_visual_glyphs((PDC)hdc, glyph_string,
_gdi_output_visual_glyphs((PDC)hdc, glyph_string,
len, TRUE, cb_draw_glyph, &ctxt);
else
_gdi_output_visual_glyphs((PDC)hdc, glyph_string,
else
_gdi_output_visual_glyphs((PDC)hdc, glyph_string,
len, FALSE, cb_draw_glyph, &ctxt);
if (adv_x)
@@ -156,28 +156,28 @@ int DrawGlyphString (HDC hdc, int startx, int starty, Glyph32* glyph_string, int
typedef struct _TEXTOUT_CTXT
{
PDC pdc;
int x;
int y;
int x;
int y;
int advance;
BOOL only_extent;
} TEXTOUT_CTXT;
static BOOL cb_textout (void* context, Glyph32 glyph_value, int glyph_type)
static BOOL cb_textout (void* context, Glyph32 glyph_value, unsigned int glyph_type)
{
TEXTOUT_CTXT* ctxt = (TEXTOUT_CTXT*)context;
int adv_x, adv_y;
int bkmode;
if (glyph_type == MCHAR_TYPE_ZEROWIDTH) {
if (check_zero_width (glyph_value, glyph_type)) {
adv_x = adv_y = 0;
}
else if (glyph_type == MCHAR_TYPE_VOWEL) {
else if (check_vowel(glyph_type)) {
if (!ctxt->only_extent)
{
bkmode = ctxt->pdc->bkmode;
//ctxt->pdc->bkmode = BM_TRANSPARENT;
_gdi_draw_one_glyph (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
_gdi_draw_one_glyph (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->x, ctxt->y, &adv_x, &adv_y);
ctxt->pdc->bkmode = bkmode;
@@ -187,12 +187,12 @@ static BOOL cb_textout (void* context, Glyph32 glyph_value, int glyph_type)
}
else {
if (ctxt->only_extent)
ctxt->advance += _gdi_get_glyph_advance (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->advance += _gdi_get_glyph_advance (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
0, 0, &adv_x, &adv_y, NULL);
else
ctxt->advance += _gdi_draw_one_glyph (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
else
ctxt->advance += _gdi_draw_one_glyph (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->x, ctxt->y, &adv_x, &adv_y);
}
@@ -202,7 +202,7 @@ static BOOL cb_textout (void* context, Glyph32 glyph_value, int glyph_type)
return TRUE;
}
int _gdi_text_out (PDC pdc, int x, int y,
int _gdi_text_out (PDC pdc, int x, int y,
const unsigned char* text, int len, POINT* cur_pos)
{
TEXTOUT_CTXT ctxt;
@@ -217,7 +217,7 @@ int _gdi_text_out (PDC pdc, int x, int y,
ctxt.only_extent = FALSE;
_gdi_start_new_line (pdc);
_gdi_reorder_text (pdc, text, len,
_gdi_reorder_text (pdc, text, len,
(pdc->ta_flags & TA_X_MASK) != TA_RIGHT, cb_textout, &ctxt);
if (cur_pos) {
@@ -250,7 +250,7 @@ int GUIAPI TextOutLen (HDC hdc, int x, int y, const char* spText, int len)
coor_LP2SP (pdc, &x, &y);
pdc->rc_output = pdc->DevRC;
advance = _gdi_text_out (pdc, x, y,
advance = _gdi_text_out (pdc, x, y,
(const unsigned char*)spText, len, &cur_pos);
coor_SP2LP (pdc, &cur_pos.x, &cur_pos.y);
@@ -260,7 +260,7 @@ int GUIAPI TextOutLen (HDC hdc, int x, int y, const char* spText, int len)
return advance;
}
int _gdi_get_text_extent (PDC pdc, const unsigned char* text, int len,
int _gdi_get_text_extent (PDC pdc, const unsigned char* text, int len,
SIZE* size)
{
TEXTOUT_CTXT ctxt;
@@ -272,7 +272,7 @@ int _gdi_get_text_extent (PDC pdc, const unsigned char* text, int len,
ctxt.only_extent = TRUE;
_gdi_start_new_line (pdc);
_gdi_reorder_text (pdc, text, len,
_gdi_reorder_text (pdc, text, len,
(pdc->ta_flags & TA_X_MASK) != TA_RIGHT, cb_textout, &ctxt);
if (size) {
@@ -304,7 +304,7 @@ static const char *strdot = "...";
#define STRDOT_LEN 3
#if 0
static int str_omitted_3dot (char *dest, const char *src,
static int str_omitted_3dot (char *dest, const char *src,
int *pos_chars, int reserve)
{
int nbytes = 0;
@@ -320,42 +320,42 @@ static int str_omitted_3dot (char *dest, const char *src,
typedef struct _TEXTOUTOMITTED_CTXT
{
PDC pdc;
int x;
int y;
int x;
int y;
int advance;
Uint32 max_extent;
} TEXTOUTOMITTED_CTXT;
static BOOL cb_textout_omitted (void* context, Glyph32 glyph_value, int glyph_type)
static BOOL cb_textout_omitted (void* context, Glyph32 glyph_value, unsigned int glyph_type)
{
TEXTOUTOMITTED_CTXT* ctxt = (TEXTOUTOMITTED_CTXT*)context;
int adv_x, adv_y;
int glyph_advance = 0;
int glyph_advance = 0;
//BBOX bbox;
int bkmode = ctxt->pdc->bkmode;
if (glyph_type == MCHAR_TYPE_ZEROWIDTH) {
if (check_zero_width(glyph_value, glyph_type)) {
adv_x = adv_y = 0;
}
else if(glyph_type == MCHAR_TYPE_VOWEL) {
else if (check_vowel(glyph_type)) {
//ctxt->pdc->bkmode = BM_TRANSPARENT;
_gdi_draw_one_glyph (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
_gdi_draw_one_glyph (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->x, ctxt->y, &adv_x, &adv_y);
ctxt->pdc->bkmode = bkmode;
adv_x = adv_y = 0;
}
else {
/* if this glyph can be visible. */
glyph_advance = _gdi_get_glyph_advance (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
glyph_advance = _gdi_get_glyph_advance (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
0, 0, &adv_x, &adv_y, NULL);
if((ctxt->advance + glyph_advance) > ctxt->max_extent)
return FALSE;
ctxt->advance += _gdi_draw_one_glyph (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->advance += _gdi_draw_one_glyph (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->x, ctxt->y, &adv_x, &adv_y);
}
@@ -365,7 +365,7 @@ static BOOL cb_textout_omitted (void* context, Glyph32 glyph_value, int glyph_ty
return TRUE;
}
int _gdi_textout_omitted (PDC pdc, int x, int y,
int _gdi_textout_omitted (PDC pdc, int x, int y,
const unsigned char* text, int len, int max_extent, POINT* cur_pos)
{
TEXTOUTOMITTED_CTXT ctxt;
@@ -380,7 +380,7 @@ int _gdi_textout_omitted (PDC pdc, int x, int y,
ctxt.max_extent = max_extent;
_gdi_start_new_line (pdc);
_gdi_reorder_text (pdc, text, len,
_gdi_reorder_text (pdc, text, len,
(pdc->ta_flags & TA_X_MASK) != TA_RIGHT, cb_textout_omitted, &ctxt);
if (cur_pos) {
@@ -391,7 +391,7 @@ int _gdi_textout_omitted (PDC pdc, int x, int y,
return ctxt.advance;
}
int GUIAPI TextOutOmitted (HDC hdc, int x, int y,
int GUIAPI TextOutOmitted (HDC hdc, int x, int y,
const char *mtext, int len, int max_extent)
{
PDC pdc;
@@ -431,7 +431,7 @@ int GUIAPI TextOutOmitted (HDC hdc, int x, int y,
return 0;
}
max_extent -= size_dot.cx;
advance = _gdi_textout_omitted(pdc, x, y,
advance = _gdi_textout_omitted(pdc, x, y,
(const unsigned char*)mtext, len, max_extent, &cur_pos);
coor_SP2LP (pdc, &cur_pos.x, &cur_pos.y);
@@ -446,8 +446,8 @@ int GUIAPI TextOutOmitted (HDC hdc, int x, int y,
#undef STRDOT_LEN
int GUIAPI GetTextExtentPoint (HDC hdc, const char* text, int len,
int max_extent,
int GUIAPI GetTextExtentPoint (HDC hdc, const char* text, int len,
int max_extent,
int* fit_chars, int* pos_chars, int* dx_chars, SIZE* size)
{
PDC pdc = dc_HDC2PDC (hdc);
@@ -476,15 +476,15 @@ int GUIAPI GetTextExtentPoint (HDC hdc, const char* text, int len,
if (dx_chars)
dx_chars[char_count] = size->cx;
if (mbc_devfont &&
(len_cur_char = mbc_devfont->charset_ops->len_first_char
if (mbc_devfont &&
(len_cur_char = mbc_devfont->charset_ops->len_first_char
((const unsigned char*)text, left_bytes)) > 0) {
glyph_value = (*mbc_devfont->charset_ops->char_glyph_value)(NULL,
0, (const unsigned char*)text, 0);
advance_cur_char = _gdi_get_glyph_advance (pdc, glyph_value | 0x80000000,
(pdc->ta_flags & TA_X_MASK) == TA_LEFT,
advance_cur_char = _gdi_get_glyph_advance (pdc, glyph_value | 0x80000000,
(pdc->ta_flags & TA_X_MASK) == TA_LEFT,
0, 0, NULL, NULL, NULL);
}
else {
@@ -493,8 +493,8 @@ int GUIAPI GetTextExtentPoint (HDC hdc, const char* text, int len,
glyph_value = (*sbc_devfont->charset_ops->char_glyph_value)(
NULL, 0, (const unsigned char*)text, 0);
advance_cur_char = _gdi_get_glyph_advance (pdc, glyph_value,
(pdc->ta_flags & TA_X_MASK) == TA_LEFT,
advance_cur_char = _gdi_get_glyph_advance (pdc, glyph_value,
(pdc->ta_flags & TA_X_MASK) == TA_LEFT,
0, 0, NULL, NULL, NULL);
}
else