Merge pull request #3063 from harfbuzz/arabic-pua

Arabic PUA shaping
This commit is contained in:
Behdad Esfahbod 2022-06-19 11:05:17 -06:00 committed by GitHub
commit abc0685749
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 1197 additions and 72 deletions

250
src/ArabicPUA1.txt Normal file
View File

@ -0,0 +1,250 @@
#
# Name: Legacy Simplified Arabic encoding
#
# Format: Three tab-separated columns
# Column #1 is the PUA code (in hex as 0xXXXX)
# Column #2 is the Unicode (in hex as 0xXXXX)
# Column #3 is the Unicode name (follows a comment sign, '#')
#
# The entries are in PUA order
#
0xF100 0x063B # ARABIC LETTER KEHEH WITH TWO DOTS ABOVE
0xF100 0x063C # ARABIC LETTER KEHEH WITH THREE DOTS BELOW
0xF100 0x063D # ARABIC LETTER FARSI YEH WITH INVERTED V
0xF100 0x063E # ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE
0xF100 0x063F # ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE
0xF100 0x0653 # ARABIC MADDAH ABOVE
0xF100 0x0654 # ARABIC HAMZA ABOVE
0xF100 0x0655 # ARABIC HAMZA BELOW
0xF100 0x0656 # ARABIC SUBSCRIPT ALEF
0xF100 0x0657 # ARABIC INVERTED DAMMA
0xF100 0x0658 # ARABIC MARK NOON GHUNNA
0xF100 0x0659 # ARABIC ZWARAKAY
0xF100 0x065A # ARABIC VOWEL SIGN SMALL V ABOVE
0xF100 0x065B # ARABIC VOWEL SIGN INVERTED SMALL V ABOVE
0xF100 0x065C # ARABIC VOWEL SIGN DOT BELOW
0xF100 0x065D # ARABIC REVERSED DAMMA
0xF100 0x065E # ARABIC FATHA WITH TWO DOTS
0xF10C 0x200C # ZERO WIDTH NON-JOINER
0xF10D 0x200D # ZERO WIDTH JOINER
0xF10E 0x200E # LEFT-TO-RIGHT MARK
0xF10F 0x200F # RIGHT-TO-LEFT MARK
0xF120 0x0020 # SPACE
0xF121 0x0021 # EXCLAMATION MARK
0xF122 0x0022 # QUOTATION MARK
0xF123 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xF124 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xF125 0x0025 # PERCENT SIGN
0xF126 0x00D7 # MULTIPLICATION SIGN
0xF127 0x00F7 # DIVISION SIGN
0xF128 0x0028 # LEFT PARENTHESIS
0xF129 0x0029 # RIGHT PARENTHESIS
0xF12A 0x002A # ASTERISK
0xF12B 0x002B # PLUS SIGN
0xF12C 0x060C # ARABIC COMMA
0xF12D 0x002D # HYPHEN-MINUS
0xF12E 0x002E # FULL STOP
0xF12F 0x002F # SOLIDUS
0xF130 0x0660 # ARABIC-INDIC DIGIT ZERO
0xF131 0x0661 # ARABIC-INDIC DIGIT ONE
0xF132 0x0662 # ARABIC-INDIC DIGIT TWO
0xF133 0x0663 # ARABIC-INDIC DIGIT THREE
0xF134 0x0664 # ARABIC-INDIC DIGIT FOUR
0xF135 0x0665 # ARABIC-INDIC DIGIT FIVE
0xF136 0x0666 # ARABIC-INDIC DIGIT SIX
0xF137 0x0667 # ARABIC-INDIC DIGIT SEVEN
0xF138 0x0668 # ARABIC-INDIC DIGIT EIGHT
0xF139 0x0669 # ARABIC-INDIC DIGIT NINE
0xF13A 0x003A # COLON
0xF13B 0x003B # SEMICOLON
0xF13B 0x061B # ARABIC SEMICOLON
0xF13C 0x2018 # LEFT SINGLE QUOTATION MARK
0xF13D 0x003D # EQUALS SIGN
0xF13E 0x2019 # RIGHT SINGLE QUOTATION MARK
0xF13F 0x003F # QUESTION MARK
0xF13F 0x061F # ARABIC QUESTION MARK
0xF141 0x0627 # ARABIC LETTER ALEF
0xF141 0xFE8D # ARABIC LETTER ALEF ISOLATED FORM
0xF142 0xFE8E # ARABIC LETTER ALEF FINAL FORM
0xF143 0x0623 # ARABIC LETTER ALEF WITH HAMZA ABOVE
0xF143 0xFE83 # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM
0xF144 0xFE84 # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM
0xF145 0x0622 # ARABIC LETTER ALEF WITH MADDA ABOVE
0xF145 0xFE81 # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM
0xF146 0xFE82 # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM
0xF147 0x0625 # ARABIC LETTER ALEF WITH HAMZA BELOW
0xF147 0xFE87 # ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM
0xF148 0xFE88 # ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM
0xF149 0xFE91 # ARABIC LETTER BEH INITIAL FORM
0xF149 0xFE92 # ARABIC LETTER BEH MEDIAL FORM
0xF14A 0x0628 # ARABIC LETTER BEH
0xF14A 0xFE8F # ARABIC LETTER BEH ISOLATED FORM
0xF14A 0xFE90 # ARABIC LETTER BEH FINAL FORM
0xF14B 0xFE97 # ARABIC LETTER TEH INITIAL FORM
0xF14B 0xFE98 # ARABIC LETTER TEH MEDIAL FORM
0xF14C 0x062A # ARABIC LETTER TEH
0xF14C 0xFE95 # ARABIC LETTER TEH ISOLATED FORM
0xF14C 0xFE96 # ARABIC LETTER TEH FINAL FORM
0xF14D 0xFE9B # ARABIC LETTER THEH INITIAL FORM
0xF14D 0xFE9C # ARABIC LETTER THEH MEDIAL FORM
0xF14E 0x062B # ARABIC LETTER THEH
0xF14E 0xFE99 # ARABIC LETTER THEH ISOLATED FORM
0xF14E 0xFE9A # ARABIC LETTER THEH FINAL FORM
0xF14F 0xFE9F # ARABIC LETTER JEEM INITIAL FORM
0xF14F 0xFEA0 # ARABIC LETTER JEEM MEDIAL FORM
0xF150 0xFE9E # ARABIC LETTER JEEM FINAL FORM
0xF151 0x062C # ARABIC LETTER JEEM
0xF151 0xFE9D # ARABIC LETTER JEEM ISOLATED FORM
0xF152 0xFEA3 # ARABIC LETTER HAH INITIAL FORM
0xF152 0xFEA4 # ARABIC LETTER HAH MEDIAL FORM
0xF153 0xFEA2 # ARABIC LETTER HAH FINAL FORM
0xF154 0x062D # ARABIC LETTER HAH
0xF154 0xFEA1 # ARABIC LETTER HAH ISOLATED FORM
0xF155 0xFEA7 # ARABIC LETTER KHAH INITIAL FORM
0xF155 0xFEA8 # ARABIC LETTER KHAH MEDIAL FORM
0xF156 0xFEA6 # ARABIC LETTER KHAH FINAL FORM
0xF157 0x062E # ARABIC LETTER KHAH
0xF157 0xFEA5 # ARABIC LETTER KHAH ISOLATED FORM
0xF158 0x062F # ARABIC LETTER DAL
0xF158 0xFEA9 # ARABIC LETTER DAL ISOLATED FORM
0xF158 0xFEAA # ARABIC LETTER DAL FINAL FORM
0xF159 0x0630 # ARABIC LETTER THAL
0xF159 0xFEAB # ARABIC LETTER THAL ISOLATED FORM
0xF159 0xFEAC # ARABIC LETTER THAL FINAL FORM
0xF15A 0x0631 # ARABIC LETTER REH
0xF15A 0xFEAD # ARABIC LETTER REH ISOLATED FORM
0xF15A 0xFEAE # ARABIC LETTER REH FINAL FORM
0xF15B 0x005B # LEFT SQUARE BRACKET
0xF15C 0x005C # REVERSE SOLIDUS
0xF15D 0x005D # RIGHT SQUARE BRACKET
0xF15E 0x002C # COMMA
0xF15E 0x066B # ARABIC DECIMAL SEPARATOR
0xF15E 0x066C # ARABIC THOUSANDS SEPARATOR
0xF15F 0x0640 # ARABIC TATWEEL
0xF160 0x0632 # ARABIC LETTER ZAIN
0xF160 0xFEAF # ARABIC LETTER ZAIN ISOLATED FORM
0xF160 0xFEB0 # ARABIC LETTER ZAIN FINAL FORM
0xF161 0xFEB3 # ARABIC LETTER SEEN INITIAL FORM
0xF161 0xFEB4 # ARABIC LETTER SEEN MEDIAL FORM
0xF162 0x0633 # ARABIC LETTER SEEN
0xF162 0xFEB1 # ARABIC LETTER SEEN ISOLATED FORM
0xF162 0xFEB2 # ARABIC LETTER SEEN FINAL FORM
0xF163 0xFEB7 # ARABIC LETTER SHEEN INITIAL FORM
0xF163 0xFEB8 # ARABIC LETTER SHEEN MEDIAL FORM
0xF164 0x0634 # ARABIC LETTER SHEEN
0xF164 0xFEB5 # ARABIC LETTER SHEEN ISOLATED FORM
0xF164 0xFEB6 # ARABIC LETTER SHEEN FINAL FORM
0xF165 0xFEBB # ARABIC LETTER SAD INITIAL FORM
0xF165 0xFEBC # ARABIC LETTER SAD MEDIAL FORM
0xF166 0x0635 # ARABIC LETTER SAD
0xF166 0xFEB9 # ARABIC LETTER SAD ISOLATED FORM
0xF166 0xFEBA # ARABIC LETTER SAD FINAL FORM
0xF167 0xFEBF # ARABIC LETTER DAD INITIAL FORM
0xF167 0xFEC0 # ARABIC LETTER DAD MEDIAL FORM
0xF168 0x0636 # ARABIC LETTER DAD
0xF168 0xFEBD # ARABIC LETTER DAD ISOLATED FORM
0xF168 0xFEBE # ARABIC LETTER DAD FINAL FORM
0xF169 0x0637 # ARABIC LETTER TAH
0xF169 0xFEC1 # ARABIC LETTER TAH ISOLATED FORM
0xF169 0xFEC2 # ARABIC LETTER TAH FINAL FORM
0xF169 0xFEC3 # ARABIC LETTER TAH INITIAL FORM
0xF169 0xFEC4 # ARABIC LETTER TAH MEDIAL FORM
0xF16A 0x0638 # ARABIC LETTER ZAH
0xF16A 0xFEC5 # ARABIC LETTER ZAH ISOLATED FORM
0xF16A 0xFEC6 # ARABIC LETTER ZAH FINAL FORM
0xF16A 0xFEC7 # ARABIC LETTER ZAH INITIAL FORM
0xF16A 0xFEC8 # ARABIC LETTER ZAH MEDIAL FORM
0xF16B 0xFECB # ARABIC LETTER AIN INITIAL FORM
0xF16C 0xFECC # ARABIC LETTER AIN MEDIAL FORM
0xF16D 0xFECA # ARABIC LETTER AIN FINAL FORM
0xF16E 0x0639 # ARABIC LETTER AIN
0xF16E 0xFEC9 # ARABIC LETTER AIN ISOLATED FORM
0xF16F 0xFECF # ARABIC LETTER GHAIN INITIAL FORM
0xF170 0xFED0 # ARABIC LETTER GHAIN MEDIAL FORM
0xF171 0xFECE # ARABIC LETTER GHAIN FINAL FORM
0xF172 0x063A # ARABIC LETTER GHAIN
0xF172 0xFECD # ARABIC LETTER GHAIN ISOLATED FORM
0xF173 0xFED3 # ARABIC LETTER FEH INITIAL FORM
0xF174 0xFED4 # ARABIC LETTER FEH MEDIAL FORM
0xF175 0x0641 # ARABIC LETTER FEH
0xF175 0xFED1 # ARABIC LETTER FEH ISOLATED FORM
0xF175 0xFED2 # ARABIC LETTER FEH FINAL FORM
0xF176 0xFED7 # ARABIC LETTER QAF INITIAL FORM
0xF177 0xFED8 # ARABIC LETTER QAF MEDIAL FORM
0xF178 0x0642 # ARABIC LETTER QAF
0xF178 0xFED5 # ARABIC LETTER QAF ISOLATED FORM
0xF178 0xFED6 # ARABIC LETTER QAF FINAL FORM
0xF179 0xFEDB # ARABIC LETTER KAF INITIAL FORM
0xF179 0xFEDC # ARABIC LETTER KAF MEDIAL FORM
0xF17A 0x0643 # ARABIC LETTER KAF
0xF17A 0xFED9 # ARABIC LETTER KAF ISOLATED FORM
0xF17A 0xFEDA # ARABIC LETTER KAF FINAL FORM
0xF17B 0xFEDF # ARABIC LETTER LAM INITIAL FORM
0xF17B 0xFEE0 # ARABIC LETTER LAM MEDIAL FORM
0xF17C 0x0644 # ARABIC LETTER LAM
0xF17C 0xFEDD # ARABIC LETTER LAM ISOLATED FORM
0xF17C 0xFEDE # ARABIC LETTER LAM FINAL FORM
0xF17D 0xFEE3 # ARABIC LETTER MEEM INITIAL FORM
0xF17D 0xFEE4 # ARABIC LETTER MEEM MEDIAL FORM
0xF17E 0x0645 # ARABIC LETTER MEEM
0xF17E 0xFEE1 # ARABIC LETTER MEEM ISOLATED FORM
0xF17E 0xFEE2 # ARABIC LETTER MEEM FINAL FORM
0xF17F 0xFEE7 # ARABIC LETTER NOON INITIAL FORM
0xF17F 0xFEE8 # ARABIC LETTER NOON MEDIAL FORM
0xF1A1 0xFEEB # ARABIC LETTER HEH INITIAL FORM
0xF1A2 0xFEEC # ARABIC LETTER HEH MEDIAL FORM
0xF1A3 0xFEEA # ARABIC LETTER HEH FINAL FORM
0xF1A4 0x0647 # ARABIC LETTER HEH
0xF1A4 0xFEE9 # ARABIC LETTER HEH ISOLATED FORM
0xF1A5 0x0648 # ARABIC LETTER WAW
0xF1A5 0xFEED # ARABIC LETTER WAW ISOLATED FORM
0xF1A5 0xFEEE # ARABIC LETTER WAW FINAL FORM
0xF1A6 0xFEF3 # ARABIC LETTER YEH INITIAL FORM
0xF1A6 0xFEF4 # ARABIC LETTER YEH MEDIAL FORM
0xF1A7 0xFEF2 # ARABIC LETTER YEH FINAL FORM
0xF1A8 0x064A # ARABIC LETTER YEH
0xF1A8 0xFEF1 # ARABIC LETTER YEH ISOLATED FORM
0xF1A9 0x0629 # ARABIC LETTER TEH MARBUTA
0xF1A9 0xFE93 # ARABIC LETTER TEH MARBUTA ISOLATED FORM
0xF1AA 0xFE94 # ARABIC LETTER TEH MARBUTA FINAL FORM
0xF1AB 0xFEF0 # ARABIC LETTER ALEF MAKSURA FINAL FORM
0xF1AC 0x0649 # ARABIC LETTER ALEF MAKSURA
0xF1AC 0xFEEF # ARABIC LETTER ALEF MAKSURA ISOLATED FORM
0xF1AD 0x0621 # ARABIC LETTER HAMZA
0xF1AE 0xFE8B # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM
0xF1AE 0xFE8C # ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM
0xF1AF 0xFE8A # ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM
0xF1B0 0x0030 # DIGIT ZERO
0xF1B1 0x0031 # DIGIT ONE
0xF1B2 0x0032 # DIGIT TWO
0xF1B3 0x0033 # DIGIT THREE
0xF1B4 0x0034 # DIGIT FOUR
0xF1B5 0x0035 # DIGIT FIVE
0xF1B6 0x0036 # DIGIT SIX
0xF1B7 0x0037 # DIGIT SEVEN
0xF1B8 0x0038 # DIGIT EIGHT
0xF1B9 0x0039 # DIGIT NINE
0xF1BA 0x0626 # ARABIC LETTER YEH WITH HAMZA ABOVE
0xF1BA 0xFE89 # ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM
0xF1BB 0x0624 # ARABIC LETTER WAW WITH HAMZA ABOVE
0xF1BB 0xFE85 # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM
0xF1BB 0xFE86 # ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM
0xF1BC 0xFEFC # ARABIC LIGATURE LAM WITH ALEF FINAL FORM
0xF1BD 0xFEFB # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
0xF1BE 0xFEF7 # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM
0xF1BF 0xFEF8 # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM
0xF1C0 0xFEF5 # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
0xF1C1 0xFEF6 # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM
0xF1C2 0xFEF9 # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM
0xF1C3 0xFEFA # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM
0xF1C4 0x064E # ARABIC FATHA
0xF1C5 0x064F # ARABIC DAMMA
0xF1C6 0x0652 # ARABIC SUKUN
0xF1C7 0x064B # ARABIC FATHATAN
0xF1C8 0x064C # ARABIC DAMMATAN
0xF1C9 0x0651 # ARABIC SHADDA
0xF1CA 0x0650 # ARABIC KASRA
0xF1CB 0x064D # ARABIC KASRATAN
0xF1E1 0x0646 # ARABIC LETTER NOON
0xF1E1 0xFEE5 # ARABIC LETTER NOON ISOLATED FORM
0xF1E1 0xFEE6 # ARABIC LETTER NOON FINAL FORM

295
src/ArabicPUA2.txt Normal file
View File

@ -0,0 +1,295 @@
#
# Name: Legacy Traditional Arabic encoding
#
# Format: Three tab-separated columns
# Column #1 is the PUA code (in hex as 0xXXXX)
# Column #2 is the Unicode (in hex as 0xXXXX)
# Column #3 is the Unicode name (follows a comment sign, '#')
#
# The entries are in PUA order
#
0xF200 0x063B # ARABIC LETTER KEHEH WITH TWO DOTS ABOVE
0xF200 0x063C # ARABIC LETTER KEHEH WITH THREE DOTS BELOW
0xF200 0x063D # ARABIC LETTER FARSI YEH WITH INVERTED V
0xF200 0x063E # ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE
0xF200 0x063F # ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE
0xF200 0x0653 # ARABIC MADDAH ABOVE
0xF200 0x0654 # ARABIC HAMZA ABOVE
0xF200 0x0655 # ARABIC HAMZA BELOW
0xF200 0x0656 # ARABIC SUBSCRIPT ALEF
0xF200 0x0657 # ARABIC INVERTED DAMMA
0xF200 0x0658 # ARABIC MARK NOON GHUNNA
0xF200 0x0659 # ARABIC ZWARAKAY
0xF200 0x065A # ARABIC VOWEL SIGN SMALL V ABOVE
0xF200 0x065B # ARABIC VOWEL SIGN INVERTED SMALL V ABOVE
0xF200 0x065C # ARABIC VOWEL SIGN DOT BELOW
0xF200 0x065D # ARABIC REVERSED DAMMA
0xF200 0x065E # ARABIC FATHA WITH TWO DOTS
0xF202 0xFC08 # ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM
0xF203 0xFC0E # ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM
0xF204 0xFC12 # ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM
0xF205 0xFC42 # ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM
0xF206 0xFC4E # ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM
0xF20C 0x200C # ZERO WIDTH NON-JOINER
0xF20D 0x200D # ZERO WIDTH JOINER
0xF20E 0x200E # LEFT-TO-RIGHT MARK
0xF20F 0x200F # RIGHT-TO-LEFT MARK
0xF210 0xFD88 # ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM
0xF212 0xFC3F # ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM
0xF213 0xFC40 # ARABIC LIGATURE LAM WITH HAH ISOLATED FORM
0xF214 0xFC41 # ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM
0xF215 0xFC6A # ARABIC LIGATURE BEH WITH REH FINAL FORM
0xF216 0xFC70 # ARABIC LIGATURE TEH WITH REH FINAL FORM
0xF217 0xFC91 # ARABIC LIGATURE YEH WITH REH FINAL FORM
0xF218 0xFCB0 # ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM
0xF219 0xFD30 # ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM
0xF21A 0xFCCD # ARABIC LIGATURE LAM WITH HEH INITIAL FORM
0xF21C 0xFC44 # ARABIC LIGATURE LAM WITH YEH ISOLATED FORM
0xF21D 0xFC0A # ARABIC LIGATURE BEH WITH YEH ISOLATED FORM
0xF21E 0xFC10 # ARABIC LIGATURE TEH WITH YEH ISOLATED FORM
0xF21F 0xFC50 # ARABIC LIGATURE NOON WITH YEH ISOLATED FORM
0xF220 0x0020 # SPACE
0xF221 0x0021 # EXCLAMATION MARK
0xF222 0x0022 # QUOTATION MARK
0xF223 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xF224 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xF225 0x0025 # PERCENT SIGN
0xF226 0x00D7 # MULTIPLICATION SIGN
0xF227 0x00F7 # DIVISION SIGN
0xF228 0x0028 # LEFT PARENTHESIS
0xF229 0x0029 # RIGHT PARENTHESIS
0xF22A 0x002A # ASTERISK
0xF22B 0x002B # PLUS SIGN
0xF22C 0x060C # ARABIC COMMA
0xF22D 0x002D # HYPHEN-MINUS
0xF22E 0x002E # FULL STOP
0xF22F 0x002F # SOLIDUS
0xF230 0x0660 # ARABIC-INDIC DIGIT ZERO
0xF231 0x0661 # ARABIC-INDIC DIGIT ONE
0xF232 0x0662 # ARABIC-INDIC DIGIT TWO
0xF233 0x0663 # ARABIC-INDIC DIGIT THREE
0xF234 0x0664 # ARABIC-INDIC DIGIT FOUR
0xF235 0x0665 # ARABIC-INDIC DIGIT FIVE
0xF236 0x0666 # ARABIC-INDIC DIGIT SIX
0xF237 0x0667 # ARABIC-INDIC DIGIT SEVEN
0xF238 0x0668 # ARABIC-INDIC DIGIT EIGHT
0xF239 0x0669 # ARABIC-INDIC DIGIT NINE
0xF23A 0x003A # COLON
0xF23B 0x003B # SEMICOLON
0xF23B 0x061B # ARABIC SEMICOLON
0xF23C 0x201C # LEFT DOUBLE QUOTATION MARK
0xF23D 0x003D # EQUALS SIGN
0xF23E 0x201D # RIGHT DOUBLE QUOTATION MARK
0xF23F 0x003F # QUESTION MARK
0xF23F 0x061F # ARABIC QUESTION MARK
0xF241 0x0627 # ARABIC LETTER ALEF
0xF241 0xFE8D # ARABIC LETTER ALEF ISOLATED FORM
0xF242 0xFE8E # ARABIC LETTER ALEF FINAL FORM
0xF243 0x0623 # ARABIC LETTER ALEF WITH HAMZA ABOVE
0xF243 0xFE83 # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM
0xF244 0xFE84 # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM
0xF245 0x0622 # ARABIC LETTER ALEF WITH MADDA ABOVE
0xF245 0xFE81 # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM
0xF246 0xFE82 # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM
0xF247 0x0625 # ARABIC LETTER ALEF WITH HAMZA BELOW
0xF247 0xFE87 # ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM
0xF248 0xFE88 # ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM
0xF249 0xFE91 # ARABIC LETTER BEH INITIAL FORM
0xF24A 0xFE92 # ARABIC LETTER BEH MEDIAL FORM
0xF24B 0xFE90 # ARABIC LETTER BEH FINAL FORM
0xF24C 0x0628 # ARABIC LETTER BEH
0xF24C 0xFE8F # ARABIC LETTER BEH ISOLATED FORM
0xF24D 0xFE97 # ARABIC LETTER TEH INITIAL FORM
0xF24E 0xFE98 # ARABIC LETTER TEH MEDIAL FORM
0xF24F 0xFE96 # ARABIC LETTER TEH FINAL FORM
0xF250 0x062A # ARABIC LETTER TEH
0xF250 0xFE95 # ARABIC LETTER TEH ISOLATED FORM
0xF251 0xFE9B # ARABIC LETTER THEH INITIAL FORM
0xF252 0xFE9C # ARABIC LETTER THEH MEDIAL FORM
0xF253 0xFE9A # ARABIC LETTER THEH FINAL FORM
0xF254 0x062B # ARABIC LETTER THEH
0xF254 0xFE99 # ARABIC LETTER THEH ISOLATED FORM
0xF255 0xFE9F # ARABIC LETTER JEEM INITIAL FORM
0xF256 0xFEA0 # ARABIC LETTER JEEM MEDIAL FORM
0xF257 0xFE9E # ARABIC LETTER JEEM FINAL FORM
0xF258 0x062C # ARABIC LETTER JEEM
0xF258 0xFE9D # ARABIC LETTER JEEM ISOLATED FORM
0xF259 0xFEA3 # ARABIC LETTER HAH INITIAL FORM
0xF25A 0xFEA4 # ARABIC LETTER HAH MEDIAL FORM
0xF25B 0x005B # LEFT SQUARE BRACKET
0xF25C 0xFEA2 # ARABIC LETTER HAH FINAL FORM
0xF25D 0x005D # RIGHT SQUARE BRACKET
0xF25E 0x002C # COMMA
0xF25E 0x066B # ARABIC DECIMAL SEPARATOR
0xF25E 0x066C # ARABIC THOUSANDS SEPARATOR
0xF25F 0x0640 # ARABIC TATWEEL
0xF260 0x062D # ARABIC LETTER HAH
0xF260 0xFEA1 # ARABIC LETTER HAH ISOLATED FORM
0xF261 0xFEA7 # ARABIC LETTER KHAH INITIAL FORM
0xF262 0xFEA8 # ARABIC LETTER KHAH MEDIAL FORM
0xF263 0xFEA6 # ARABIC LETTER KHAH FINAL FORM
0xF264 0x062E # ARABIC LETTER KHAH
0xF264 0xFEA5 # ARABIC LETTER KHAH ISOLATED FORM
0xF265 0x062F # ARABIC LETTER DAL
0xF265 0xFEA9 # ARABIC LETTER DAL ISOLATED FORM
0xF266 0xFEAA # ARABIC LETTER DAL FINAL FORM
0xF267 0x0630 # ARABIC LETTER THAL
0xF267 0xFEAB # ARABIC LETTER THAL ISOLATED FORM
0xF268 0xFEAC # ARABIC LETTER THAL FINAL FORM
0xF269 0x0631 # ARABIC LETTER REH
0xF269 0xFEAD # ARABIC LETTER REH ISOLATED FORM
0xF26A 0xFEAE # ARABIC LETTER REH FINAL FORM
0xF26B 0x0632 # ARABIC LETTER ZAIN
0xF26B 0xFEAF # ARABIC LETTER ZAIN ISOLATED FORM
0xF26C 0xFEB0 # ARABIC LETTER ZAIN FINAL FORM
0xF26D 0xFEB3 # ARABIC LETTER SEEN INITIAL FORM
0xF26E 0xFEB4 # ARABIC LETTER SEEN MEDIAL FORM
0xF26F 0xFEB2 # ARABIC LETTER SEEN FINAL FORM
0xF270 0x0633 # ARABIC LETTER SEEN
0xF270 0xFEB1 # ARABIC LETTER SEEN ISOLATED FORM
0xF271 0xFEB7 # ARABIC LETTER SHEEN INITIAL FORM
0xF272 0xFEB8 # ARABIC LETTER SHEEN MEDIAL FORM
0xF273 0xFEB6 # ARABIC LETTER SHEEN FINAL FORM
0xF274 0x0634 # ARABIC LETTER SHEEN
0xF274 0xFEB5 # ARABIC LETTER SHEEN ISOLATED FORM
0xF275 0xFEBB # ARABIC LETTER SAD INITIAL FORM
0xF276 0xFEBC # ARABIC LETTER SAD MEDIAL FORM
0xF277 0xFEBA # ARABIC LETTER SAD FINAL FORM
0xF278 0x0635 # ARABIC LETTER SAD
0xF278 0xFEB9 # ARABIC LETTER SAD ISOLATED FORM
0xF279 0xFEBF # ARABIC LETTER DAD INITIAL FORM
0xF27A 0xFEC0 # ARABIC LETTER DAD MEDIAL FORM
0xF27B 0xFD3E # ORNATE LEFT PARENTHESIS
0xF27C 0xFEBE # ARABIC LETTER DAD FINAL FORM
0xF27D 0xFD3F # ORNATE RIGHT PARENTHESIS
0xF27E 0x0636 # ARABIC LETTER DAD
0xF27E 0xFEBD # ARABIC LETTER DAD ISOLATED FORM
0xF27F 0xFEC3 # ARABIC LETTER TAH INITIAL FORM
0xF280 0xFC9C # ARABIC LIGATURE BEH WITH JEEM INITIAL FORM
0xF281 0xFC9D # ARABIC LIGATURE BEH WITH HAH INITIAL FORM
0xF282 0xFC9E # ARABIC LIGATURE BEH WITH KHAH INITIAL FORM
0xF283 0xFCA1 # ARABIC LIGATURE TEH WITH JEEM INITIAL FORM
0xF284 0xFCA2 # ARABIC LIGATURE TEH WITH HAH INITIAL FORM
0xF285 0xFCA3 # ARABIC LIGATURE TEH WITH KHAH INITIAL FORM
0xF286 0xFCC9 # ARABIC LIGATURE LAM WITH JEEM INITIAL FORM
0xF287 0xFCCA # ARABIC LIGATURE LAM WITH HAH INITIAL FORM
0xF288 0xFCCB # ARABIC LIGATURE LAM WITH KHAH INITIAL FORM
0xF289 0xFCCE # ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM
0xF28A 0xFCCF # ARABIC LIGATURE MEEM WITH HAH INITIAL FORM
0xF28B 0xFCD0 # ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM
0xF28D 0xFCD2 # ARABIC LIGATURE NOON WITH JEEM INITIAL FORM
0xF28E 0xFCD3 # ARABIC LIGATURE NOON WITH HAH INITIAL FORM
0xF28F 0xFCDA # ARABIC LIGATURE YEH WITH JEEM INITIAL FORM
0xF290 0xFCDB # ARABIC LIGATURE YEH WITH HAH INITIAL FORM
0xF291 0xFCDC # ARABIC LIGATURE YEH WITH KHAH INITIAL FORM
0xF292 0xFC6D # ARABIC LIGATURE BEH WITH NOON FINAL FORM
0xF293 0xFC73 # ARABIC LIGATURE TEH WITH NOON FINAL FORM
0xF294 0xFC94 # ARABIC LIGATURE YEH WITH NOON FINAL FORM
0xF295 0xFC86 # ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM
0xF296 0xFC9F # ARABIC LIGATURE BEH WITH MEEM INITIAL FORM
0xF297 0xFCA4 # ARABIC LIGATURE TEH WITH MEEM INITIAL FORM
0xF298 0xFCD5 # ARABIC LIGATURE NOON WITH MEEM INITIAL FORM
0xF299 0xFCDD # ARABIC LIGATURE YEH WITH MEEM INITIAL FORM
0xF29A 0xFCA8 # ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM
0xF29B 0xFCAA # ARABIC LIGATURE HAH WITH MEEM INITIAL FORM
0xF29C 0xFCAC # ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM
0xF29D 0xFCCC # ARABIC LIGATURE LAM WITH MEEM INITIAL FORM
0xF29E 0xFCD1 # ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM
0xF29F 0xFC32 # ARABIC LIGATURE FEH WITH YEH ISOLATED FORM
0xF2A1 0xFEC2 # ARABIC LETTER TAH FINAL FORM
0xF2A2 0x0637 # ARABIC LETTER TAH
0xF2A2 0xFEC1 # ARABIC LETTER TAH ISOLATED FORM
0xF2A3 0x0638 # ARABIC LETTER ZAH
0xF2A3 0xFEC7 # ARABIC LETTER ZAH INITIAL FORM
0xF2A4 0xFEC8 # ARABIC LETTER ZAH MEDIAL FORM
0xF2A5 0xFEC6 # ARABIC LETTER ZAH FINAL FORM
0xF2A6 0xFEC5 # ARABIC LETTER ZAH ISOLATED FORM
0xF2A7 0xFECB # ARABIC LETTER AIN INITIAL FORM
0xF2A8 0xFECC # ARABIC LETTER AIN MEDIAL FORM
0xF2A9 0xFECA # ARABIC LETTER AIN FINAL FORM
0xF2AA 0x0639 # ARABIC LETTER AIN
0xF2AA 0xFEC9 # ARABIC LETTER AIN ISOLATED FORM
0xF2AB 0xFECF # ARABIC LETTER GHAIN INITIAL FORM
0xF2AC 0xFED0 # ARABIC LETTER GHAIN MEDIAL FORM
0xF2AD 0xFECE # ARABIC LETTER GHAIN FINAL FORM
0xF2AE 0x063A # ARABIC LETTER GHAIN
0xF2AE 0xFECD # ARABIC LETTER GHAIN ISOLATED FORM
0xF2AF 0xFED3 # ARABIC LETTER FEH INITIAL FORM
0xF2B0 0xFED4 # ARABIC LETTER FEH MEDIAL FORM
0xF2B1 0xFED2 # ARABIC LETTER FEH FINAL FORM
0xF2B2 0x0641 # ARABIC LETTER FEH
0xF2B2 0xFED1 # ARABIC LETTER FEH ISOLATED FORM
0xF2B3 0xFED7 # ARABIC LETTER QAF INITIAL FORM
0xF2B4 0xFED8 # ARABIC LETTER QAF MEDIAL FORM
0xF2B5 0xFED6 # ARABIC LETTER QAF FINAL FORM
0xF2B6 0x0642 # ARABIC LETTER QAF
0xF2B6 0xFED5 # ARABIC LETTER QAF ISOLATED FORM
0xF2B7 0xFEDB # ARABIC LETTER KAF INITIAL FORM
0xF2B8 0xFEDC # ARABIC LETTER KAF MEDIAL FORM
0xF2B9 0xFEDA # ARABIC LETTER KAF FINAL FORM
0xF2BA 0x0643 # ARABIC LETTER KAF
0xF2BA 0xFED9 # ARABIC LETTER KAF ISOLATED FORM
0xF2BB 0xFEDF # ARABIC LETTER LAM INITIAL FORM
0xF2BC 0xFEE0 # ARABIC LETTER LAM MEDIAL FORM
0xF2BD 0xFEDE # ARABIC LETTER LAM FINAL FORM
0xF2BE 0x0644 # ARABIC LETTER LAM
0xF2BE 0xFEDD # ARABIC LETTER LAM ISOLATED FORM
0xF2BF 0xFEE3 # ARABIC LETTER MEEM INITIAL FORM
0xF2C0 0xFEE4 # ARABIC LETTER MEEM MEDIAL FORM
0xF2C1 0xFEE2 # ARABIC LETTER MEEM FINAL FORM
0xF2C2 0x0645 # ARABIC LETTER MEEM
0xF2C2 0xFEE1 # ARABIC LETTER MEEM ISOLATED FORM
0xF2C3 0xFEE7 # ARABIC LETTER NOON INITIAL FORM
0xF2C4 0xFEE8 # ARABIC LETTER NOON MEDIAL FORM
0xF2C5 0xFEE6 # ARABIC LETTER NOON FINAL FORM
0xF2C6 0x0646 # ARABIC LETTER NOON
0xF2C6 0xFEE5 # ARABIC LETTER NOON ISOLATED FORM
0xF2C7 0xFEEB # ARABIC LETTER HEH INITIAL FORM
0xF2C8 0xFEEC # ARABIC LETTER HEH MEDIAL FORM
0xF2C9 0xFEEA # ARABIC LETTER HEH FINAL FORM
0xF2CA 0x0647 # ARABIC LETTER HEH
0xF2CA 0xFEE9 # ARABIC LETTER HEH ISOLATED FORM
0xF2CB 0x0648 # ARABIC LETTER WAW
0xF2CB 0xFEED # ARABIC LETTER WAW ISOLATED FORM
0xF2CC 0xFEEE # ARABIC LETTER WAW FINAL FORM
0xF2CD 0xFEF3 # ARABIC LETTER YEH INITIAL FORM
0xF2CE 0xFEF4 # ARABIC LETTER YEH MEDIAL FORM
0xF2CF 0xFEF2 # ARABIC LETTER YEH FINAL FORM
0xF2D0 0x064A # ARABIC LETTER YEH
0xF2D0 0xFEF1 # ARABIC LETTER YEH ISOLATED FORM
0xF2D1 0x0629 # ARABIC LETTER TEH MARBUTA
0xF2D1 0xFE93 # ARABIC LETTER TEH MARBUTA ISOLATED FORM
0xF2D2 0xFE94 # ARABIC LETTER TEH MARBUTA FINAL FORM
0xF2D3 0xFEF0 # ARABIC LETTER ALEF MAKSURA FINAL FORM
0xF2D4 0x0649 # ARABIC LETTER ALEF MAKSURA
0xF2D4 0xFEEF # ARABIC LETTER ALEF MAKSURA ISOLATED FORM
0xF2D5 0x0621 # ARABIC LETTER HAMZA
0xF2D6 0xFE8B # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM
0xF2D7 0xFE8C # ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM
0xF2D8 0xFE8A # ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM
0xF2D9 0x0626 # ARABIC LETTER YEH WITH HAMZA ABOVE
0xF2D9 0xFE89 # ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM
0xF2DA 0x0624 # ARABIC LETTER WAW WITH HAMZA ABOVE
0xF2DA 0xFE85 # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM
0xF2DB 0xFE86 # ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM
0xF2DC 0xFEFB # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
0xF2DD 0xFEFC # ARABIC LIGATURE LAM WITH ALEF FINAL FORM
0xF2DE 0xFEF7 # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM
0xF2DF 0xFEF8 # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM
0xF2E0 0xFEF5 # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
0xF2E1 0xFEF6 # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM
0xF2E2 0xFEF9 # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM
0xF2E3 0xFEFA # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM
0xF2E4 0x064E # ARABIC FATHA
0xF2E5 0x064F # ARABIC DAMMA
0xF2E6 0x0652 # ARABIC SUKUN
0xF2E7 0x064B # ARABIC FATHATAN
0xF2E8 0x064C # ARABIC DAMMATAN
0xF2E9 0x0651 # ARABIC SHADDA
0xF2EA 0x0650 # ARABIC KASRA
0xF2EB 0x064D # ARABIC KASRATAN
0xF2EC 0xFC60 # ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM
0xF2ED 0xFC61 # ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM
0xF2EF 0xFC5E # ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM
0xF2F0 0xFC62 # ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM
0xF2F1 0xFEC4 # ARABIC LETTER TAH MEDIAL FORM

View File

@ -133,6 +133,7 @@ HB_BASE_sources = \
hb-ot-post-table.hh \ hb-ot-post-table.hh \
hb-ot-shaper-arabic-fallback.hh \ hb-ot-shaper-arabic-fallback.hh \
hb-ot-shaper-arabic-joining-list.hh \ hb-ot-shaper-arabic-joining-list.hh \
hb-ot-shaper-arabic-pua.hh \
hb-ot-shaper-arabic-table.hh \ hb-ot-shaper-arabic-table.hh \
hb-ot-shaper-arabic-win1256.hh \ hb-ot-shaper-arabic-win1256.hh \
hb-ot-shaper-arabic.cc \ hb-ot-shaper-arabic.cc \

View File

@ -153,12 +153,29 @@ def print_joining_table(f):
print ("#undef %s" % (short)) print ("#undef %s" % (short))
print () print ()
LIGATURES = (
0xF2EE, 0xFC08, 0xFC0E, 0xFC12, 0xFC32, 0xFC3F, 0xFC40, 0xFC41, 0xFC42,
0xFC44, 0xFC4E, 0xFC5E, 0xFC60, 0xFC61, 0xFC62, 0xFC6A, 0xFC6D, 0xFC6F,
0xFC70, 0xFC73, 0xFC75, 0xFC86, 0xFC8F, 0xFC91, 0xFC94, 0xFC9C, 0xFC9D,
0xFC9E, 0xFC9F, 0xFCA1, 0xFCA2, 0xFCA3, 0xFCA4, 0xFCA8, 0xFCAA, 0xFCAC,
0xFCB0, 0xFCC9, 0xFCCA, 0xFCCB, 0xFCCC, 0xFCCD, 0xFCCE, 0xFCCF, 0xFCD0,
0xFCD1, 0xFCD2, 0xFCD3, 0xFCD5, 0xFCDA, 0xFCDB, 0xFCDC, 0xFCDD, 0xFD30,
0xFD88, 0xFEF5, 0xFEF6, 0xFEF7, 0xFEF8, 0xFEF9, 0xFEFA, 0xFEFB, 0xFEFC,
0xF201, 0xF211, 0xF2EE,
)
def print_shaping_table(f): def print_shaping_table(f):
shapes = {} shapes = {}
ligatures = {} ligatures = {}
names = {} names = {}
for line in f: lines = f.readlines()
lines += [
"F201;PUA ARABIC LIGATURE LELLAH ISOLATED FORM;Lo;0;AL;<isolated> 0644 0644 0647;;;;N;;;;;",
"F211;PUA ARABIC LIGATURE LAM WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0644 0645 062C;;;;N;;;;;",
"F2EE;PUA ARABIC LIGATURE SHADDA WITH FATHATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064B 0651;;;;N;;;;;",
]
for line in lines:
fields = [x.strip () for x in line.split (';')] fields = [x.strip () for x in line.split (';')]
if fields[5][0:1] != '<': if fields[5][0:1] != '<':
@ -166,14 +183,19 @@ def print_shaping_table(f):
items = fields[5].split (' ') items = fields[5].split (' ')
shape, items = items[0][1:-1], tuple (int (x, 16) for x in items[1:]) shape, items = items[0][1:-1], tuple (int (x, 16) for x in items[1:])
c = int (fields[0], 16)
if not shape in ['initial', 'medial', 'isolated', 'final']: if not shape in ['initial', 'medial', 'isolated', 'final']:
continue continue
c = int (fields[0], 16)
if len (items) != 1: if len (items) != 1:
# We only care about lam-alef ligatures # Mark ligatures start with space and are in visual order, so we
if len (items) != 2 or items[0] != 0x0644 or items[1] not in [0x0622, 0x0623, 0x0625, 0x0627]: # remove the space and reverse the items.
if items[0] == 0x0020:
items = items[:0:-1]
shape = None
# We only care about a subset of ligatures
if c not in LIGATURES:
continue continue
# Save ligature # Save ligature
@ -209,34 +231,99 @@ def print_shaping_table(f):
print ("#define SHAPING_TABLE_LAST 0x%04Xu" % max_u) print ("#define SHAPING_TABLE_LAST 0x%04Xu" % max_u)
print () print ()
ligas = {} ligas_2 = {}
for pair in ligatures.keys (): ligas_3 = {}
for shape in ligatures[pair]: ligas_mark_2 = {}
c = ligatures[pair][shape] for key in ligatures.keys ():
for shape in ligatures[key]:
c = ligatures[key][shape]
if len(key) == 3:
if shape == 'isolated': if shape == 'isolated':
liga = (shapes[pair[0]]['initial'], shapes[pair[1]]['final']) liga = (shapes[key[0]]['initial'], shapes[key[1]]['medial'], shapes[key[2]]['final'])
elif shape == 'final': elif shape == 'final':
liga = (shapes[pair[0]]['medial'], shapes[pair[1]]['final']) liga = (shapes[key[0]]['medial'], shapes[key[1]]['medial'], shapes[key[2]]['final'])
elif shape == 'initial':
liga = (shapes[key[0]]['initial'], shapes[key[1]]['medial'], shapes[key[2]]['medial'])
else: else:
raise Exception ("Unexpected shape", shape) raise Exception ("Unexpected shape", shape)
if liga[0] not in ligas: if liga[0] not in ligas_3:
ligas[liga[0]] = [] ligas_3[liga[0]] = []
ligas[liga[0]].append ((liga[1], c)) ligas_3[liga[0]].append ((liga[1], liga[2], c))
max_i = max (len (ligas[l]) for l in ligas) elif len(key) == 2:
if shape is None:
liga = key
if liga[0] not in ligas_mark_2:
ligas_mark_2[liga[0]] = []
ligas_mark_2[liga[0]].append ((liga[1], c))
continue
elif shape == 'isolated':
liga = (shapes[key[0]]['initial'], shapes[key[1]]['final'])
elif shape == 'final':
liga = (shapes[key[0]]['medial'], shapes[key[1]]['final'])
elif shape == 'initial':
liga = (shapes[key[0]]['initial'], shapes[key[1]]['medial'])
else:
raise Exception ("Unexpected shape", shape)
if liga[0] not in ligas_2:
ligas_2[liga[0]] = []
ligas_2[liga[0]].append ((liga[1], c))
else:
raise Exception ("Unexpected number of ligature components", key)
max_i = max (len (ligas_2[l]) for l in ligas_2)
print () print ()
print ("static const struct ligature_set_t {") print ("static const struct ligature_set_t {")
print (" uint16_t first;") print (" uint16_t first;")
print (" struct ligature_pairs_t {") print (" struct ligature_pairs_t {")
print (" uint16_t second;") print (" uint16_t components[1];")
print (" uint16_t ligature;") print (" uint16_t ligature;")
print (" } ligatures[%d];" % max_i) print (" } ligatures[%d];" % max_i)
print ("} ligature_table[] =") print ("} ligature_table[] =")
print ("{") print ("{")
for first in sorted (ligas.keys ()): for first in sorted (ligas_2.keys ()):
print (" { 0x%04Xu, {" % (first)) print (" { 0x%04Xu, {" % (first))
for liga in ligas[first]: for liga in ligas_2[first]:
print (" { 0x%04Xu, 0x%04Xu }, /* %s */" % (liga[0], liga[1], names[liga[1]])) print (" { {0x%04Xu}, 0x%04Xu }, /* %s */" % (liga[0], liga[1], names[liga[1]]))
print (" }},")
print ("};")
print ()
max_i = max (len (ligas_mark_2[l]) for l in ligas_mark_2)
print ()
print ("static const struct ligature_mark_set_t {")
print (" uint16_t first;")
print (" struct ligature_pairs_t {")
print (" uint16_t components[1];")
print (" uint16_t ligature;")
print (" } ligatures[%d];" % max_i)
print ("} ligature_mark_table[] =")
print ("{")
for first in sorted (ligas_mark_2.keys ()):
print (" { 0x%04Xu, {" % (first))
for liga in ligas_mark_2[first]:
print (" { {0x%04Xu}, 0x%04Xu }, /* %s */" % (liga[0], liga[1], names[liga[1]]))
print (" }},")
print ("};")
print ()
max_i = max (len (ligas_3[l]) for l in ligas_3)
print ()
print ("static const struct ligature_3_set_t {")
print (" uint16_t first;")
print (" struct ligature_triplets_t {")
print (" uint16_t components[2];")
print (" uint16_t ligature;")
print (" } ligatures[%d];" % max_i)
print ("} ligature_3_table[] =")
print ("{")
for first in sorted (ligas_3.keys ()):
print (" { 0x%04Xu, {" % (first))
for liga in ligas_3[first]:
print (" { {0x%04Xu, 0x%04Xu}, 0x%04Xu}, /* %s */" % (liga[0], liga[1], liga[2], names[liga[2]]))
print (" }},") print (" }},")
print ("};") print ("};")

View File

@ -37,6 +37,8 @@
#include "hb-font.hh" #include "hb-font.hh"
#include "hb-machinery.hh" #include "hb-machinery.hh"
#include "hb-cache.hh" #include "hb-cache.hh"
#include "hb-ot-os2-table.hh"
#include "hb-ot-shaper-arabic-pua.hh"
#include FT_ADVANCES_H #include FT_ADVANCES_H
#include FT_MULTIPLE_MASTERS_H #include FT_MULTIPLE_MASTERS_H
@ -298,7 +300,7 @@ hb_ft_font_unlock_face (hb_font_t *font)
static hb_bool_t static hb_bool_t
hb_ft_get_nominal_glyph (hb_font_t *font HB_UNUSED, hb_ft_get_nominal_glyph (hb_font_t *font,
void *font_data, void *font_data,
hb_codepoint_t unicode, hb_codepoint_t unicode,
hb_codepoint_t *glyph, hb_codepoint_t *glyph,
@ -310,14 +312,29 @@ hb_ft_get_nominal_glyph (hb_font_t *font HB_UNUSED,
if (unlikely (!g)) if (unlikely (!g))
{ {
if (unlikely (ft_font->symbol) && unicode <= 0x00FFu) if (unlikely (ft_font->symbol))
{ {
switch ((unsigned) font->face->table.OS2->get_font_page ()) {
case OT::OS2::font_page_t::FONT_PAGE_NONE:
if (unicode <= 0x00FFu)
/* For symbol-encoded OpenType fonts, we duplicate the /* For symbol-encoded OpenType fonts, we duplicate the
* U+F000..F0FF range at U+0000..U+00FF. That's what * U+F000..F0FF range at U+0000..U+00FF. That's what
* Windows seems to do, and that's hinted about at: * Windows seems to do, and that's hinted about at:
* https://docs.microsoft.com/en-us/typography/opentype/spec/recom * https://docs.microsoft.com/en-us/typography/opentype/spec/recom
* under "Non-Standard (Symbol) Fonts". */ * under "Non-Standard (Symbol) Fonts". */
g = FT_Get_Char_Index (ft_font->ft_face, 0xF000u + unicode); g = FT_Get_Char_Index (ft_font->ft_face, 0xF000u + unicode);
break;
#ifndef HB_NO_OT_SHAPER_ARABIC_FALLBACK
case OT::OS2::font_page_t::FONT_PAGE_SIMP_ARABIC:
g = FT_Get_Char_Index (ft_font->ft_face, _hb_arabic_pua_simp_map (unicode));
break;
case OT::OS2::font_page_t::FONT_PAGE_TRAD_ARABIC:
g = FT_Get_Char_Index (ft_font->ft_face, _hb_arabic_pua_trad_map (unicode));
break;
#endif
default:
break;
}
if (!g) if (!g)
return false; return false;
} }

View File

@ -37,7 +37,7 @@
/* Global nul-content Null pool. Enlarge as necessary. */ /* Global nul-content Null pool. Enlarge as necessary. */
#define HB_NULL_POOL_SIZE 384 #define HB_NULL_POOL_SIZE 448
/* Use SFINAE to sniff whether T has min_size; in which case return the larger /* Use SFINAE to sniff whether T has min_size; in which case return the larger
* of sizeof(T) and T::null_size, otherwise return sizeof(T). * of sizeof(T) and T::null_size, otherwise return sizeof(T).

View File

@ -27,6 +27,8 @@
#ifndef HB_OT_CMAP_TABLE_HH #ifndef HB_OT_CMAP_TABLE_HH
#define HB_OT_CMAP_TABLE_HH #define HB_OT_CMAP_TABLE_HH
#include "hb-ot-os2-table.hh"
#include "hb-ot-shaper-arabic-pua.hh"
#include "hb-open-type.hh" #include "hb-open-type.hh"
#include "hb-set.hh" #include "hb-set.hh"
@ -1502,6 +1504,21 @@ struct SubtableUnicodesCache {
}; };
static inline hb_codepoint_t
_hb_symbol_pua_map (hb_codepoint_t codepoint)
{
if (codepoint <= 0x00FFu)
{
/* For symbol-encoded OpenType fonts, we duplicate the
* U+F000..F0FF range at U+0000..U+00FF. That's what
* Windows seems to do, and that's hinted about at:
* https://docs.microsoft.com/en-us/typography/opentype/spec/recom
* under "Non-Standard (Symbol) Fonts". */
return 0xF000u + codepoint;
}
return 0;
}
struct cmap struct cmap
{ {
static constexpr hb_tag_t tableTag = HB_OT_TAG_cmap; static constexpr hb_tag_t tableTag = HB_OT_TAG_cmap;
@ -1725,7 +1742,24 @@ struct cmap
this->get_glyph_data = subtable; this->get_glyph_data = subtable;
if (unlikely (symbol)) if (unlikely (symbol))
this->get_glyph_funcZ = get_glyph_from_symbol<CmapSubtable>; {
switch ((unsigned) face->table.OS2->get_font_page ()) {
case OS2::font_page_t::FONT_PAGE_NONE:
this->get_glyph_funcZ = get_glyph_from_symbol<CmapSubtable, _hb_symbol_pua_map>;
break;
#ifndef HB_NO_OT_SHAPER_ARABIC_FALLBACK
case OS2::font_page_t::FONT_PAGE_SIMP_ARABIC:
this->get_glyph_funcZ = get_glyph_from_symbol<CmapSubtable, _hb_arabic_pua_simp_map>;
break;
case OS2::font_page_t::FONT_PAGE_TRAD_ARABIC:
this->get_glyph_funcZ = get_glyph_from_symbol<CmapSubtable, _hb_arabic_pua_trad_map>;
break;
#endif
default:
this->get_glyph_funcZ = get_glyph_from<CmapSubtable>;
break;
}
}
else else
{ {
switch (subtable->u.format) { switch (subtable->u.format) {
@ -1807,6 +1841,7 @@ struct cmap
typedef bool (*hb_cmap_get_glyph_func_t) (const void *obj, typedef bool (*hb_cmap_get_glyph_func_t) (const void *obj,
hb_codepoint_t codepoint, hb_codepoint_t codepoint,
hb_codepoint_t *glyph); hb_codepoint_t *glyph);
typedef hb_codepoint_t (*hb_pua_remap_func_t) (hb_codepoint_t);
template <typename Type> template <typename Type>
HB_INTERNAL static bool get_glyph_from (const void *obj, HB_INTERNAL static bool get_glyph_from (const void *obj,
@ -1817,7 +1852,7 @@ struct cmap
return typed_obj->get_glyph (codepoint, glyph); return typed_obj->get_glyph (codepoint, glyph);
} }
template <typename Type> template <typename Type, hb_pua_remap_func_t remap>
HB_INTERNAL static bool get_glyph_from_symbol (const void *obj, HB_INTERNAL static bool get_glyph_from_symbol (const void *obj,
hb_codepoint_t codepoint, hb_codepoint_t codepoint,
hb_codepoint_t *glyph) hb_codepoint_t *glyph)
@ -1826,15 +1861,8 @@ struct cmap
if (likely (typed_obj->get_glyph (codepoint, glyph))) if (likely (typed_obj->get_glyph (codepoint, glyph)))
return true; return true;
if (codepoint <= 0x00FFu) if (hb_codepoint_t c = remap (codepoint))
{ return typed_obj->get_glyph (c, glyph);
/* For symbol-encoded OpenType fonts, we duplicate the
* U+F000..F0FF range at U+0000..U+00FF. That's what
* Windows seems to do, and that's hinted about at:
* https://docs.microsoft.com/en-us/typography/opentype/spec/recom
* under "Non-Standard (Symbol) Fonts". */
return typed_obj->get_glyph (0xF000u + codepoint, glyph);
}
return false; return false;
} }

View File

@ -224,9 +224,11 @@ struct OS2
*max_cp = hb_min (0xFFFFu, codepoints->get_max ()); *max_cp = hb_min (0xFFFFu, codepoints->get_max ());
} }
/* https://github.com/Microsoft/Font-Validator/blob/520aaae/OTFontFileVal/val_OS2.cs#L644-L681 */ /* https://github.com/Microsoft/Font-Validator/blob/520aaae/OTFontFileVal/val_OS2.cs#L644-L681
* https://docs.microsoft.com/en-us/typography/legacy/legacy_arabic_fonts */
enum font_page_t enum font_page_t
{ {
FONT_PAGE_NONE = 0,
FONT_PAGE_HEBREW = 0xB100, /* Hebrew Windows 3.1 font page */ FONT_PAGE_HEBREW = 0xB100, /* Hebrew Windows 3.1 font page */
FONT_PAGE_SIMP_ARABIC = 0xB200, /* Simplified Arabic Windows 3.1 font page */ FONT_PAGE_SIMP_ARABIC = 0xB200, /* Simplified Arabic Windows 3.1 font page */
FONT_PAGE_TRAD_ARABIC = 0xB300, /* Traditional Arabic Windows 3.1 font page */ FONT_PAGE_TRAD_ARABIC = 0xB300, /* Traditional Arabic Windows 3.1 font page */

View File

@ -34,7 +34,11 @@
/* Features ordered the same as the entries in shaping_table rows, /* Features ordered the same as the entries in shaping_table rows,
* followed by rlig. Don't change. */ * followed by rlig. Don't change.
*
* We currently support one subtable per lookup, and one lookup
* per feature. But we allow duplicate features, so we use that!
*/
static const hb_tag_t arabic_fallback_features[] = static const hb_tag_t arabic_fallback_features[] =
{ {
HB_TAG('i','n','i','t'), HB_TAG('i','n','i','t'),
@ -42,6 +46,8 @@ static const hb_tag_t arabic_fallback_features[] =
HB_TAG('f','i','n','a'), HB_TAG('f','i','n','a'),
HB_TAG('i','s','o','l'), HB_TAG('i','s','o','l'),
HB_TAG('r','l','i','g'), HB_TAG('r','l','i','g'),
HB_TAG('r','l','i','g'),
HB_TAG('r','l','i','g'),
}; };
static OT::SubstLookup * static OT::SubstLookup *
@ -95,20 +101,25 @@ arabic_fallback_synthesize_lookup_single (const hb_ot_shape_plan_t *plan HB_UNUS
return ret && !c.in_error () ? c.copy<OT::SubstLookup> () : nullptr; return ret && !c.in_error () ? c.copy<OT::SubstLookup> () : nullptr;
} }
template <typename T>
static OT::SubstLookup * static OT::SubstLookup *
arabic_fallback_synthesize_lookup_ligature (const hb_ot_shape_plan_t *plan HB_UNUSED, arabic_fallback_synthesize_lookup_ligature (const hb_ot_shape_plan_t *plan HB_UNUSED,
hb_font_t *font) hb_font_t *font,
const T &ligature_table,
unsigned lookup_flags)
{ {
OT::HBGlyphID16 first_glyphs[ARRAY_LENGTH_CONST (ligature_table)]; OT::HBGlyphID16 first_glyphs[ARRAY_LENGTH_CONST (ligature_table)];
unsigned int first_glyphs_indirection[ARRAY_LENGTH_CONST (ligature_table)]; unsigned int first_glyphs_indirection[ARRAY_LENGTH_CONST (ligature_table)];
unsigned int ligature_per_first_glyph_count_list[ARRAY_LENGTH_CONST (first_glyphs)]; unsigned int ligature_per_first_glyph_count_list[ARRAY_LENGTH_CONST (first_glyphs)];
unsigned int num_first_glyphs = 0; unsigned int num_first_glyphs = 0;
/* We know that all our ligatures are 2-component */ /* We know that all our ligatures have the same number of components. */
OT::HBGlyphID16 ligature_list[ARRAY_LENGTH_CONST (first_glyphs) * ARRAY_LENGTH_CONST(ligature_table[0].ligatures)]; OT::HBGlyphID16 ligature_list[ARRAY_LENGTH_CONST (first_glyphs) * ARRAY_LENGTH_CONST(ligature_table[0].ligatures)];
unsigned int component_count_list[ARRAY_LENGTH_CONST (ligature_list)]; unsigned int component_count_list[ARRAY_LENGTH_CONST (ligature_list)];
OT::HBGlyphID16 component_list[ARRAY_LENGTH_CONST (ligature_list) * 1/* One extra component per ligature */]; OT::HBGlyphID16 component_list[ARRAY_LENGTH_CONST (ligature_list) *
ARRAY_LENGTH_CONST (ligature_table[0].ligatures[0].components)];
unsigned int num_ligatures = 0; unsigned int num_ligatures = 0;
unsigned int num_components = 0;
/* Populate arrays */ /* Populate arrays */
@ -133,21 +144,32 @@ arabic_fallback_synthesize_lookup_ligature (const hb_ot_shape_plan_t *plan HB_UN
{ {
unsigned int first_glyph_idx = first_glyphs_indirection[i]; unsigned int first_glyph_idx = first_glyphs_indirection[i];
for (unsigned int second_glyph_idx = 0; second_glyph_idx < ARRAY_LENGTH (ligature_table[0].ligatures); second_glyph_idx++) for (unsigned int ligature_idx = 0; ligature_idx < ARRAY_LENGTH (ligature_table[0].ligatures); ligature_idx++)
{ {
hb_codepoint_t second_u = ligature_table[first_glyph_idx].ligatures[second_glyph_idx].second; hb_codepoint_t ligature_u = ligature_table[first_glyph_idx].ligatures[ligature_idx].ligature;
hb_codepoint_t ligature_u = ligature_table[first_glyph_idx].ligatures[second_glyph_idx].ligature; hb_codepoint_t ligature_glyph;
hb_codepoint_t second_glyph, ligature_glyph; if (!hb_font_get_glyph (font, ligature_u, 0, &ligature_glyph))
if (!second_u ||
!hb_font_get_glyph (font, second_u, 0, &second_glyph) ||
!hb_font_get_glyph (font, ligature_u, 0, &ligature_glyph))
continue; continue;
const auto &components = ligature_table[first_glyph_idx].ligatures[ligature_idx].components;
unsigned component_count = ARRAY_LENGTH_CONST (components);
for (unsigned i = 0; i < component_count; i++)
{
hb_codepoint_t component_u = ligature_table[first_glyph_idx].ligatures[ligature_idx].components[i];
hb_codepoint_t component_glyph;
if (!component_u ||
!hb_font_get_glyph (font, component_u, 0, &component_glyph))
continue;
component_list[num_components++] = component_glyph;
}
component_count_list[num_ligatures] = 1 + component_count;
ligature_list[num_ligatures] = ligature_glyph;
ligature_per_first_glyph_count_list[i]++; ligature_per_first_glyph_count_list[i]++;
ligature_list[num_ligatures] = ligature_glyph;
component_count_list[num_ligatures] = 2;
component_list[num_ligatures] = second_glyph;
num_ligatures++; num_ligatures++;
} }
} }
@ -161,12 +183,12 @@ arabic_fallback_synthesize_lookup_ligature (const hb_ot_shape_plan_t *plan HB_UN
hb_serialize_context_t c (buf, sizeof (buf)); hb_serialize_context_t c (buf, sizeof (buf));
OT::SubstLookup *lookup = c.start_serialize<OT::SubstLookup> (); OT::SubstLookup *lookup = c.start_serialize<OT::SubstLookup> ();
bool ret = lookup->serialize_ligature (&c, bool ret = lookup->serialize_ligature (&c,
OT::LookupFlag::IgnoreMarks, lookup_flags,
hb_sorted_array (first_glyphs, num_first_glyphs), hb_sorted_array (first_glyphs, num_first_glyphs),
hb_array (ligature_per_first_glyph_count_list, num_first_glyphs), hb_array (ligature_per_first_glyph_count_list, num_first_glyphs),
hb_array (ligature_list, num_ligatures), hb_array (ligature_list, num_ligatures),
hb_array (component_count_list, num_ligatures), hb_array (component_count_list, num_ligatures),
hb_array (component_list, num_ligatures)); hb_array (component_list, num_components));
c.end_serialize (); c.end_serialize ();
return ret && !c.in_error () ? c.copy<OT::SubstLookup> () : nullptr; return ret && !c.in_error () ? c.copy<OT::SubstLookup> () : nullptr;
@ -180,10 +202,18 @@ arabic_fallback_synthesize_lookup (const hb_ot_shape_plan_t *plan,
if (feature_index < 4) if (feature_index < 4)
return arabic_fallback_synthesize_lookup_single (plan, font, feature_index); return arabic_fallback_synthesize_lookup_single (plan, font, feature_index);
else else
return arabic_fallback_synthesize_lookup_ligature (plan, font); {
switch (feature_index) {
case 4: return arabic_fallback_synthesize_lookup_ligature (plan, font, ligature_3_table, OT::LookupFlag::IgnoreMarks);
case 5: return arabic_fallback_synthesize_lookup_ligature (plan, font, ligature_table, OT::LookupFlag::IgnoreMarks);
case 6: return arabic_fallback_synthesize_lookup_ligature (plan, font, ligature_mark_table, 0);
}
}
assert (false);
return nullptr;
} }
#define ARABIC_FALLBACK_MAX_LOOKUPS 5 #define ARABIC_FALLBACK_MAX_LOOKUPS ARRAY_LENGTH_CONST (arabic_fallback_features)
struct arabic_fallback_plan_t struct arabic_fallback_plan_t
{ {
@ -229,7 +259,7 @@ arabic_fallback_plan_init_win1256 (arabic_fallback_plan_t *fallback_plan HB_UNUS
return false; return false;
const Manifest &manifest = reinterpret_cast<const Manifest&> (arabic_win1256_gsub_lookups.manifest); const Manifest &manifest = reinterpret_cast<const Manifest&> (arabic_win1256_gsub_lookups.manifest);
static_assert (sizeof (arabic_win1256_gsub_lookups.manifestData) == static_assert (sizeof (arabic_win1256_gsub_lookups.manifestData) <=
ARABIC_FALLBACK_MAX_LOOKUPS * sizeof (ManifestLookup), ""); ARABIC_FALLBACK_MAX_LOOKUPS * sizeof (ManifestLookup), "");
unsigned j = 0; unsigned j = 0;

View File

@ -0,0 +1,289 @@
#ifndef HB_OT_SHAPER_ARABIC_PUA_HH
#define HB_OT_SHAPER_ARABIC_PUA_HH
static const uint16_t _arabic_table_pua_simp[][128] = {
{ /* 0x0000u..0x007Fu */
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0xF120u, 0xF121u, 0xF122u, 0x0000u, 0x0000u, 0xF125u, 0x0000u, 0x0000u,
0xF128u, 0xF129u, 0xF12Au, 0xF12Bu, 0xF15Eu, 0xF12Du, 0xF12Eu, 0xF12Fu,
0xF1B0u, 0xF1B1u, 0xF1B2u, 0xF1B3u, 0xF1B4u, 0xF1B5u, 0xF1B6u, 0xF1B7u,
0xF1B8u, 0xF1B9u, 0xF13Au, 0xF13Bu, 0x0000u, 0xF13Du, 0x0000u, 0xF13Fu,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0xF15Bu, 0xF15Cu, 0xF15Du, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
},
{ /* 0x0080u..0x00FFu */
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0xF123u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0xF124u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF126u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF127u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
},
{ /* 0x0600u..0x067Fu */
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF12Cu, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0xF13Bu, 0x0000u, 0x0000u, 0x0000u, 0xF13Fu,
0x0000u, 0xF1ADu, 0xF145u, 0xF143u, 0xF1BBu, 0xF147u, 0xF1BAu, 0xF141u,
0xF14Au, 0xF1A9u, 0xF14Cu, 0xF14Eu, 0xF151u, 0xF154u, 0xF157u, 0xF158u,
0xF159u, 0xF15Au, 0xF160u, 0xF162u, 0xF164u, 0xF166u, 0xF168u, 0xF169u,
0xF16Au, 0xF16Eu, 0xF172u, 0xF100u, 0xF100u, 0xF100u, 0xF100u, 0xF100u,
0xF15Fu, 0xF175u, 0xF178u, 0xF17Au, 0xF17Cu, 0xF17Eu, 0xF1E1u, 0xF1A4u,
0xF1A5u, 0xF1ACu, 0xF1A8u, 0xF1C7u, 0xF1C8u, 0xF1CBu, 0xF1C4u, 0xF1C5u,
0xF1CAu, 0xF1C9u, 0xF1C6u, 0xF100u, 0xF100u, 0xF100u, 0xF100u, 0xF100u,
0xF100u, 0xF100u, 0xF100u, 0xF100u, 0xF100u, 0xF100u, 0xF100u, 0x0000u,
0xF130u, 0xF131u, 0xF132u, 0xF133u, 0xF134u, 0xF135u, 0xF136u, 0xF137u,
0xF138u, 0xF139u, 0x0000u, 0xF15Eu, 0xF15Eu, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
},
{ /* 0x2000u..0x207Fu */
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF10Cu, 0xF10Du, 0xF10Eu, 0xF10Fu,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0xF13Cu, 0xF13Eu, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
},
{ /* 0xFE80u..0xFEFFu */
0x0000u, 0xF145u, 0xF146u, 0xF143u, 0xF144u, 0xF1BBu, 0xF1BBu, 0xF147u,
0xF148u, 0xF1BAu, 0xF1AFu, 0xF1AEu, 0xF1AEu, 0xF141u, 0xF142u, 0xF14Au,
0xF14Au, 0xF149u, 0xF149u, 0xF1A9u, 0xF1AAu, 0xF14Cu, 0xF14Cu, 0xF14Bu,
0xF14Bu, 0xF14Eu, 0xF14Eu, 0xF14Du, 0xF14Du, 0xF151u, 0xF150u, 0xF14Fu,
0xF14Fu, 0xF154u, 0xF153u, 0xF152u, 0xF152u, 0xF157u, 0xF156u, 0xF155u,
0xF155u, 0xF158u, 0xF158u, 0xF159u, 0xF159u, 0xF15Au, 0xF15Au, 0xF160u,
0xF160u, 0xF162u, 0xF162u, 0xF161u, 0xF161u, 0xF164u, 0xF164u, 0xF163u,
0xF163u, 0xF166u, 0xF166u, 0xF165u, 0xF165u, 0xF168u, 0xF168u, 0xF167u,
0xF167u, 0xF169u, 0xF169u, 0xF169u, 0xF169u, 0xF16Au, 0xF16Au, 0xF16Au,
0xF16Au, 0xF16Eu, 0xF16Du, 0xF16Bu, 0xF16Cu, 0xF172u, 0xF171u, 0xF16Fu,
0xF170u, 0xF175u, 0xF175u, 0xF173u, 0xF174u, 0xF178u, 0xF178u, 0xF176u,
0xF177u, 0xF17Au, 0xF17Au, 0xF179u, 0xF179u, 0xF17Cu, 0xF17Cu, 0xF17Bu,
0xF17Bu, 0xF17Eu, 0xF17Eu, 0xF17Du, 0xF17Du, 0xF1E1u, 0xF1E1u, 0xF17Fu,
0xF17Fu, 0xF1A4u, 0xF1A3u, 0xF1A1u, 0xF1A2u, 0xF1A5u, 0xF1A5u, 0xF1ACu,
0xF1ABu, 0xF1A8u, 0xF1A7u, 0xF1A6u, 0xF1A6u, 0xF1C0u, 0xF1C1u, 0xF1BEu,
0xF1BFu, 0xF1C2u, 0xF1C3u, 0xF1BDu, 0xF1BCu, 0x0000u, 0x0000u, 0x0000u,
},
};
static inline hb_codepoint_t
_hb_arabic_pua_simp_map (hb_codepoint_t codepoint)
{
if (hb_in_range<hb_codepoint_t> (codepoint, 0x0000u, 0x007Fu)) return _arabic_table_pua_simp[0][codepoint];
if (hb_in_range<hb_codepoint_t> (codepoint, 0x0080u, 0x00FFu)) return _arabic_table_pua_simp[1][codepoint - 0x0080u];
if (hb_in_range<hb_codepoint_t> (codepoint, 0x0600u, 0x067Fu)) return _arabic_table_pua_simp[2][codepoint - 0x0600u];
if (hb_in_range<hb_codepoint_t> (codepoint, 0x2000u, 0x207Fu)) return _arabic_table_pua_simp[3][codepoint - 0x2000u];
if (hb_in_range<hb_codepoint_t> (codepoint, 0xFE80u, 0xFEFFu)) return _arabic_table_pua_simp[4][codepoint - 0xFE80u];
return 0;
}
static const uint16_t _arabic_table_pua_trad[][128] = {
{ /* 0x0000u..0x007Fu */
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0xF220u, 0xF221u, 0xF222u, 0x0000u, 0x0000u, 0xF225u, 0x0000u, 0x0000u,
0xF228u, 0xF229u, 0xF22Au, 0xF22Bu, 0xF25Eu, 0xF22Du, 0xF22Eu, 0xF22Fu,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0xF23Au, 0xF23Bu, 0x0000u, 0xF23Du, 0x0000u, 0xF23Fu,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0xF25Bu, 0x0000u, 0xF25Du, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
},
{ /* 0x0080u..0x00FFu */
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0xF223u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0xF224u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF226u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF227u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
},
{ /* 0x0600u..0x067Fu */
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF22Cu, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0xF23Bu, 0x0000u, 0x0000u, 0x0000u, 0xF23Fu,
0x0000u, 0xF2D5u, 0xF245u, 0xF243u, 0xF2DAu, 0xF247u, 0xF2D9u, 0xF241u,
0xF24Cu, 0xF2D1u, 0xF250u, 0xF254u, 0xF258u, 0xF260u, 0xF264u, 0xF265u,
0xF267u, 0xF269u, 0xF26Bu, 0xF270u, 0xF274u, 0xF278u, 0xF27Eu, 0xF2A2u,
0xF2A3u, 0xF2AAu, 0xF2AEu, 0xF200u, 0xF200u, 0xF200u, 0xF200u, 0xF200u,
0xF25Fu, 0xF2B2u, 0xF2B6u, 0xF2BAu, 0xF2BEu, 0xF2C2u, 0xF2C6u, 0xF2CAu,
0xF2CBu, 0xF2D4u, 0xF2D0u, 0xF2E7u, 0xF2E8u, 0xF2EBu, 0xF2E4u, 0xF2E5u,
0xF2EAu, 0xF2E9u, 0xF2E6u, 0xF200u, 0xF200u, 0xF200u, 0xF200u, 0xF200u,
0xF200u, 0xF200u, 0xF200u, 0xF200u, 0xF200u, 0xF200u, 0xF200u, 0x0000u,
0xF230u, 0xF231u, 0xF232u, 0xF233u, 0xF234u, 0xF235u, 0xF236u, 0xF237u,
0xF238u, 0xF239u, 0x0000u, 0xF25Eu, 0xF25Eu, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
},
{ /* 0x2000u..0x207Fu */
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF20Cu, 0xF20Du, 0xF20Eu, 0xF20Fu,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF23Cu, 0xF23Eu, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
},
{ /* 0xFBD0u..0xFC4Fu */
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0xF202u, 0x0000u, 0xF21Du, 0x0000u, 0x0000u, 0x0000u, 0xF203u, 0x0000u,
0xF21Eu, 0x0000u, 0xF204u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0xF29Fu, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF212u,
0xF213u, 0xF214u, 0xF205u, 0x0000u, 0xF21Cu, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF206u, 0x0000u,
},
{ /* 0xFC50u..0xFCCFu */
0xF21Fu, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF2EFu, 0x0000u,
0xF2ECu, 0xF2EDu, 0xF2F0u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0xF215u, 0x0000u, 0x0000u, 0xF292u, 0x0000u, 0x0000u,
0xF216u, 0x0000u, 0x0000u, 0xF293u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF295u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0xF217u, 0x0000u, 0x0000u, 0xF294u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF280u, 0xF281u, 0xF282u, 0xF296u,
0x0000u, 0xF283u, 0xF284u, 0xF285u, 0xF297u, 0x0000u, 0x0000u, 0x0000u,
0xF29Au, 0x0000u, 0xF29Bu, 0x0000u, 0xF29Cu, 0x0000u, 0x0000u, 0x0000u,
0xF218u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0xF286u, 0xF287u, 0xF288u, 0xF29Du, 0xF21Au, 0xF289u, 0xF28Au,
},
{ /* 0xFCD0u..0xFD4Fu */
0xF28Bu, 0xF29Eu, 0xF28Du, 0xF28Eu, 0x0000u, 0xF298u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0xF28Fu, 0xF290u, 0xF291u, 0xF299u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0xF219u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF27Bu, 0xF27Du,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
},
{ /* 0xFD50u..0xFDCFu */
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0xF210u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
},
{ /* 0xFE80u..0xFEFFu */
0x0000u, 0xF245u, 0xF246u, 0xF243u, 0xF244u, 0xF2DAu, 0xF2DBu, 0xF247u,
0xF248u, 0xF2D9u, 0xF2D8u, 0xF2D6u, 0xF2D7u, 0xF241u, 0xF242u, 0xF24Cu,
0xF24Bu, 0xF249u, 0xF24Au, 0xF2D1u, 0xF2D2u, 0xF250u, 0xF24Fu, 0xF24Du,
0xF24Eu, 0xF254u, 0xF253u, 0xF251u, 0xF252u, 0xF258u, 0xF257u, 0xF255u,
0xF256u, 0xF260u, 0xF25Cu, 0xF259u, 0xF25Au, 0xF264u, 0xF263u, 0xF261u,
0xF262u, 0xF265u, 0xF266u, 0xF267u, 0xF268u, 0xF269u, 0xF26Au, 0xF26Bu,
0xF26Cu, 0xF270u, 0xF26Fu, 0xF26Du, 0xF26Eu, 0xF274u, 0xF273u, 0xF271u,
0xF272u, 0xF278u, 0xF277u, 0xF275u, 0xF276u, 0xF27Eu, 0xF27Cu, 0xF279u,
0xF27Au, 0xF2A2u, 0xF2A1u, 0xF27Fu, 0xF2F1u, 0xF2A6u, 0xF2A5u, 0xF2A3u,
0xF2A4u, 0xF2AAu, 0xF2A9u, 0xF2A7u, 0xF2A8u, 0xF2AEu, 0xF2ADu, 0xF2ABu,
0xF2ACu, 0xF2B2u, 0xF2B1u, 0xF2AFu, 0xF2B0u, 0xF2B6u, 0xF2B5u, 0xF2B3u,
0xF2B4u, 0xF2BAu, 0xF2B9u, 0xF2B7u, 0xF2B8u, 0xF2BEu, 0xF2BDu, 0xF2BBu,
0xF2BCu, 0xF2C2u, 0xF2C1u, 0xF2BFu, 0xF2C0u, 0xF2C6u, 0xF2C5u, 0xF2C3u,
0xF2C4u, 0xF2CAu, 0xF2C9u, 0xF2C7u, 0xF2C8u, 0xF2CBu, 0xF2CCu, 0xF2D4u,
0xF2D3u, 0xF2D0u, 0xF2CFu, 0xF2CDu, 0xF2CEu, 0xF2E0u, 0xF2E1u, 0xF2DEu,
0xF2DFu, 0xF2E2u, 0xF2E3u, 0xF2DCu, 0xF2DDu, 0x0000u, 0x0000u, 0x0000u,
},
};
static inline hb_codepoint_t
_hb_arabic_pua_trad_map (hb_codepoint_t codepoint)
{
if (hb_in_range<hb_codepoint_t> (codepoint, 0x0000u, 0x007Fu)) return _arabic_table_pua_trad[0][codepoint];
if (hb_in_range<hb_codepoint_t> (codepoint, 0x0080u, 0x00FFu)) return _arabic_table_pua_trad[1][codepoint - 0x0080u];
if (hb_in_range<hb_codepoint_t> (codepoint, 0x0600u, 0x067Fu)) return _arabic_table_pua_trad[2][codepoint - 0x0600u];
if (hb_in_range<hb_codepoint_t> (codepoint, 0x2000u, 0x207Fu)) return _arabic_table_pua_trad[3][codepoint - 0x2000u];
if (hb_in_range<hb_codepoint_t> (codepoint, 0xFBD0u, 0xFC4Fu)) return _arabic_table_pua_trad[4][codepoint - 0xFBD0u];
if (hb_in_range<hb_codepoint_t> (codepoint, 0xFC50u, 0xFCCFu)) return _arabic_table_pua_trad[5][codepoint - 0xFC50u];
if (hb_in_range<hb_codepoint_t> (codepoint, 0xFCD0u, 0xFD4Fu)) return _arabic_table_pua_trad[6][codepoint - 0xFCD0u];
if (hb_in_range<hb_codepoint_t> (codepoint, 0xFD50u, 0xFDCFu)) return _arabic_table_pua_trad[7][codepoint - 0xFD50u];
if (hb_in_range<hb_codepoint_t> (codepoint, 0xFE80u, 0xFEFFu)) return _arabic_table_pua_trad[8][codepoint - 0xFE80u];
return 0;
}
#endif /* HB_OT_SHAPER_ARABIC_PUA_HH */

View File

@ -416,22 +416,137 @@ static const uint16_t shaping_table[][4] =
static const struct ligature_set_t { static const struct ligature_set_t {
uint16_t first; uint16_t first;
struct ligature_pairs_t { struct ligature_pairs_t {
uint16_t second; uint16_t components[1];
uint16_t ligature; uint16_t ligature;
} ligatures[4]; } ligatures[14];
} ligature_table[] = } ligature_table[] =
{ {
{ 0xFE91u, {
{ {0xFEE2u}, 0xFC08u }, /* ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM */
{ {0xFEE4u}, 0xFC9Fu }, /* ARABIC LIGATURE BEH WITH MEEM INITIAL FORM */
{ {0xFEA0u}, 0xFC9Cu }, /* ARABIC LIGATURE BEH WITH JEEM INITIAL FORM */
{ {0xFEA4u}, 0xFC9Du }, /* ARABIC LIGATURE BEH WITH HAH INITIAL FORM */
{ {0xFEA8u}, 0xFC9Eu }, /* ARABIC LIGATURE BEH WITH KHAH INITIAL FORM */
}},
{ 0xFE92u, {
{ {0xFEAEu}, 0xFC6Au }, /* ARABIC LIGATURE BEH WITH REH FINAL FORM */
{ {0xFEE6u}, 0xFC6Du }, /* ARABIC LIGATURE BEH WITH NOON FINAL FORM */
{ {0xFEF2u}, 0xFC6Fu }, /* ARABIC LIGATURE BEH WITH YEH FINAL FORM */
}},
{ 0xFE97u, {
{ {0xFEE2u}, 0xFC0Eu }, /* ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM */
{ {0xFEE4u}, 0xFCA4u }, /* ARABIC LIGATURE TEH WITH MEEM INITIAL FORM */
{ {0xFEA0u}, 0xFCA1u }, /* ARABIC LIGATURE TEH WITH JEEM INITIAL FORM */
{ {0xFEA4u}, 0xFCA2u }, /* ARABIC LIGATURE TEH WITH HAH INITIAL FORM */
{ {0xFEA8u}, 0xFCA3u }, /* ARABIC LIGATURE TEH WITH KHAH INITIAL FORM */
}},
{ 0xFE98u, {
{ {0xFEAEu}, 0xFC70u }, /* ARABIC LIGATURE TEH WITH REH FINAL FORM */
{ {0xFEE6u}, 0xFC73u }, /* ARABIC LIGATURE TEH WITH NOON FINAL FORM */
{ {0xFEF2u}, 0xFC75u }, /* ARABIC LIGATURE TEH WITH YEH FINAL FORM */
}},
{ 0xFE9Bu, {
{ {0xFEE2u}, 0xFC12u }, /* ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM */
}},
{ 0xFE9Fu, {
{ {0xFEE4u}, 0xFCA8u }, /* ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM */
}},
{ 0xFEA3u, {
{ {0xFEE4u}, 0xFCAAu }, /* ARABIC LIGATURE HAH WITH MEEM INITIAL FORM */
}},
{ 0xFEA7u, {
{ {0xFEE4u}, 0xFCACu }, /* ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM */
}},
{ 0xFEB3u, {
{ {0xFEE4u}, 0xFCB0u }, /* ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM */
}},
{ 0xFEB7u, {
{ {0xFEE4u}, 0xFD30u }, /* ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM */
}},
{ 0xFED3u, {
{ {0xFEF2u}, 0xFC32u }, /* ARABIC LIGATURE FEH WITH YEH ISOLATED FORM */
}},
{ 0xFEDFu, { { 0xFEDFu, {
{ 0xFE82u, 0xFEF5u }, /* ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM */ { {0xFE9Eu}, 0xFC3Fu }, /* ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM */
{ 0xFE84u, 0xFEF7u }, /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM */ { {0xFEA0u}, 0xFCC9u }, /* ARABIC LIGATURE LAM WITH JEEM INITIAL FORM */
{ 0xFE88u, 0xFEF9u }, /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM */ { {0xFEA2u}, 0xFC40u }, /* ARABIC LIGATURE LAM WITH HAH ISOLATED FORM */
{ 0xFE8Eu, 0xFEFBu }, /* ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM */ { {0xFEA4u}, 0xFCCAu }, /* ARABIC LIGATURE LAM WITH HAH INITIAL FORM */
{ {0xFEA6u}, 0xFC41u }, /* ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM */
{ {0xFEA8u}, 0xFCCBu }, /* ARABIC LIGATURE LAM WITH KHAH INITIAL FORM */
{ {0xFEE2u}, 0xFC42u }, /* ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM */
{ {0xFEE4u}, 0xFCCCu }, /* ARABIC LIGATURE LAM WITH MEEM INITIAL FORM */
{ {0xFEF2u}, 0xFC44u }, /* ARABIC LIGATURE LAM WITH YEH ISOLATED FORM */
{ {0xFEECu}, 0xFCCDu }, /* ARABIC LIGATURE LAM WITH HEH INITIAL FORM */
{ {0xFE82u}, 0xFEF5u }, /* ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM */
{ {0xFE84u}, 0xFEF7u }, /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM */
{ {0xFE88u}, 0xFEF9u }, /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM */
{ {0xFE8Eu}, 0xFEFBu }, /* ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM */
}}, }},
{ 0xFEE0u, { { 0xFEE0u, {
{ 0xFE82u, 0xFEF6u }, /* ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM */ { {0xFEF0u}, 0xFC86u }, /* ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM */
{ 0xFE84u, 0xFEF8u }, /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM */ { {0xFE82u}, 0xFEF6u }, /* ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM */
{ 0xFE88u, 0xFEFAu }, /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM */ { {0xFE84u}, 0xFEF8u }, /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM */
{ 0xFE8Eu, 0xFEFCu }, /* ARABIC LIGATURE LAM WITH ALEF FINAL FORM */ { {0xFE88u}, 0xFEFAu }, /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM */
{ {0xFE8Eu}, 0xFEFCu }, /* ARABIC LIGATURE LAM WITH ALEF FINAL FORM */
}},
{ 0xFEE3u, {
{ {0xFEA0u}, 0xFCCEu }, /* ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM */
{ {0xFEA4u}, 0xFCCFu }, /* ARABIC LIGATURE MEEM WITH HAH INITIAL FORM */
{ {0xFEA8u}, 0xFCD0u }, /* ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM */
{ {0xFEE4u}, 0xFCD1u }, /* ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM */
}},
{ 0xFEE7u, {
{ {0xFEE2u}, 0xFC4Eu }, /* ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM */
{ {0xFEE4u}, 0xFCD5u }, /* ARABIC LIGATURE NOON WITH MEEM INITIAL FORM */
{ {0xFEA0u}, 0xFCD2u }, /* ARABIC LIGATURE NOON WITH JEEM INITIAL FORM */
{ {0xFEA4u}, 0xFCD3u }, /* ARABIC LIGATURE NOON WITH HAH INITIAL FORM */
}},
{ 0xFEE8u, {
{ {0xFEF2u}, 0xFC8Fu }, /* ARABIC LIGATURE NOON WITH YEH FINAL FORM */
}},
{ 0xFEF3u, {
{ {0xFEA0u}, 0xFCDAu }, /* ARABIC LIGATURE YEH WITH JEEM INITIAL FORM */
{ {0xFEA4u}, 0xFCDBu }, /* ARABIC LIGATURE YEH WITH HAH INITIAL FORM */
{ {0xFEA8u}, 0xFCDCu }, /* ARABIC LIGATURE YEH WITH KHAH INITIAL FORM */
{ {0xFEE4u}, 0xFCDDu }, /* ARABIC LIGATURE YEH WITH MEEM INITIAL FORM */
}},
{ 0xFEF4u, {
{ {0xFEAEu}, 0xFC91u }, /* ARABIC LIGATURE YEH WITH REH FINAL FORM */
{ {0xFEE6u}, 0xFC94u }, /* ARABIC LIGATURE YEH WITH NOON FINAL FORM */
}},
};
static const struct ligature_mark_set_t {
uint16_t first;
struct ligature_pairs_t {
uint16_t components[1];
uint16_t ligature;
} ligatures[5];
} ligature_mark_table[] =
{
{ 0x0651u, {
{ {0x064Cu}, 0xFC5Eu }, /* ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM */
{ {0x064Eu}, 0xFC60u }, /* ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM */
{ {0x064Fu}, 0xFC61u }, /* ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM */
{ {0x0650u}, 0xFC62u }, /* ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM */
{ {0x064Bu}, 0xF2EEu }, /* PUA ARABIC LIGATURE SHADDA WITH FATHATAN ISOLATED FORM */
}},
};
static const struct ligature_3_set_t {
uint16_t first;
struct ligature_triplets_t {
uint16_t components[2];
uint16_t ligature;
} ligatures[3];
} ligature_3_table[] =
{
{ 0xFEDFu, {
{ {0xFEE4u, 0xFEA4u}, 0xFD88u}, /* ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM */
{ {0xFEE0u, 0xFEEAu}, 0xF201u}, /* PUA ARABIC LIGATURE LELLAH ISOLATED FORM */
{ {0xFEE4u, 0xFEA0u}, 0xF211u}, /* PUA ARABIC LIGATURE LAM WITH MEEM WITH JEEM INITIAL FORM */
}}, }},
}; };

View File

@ -137,6 +137,7 @@ hb_base_sources = files(
'hb-ot-post-table.hh', 'hb-ot-post-table.hh',
'hb-ot-shaper-arabic-fallback.hh', 'hb-ot-shaper-arabic-fallback.hh',
'hb-ot-shaper-arabic-joining-list.hh', 'hb-ot-shaper-arabic-joining-list.hh',
'hb-ot-shaper-arabic-pua.hh',
'hb-ot-shaper-arabic-table.hh', 'hb-ot-shaper-arabic-table.hh',
'hb-ot-shaper-arabic-win1256.hh', 'hb-ot-shaper-arabic-win1256.hh',
'hb-ot-shaper-arabic.cc', 'hb-ot-shaper-arabic.cc',

Binary file not shown.

Binary file not shown.

View File

@ -1 +1,11 @@
../fonts/df768b9c257e0c9c35786c47cae15c46571d56be.ttf;;U+0633,U+064F,U+0644,U+064E,U+0651,U+0627,U+0651,U+0650,U+0645,U+062A,U+06CC;[uni06CC.fina=10+1655|uni062A.medi=9+868|uni0645.init=8+1098|uni0650=2@148,0+0|uni0651=2@187,736+0|uni064E=2@883,1259+0|uni0651=2@922,736+0|uni06440627.fina=2+1470|uni064F=0@629,-10+0|uni0633.init=0+1585] ../fonts/df768b9c257e0c9c35786c47cae15c46571d56be.ttf;;U+0633,U+064F,U+0644,U+064E,U+0651,U+0627,U+0651,U+0650,U+0645,U+062A,U+06CC;[uni06CC.fina=10+1655|uni062A.medi=9+868|uni0645.init=8+1098|uni0650=2@148,0+0|uni0651=2@187,736+0|uni064E=2@883,1259+0|uni0651=2@922,736+0|uni06440627.fina=2+1470|uni064F=0@629,-10+0|uni0633.init=0+1585]
../fonts/SimpArabicTest.ttf;--no-positions;U+0628,U+0650,U+0633,U+0652,U+0645,U+0650,U+0020,U+0020,U+0627,U+0644,U+0644,U+0647,U+0020,U+0627,U+0644,U+0631,U+0651,U+064E,U+062D,U+0652,U+0645,U+064E,U+0646,U+0650,U+0020,U+0627,U+0644,U+0631,U+062D,U+0650,U+064A,U+0645;[daggerdbl=31|c142=30|twosuperior=28|bracketleft=28|c=27|quotedblbase=26|J=25|parenright=24|twosuperior=22|Eacute=22|logicalnot=20|dagger=20|registered=18|bracketleft=18|logicalnot=15|plusminus=15|c=15|quotedblbase=14|J=13|parenright=12|guilsinglleft=11|quotedblbase=10|quotedblbase=9|J=8|parenright=7|parenright=6|twosuperior=4|daggerdbl=4|registered=2|j=2|twosuperior=0|R=0]
../fonts/SimpArabicTest.ttf;;U+0020,U+0644,U+0627,U+0020,U+0644,U+0623,U+0020,U+0644,U+064E,U+0623,U+064E,U+0020,U+0623,U+064E,U+0646,U+062A;[U=15+693|DEL=14+227|logicalnot=12@17,307+0|L=12+289|parenright=11+391|logicalnot=7@41,267+0|logicalnot=7@378,267+0|brokenbar=7+674|parenright=6+391|brokenbar=4+674|parenright=3+391|yen=1+709|parenright=0+391]
../fonts/SimpArabicTest.ttf;;U+0021,U+0022,U+00AB,U+00BB,U+0025,U+00D7,U+00F7,U+0028,U+0020,U+0029,U+002A,U+002B,U+060C,U+002E,U+002F,U+003A,U+061B,U+2018,U+003D,U+2019,U+061F,U+005B,U+005D,U+002D,U+0022;[asterisk=0+269|plus=1+408|comma=2+509|hyphen=3+509|period=4+573|slash=5+572|zero=6+572|one=7+300|parenright=8+391|two=9+300|three=10+551|four=11+572|five=12+283|seven=13+268|eight=14+372|C=15+268|D=16+295|E=17+175|F=18+572|G=19+175|H=20+485|d=21+329|f=22+329|six=23+322|plus=24+408]
../fonts/SimpArabicTest.ttf;;U+061F,U+003F,U+0640;[H=0+485|H=1+485|h=2+171]
../fonts/SimpArabicTest.ttf;;U+0628,U+0644,U+0627,U+0020,U+0628,U+0644,U+0625;[ordfeminine=5+674|R=4+232|parenright=3+391|yen=1+709|R=0+232]
../fonts/TradArabicTest.ttf;;U+0628,U+0650,U+0633,U+0652,U+0645,U+0650,U+0020,U+0020,U+0627,U+0644,U+0644,U+0647,U+0020,U+0627,U+0644,U+0631,U+0651,U+064E,U+062D,U+0652,U+0645,U+064E,U+0646,U+0650,U+0020,U+0627,U+0644,U+0631,U+062D,U+0650,U+064A,U+0645;[fnmeem=31+1069|midya=30+499|kasrah2=28@151,0+0|inhaa=28+1341|fnra=27+702|inlam=26+358|alef=25+444|righttoleftspace=24+468|kasrah2=22@110,-604+0|fnnoon=22+1259|fathah2=18@-145,-168+0|sukun2=18@760,-166+0|f29b=18+1497|fahtanonshaddah2=15@-51,-416+0|fnra=15+702|inlam=14+358|alef=13+444|righttoleftspace=12+468|Allah=9+1513|alef=8+444|righttoleftspace=7+468|righttoleftspace=6+468|kasrah2=4@15,-1102+0|fnmeem=4+1069|sukun2=2@220,-386+0|midseen=2+1163|kasrah2=0@-324,-403+0|inbaa=0+389]
../fonts/TradArabicTest.ttf;;U+0020,U+0644,U+0627,U+0020,U+0644,U+0623,U+0020,U+0644,U+064E,U+0623,U+064E,U+0020,U+0623,U+064E,U+0646,U+062A;[fntaa=15+1808|innoon=14+389|fathah2=12@-279,883+0|hamzahonalef=12+479|righttoleftspace=11+468|fathah2=7@-190,862+0|fathah2=7@468,862+0|hamzahonlamelef=7+1316|righttoleftspace=6+468|hamzahonlamelef=4+1316|righttoleftspace=3+468|lamelef=1+1316|righttoleftspace=0+468]
../fonts/TradArabicTest.ttf;;U+0021,U+0022,U+00AB,U+00BB,U+0025,U+00D7,U+00F7,U+0028,U+0020,U+0029,U+002A,U+002B,U+060C,U+002E,U+002F,U+003A,U+061B,U+2018,U+003D,U+2019,U+061F,U+005B,U+005D,U+002D,U+0022;[greater=0+481|question=1+559|at=2+849|A=3+849|percentarabic=4+1353|C=5+927|D=6+1196|E=7+855|righttoleftspace=8+468|F=9+855|G=10+884|H=11+1083|commaarabic=12+755|K=13+649|L=14+704|W=15+450|semicolonarabic=16+755|.notdef=17+745|Z=18+1128|.notdef=19+745|questionarabic=20+845|x=21+739|z=22+739|J=23+753|question=24+559]
../fonts/TradArabicTest.ttf;;U+061F,U+003F,U+0640;[questionarabic=0+845|questionarabic=1+845|tatweelnarrow=2+378]
../fonts/TradArabicTest.ttf;;U+0644,U+0645,U+0020,U+0628,U+0645,U+0627;[fnalef=5+468|f296=3+897|righttoleftspace=2+468|f205=0+903]