Committed by
GitHub
Fix Arabic fonts missing isolated form ( mostly Arabic Google fonts ) (#1451)
* Add RTL support to Flex widget * Add RTL support to Wrap widget * Add RTL support to EdgeInsets widget Add RTL support Page and MultiPage * Add RTL support to BorderRadius widget Add RTL support Alignment * Add RTL support to GridView * Add test annotations * Add TextAlign.start and TextAlign.end and fix Line.realign accordingly change widgets geometry to directional geometry * support multi page slots alignments * support stack's Positioned directional * Fix: some Arabic fonts do not render the isolated from because it doesn't have a corresponding glyph * format code
Showing
2 changed files
with
48 additions
and
1 deletions
| @@ -38,6 +38,46 @@ bool isArabicDiacriticValue(int letter) { | @@ -38,6 +38,46 @@ bool isArabicDiacriticValue(int letter) { | ||
| 38 | return _arabicDiacritics.containsValue(letter); | 38 | return _arabicDiacritics.containsValue(letter); |
| 39 | } | 39 | } |
| 40 | 40 | ||
| 41 | +/// Arabic characters that have different unicode values | ||
| 42 | +/// but should point to the same glyph. | ||
| 43 | +const Map<int, int> basicToIsolatedMappings = { | ||
| 44 | + 0x0627: 0xFE8D, // ا | ||
| 45 | + 0x0628: 0xFE8F, // ب | ||
| 46 | + 0x062A: 0xFE95, // ت | ||
| 47 | + 0x062B: 0xFE99, // ث | ||
| 48 | + 0x062C: 0xFE9D, // ج | ||
| 49 | + 0x062D: 0xFEA1, // ح | ||
| 50 | + 0x062E: 0xFEA5, // خ | ||
| 51 | + 0x062F: 0xFEA9, // د | ||
| 52 | + 0x0630: 0xFEAB, // ذ | ||
| 53 | + 0x0631: 0xFEAD, // ر | ||
| 54 | + 0x0632: 0xFEAF, // ز | ||
| 55 | + 0x0633: 0xFEB1, // س | ||
| 56 | + 0x0634: 0xFEB5, // ش | ||
| 57 | + 0x0635: 0xFEB9, // ص | ||
| 58 | + 0x0636: 0xFEBD, // ض | ||
| 59 | + 0x0637: 0xFEC1, // ط | ||
| 60 | + 0x0638: 0xFEC5, // ظ | ||
| 61 | + 0x0639: 0xFEC9, // ع | ||
| 62 | + 0x063A: 0xFECD, // غ | ||
| 63 | + 0x0641: 0xFED1, // ف | ||
| 64 | + 0x0642: 0xFED5, // ق | ||
| 65 | + 0x0643: 0xFED9, // ك | ||
| 66 | + 0x0644: 0xFEDD, // ل | ||
| 67 | + 0x0645: 0xFEE1, // م | ||
| 68 | + 0x0646: 0xFEE5, // ن | ||
| 69 | + 0x0647: 0xFEE9, // ه | ||
| 70 | + 0x0648: 0xFEED, // و | ||
| 71 | + 0x064A: 0xFEEF, // ي | ||
| 72 | + 0x0621: 0xFE80, // ء | ||
| 73 | + 0x0622: 0xFE81, // آ | ||
| 74 | + 0x0623: 0xFE83, // أ | ||
| 75 | + 0x0624: 0xFE85, // ؤ | ||
| 76 | + 0x0625: 0xFE87, // إ | ||
| 77 | + 0x0626: 0xFE89, // ئ | ||
| 78 | + 0x0629: 0xFE93, // ة | ||
| 79 | +}; | ||
| 80 | + | ||
| 41 | /// Applies THE BIDIRECTIONAL ALGORITHM using (https://pub.dev/packages/bidi) | 81 | /// Applies THE BIDIRECTIONAL ALGORITHM using (https://pub.dev/packages/bidi) |
| 42 | String logicalToVisual(String input) { | 82 | String logicalToVisual(String input) { |
| 43 | final buffer = StringBuffer(); | 83 | final buffer = StringBuffer(); |
| @@ -19,8 +19,8 @@ | @@ -19,8 +19,8 @@ | ||
| 19 | import 'dart:convert'; | 19 | import 'dart:convert'; |
| 20 | import 'dart:math' as math; | 20 | import 'dart:math' as math; |
| 21 | import 'dart:typed_data'; | 21 | import 'dart:typed_data'; |
| 22 | - | ||
| 23 | import 'package:meta/meta.dart'; | 22 | import 'package:meta/meta.dart'; |
| 23 | +import 'bidi_utils.dart' as bidi; | ||
| 24 | 24 | ||
| 25 | import 'font_metrics.dart'; | 25 | import 'font_metrics.dart'; |
| 26 | 26 | ||
| @@ -316,6 +316,13 @@ class TtfParser { | @@ -316,6 +316,13 @@ class TtfParser { | ||
| 316 | glyphIndex = bytes.getUint16(glyphIndexAddress); | 316 | glyphIndex = bytes.getUint16(glyphIndexAddress); |
| 317 | } | 317 | } |
| 318 | charToGlyphIndexMap[c] = glyphIndex; | 318 | charToGlyphIndexMap[c] = glyphIndex; |
| 319 | + | ||
| 320 | + /// Having both the unicode and the isolated form code | ||
| 321 | + /// point to the same glyph index because some fonts | ||
| 322 | + /// do not have a glyph for the isolated form.\ | ||
| 323 | + if (bidi.basicToIsolatedMappings.containsKey(c)) { | ||
| 324 | + charToGlyphIndexMap[bidi.basicToIsolatedMappings[c]!] = glyphIndex; | ||
| 325 | + } | ||
| 319 | } | 326 | } |
| 320 | } | 327 | } |
| 321 | } | 328 | } |
-
Please register or login to post a comment