From b746d2927e0072eddd4be9b5d42e5d9bdf509373 Mon Sep 17 00:00:00 2001 From: Vincent Wei Date: Fri, 15 Feb 2019 18:07:03 +0800 Subject: [PATCH] Partial implementation of GetGlyphsExtentPointEx --- include/gdi.h | 467 +++++++++++++++++++++-------------------- src/newgdi/glyph-css.c | 391 +++++++++++++++++++++++++++++++--- 2 files changed, 597 insertions(+), 261 deletions(-) diff --git a/include/gdi.h b/include/gdi.h index e0e684f4..194440d2 100644 --- a/include/gdi.h +++ b/include/gdi.h @@ -5867,36 +5867,36 @@ typedef Uint32 Uchar32; /** * UCharBasicType: basic type of a UNICODE character. * - * -UCHAR_TYPE_CONTROL: General category "Other, Control" (Cc) - * -UCHAR_TYPE_FORMAT: General category "Other, Format" (Cf) - * -UCHAR_TYPE_UNASSIGNED: General category "Other, Not Assigned" (Cn) - * -UCHAR_TYPE_PRIVATE_USE: General category "Other, Private Use" (Co) - * -UCHAR_TYPE_SURROGATE: General category "Other, Surrogate" (Cs) - * -UCHAR_TYPE_LOWERCASE_LETTER: General category "Letter, Lowercase" (Ll) - * -UCHAR_TYPE_MODIFIER_LETTER: General category "Letter, Modifier" (Lm) - * -UCHAR_TYPE_OTHER_LETTER: General category "Letter, Other" (Lo) - * -UCHAR_TYPE_TITLECASE_LETTER: General category "Letter, Titlecase" (Lt) - * -UCHAR_TYPE_UPPERCASE_LETTER: General category "Letter, Uppercase" (Lu) - * -UCHAR_TYPE_SPACING_MARK: General category "Mark, Spacing" (Mc) - * -UCHAR_TYPE_ENCLOSING_MARK: General category "Mark, Enclosing" (Me) - * -UCHAR_TYPE_NON_SPACING_MARK: General category "Mark, Nonspacing" (Mn) - * -UCHAR_TYPE_DECIMAL_NUMBER: General category "Number, Decimal Digit" (Nd) - * -UCHAR_TYPE_LETTER_NUMBER: General category "Number, Letter" (Nl) - * -UCHAR_TYPE_OTHER_NUMBER: General category "Number, Other" (No) - * -UCHAR_TYPE_CONNECT_PUNCTUATION: General category "Punctuation, Connector" (Pc) - * -UCHAR_TYPE_DASH_PUNCTUATION: General category "Punctuation, Dash" (Pd) - * -UCHAR_TYPE_CLOSE_PUNCTUATION: General category "Punctuation, Close" (Pe) - * -UCHAR_TYPE_FINAL_PUNCTUATION: General category "Punctuation, Final quote" (Pf) - * -UCHAR_TYPE_INITIAL_PUNCTUATION: General category "Punctuation, Initial quote" (Pi) - * -UCHAR_TYPE_OTHER_PUNCTUATION: General category "Punctuation, Other" (Po) - * -UCHAR_TYPE_OPEN_PUNCTUATION: General category "Punctuation, Open" (Ps) - * -UCHAR_TYPE_CURRENCY_SYMBOL: General category "Symbol, Currency" (Sc) - * -UCHAR_TYPE_MODIFIER_SYMBOL: General category "Symbol, Modifier" (Sk) - * -UCHAR_TYPE_MATH_SYMBOL: General category "Symbol, Math" (Sm) - * -UCHAR_TYPE_OTHER_SYMBOL: General category "Symbol, Other" (So) - * -UCHAR_TYPE_LINE_SEPARATOR: General category "Separator, Line" (Zl) - * -UCHAR_TYPE_PARAGRAPH_SEPARATOR: General category "Separator, Paragraph" (Zp) - * -UCHAR_TYPE_SPACE_SEPARATOR: General category "Separator, Space" (Zs) + * - UCHAR_TYPE_CONTROL: General category "Other, Control" (Cc) + * - UCHAR_TYPE_FORMAT: General category "Other, Format" (Cf) + * - UCHAR_TYPE_UNASSIGNED: General category "Other, Not Assigned" (Cn) + * - UCHAR_TYPE_PRIVATE_USE: General category "Other, Private Use" (Co) + * - UCHAR_TYPE_SURROGATE: General category "Other, Surrogate" (Cs) + * - UCHAR_TYPE_LOWERCASE_LETTER: General category "Letter, Lowercase" (Ll) + * - UCHAR_TYPE_MODIFIER_LETTER: General category "Letter, Modifier" (Lm) + * - UCHAR_TYPE_OTHER_LETTER: General category "Letter, Other" (Lo) + * - UCHAR_TYPE_TITLECASE_LETTER: General category "Letter, Titlecase" (Lt) + * - UCHAR_TYPE_UPPERCASE_LETTER: General category "Letter, Uppercase" (Lu) + * - UCHAR_TYPE_SPACING_MARK: General category "Mark, Spacing" (Mc) + * - UCHAR_TYPE_ENCLOSING_MARK: General category "Mark, Enclosing" (Me) + * - UCHAR_TYPE_NON_SPACING_MARK: General category "Mark, Nonspacing" (Mn) + * - UCHAR_TYPE_DECIMAL_NUMBER: General category "Number, Decimal Digit" (Nd) + * - UCHAR_TYPE_LETTER_NUMBER: General category "Number, Letter" (Nl) + * - UCHAR_TYPE_OTHER_NUMBER: General category "Number, Other" (No) + * - UCHAR_TYPE_CONNECT_PUNCTUATION: General category "Punctuation, Connector" (Pc) + * - UCHAR_TYPE_DASH_PUNCTUATION: General category "Punctuation, Dash" (Pd) + * - UCHAR_TYPE_CLOSE_PUNCTUATION: General category "Punctuation, Close" (Pe) + * - UCHAR_TYPE_FINAL_PUNCTUATION: General category "Punctuation, Final quote" (Pf) + * - UCHAR_TYPE_INITIAL_PUNCTUATION: General category "Punctuation, Initial quote" (Pi) + * - UCHAR_TYPE_OTHER_PUNCTUATION: General category "Punctuation, Other" (Po) + * - UCHAR_TYPE_OPEN_PUNCTUATION: General category "Punctuation, Open" (Ps) + * - UCHAR_TYPE_CURRENCY_SYMBOL: General category "Symbol, Currency" (Sc) + * - UCHAR_TYPE_MODIFIER_SYMBOL: General category "Symbol, Modifier" (Sk) + * - UCHAR_TYPE_MATH_SYMBOL: General category "Symbol, Math" (Sm) + * - UCHAR_TYPE_OTHER_SYMBOL: General category "Symbol, Other" (So) + * - UCHAR_TYPE_LINE_SEPARATOR: General category "Separator, Line" (Zl) + * - UCHAR_TYPE_PARAGRAPH_SEPARATOR: General category "Separator, Paragraph" (Zp) + * - UCHAR_TYPE_SPACE_SEPARATOR: General category "Separator, Space" (Zs) * * These are the possible character classifications from the * Unicode specification. @@ -5938,49 +5938,49 @@ typedef enum { /** * UCharBreakType: The break type of a UNICODE character. * - * -UCHAR_BREAK_MANDATORY: Mandatory Break (BK) - * -UCHAR_BREAK_CARRIAGE_RETURN: Carriage Return (CR) - * -UCHAR_BREAK_LINE_FEED: Line Feed (LF) - * -UCHAR_BREAK_COMBINING_MARK: Attached Characters and Combining Marks (CM) - * -UCHAR_BREAK_SURROGATE: Surrogates (SG) - * -UCHAR_BREAK_ZERO_WIDTH_SPACE: Zero Width Space (ZW) - * -UCHAR_BREAK_INSEPARABLE: Inseparable (IN) - * -UCHAR_BREAK_NON_BREAKING_GLUE: Non-breaking ("Glue") (GL) - * -UCHAR_BREAK_CONTINGENT: Contingent Break Opportunity (CB) - * -UCHAR_BREAK_SPACE: Space (SP) - * -UCHAR_BREAK_AFTER: Break Opportunity After (BA) - * -UCHAR_BREAK_BEFORE: Break Opportunity Before (BB) - * -UCHAR_BREAK_BEFORE_AND_AFTER: Break Opportunity Before and After (B2) - * -UCHAR_BREAK_HYPHEN: Hyphen (HY) - * -UCHAR_BREAK_NON_STARTER: Nonstarter (NS) - * -UCHAR_BREAK_OPEN_PUNCTUATION: Opening Punctuation (OP) - * -UCHAR_BREAK_CLOSE_PUNCTUATION: Closing Punctuation (CL) - * -UCHAR_BREAK_QUOTATION: Ambiguous Quotation (QU) - * -UCHAR_BREAK_EXCLAMATION: Exclamation/Interrogation (EX) - * -UCHAR_BREAK_IDEOGRAPHIC: Ideographic (ID) - * -UCHAR_BREAK_NUMERIC: Numeric (NU) - * -UCHAR_BREAK_INFIX_SEPARATOR: Infix Separator (Numeric) (IS) - * -UCHAR_BREAK_SYMBOL: Symbols Allowing Break After (SY) - * -UCHAR_BREAK_ALPHABETIC: Ordinary Alphabetic and Symbol Characters (AL) - * -UCHAR_BREAK_PREFIX: Prefix (Numeric) (PR) - * -UCHAR_BREAK_POSTFIX: Postfix (Numeric) (PO) - * -UCHAR_BREAK_COMPLEX_CONTEXT: Complex Content Dependent (South East Asian) (SA) - * -UCHAR_BREAK_AMBIGUOUS: Ambiguous (Alphabetic or Ideographic) (AI) - * -UCHAR_BREAK_UNKNOWN: Unknown (XX) - * -UCHAR_BREAK_NEXT_LINE: Next Line (NL) - * -UCHAR_BREAK_WORD_JOINER: Word Joiner (WJ) - * -UCHAR_BREAK_HANGUL_L_JAMO: Hangul L Jamo (JL) - * -UCHAR_BREAK_HANGUL_V_JAMO: Hangul V Jamo (JV) - * -UCHAR_BREAK_HANGUL_T_JAMO: Hangul T Jamo (JT) - * -UCHAR_BREAK_HANGUL_LV_SYLLABLE: Hangul LV Syllable (H2) - * -UCHAR_BREAK_HANGUL_LVT_SYLLABLE: Hangul LVT Syllable (H3) - * -UCHAR_BREAK_CLOSE_PARANTHESIS: Closing Parenthesis (CP). - * -UCHAR_BREAK_CONDITIONAL_JAPANESE_STARTER: Conditional Japanese Starter (CJ). - * -UCHAR_BREAK_HEBREW_LETTER: Hebrew Letter (HL). - * -UCHAR_BREAK_REGIONAL_INDICATOR: Regional Indicator (RI). - * -UCHAR_BREAK_EMOJI_BASE: Emoji Base (EB). - * -UCHAR_BREAK_EMOJI_MODIFIER: Emoji Modifier (EM). - * -UCHAR_BREAK_ZERO_WIDTH_JOINER: Zero Width Joiner (ZWJ). + * - UCHAR_BREAK_MANDATORY: Mandatory Break (BK) + * - UCHAR_BREAK_CARRIAGE_RETURN: Carriage Return (CR) + * - UCHAR_BREAK_LINE_FEED: Line Feed (LF) + * - UCHAR_BREAK_COMBINING_MARK: Attached Characters and Combining Marks (CM) + * - UCHAR_BREAK_SURROGATE: Surrogates (SG) + * - UCHAR_BREAK_ZERO_WIDTH_SPACE: Zero Width Space (ZW) + * - UCHAR_BREAK_INSEPARABLE: Inseparable (IN) + * - UCHAR_BREAK_NON_BREAKING_GLUE: Non-breaking ("Glue") (GL) + * - UCHAR_BREAK_CONTINGENT: Contingent Break Opportunity (CB) + * - UCHAR_BREAK_SPACE: Space (SP) + * - UCHAR_BREAK_AFTER: Break Opportunity After (BA) + * - UCHAR_BREAK_BEFORE: Break Opportunity Before (BB) + * - UCHAR_BREAK_BEFORE_AND_AFTER: Break Opportunity Before and After (B2) + * - UCHAR_BREAK_HYPHEN: Hyphen (HY) + * - UCHAR_BREAK_NON_STARTER: Nonstarter (NS) + * - UCHAR_BREAK_OPEN_PUNCTUATION: Opening Punctuation (OP) + * - UCHAR_BREAK_CLOSE_PUNCTUATION: Closing Punctuation (CL) + * - UCHAR_BREAK_QUOTATION: Ambiguous Quotation (QU) + * - UCHAR_BREAK_EXCLAMATION: Exclamation/Interrogation (EX) + * - UCHAR_BREAK_IDEOGRAPHIC: Ideographic (ID) + * - UCHAR_BREAK_NUMERIC: Numeric (NU) + * - UCHAR_BREAK_INFIX_SEPARATOR: Infix Separator (Numeric) (IS) + * - UCHAR_BREAK_SYMBOL: Symbols Allowing Break After (SY) + * - UCHAR_BREAK_ALPHABETIC: Ordinary Alphabetic and Symbol Characters (AL) + * - UCHAR_BREAK_PREFIX: Prefix (Numeric) (PR) + * - UCHAR_BREAK_POSTFIX: Postfix (Numeric) (PO) + * - UCHAR_BREAK_COMPLEX_CONTEXT: Complex Content Dependent (South East Asian) (SA) + * - UCHAR_BREAK_AMBIGUOUS: Ambiguous (Alphabetic or Ideographic) (AI) + * - UCHAR_BREAK_UNKNOWN: Unknown (XX) + * - UCHAR_BREAK_NEXT_LINE: Next Line (NL) + * - UCHAR_BREAK_WORD_JOINER: Word Joiner (WJ) + * - UCHAR_BREAK_HANGUL_L_JAMO: Hangul L Jamo (JL) + * - UCHAR_BREAK_HANGUL_V_JAMO: Hangul V Jamo (JV) + * - UCHAR_BREAK_HANGUL_T_JAMO: Hangul T Jamo (JT) + * - UCHAR_BREAK_HANGUL_LV_SYLLABLE: Hangul LV Syllable (H2) + * - UCHAR_BREAK_HANGUL_LVT_SYLLABLE: Hangul LVT Syllable (H3) + * - UCHAR_BREAK_CLOSE_PARANTHESIS: Closing Parenthesis (CP). + * - UCHAR_BREAK_CONDITIONAL_JAPANESE_STARTER: Conditional Japanese Starter (CJ). + * - UCHAR_BREAK_HEBREW_LETTER: Hebrew Letter (HL). + * - UCHAR_BREAK_REGIONAL_INDICATOR: Regional Indicator (RI). + * - UCHAR_BREAK_EMOJI_BASE: Emoji Base (EB). + * - UCHAR_BREAK_EMOJI_MODIFIER: Emoji Modifier (EM). + * - UCHAR_BREAK_ZERO_WIDTH_JOINER: Zero Width Joiner (ZWJ). * * These are the possible line break classifications. * @@ -6038,162 +6038,162 @@ typedef enum { /** * UCharScriptType: The script type of a UNICODE character. * - * -UCHAR_SCRIPT_INVALID_CODE: + * - UCHAR_SCRIPT_INVALID_CODE: * a value never returned from UCharGetScriptType() - * -UCHAR_SCRIPT_COMMON: a character used by multiple different scripts - * -UCHAR_SCRIPT_INHERITED: a mark glyph that takes its script from the + * - UCHAR_SCRIPT_COMMON: a character used by multiple different scripts + * - UCHAR_SCRIPT_INHERITED: a mark glyph that takes its script from the * base glyph to which it is attached - * -UCHAR_SCRIPT_ARABIC: Arabic - * -UCHAR_SCRIPT_ARMENIAN: Armenian - * -UCHAR_SCRIPT_BENGALI: Bengali - * -UCHAR_SCRIPT_BOPOMOFO: Bopomofo - * -UCHAR_SCRIPT_CHEROKEE: Cherokee - * -UCHAR_SCRIPT_COPTIC: Coptic - * -UCHAR_SCRIPT_CYRILLIC: Cyrillic - * -UCHAR_SCRIPT_DESERET: Deseret - * -UCHAR_SCRIPT_DEVANAGARI: Devanagari - * -UCHAR_SCRIPT_ETHIOPIC: Ethiopic - * -UCHAR_SCRIPT_GEORGIAN: Georgian - * -UCHAR_SCRIPT_GOTHIC: Gothic - * -UCHAR_SCRIPT_GREEK: Greek - * -UCHAR_SCRIPT_GUJARATI: Gujarati - * -UCHAR_SCRIPT_GURMUKHI: Gurmukhi - * -UCHAR_SCRIPT_HAN: Han - * -UCHAR_SCRIPT_HANGUL: Hangul - * -UCHAR_SCRIPT_HEBREW: Hebrew - * -UCHAR_SCRIPT_HIRAGANA: Hiragana - * -UCHAR_SCRIPT_KANNADA: Kannada - * -UCHAR_SCRIPT_KATAKANA: Katakana - * -UCHAR_SCRIPT_KHMER: Khmer - * -UCHAR_SCRIPT_LAO: Lao - * -UCHAR_SCRIPT_LATIN: Latin - * -UCHAR_SCRIPT_MALAYALAM: Malayalam - * -UCHAR_SCRIPT_MONGOLIAN: Mongolian - * -UCHAR_SCRIPT_MYANMAR: Myanmar - * -UCHAR_SCRIPT_OGHAM: Ogham - * -UCHAR_SCRIPT_OLD_ITALIC: Old Italic - * -UCHAR_SCRIPT_ORIYA: Oriya - * -UCHAR_SCRIPT_RUNIC: Runic - * -UCHAR_SCRIPT_SINHALA: Sinhala - * -UCHAR_SCRIPT_SYRIAC: Syriac - * -UCHAR_SCRIPT_TAMIL: Tamil - * -UCHAR_SCRIPT_TELUGU: Telugu - * -UCHAR_SCRIPT_THAANA: Thaana - * -UCHAR_SCRIPT_THAI: Thai - * -UCHAR_SCRIPT_TIBETAN: Tibetan - * -UCHAR_SCRIPT_CANADIAN_ABORIGINAL: + * - UCHAR_SCRIPT_ARABIC: Arabic + * - UCHAR_SCRIPT_ARMENIAN: Armenian + * - UCHAR_SCRIPT_BENGALI: Bengali + * - UCHAR_SCRIPT_BOPOMOFO: Bopomofo + * - UCHAR_SCRIPT_CHEROKEE: Cherokee + * - UCHAR_SCRIPT_COPTIC: Coptic + * - UCHAR_SCRIPT_CYRILLIC: Cyrillic + * - UCHAR_SCRIPT_DESERET: Deseret + * - UCHAR_SCRIPT_DEVANAGARI: Devanagari + * - UCHAR_SCRIPT_ETHIOPIC: Ethiopic + * - UCHAR_SCRIPT_GEORGIAN: Georgian + * - UCHAR_SCRIPT_GOTHIC: Gothic + * - UCHAR_SCRIPT_GREEK: Greek + * - UCHAR_SCRIPT_GUJARATI: Gujarati + * - UCHAR_SCRIPT_GURMUKHI: Gurmukhi + * - UCHAR_SCRIPT_HAN: Han + * - UCHAR_SCRIPT_HANGUL: Hangul + * - UCHAR_SCRIPT_HEBREW: Hebrew + * - UCHAR_SCRIPT_HIRAGANA: Hiragana + * - UCHAR_SCRIPT_KANNADA: Kannada + * - UCHAR_SCRIPT_KATAKANA: Katakana + * - UCHAR_SCRIPT_KHMER: Khmer + * - UCHAR_SCRIPT_LAO: Lao + * - UCHAR_SCRIPT_LATIN: Latin + * - UCHAR_SCRIPT_MALAYALAM: Malayalam + * - UCHAR_SCRIPT_MONGOLIAN: Mongolian + * - UCHAR_SCRIPT_MYANMAR: Myanmar + * - UCHAR_SCRIPT_OGHAM: Ogham + * - UCHAR_SCRIPT_OLD_ITALIC: Old Italic + * - UCHAR_SCRIPT_ORIYA: Oriya + * - UCHAR_SCRIPT_RUNIC: Runic + * - UCHAR_SCRIPT_SINHALA: Sinhala + * - UCHAR_SCRIPT_SYRIAC: Syriac + * - UCHAR_SCRIPT_TAMIL: Tamil + * - UCHAR_SCRIPT_TELUGU: Telugu + * - UCHAR_SCRIPT_THAANA: Thaana + * - UCHAR_SCRIPT_THAI: Thai + * - UCHAR_SCRIPT_TIBETAN: Tibetan + * - UCHAR_SCRIPT_CANADIAN_ABORIGINAL: * Canadian Aboriginal - * -UCHAR_SCRIPT_YI: Yi - * -UCHAR_SCRIPT_TAGALOG: Tagalog - * -UCHAR_SCRIPT_HANUNOO: Hanunoo - * -UCHAR_SCRIPT_BUHID: Buhid - * -UCHAR_SCRIPT_TAGBANWA: Tagbanwa - * -UCHAR_SCRIPT_BRAILLE: Braille - * -UCHAR_SCRIPT_CYPRIOT: Cypriot - * -UCHAR_SCRIPT_LIMBU: Limbu - * -UCHAR_SCRIPT_OSMANYA: Osmanya - * -UCHAR_SCRIPT_SHAVIAN: Shavian - * -UCHAR_SCRIPT_LINEAR_B: Linear B - * -UCHAR_SCRIPT_TAI_LE: Tai Le - * -UCHAR_SCRIPT_UGARITIC: Ugaritic - * -UCHAR_SCRIPT_NEW_TAI_LUE: + * - UCHAR_SCRIPT_YI: Yi + * - UCHAR_SCRIPT_TAGALOG: Tagalog + * - UCHAR_SCRIPT_HANUNOO: Hanunoo + * - UCHAR_SCRIPT_BUHID: Buhid + * - UCHAR_SCRIPT_TAGBANWA: Tagbanwa + * - UCHAR_SCRIPT_BRAILLE: Braille + * - UCHAR_SCRIPT_CYPRIOT: Cypriot + * - UCHAR_SCRIPT_LIMBU: Limbu + * - UCHAR_SCRIPT_OSMANYA: Osmanya + * - UCHAR_SCRIPT_SHAVIAN: Shavian + * - UCHAR_SCRIPT_LINEAR_B: Linear B + * - UCHAR_SCRIPT_TAI_LE: Tai Le + * - UCHAR_SCRIPT_UGARITIC: Ugaritic + * - UCHAR_SCRIPT_NEW_TAI_LUE: * New Tai Lue - * -UCHAR_SCRIPT_BUGINESE: Buginese - * -UCHAR_SCRIPT_GLAGOLITIC: Glagolitic - * -UCHAR_SCRIPT_TIFINAGH: Tifinagh - * -UCHAR_SCRIPT_SYLOTI_NAGRI: + * - UCHAR_SCRIPT_BUGINESE: Buginese + * - UCHAR_SCRIPT_GLAGOLITIC: Glagolitic + * - UCHAR_SCRIPT_TIFINAGH: Tifinagh + * - UCHAR_SCRIPT_SYLOTI_NAGRI: * Syloti Nagri - * -UCHAR_SCRIPT_OLD_PERSIAN: + * - UCHAR_SCRIPT_OLD_PERSIAN: * Old Persian - * -UCHAR_SCRIPT_KHAROSHTHI: Kharoshthi - * -UCHAR_SCRIPT_UNKNOWN: an unassigned code point - * -UCHAR_SCRIPT_BALINESE: Balinese - * -UCHAR_SCRIPT_CUNEIFORM: Cuneiform - * -UCHAR_SCRIPT_PHOENICIAN: Phoenician - * -UCHAR_SCRIPT_PHAGS_PA: Phags-pa - * -UCHAR_SCRIPT_NKO: N'Ko - * -UCHAR_SCRIPT_KAYAH_LI: Kayah Li. - * -UCHAR_SCRIPT_LEPCHA: Lepcha. - * -UCHAR_SCRIPT_REJANG: Rejang. - * -UCHAR_SCRIPT_SUNDANESE: Sundanese. - * -UCHAR_SCRIPT_SAURASHTRA: Saurashtra. - * -UCHAR_SCRIPT_CHAM: Cham. - * -UCHAR_SCRIPT_OL_CHIKI: Ol Chiki. - * -UCHAR_SCRIPT_VAI: Vai. - * -UCHAR_SCRIPT_CARIAN: Carian. - * -UCHAR_SCRIPT_LYCIAN: Lycian. - * -UCHAR_SCRIPT_LYDIAN: Lydian. - * -UCHAR_SCRIPT_AVESTAN: Avestan. - * -UCHAR_SCRIPT_BAMUM: Bamum. - * -UCHAR_SCRIPT_EGYPTIAN_HIEROGLYPHS: Egyptian Hieroglpyhs. - * -UCHAR_SCRIPT_IMPERIAL_ARAMAIC: Imperial Aramaic. - * -UCHAR_SCRIPT_INSCRIPTIONAL_PAHLAVI: Inscriptional Pahlavi. - * -UCHAR_SCRIPT_INSCRIPTIONAL_PARTHIAN: Inscriptional Parthian. - * -UCHAR_SCRIPT_JAVANESE: Javanese. - * -UCHAR_SCRIPT_KAITHI: Kaithi. - * -UCHAR_SCRIPT_LISU: Lisu. - * -UCHAR_SCRIPT_MEETEI_MAYEK: Meetei Mayek. - * -UCHAR_SCRIPT_OLD_SOUTH_ARABIAN: Old South Arabian. - * -UCHAR_SCRIPT_OLD_TURKIC: Old Turkic. - * -UCHAR_SCRIPT_SAMARITAN: Samaritan. - * -UCHAR_SCRIPT_TAI_THAM: Tai Tham. - * -UCHAR_SCRIPT_TAI_VIET: Tai Viet. - * -UCHAR_SCRIPT_BATAK: Batak. - * -UCHAR_SCRIPT_BRAHMI: Brahmi. - * -UCHAR_SCRIPT_MANDAIC: Mandaic. - * -UCHAR_SCRIPT_CHAKMA: Chakma. - * -UCHAR_SCRIPT_MEROITIC_CURSIVE: Meroitic Cursive. - * -UCHAR_SCRIPT_MEROITIC_HIEROGLYPHS: Meroitic Hieroglyphs. - * -UCHAR_SCRIPT_MIAO: Miao. - * -UCHAR_SCRIPT_SHARADA: Sharada. - * -UCHAR_SCRIPT_SORA_SOMPENG: Sora Sompeng. - * -UCHAR_SCRIPT_TAKRI: Takri. - * -UCHAR_SCRIPT_BASSA_VAH: Bassa. - * -UCHAR_SCRIPT_CAUCASIAN_ALBANIAN: Caucasian Albanian. - * -UCHAR_SCRIPT_DUPLOYAN: Duployan. - * -UCHAR_SCRIPT_ELBASAN: Elbasan. - * -UCHAR_SCRIPT_GRANTHA: Grantha. - * -UCHAR_SCRIPT_KHOJKI: Kjohki. - * -UCHAR_SCRIPT_KHUDAWADI: Khudawadi, Sindhi. - * -UCHAR_SCRIPT_LINEAR_A: Linear A. - * -UCHAR_SCRIPT_MAHAJANI: Mahajani. - * -UCHAR_SCRIPT_MANICHAEAN: Manichaean. - * -UCHAR_SCRIPT_MENDE_KIKAKUI: Mende Kikakui. - * -UCHAR_SCRIPT_MODI: Modi. - * -UCHAR_SCRIPT_MRO: Mro. - * -UCHAR_SCRIPT_NABATAEAN: Nabataean. - * -UCHAR_SCRIPT_OLD_NORTH_ARABIAN: Old North Arabian. - * -UCHAR_SCRIPT_OLD_PERMIC: Old Permic. - * -UCHAR_SCRIPT_PAHAWH_HMONG: Pahawh Hmong. - * -UCHAR_SCRIPT_PALMYRENE: Palmyrene. - * -UCHAR_SCRIPT_PAU_CIN_HAU: Pau Cin Hau. - * -UCHAR_SCRIPT_PSALTER_PAHLAVI: Psalter Pahlavi. - * -UCHAR_SCRIPT_SIDDHAM: Siddham. - * -UCHAR_SCRIPT_TIRHUTA: Tirhuta. - * -UCHAR_SCRIPT_WARANG_CITI: Warang Citi. - * -UCHAR_SCRIPT_AHOM: Ahom. - * -UCHAR_SCRIPT_ANATOLIAN_HIEROGLYPHS: Anatolian Hieroglyphs. - * -UCHAR_SCRIPT_HATRAN: Hatran. - * -UCHAR_SCRIPT_MULTANI: Multani. - * -UCHAR_SCRIPT_OLD_HUNGARIAN: Old Hungarian. - * -UCHAR_SCRIPT_SIGNWRITING: Signwriting. - * -UCHAR_SCRIPT_ADLAM: Adlam. - * -UCHAR_SCRIPT_BHAIKSUKI: Bhaiksuki. - * -UCHAR_SCRIPT_MARCHEN: Marchen. - * -UCHAR_SCRIPT_NEWA: Newa. - * -UCHAR_SCRIPT_OSAGE: Osage. - * -UCHAR_SCRIPT_TANGUT: Tangut. - * -UCHAR_SCRIPT_MASARAM_GONDI: Masaram Gondi. - * -UCHAR_SCRIPT_NUSHU: Nushu. - * -UCHAR_SCRIPT_SOYOMBO: Soyombo. - * -UCHAR_SCRIPT_ZANABAZAR_SQUARE: Zanabazar Square. - * -UCHAR_SCRIPT_DOGRA: Dogra. - * -UCHAR_SCRIPT_GUNJALA_GONDI: Gunjala Gondi. - * -UCHAR_SCRIPT_HANIFI_ROHINGYA: Hanifi Rohingya. - * -UCHAR_SCRIPT_MAKASAR: Makasar. - * -UCHAR_SCRIPT_MEDEFAIDRIN: Medefaidrin. - * -UCHAR_SCRIPT_OLD_SOGDIAN: Old Sogdian. - * -UCHAR_SCRIPT_SOGDIAN: Sogdian. + * - UCHAR_SCRIPT_KHAROSHTHI: Kharoshthi + * - UCHAR_SCRIPT_UNKNOWN: an unassigned code point + * - UCHAR_SCRIPT_BALINESE: Balinese + * - UCHAR_SCRIPT_CUNEIFORM: Cuneiform + * - UCHAR_SCRIPT_PHOENICIAN: Phoenician + * - UCHAR_SCRIPT_PHAGS_PA: Phags-pa + * - UCHAR_SCRIPT_NKO: N'Ko + * - UCHAR_SCRIPT_KAYAH_LI: Kayah Li. + * - UCHAR_SCRIPT_LEPCHA: Lepcha. + * - UCHAR_SCRIPT_REJANG: Rejang. + * - UCHAR_SCRIPT_SUNDANESE: Sundanese. + * - UCHAR_SCRIPT_SAURASHTRA: Saurashtra. + * - UCHAR_SCRIPT_CHAM: Cham. + * - UCHAR_SCRIPT_OL_CHIKI: Ol Chiki. + * - UCHAR_SCRIPT_VAI: Vai. + * - UCHAR_SCRIPT_CARIAN: Carian. + * - UCHAR_SCRIPT_LYCIAN: Lycian. + * - UCHAR_SCRIPT_LYDIAN: Lydian. + * - UCHAR_SCRIPT_AVESTAN: Avestan. + * - UCHAR_SCRIPT_BAMUM: Bamum. + * - UCHAR_SCRIPT_EGYPTIAN_HIEROGLYPHS: Egyptian Hieroglpyhs. + * - UCHAR_SCRIPT_IMPERIAL_ARAMAIC: Imperial Aramaic. + * - UCHAR_SCRIPT_INSCRIPTIONAL_PAHLAVI: Inscriptional Pahlavi. + * - UCHAR_SCRIPT_INSCRIPTIONAL_PARTHIAN: Inscriptional Parthian. + * - UCHAR_SCRIPT_JAVANESE: Javanese. + * - UCHAR_SCRIPT_KAITHI: Kaithi. + * - UCHAR_SCRIPT_LISU: Lisu. + * - UCHAR_SCRIPT_MEETEI_MAYEK: Meetei Mayek. + * - UCHAR_SCRIPT_OLD_SOUTH_ARABIAN: Old South Arabian. + * - UCHAR_SCRIPT_OLD_TURKIC: Old Turkic. + * - UCHAR_SCRIPT_SAMARITAN: Samaritan. + * - UCHAR_SCRIPT_TAI_THAM: Tai Tham. + * - UCHAR_SCRIPT_TAI_VIET: Tai Viet. + * - UCHAR_SCRIPT_BATAK: Batak. + * - UCHAR_SCRIPT_BRAHMI: Brahmi. + * - UCHAR_SCRIPT_MANDAIC: Mandaic. + * - UCHAR_SCRIPT_CHAKMA: Chakma. + * - UCHAR_SCRIPT_MEROITIC_CURSIVE: Meroitic Cursive. + * - UCHAR_SCRIPT_MEROITIC_HIEROGLYPHS: Meroitic Hieroglyphs. + * - UCHAR_SCRIPT_MIAO: Miao. + * - UCHAR_SCRIPT_SHARADA: Sharada. + * - UCHAR_SCRIPT_SORA_SOMPENG: Sora Sompeng. + * - UCHAR_SCRIPT_TAKRI: Takri. + * - UCHAR_SCRIPT_BASSA_VAH: Bassa. + * - UCHAR_SCRIPT_CAUCASIAN_ALBANIAN: Caucasian Albanian. + * - UCHAR_SCRIPT_DUPLOYAN: Duployan. + * - UCHAR_SCRIPT_ELBASAN: Elbasan. + * - UCHAR_SCRIPT_GRANTHA: Grantha. + * - UCHAR_SCRIPT_KHOJKI: Kjohki. + * - UCHAR_SCRIPT_KHUDAWADI: Khudawadi, Sindhi. + * - UCHAR_SCRIPT_LINEAR_A: Linear A. + * - UCHAR_SCRIPT_MAHAJANI: Mahajani. + * - UCHAR_SCRIPT_MANICHAEAN: Manichaean. + * - UCHAR_SCRIPT_MENDE_KIKAKUI: Mende Kikakui. + * - UCHAR_SCRIPT_MODI: Modi. + * - UCHAR_SCRIPT_MRO: Mro. + * - UCHAR_SCRIPT_NABATAEAN: Nabataean. + * - UCHAR_SCRIPT_OLD_NORTH_ARABIAN: Old North Arabian. + * - UCHAR_SCRIPT_OLD_PERMIC: Old Permic. + * - UCHAR_SCRIPT_PAHAWH_HMONG: Pahawh Hmong. + * - UCHAR_SCRIPT_PALMYRENE: Palmyrene. + * - UCHAR_SCRIPT_PAU_CIN_HAU: Pau Cin Hau. + * - UCHAR_SCRIPT_PSALTER_PAHLAVI: Psalter Pahlavi. + * - UCHAR_SCRIPT_SIDDHAM: Siddham. + * - UCHAR_SCRIPT_TIRHUTA: Tirhuta. + * - UCHAR_SCRIPT_WARANG_CITI: Warang Citi. + * - UCHAR_SCRIPT_AHOM: Ahom. + * - UCHAR_SCRIPT_ANATOLIAN_HIEROGLYPHS: Anatolian Hieroglyphs. + * - UCHAR_SCRIPT_HATRAN: Hatran. + * - UCHAR_SCRIPT_MULTANI: Multani. + * - UCHAR_SCRIPT_OLD_HUNGARIAN: Old Hungarian. + * - UCHAR_SCRIPT_SIGNWRITING: Signwriting. + * - UCHAR_SCRIPT_ADLAM: Adlam. + * - UCHAR_SCRIPT_BHAIKSUKI: Bhaiksuki. + * - UCHAR_SCRIPT_MARCHEN: Marchen. + * - UCHAR_SCRIPT_NEWA: Newa. + * - UCHAR_SCRIPT_OSAGE: Osage. + * - UCHAR_SCRIPT_TANGUT: Tangut. + * - UCHAR_SCRIPT_MASARAM_GONDI: Masaram Gondi. + * - UCHAR_SCRIPT_NUSHU: Nushu. + * - UCHAR_SCRIPT_SOYOMBO: Soyombo. + * - UCHAR_SCRIPT_ZANABAZAR_SQUARE: Zanabazar Square. + * - UCHAR_SCRIPT_DOGRA: Dogra. + * - UCHAR_SCRIPT_GUNJALA_GONDI: Gunjala Gondi. + * - UCHAR_SCRIPT_HANIFI_ROHINGYA: Hanifi Rohingya. + * - UCHAR_SCRIPT_MAKASAR: Makasar. + * - UCHAR_SCRIPT_MEDEFAIDRIN: Medefaidrin. + * - UCHAR_SCRIPT_OLD_SOGDIAN: Old Sogdian. + * - UCHAR_SCRIPT_SOGDIAN: Sogdian. * * This enumeration identifies different writing * systems. The values correspond to the names as defined in the @@ -10638,8 +10638,11 @@ typedef struct _GLYPHPOS { * * \note Only available when support for UNICODE is enabled. * - * \note The LOGFONT object \a logfont should have the rotation be 0° or 180° - * for upright glyphs and 90° or 270° (-90°) for sideways glyphs. + * \note The LOGFONT object \a logfont should have the rotation be 0° + * for upright glyphs and 90° for sideways glyphs. + * + * \note The positions of all glyphs are always with respected to + * the top-left corner of the output rectangle. * * \sa GetGlyphsByRules, DrawGlyphStringEx, GLYPHEXTINFO, glyph_render_flags, white_space_rule */ @@ -10652,28 +10655,30 @@ MG_EXPORT int GUIAPI GetGlyphsExtentPointEx(LOGFONT* logfont, int x, int y, #endif /* _MGCHARSET_UNICODE */ /* - * \fn BOOL GUIAPI DrawGlyphStringEx (HDC hdc, const Glyph32* glyphs, + * \fn int GUIAPI DrawGlyphStringEx (HDC hdc, const Glyph32* glyphs, * int nr_glyphs, const GLYPHPOS* glyph_pos) * \brief Draw a glyph string at the specified positions. * * This function draws a glyph string to the specific positions - * in different orientations on a DC \a hdc. + * on a DC \a hdc. * * \param hdc The device context. * \param glyphs The pointer to the glyph string. * \param nr_glyphs The number of the glyphs should be drawn. * \param glyph_pos The buffer holds the position information - * of every glyph. If it is NULL, the manner of this function - * will be same as \a DrawGlyphString. + * of every glyph. * - * \return TRUE on success, otherwise FALSE. + * \return The number of glyphs really drawn. + * + * \note The positions of all glyphs are always with respected to + * the top-left corner of the output rectangle. * * \note The LOGFONT object selected into the DC \a hdc should * be the same as used by GetGlyphsExtentPointEx. * * \sa GetGlyphsExtentPointEx */ -MG_EXPORT BOOL GUIAPI DrawGlyphStringEx (HDC hdc, const Glyph32* glyphs, +MG_EXPORT int GUIAPI DrawGlyphStringEx (HDC hdc, const Glyph32* glyphs, int nr_glyphs, const GLYPHPOS* glyph_pos); /* diff --git a/src/newgdi/glyph-css.c b/src/newgdi/glyph-css.c index 9aa74f32..132fe21f 100644 --- a/src/newgdi/glyph-css.c +++ b/src/newgdi/glyph-css.c @@ -293,7 +293,8 @@ static int get_next_glyph(struct glyph_break_ctxt* gbctxt, return mclen; } -static UCharBreakType resolve_lbc(struct glyph_break_ctxt* gbctxt, Uchar32 uc) +static UCharBreakType resolve_lbc(struct glyph_break_ctxt* gbctxt, Uchar32 uc, + UCharBasicType* pgc) { UCharBasicType gc = UCharGetType(uc); UCharBreakType bt = UCharGetBreak(uc); @@ -327,7 +328,7 @@ static UCharBreakType resolve_lbc(struct glyph_break_ctxt* gbctxt, Uchar32 uc) case UCHAR_BREAK_COMBINING_MARK: case UCHAR_BREAK_ZERO_WIDTH_JOINER: - if (gbctxt->base_bt != UCHAR_BREAK_UNSET) { + if (gbctxt && gbctxt->base_bt != UCHAR_BREAK_UNSET) { _DBG_PRINTF ("CM as if it has the line breaking class of the base character(%d)\n", gbctxt->base_bt); // CM/ZWJ should have the same break class as // its base character. @@ -339,6 +340,9 @@ static UCharBreakType resolve_lbc(struct glyph_break_ctxt* gbctxt, Uchar32 uc) break; } + if (pgc) + *pgc = gc; + return bt; } @@ -362,7 +366,7 @@ static int collapse_space(struct glyph_break_ctxt* gbctxt, mstr_len -= mclen; cosumed += mclen; - bt = resolve_lbc(gbctxt, uc); + bt = resolve_lbc(gbctxt, uc, NULL); } while (bt == UCHAR_BREAK_SPACE || uc == UCHAR_TAB); return cosumed; @@ -384,7 +388,7 @@ static int check_glyphs_following_zw(struct glyph_break_ctxt* gbctxt, mstr += mclen; mstr_len -= mclen; - if (resolve_lbc(gbctxt, uc) == UCHAR_BREAK_SPACE) { + if (resolve_lbc(gbctxt, uc, NULL) == UCHAR_BREAK_SPACE) { cosumed += mclen; gbctxt_change_bt_last(gbctxt, BOV_NOTALLOWED); gbctxt_push_back(gbctxt, gv, BOV_NOTALLOWED); @@ -409,7 +413,7 @@ static int is_next_glyph_bt(struct glyph_break_ctxt* gbctxt, mclen = get_next_glyph(gbctxt, mstr, mstr_len, gv, uc); - if (mclen > 0 && resolve_lbc(gbctxt, *uc) == bt) + if (mclen > 0 && resolve_lbc(gbctxt, *uc, NULL) == bt) return mclen; return 0; @@ -523,7 +527,7 @@ static int is_next_glyph_hy_or_ba(struct glyph_break_ctxt* gbctxt, mclen = get_next_glyph(gbctxt, mstr, mstr_len, gv, uc); if (mclen > 0) { - UCharBreakType bt = resolve_lbc(gbctxt, *uc); + UCharBreakType bt = resolve_lbc(gbctxt, *uc, NULL); if (bt == UCHAR_BREAK_HYPHEN || bt == UCHAR_BREAK_AFTER) return mclen; @@ -539,7 +543,7 @@ static int is_next_glyph_al_hl(struct glyph_break_ctxt* gbctxt, mclen = get_next_glyph(gbctxt, mstr, mstr_len, gv, uc); if (mclen > 0) { - UCharBreakType bt = resolve_lbc(gbctxt, *uc); + UCharBreakType bt = resolve_lbc(gbctxt, *uc, NULL); if (bt == UCHAR_BREAK_HEBREW_LETTER || bt == UCHAR_BREAK_ALPHABETIC) return mclen; } @@ -554,7 +558,7 @@ static int is_next_glyph_pr_po(struct glyph_break_ctxt* gbctxt, mclen = get_next_glyph(gbctxt, mstr, mstr_len, gv, uc); if (mclen > 0) { - UCharBreakType bt = resolve_lbc(gbctxt, *uc); + UCharBreakType bt = resolve_lbc(gbctxt, *uc, NULL); if (bt == UCHAR_BREAK_PREFIX || bt == UCHAR_BREAK_POSTFIX) return mclen; } @@ -569,7 +573,7 @@ static int is_next_glyph_id_eb_em(struct glyph_break_ctxt* gbctxt, mclen = get_next_glyph(gbctxt, mstr, mstr_len, gv, uc); if (mclen > 0) { - UCharBreakType bt = resolve_lbc(gbctxt, *uc); + UCharBreakType bt = resolve_lbc(gbctxt, *uc, NULL); if (bt == UCHAR_BREAK_IDEOGRAPHIC || bt == UCHAR_BREAK_EMOJI_BASE || bt == UCHAR_BREAK_EMOJI_MODIFIER) @@ -586,7 +590,7 @@ static int is_next_glyph_jl_jv_jt_h2_h3(struct glyph_break_ctxt* gbctxt, mclen = get_next_glyph(gbctxt, mstr, mstr_len, gv, uc); if (mclen > 0) { - UCharBreakType bt = resolve_lbc(gbctxt, *uc); + UCharBreakType bt = resolve_lbc(gbctxt, *uc, NULL); if (bt == UCHAR_BREAK_HANGUL_L_JAMO || bt == UCHAR_BREAK_HANGUL_V_JAMO || bt == UCHAR_BREAK_HANGUL_T_JAMO @@ -605,7 +609,7 @@ static int is_next_glyph_jl_jv_h2_h3(struct glyph_break_ctxt* gbctxt, mclen = get_next_glyph(gbctxt, mstr, mstr_len, gv, uc); if (mclen > 0) { - UCharBreakType bt = resolve_lbc(gbctxt, *uc); + UCharBreakType bt = resolve_lbc(gbctxt, *uc, NULL); if (bt == UCHAR_BREAK_HANGUL_L_JAMO || bt == UCHAR_BREAK_HANGUL_V_JAMO || bt == UCHAR_BREAK_HANGUL_LV_SYLLABLE @@ -623,7 +627,7 @@ static int is_next_glyph_jv_jt(struct glyph_break_ctxt* gbctxt, mclen = get_next_glyph(gbctxt, mstr, mstr_len, gv, uc); if (mclen > 0) { - UCharBreakType bt = resolve_lbc(gbctxt, *uc); + UCharBreakType bt = resolve_lbc(gbctxt, *uc, NULL); if (bt == UCHAR_BREAK_HANGUL_V_JAMO || bt == UCHAR_BREAK_HANGUL_T_JAMO) return mclen; @@ -639,7 +643,7 @@ static int is_next_glyph_al_hl_nu(struct glyph_break_ctxt* gbctxt, mclen = get_next_glyph(gbctxt, mstr, mstr_len, gv, uc); if (mclen > 0) { - UCharBreakType bt = resolve_lbc(gbctxt, *uc); + UCharBreakType bt = resolve_lbc(gbctxt, *uc, NULL); if (bt == UCHAR_BREAK_HEBREW_LETTER || bt == UCHAR_BREAK_ALPHABETIC || bt == UCHAR_BREAK_NUMERIC) @@ -659,7 +663,7 @@ static BOOL is_next_glyph_zw(struct glyph_break_ctxt* gbctxt, mclen = get_next_glyph(gbctxt, mstr, mstr_len, &gv, &uc); - if (mclen > 0 && resolve_lbc(gbctxt, uc) == UCHAR_BREAK_ZERO_WIDTH_SPACE) + if (mclen > 0 && resolve_lbc(gbctxt, uc, NULL) == UCHAR_BREAK_ZERO_WIDTH_SPACE) return TRUE; return FALSE; @@ -718,7 +722,7 @@ static int is_subsequent_sps_and_end_bt(struct glyph_break_ctxt* gbctxt, mclen = get_next_glyph(gbctxt, mstr, mstr_len, &gv, &uc); if (mclen > 0) { - UCharBreakType bt = resolve_lbc(gbctxt, uc); + UCharBreakType bt = resolve_lbc(gbctxt, uc, NULL); if (bt == UCHAR_BREAK_SPACE) { mstr += mclen; mstr_len -= mclen; @@ -746,7 +750,7 @@ static int check_subsequent_sps_and_end_bt(struct glyph_break_ctxt* gbctxt, while (mstr_len > 0 && *mstr != '\0') { mclen = get_next_glyph(gbctxt, mstr, mstr_len, &gv, &uc); if (mclen > 0) { - UCharBreakType bt = resolve_lbc(gbctxt, uc); + UCharBreakType bt = resolve_lbc(gbctxt, uc, NULL); _DBG_PRINTF("%s: %04X (%d)\n", __FUNCTION__, uc, bt); if (bt == UCHAR_BREAK_SPACE) { mstr += mclen; @@ -781,7 +785,7 @@ static BOOL is_odd_nubmer_of_subsequent_ri(struct glyph_break_ctxt* gbctxt, mstr += mclen; mstr_len -= mclen; - if (mclen > 0 && resolve_lbc(gbctxt, uc) + if (mclen > 0 && resolve_lbc(gbctxt, uc, NULL) == UCHAR_BREAK_REGIONAL_INDICATOR) { nr++; continue; @@ -810,7 +814,7 @@ static BOOL is_even_nubmer_of_subsequent_ri(struct glyph_break_ctxt* gbctxt, mstr += mclen; mstr_len -= mclen; - if (mclen > 0 && resolve_lbc(gbctxt, uc) + if (mclen > 0 && resolve_lbc(gbctxt, uc, NULL) == UCHAR_BREAK_REGIONAL_INDICATOR) { nr++; continue; @@ -835,7 +839,7 @@ static int check_subsequent_ri(struct glyph_break_ctxt* gbctxt, while (mstr_len > 0 && *mstr != '\0') { mclen = get_next_glyph(gbctxt, mstr, mstr_len, &gv, &uc); - if (mclen > 0 && resolve_lbc(gbctxt, uc) + if (mclen > 0 && resolve_lbc(gbctxt, uc, NULL) == UCHAR_BREAK_REGIONAL_INDICATOR) { mstr += mclen; mstr_len -= mclen; @@ -927,7 +931,7 @@ int GUIAPI GetGlyphsByRules(LOGFONT* logfont, const char* mstr, int mstr_len, // LB1 Resolve line breaking class gbctxt.curr_od = LB1; - bt = resolve_lbc(&gbctxt, uc); + bt = resolve_lbc(&gbctxt, uc, NULL); /* Start and end of text */ // LB2 Never break at the start of text. @@ -1734,20 +1738,347 @@ error: return 0; } -int GUIAPI GetGlyphsExtentPointEx(LOGFONT* logfont, int x, int y, - const Glyph32* glyphs, const Uint8* break_oppos, int nr_glyphs, - Uint32 reander_flags, Uint32 space_rule, - int letter_spacing, int word_spacing, int tab_size, int max_extent, - SIZE* line_size, GLYPHEXTINFO* glyph_ext_info, GLYPHPOS* glyph_pos) +static int font_get_glyph_metrics (LOGFONT* logfont, DEVFONT* devfont, + Glyph32 rg, int* adv_x, int* adv_y, BBOX* bbox) +{ + int bold = 0; + int tmp_x = 0; + int tmp_y = 0; + int bbox_x = 0, bbox_y = 0; + int bbox_w = 0, bbox_h = 0; + int gbt; + + gbt = devfont->font_ops->get_glyph_bmptype (logfont, devfont) + & DEVFONTGLYPHTYPE_MASK_BMPTYPE; + + devfont->font_ops->get_glyph_bbox (logfont, devfont, + rg, &bbox_x, &bbox_y, &bbox_w, &bbox_h); + + if ((logfont->style & FS_WEIGHT_MASK) > FS_WEIGHT_MEDIUM + && (devfont->style & FS_WEIGHT_MASK) < FS_WEIGHT_DEMIBOLD + && (gbt == DEVFONTGLYPHTYPE_MONOBMP)) { + bold = GET_DEVFONT_SCALE (logfont, devfont); + bbox_w += bold; + } + + if (bbox) { + bbox->x = bbox_x; + bbox->y = bbox_y; + bbox->w = bbox_w; + bbox->h = bbox_h; + } + + devfont->font_ops->get_glyph_advance (logfont, devfont, rg, &tmp_x, &tmp_y); + + tmp_x += bold; + if (gbt == DEVFONTGLYPHTYPE_MONOBMP) { + if ((logfont->style & FS_RENDER_MASK) == FS_RENDER_GREY || + (logfont->style & FS_DECORATE_OUTLINE)) { + tmp_x += 1; + } + } + + if (adv_x) *adv_x = tmp_x; + if (adv_y) *adv_y = tmp_y; + + return 0; +} + +#define IS_UPRIGHT(rf) \ + ((render_flags & GRF_TEXT_ORIENTATION_MASK) == GRF_TEXT_ORIENTATION_UPRIGHT) +#define IS_SIDEWAYS(rf) \ + ((render_flags & GRF_TEXT_ORIENTATION_MASK) == GRF_TEXT_ORIENTATION_SIDEWAYS) + +static int normalize_advance(Uint32 render_flags, int* adv_x, int* adv_y) +{ + int line_adv; + int dir = 1; + + if ((render_flags & GRF_DIRECTION_MASK) == GRF_DIRECTION_RTL) + dir = -1; + + switch (render_flags & GRF_WRITING_MODE_MASK) { + case GRF_WRITING_MODE_VERTICAL_RL: + if (IS_SIDEWAYS(render_flags)) { + } + else { + int tmp; + tmp = *adv_x; + *adv_x = *adv_y; + *adv_y = tmp; + } + line_adv = *adv_y; + *adv_y *= dir; + break; + + case GRF_WRITING_MODE_VERTICAL_LR: + if (IS_SIDEWAYS(render_flags)) { + } + else { + int tmp; + tmp = *adv_x; + *adv_x = *adv_y; + *adv_y = tmp; + } + line_adv = *adv_y; + *adv_y *= dir; + break; + + case GRF_WRITING_MODE_HORIZONTAL_TB: + default: + if (IS_SIDEWAYS(render_flags)) { + int tmp; + tmp = *adv_x; + *adv_x = *adv_y; + *adv_y = tmp; + } + else { + } + line_adv = *adv_x; + *adv_x *= dir; + break; + } + + return line_adv; +} + +static void advance_extra_spacing(Uint32 render_flags, int extra_spacing, + int* adv_x, int *adv_y) +{ + int dir = 1; + + if ((render_flags & GRF_DIRECTION_MASK) == GRF_DIRECTION_RTL) + dir = -1; + + switch (render_flags & GRF_WRITING_MODE_MASK) { + case GRF_WRITING_MODE_VERTICAL_RL: + if (IS_SIDEWAYS(render_flags)) { + } + else { + *adv_y += dir * extra_spacing; + } + break; + + case GRF_WRITING_MODE_VERTICAL_LR: + if (IS_SIDEWAYS(render_flags)) { + } + else { + *adv_y += dir * extra_spacing; + } + break; + + case GRF_WRITING_MODE_HORIZONTAL_TB: + default: + if (IS_SIDEWAYS(render_flags)) { + *adv_x += dir * extra_spacing; + } + else { + } + break; + } +} + +static int find_breaking_pos_any(const Glyph32* glyphs, + const Uint8* break_oppos, int n, Uint32 rf) { return 0; } -#endif /* _MGCHARSET_UNICODE */ - -BOOL GUIAPI DrawGlyphStringEx(HDC hdc, const Glyph32* glyphs, int nr_glyphs, - const GLYPHPOS* glyph_pos) +static int find_breaking_pos_word(const Glyph32* glyphs, + const Uint8* break_oppos, int n, Uint32 rf) { - return TRUE; + return 0; +} + +static int find_breaking_pos_normal(const Glyph32* glyphs, + const Uint8* break_oppos, int n, Uint32 rf) +{ + return 0; +} + +int GUIAPI GetGlyphsExtentPointEx(LOGFONT* logfont, int x, int y, + const Glyph32* glyphs, const Uint8* break_oppos, int nr_glyphs, + Uint32 render_flags, Uint32 space_rule, + int letter_spacing, int word_spacing, int tab_size, int max_extent, + SIZE* line_size, GLYPHEXTINFO* glyph_ext_info, GLYPHPOS* glyph_pos) +{ + int n = 0; + int total_extent = 0; + int nr_letter_spaces = 0; + int nr_word_spaces = 0; + int breaking_pos = -1; + + if (line_size) { + line_size->cx = 0; + line_size->cy = 0; + } + + /* check the rotation of the logfont is compatible with render flags */ + switch (render_flags & GRF_TEXT_ORIENTATION_MASK) { + case GRF_TEXT_ORIENTATION_UPRIGHT: + if (logfont->rotation != 0) + return 0; + break; + case GRF_TEXT_ORIENTATION_SIDEWAYS: + if (logfont->rotation != 900) + return 0; + break; + default: + return 0; + } + + /* Cases of no text wrapping */ + if (space_rule == WSR_PRE || space_rule == WSR_NOWRAP) { + max_extent = -1; + } + + while (n < nr_glyphs) { + DEVFONT* devfont; + Glyph32 gv; + Uchar32 uc; + UCharBasicType gc; + UCharBreakType bt; + + BBOX bbox; + int adv_x, adv_y; + int line_adv; + + gv = glyphs[n]; + uc = GLYPH2UCHAR(gv); + bt = resolve_lbc(NULL, uc, &gc); + + if (uc == UCHAR_TAB) { + bbox.x = 0; bbox.y = 0; + bbox.w = 0; bbox.h = 0; + adv_x = 0; adv_y = 0; + line_adv = tab_size; + } + else if (bt == UCHAR_BREAK_ZERO_WIDTH_SPACE + || bt == UCHAR_BREAK_ZERO_WIDTH_JOINER) { + bbox.x = 0; bbox.y = 0; + bbox.w = 0; bbox.h = 0; + adv_x = 0; adv_y = 0; + line_adv = 0; + } + else { + devfont = SELECT_DEVFONT(logfont, gv); + font_get_glyph_metrics (logfont, devfont, REAL_GLYPH(gv), + &adv_x, &adv_y, &bbox); + + line_adv = normalize_advance(render_flags, &adv_x, &adv_y); + } + + if (glyph_ext_info) { + glyph_ext_info[n].bbox_x = bbox.x; + glyph_ext_info[n].bbox_y = bbox.y; + glyph_ext_info[n].bbox_w = bbox.w; + glyph_ext_info[n].bbox_h = bbox.h; + glyph_ext_info[n].advance_x = adv_x; + glyph_ext_info[n].advance_y = adv_y; + } + + if (n > 0 && break_oppos[n+1] == BOV_MANDATORY) { + n++; + // hard line breaking + break; + } + + if (max_extent > 0 && (total_extent + line_adv) > max_extent) { + // overflow + switch (render_flags & GRF_OVERFLOW_WRAP_MASK) { + case GRF_OVERFLOW_WRAP_BREAK_WORD: + breaking_pos = find_breaking_pos_word(glyphs, break_oppos, + n, render_flags); + break; + case GRF_OVERFLOW_WRAP_ANYWHERE: + breaking_pos = find_breaking_pos_any(glyphs, break_oppos, + n, render_flags); + break; + case GRF_OVERFLOW_WRAP_NORMAL: + default: + breaking_pos = find_breaking_pos_normal(glyphs, break_oppos, + n, render_flags); + break; + } + + break; + } + + if ((render_flags & GRF_ALIGN_MASK) != GRF_ALIGN_JUSTIFY) { + int extra_spacing = 0; + // extra space for word and letter + if (uc == UCHAR_SPACE) { + extra_spacing = word_spacing; + } + else if (gc != UCHAR_TYPE_FORMAT) { + extra_spacing = letter_spacing; + } + + line_adv += extra_spacing; + advance_extra_spacing(render_flags, extra_spacing, &adv_x, &adv_y); + } + else { + if (uc == UCHAR_SPACE) { + nr_word_spaces++; + } + else if (gc != UCHAR_TYPE_FORMAT) { + nr_letter_spaces++; + } + } + + total_extent += line_adv; + + if (glyph_pos) { + if (n == 0) { + glyph_pos[n].x = x; + glyph_pos[n].y = y; + } + else { + glyph_pos[n].x = glyph_pos[n - 1].x + adv_x; + glyph_pos[n].y = glyph_pos[n - 1].y + adv_y; + } + + if (adv_x == 0 && adv_y == 0) { + glyph_pos[n].suppressed = 1; + } + } + + if (line_size) { + line_size->cx += adv_x; + line_size->cy += adv_y; + } + + n++; + } + + if (breaking_pos != -1 && breaking_pos != n) { + // wrapped due to overflow + } + + if ((render_flags & GRF_ALIGN_MASK) == GRF_ALIGN_JUSTIFY) { + } + + return n; +} + +#endif /* _MGCHARSET_UNICODE */ + +int GUIAPI DrawGlyphStringEx(HDC hdc, const Glyph32* glyphs, int nr_glyphs, + const GLYPHPOS* glyph_pos) +{ + int i; + int n = 0; + + if (glyph_pos) { + for (i = 0; i < nr_glyphs; i++) { + if (glyph_pos[i].suppressed == 0) { + DrawGlyph(hdc, glyph_pos[i].x, glyph_pos[i].y, glyphs[i], + NULL, NULL); + n++; + } + } + } + + return n; }