mirror of
https://github.com/VincentWei/MiniGUI.git
synced 2026-09-25 02:33:59 +08:00
rename glyph type macros and glyph type now includes MCHAR_TYPE_XXX for ASCII characters
This commit is contained in:
+93
-116
@@ -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
|
||||
|
||||
@@ -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
@@ -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
@@ -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
File diff suppressed because it is too large
Load Diff
@@ -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
File diff suppressed because it is too large
Load Diff
+15422
-15422
File diff suppressed because it is too large
Load Diff
+138
-138
@@ -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
@@ -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
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
@@ -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,
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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)){
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user