1diff --git a/modules/basic/.libs/basic-coretext.o b/modules/basic/.libs/basic-coretext.o 2index 13cce67..80c3268 100644 3Binary files a/modules/basic/.libs/basic-coretext.o and b/modules/basic/.libs/basic-coretext.o differ 4diff --git a/modules/basic/.libs/pango-basic-coretext.so b/modules/basic/.libs/pango-basic-coretext.so 5index 70bb117..d0940c4 100755 6Binary files a/modules/basic/.libs/pango-basic-coretext.so and b/modules/basic/.libs/pango-basic-coretext.so differ 7diff --git a/modules/basic/basic-coretext.c b/modules/basic/basic-coretext.c 8index c34460a..46d83ff 100644 9--- a/modules/basic/basic-coretext.c 10+++ b/modules/basic/basic-coretext.c 11@@ -92,6 +92,7 @@ struct RunIterator 12 CTRunRef current_run; 13 CFIndex *current_indices; 14 const CGGlyph *current_cgglyphs; 15+ CGGlyph *current_cgglyphs_buffer; 16 CTRunStatus current_run_status; 17 }; 18 19@@ -101,6 +102,9 @@ run_iterator_free_current_run (struct RunIterator *iter) 20 iter->current_run_number = -1; 21 iter->current_run = NULL; 22 iter->current_cgglyphs = NULL; 23+ if (iter->current_cgglyphs_buffer) 24+ free (iter->current_cgglyphs_buffer); 25+ iter->current_cgglyphs_buffer = NULL; 26 if (iter->current_indices) 27 free (iter->current_indices); 28 iter->current_indices = NULL; 29@@ -116,10 +120,18 @@ run_iterator_set_current_run (struct RunIterator *iter, 30 31 iter->current_run_number = run_number; 32 iter->current_run = CFArrayGetValueAtIndex (iter->runs, run_number); 33+ ct_glyph_count = CTRunGetGlyphCount (iter->current_run); 34+ 35 iter->current_run_status = CTRunGetStatus (iter->current_run); 36 iter->current_cgglyphs = CTRunGetGlyphsPtr (iter->current_run); 37+ if (!iter->current_cgglyphs) 38+ { 39+ iter->current_cgglyphs_buffer = (CGGlyph *)malloc (sizeof (CGGlyph) * ct_glyph_count); 40+ CTRunGetGlyphs (iter->current_run, CFRangeMake (0, ct_glyph_count), 41+ iter->current_cgglyphs_buffer); 42+ iter->current_cgglyphs = iter->current_cgglyphs_buffer; 43+ } 44 45- ct_glyph_count = CTRunGetGlyphCount (iter->current_run); 46 iter->current_indices = malloc (sizeof (CFIndex *) * ct_glyph_count); 47 CTRunGetStringIndices (iter->current_run, CFRangeMake (0, ct_glyph_count), 48 iter->current_indices); 49@@ -237,6 +249,7 @@ run_iterator_create (struct RunIterator *iter, 50 iter->current_run = NULL; 51 iter->current_indices = NULL; 52 iter->current_cgglyphs = NULL; 53+ iter->current_cgglyphs_buffer = NULL; 54 55 /* Create CTLine */ 56 attributes = CFDictionaryCreate (kCFAllocatorDefault, 57diff --git a/modules/basic/basic-coretext.c.orig b/modules/basic/basic-coretext.c.orig 58index 0a2c27f..c34460a 100644 59--- a/modules/basic/basic-coretext.c.orig 60+++ b/modules/basic/basic-coretext.c.orig 61@@ -166,7 +166,42 @@ run_iterator_run_is_non_monotonic (struct RunIterator *iter) 62 static gunichar 63 run_iterator_get_character (struct RunIterator *iter) 64 { 65- return CFStringGetCharacterAtIndex (iter->cstr, iter->current_indices[iter->ct_i]); 66+ int lower, upper; 67+ 68+ lower = iter->current_indices[iter->ct_i]; 69+ if (iter->ct_i + 1 < CTRunGetGlyphCount (iter->current_run)) 70+ upper = iter->current_indices[iter->ct_i + 1]; 71+ else 72+ { 73+ CFRange range = CTRunGetStringRange (iter->current_run); 74+ upper = range.location + range.length; 75+ } 76+ 77+ if (upper - lower == 1) 78+ return CFStringGetCharacterAtIndex (iter->cstr, lower); 79+ if (upper - lower == 2) 80+ { 81+ /* Character is encoded in two UTF16 code points. */ 82+ gunichar *ch; 83+ gunichar retval; 84+ gunichar2 orig[2]; 85+ 86+ orig[0] = CFStringGetCharacterAtIndex (iter->cstr, lower); 87+ orig[1] = CFStringGetCharacterAtIndex (iter->cstr, lower + 1); 88+ 89+ ch = g_utf16_to_ucs4 (orig, 2, NULL, NULL, NULL); 90+ retval = *ch; 91+ g_free (ch); 92+ 93+ return retval; 94+ } 95+ 96+ /* This should not be reached, because other cases cannot occur. Instead 97+ * of crashing, return the first character which will likely be displayed 98+ * as unknown glyph. 99+ */ 100+ 101+ return CFStringGetCharacterAtIndex (iter->cstr, lower); 102 } 103 104 static CGGlyph 105@@ -175,12 +210,6 @@ run_iterator_get_cgglyph (struct RunIterator *iter) 106 return iter->current_cgglyphs[iter->ct_i]; 107 } 108 109-static CFIndex 110-run_iterator_get_index (struct RunIterator *iter) 111-{ 112- return iter->current_indices[iter->ct_i]; 113-} 114- 115 static gboolean 116 run_iterator_create (struct RunIterator *iter, 117 const char *text, 118@@ -190,13 +219,17 @@ run_iterator_create (struct RunIterator *iter, 119 char *copy; 120 CFDictionaryRef attributes; 121 CFAttributedStringRef attstr; 122+ int val = 0; 123+ CFNumberRef number = CFNumberCreate (kCFAllocatorDefault, kCFNumberIntType, &val); 124 125 CFTypeRef keys[] = { 126- (CFTypeRef) kCTFontAttributeName 127+ (CFTypeRef) kCTFontAttributeName, 128+ kCTLigatureAttributeName 129 }; 130 131 CFTypeRef values[] = { 132- ctfont 133+ ctfont, 134+ number 135 }; 136 137 /* Initialize RunIterator structure */ 138@@ -209,7 +242,7 @@ run_iterator_create (struct RunIterator *iter, 139 attributes = CFDictionaryCreate (kCFAllocatorDefault, 140 (const void **)keys, 141 (const void **)values, 142- 1, 143+ sizeof (keys) / sizeof (keys[0]), 144 &kCFCopyStringDictionaryKeyCallBacks, 145 &kCFTypeDictionaryValueCallBacks); 146 147@@ -233,6 +266,7 @@ run_iterator_create (struct RunIterator *iter, 148 iter->line = CTLineCreateWithAttributedString (attstr); 149 iter->runs = CTLineGetGlyphRuns (iter->line); 150 151+ CFRelease (number); 152 CFRelease (attstr); 153 CFRelease (attributes); 154 155@@ -336,7 +370,7 @@ create_core_text_glyph_list (const char *text, 156 struct GlyphInfo *gi; 157 158 gi = g_slice_new (struct GlyphInfo); 159- gi->index = run_iterator_get_index (&riter); 160+ gi->index = riter.total_ct_i; 161 gi->cgglyph = run_iterator_get_cgglyph (&riter); 162 gi->wc = run_iterator_get_character (&riter); 163 164@@ -378,9 +412,8 @@ basic_engine_shape (PangoEngineShape *engine, 165 * glyph sequence generated by the CoreText typesetter: 166 * # E.g. zero-width spaces do not end up in the CoreText glyph sequence. We have 167 * to manually account for the gap in the character indices. 168- * # Sometimes, CoreText generates two glyph for the same character index. We 169- * currently handle this "properly" as in we do not crash or corrupt memory, 170- * but that's about it. 171+ * # Sometimes, CoreText generates two glyph for the same character index. These 172+ * are properly composed into a single 32-bit gunichar. 173 * # Due to mismatches in size, the CoreText glyph sequence can either be longer or 174 * shorter than the PangoGlyphString. Note that the size of the PangoGlyphString 175 * should match the number of characters in "text". 176@@ -392,11 +425,6 @@ basic_engine_shape (PangoEngineShape *engine, 177 * increasing/decreasing. 178 * 179 * FIXME items for future fixing: 180- * # CoreText strings are UTF16, and the indices *often* refer to characters, 181- * but not *always*. Notable exception is when a character is encoded using 182- * two UTF16 code points. This are two characters in a CFString. At this point 183- * advancing a single character in the CFString and advancing a single character 184- * using g_utf8_next_char in the const char string goes out of sync. 185 * # We currently don't bother about LTR, Pango core appears to fix this up for us. 186 * (Even when we cared warnings were generated that strings were in the wrong 187 * order, this should be investigated). 188