[coretext] Start adding support for features
Unlike AAT, looks like with CoreText very few OT features can be mapped. :(
This commit is contained in:
parent
bdd8873fd8
commit
a782a5e9a3
|
@ -205,25 +205,68 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan,
|
||||||
pchars[chars_len++] = 0xDC00 + ((c - 0x10000) & ((1 << 10) - 1));
|
pchars[chars_len++] = 0xDC00 + ((c - 0x10000) & ((1 << 10) - 1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
unsigned int *log_clusters = (unsigned int *) (pchars + chars_len);
|
||||||
|
if (num_features)
|
||||||
|
{
|
||||||
|
/* Need log_clusters to assign features. */
|
||||||
|
chars_len = 0;
|
||||||
|
for (unsigned int i = 0; i < buffer->len; i++)
|
||||||
|
{
|
||||||
|
hb_codepoint_t c = buffer->info[i].codepoint;
|
||||||
|
unsigned int cluster = buffer->info[i].cluster;
|
||||||
|
log_clusters[chars_len++] = cluster;
|
||||||
|
if (c >= 0x10000 && c < 0x110000)
|
||||||
|
log_clusters[chars_len++] = cluster; /* Surrogates. */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#undef utf16_index
|
#undef utf16_index
|
||||||
|
|
||||||
CFStringRef string_ref = CFStringCreateWithCharactersNoCopy (kCFAllocatorDefault,
|
CFStringRef string_ref = CFStringCreateWithCharactersNoCopy (NULL,
|
||||||
pchars, chars_len,
|
pchars, chars_len,
|
||||||
kCFAllocatorNull);
|
kCFAllocatorNull);
|
||||||
|
|
||||||
CFDictionaryRef attrs = CFDictionaryCreate (kCFAllocatorDefault,
|
CFMutableAttributedStringRef attr_string = CFAttributedStringCreateMutable (NULL, chars_len);
|
||||||
(const void**) &kCTFontAttributeName,
|
CFAttributedStringReplaceString (attr_string, CFRangeMake (0, 0), string_ref);
|
||||||
(const void**) &font_data->ct_font,
|
|
||||||
1, /* count of attributes */
|
|
||||||
&kCFTypeDictionaryKeyCallBacks,
|
|
||||||
&kCFTypeDictionaryValueCallBacks);
|
|
||||||
|
|
||||||
/* TODO: support features */
|
|
||||||
|
|
||||||
CFAttributedStringRef attr_string = CFAttributedStringCreate (kCFAllocatorDefault, string_ref, attrs);
|
|
||||||
CFRelease (string_ref);
|
CFRelease (string_ref);
|
||||||
CFRelease (attrs);
|
CFAttributedStringSetAttribute (attr_string, CFRangeMake (0, chars_len),
|
||||||
|
kCTFontAttributeName, font_data->ct_font);
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < num_features; i++)
|
||||||
|
{
|
||||||
|
CFStringRef a = NULL;
|
||||||
|
unsigned int v = features[i].value;
|
||||||
|
|
||||||
|
switch (features[i].tag)
|
||||||
|
{
|
||||||
|
case HB_TAG ('l','i','g','a'): a = kCTLigatureAttributeName; v = v ? 1 : 0; break;
|
||||||
|
case HB_TAG ('d','l','i','g'): a = kCTLigatureAttributeName; v = v ? 2 : 1; break;
|
||||||
|
|
||||||
|
case HB_TAG ('e','x','p','t'): a = kCTCharacterShapeAttributeName; v = v ? 11 : 16; break;
|
||||||
|
case HB_TAG ('j','s','7','8'): a = kCTCharacterShapeAttributeName; v = v ? 3 : 16; break;
|
||||||
|
case HB_TAG ('j','s','8','3'): a = kCTCharacterShapeAttributeName; v = v ? 4 : 16; break;
|
||||||
|
case HB_TAG ('j','s','9','0'): a = kCTCharacterShapeAttributeName; v = v ? 5 : 16; break;
|
||||||
|
case HB_TAG ('s','m','p','l'): a = kCTCharacterShapeAttributeName; v = v ? 2 : 16; break;
|
||||||
|
case HB_TAG ('t','r','a','d'): a = kCTCharacterShapeAttributeName; v = v ? 1 : 16; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!a)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
CFTypeRef vref = CFNumberCreate (NULL, kCFNumberIntType, &v);
|
||||||
|
unsigned int start = features[i].start;
|
||||||
|
unsigned int end = features[i].end;
|
||||||
|
for (unsigned int j = 0; j < chars_len; j++)
|
||||||
|
{
|
||||||
|
if (log_clusters[j] < start || log_clusters[j] >= end)
|
||||||
|
continue;
|
||||||
|
unsigned int range_start = j;
|
||||||
|
while (j < chars_len && log_clusters[j] >= start && log_clusters[j] < end)
|
||||||
|
j++;
|
||||||
|
CFAttributedStringSetAttribute (attr_string, CFRangeMake (range_start, j - range_start), a, vref);
|
||||||
|
}
|
||||||
|
CFRelease (vref);
|
||||||
|
}
|
||||||
|
|
||||||
CTLineRef line = CTLineCreateWithAttributedString (attr_string);
|
CTLineRef line = CTLineCreateWithAttributedString (attr_string);
|
||||||
CFRelease (attr_string);
|
CFRelease (attr_string);
|
||||||
|
|
Loading…
Reference in New Issue