Fixed improper breaks in Unix attribute handling.

This commit is contained in:
Pietro Gagliardi 2017-02-20 19:51:00 -05:00
parent d4b38cd3b7
commit 4a1642cea2
2 changed files with 21 additions and 1 deletions

View File

@ -307,6 +307,7 @@ static void applyAndFreeFontAttributes(struct foreachParams *p)
fp = (struct fontParams *) [val pointerValue];
font = fontdescToCTFont(fp);
range.location = [key integerValue];
// TODO this is wrong for surrogate pairs
range.length = 1;
CFAttributedStringSetAttribute(p->mas, range, kCTFontAttributeName, font);
CFRelease(font);

View File

@ -1,9 +1,13 @@
// 12 february 2017
#include "uipriv_unix.h"
// TODO ligatures items turn ligatures *OFF*?!
// TODO actually does not specifying a feature revert to default?
// we need to collect all the OpenType features and background blocks and add them all at once
// TODO rename this struct to something that isn't exclusively foreach-ing?
struct foreachParams {
const char *s;
PangoAttrList *attrs;
// keys are pointers to size_t maintained by g_new0()/g_free()
// values are GStrings
@ -31,6 +35,8 @@ static void freeFeatureString(gpointer s)
g_string_free((GString *) s, TRUE);
}
#define isCodepointStart(b) (((uint8_t) (b)) <= 0x7F || ((uint8_t) (b)) >= 0xC0)
static void ensureFeaturesInRange(struct foreachParams *p, size_t start, size_t end)
{
size_t i;
@ -38,6 +44,9 @@ static void ensureFeaturesInRange(struct foreachParams *p, size_t start, size_t
GString *new;
for (i = start; i < end; i++) {
// don't create redundant entries; see below
if (!isCodepointStart(p->s[i]))
continue;
new = (GString *) g_hash_table_lookup(p->features, &i);
if (new != NULL)
continue;
@ -79,6 +88,9 @@ static void doOpenType(const char *featureTag, uint32_t param, void *data)
ensureFeaturesInRange(p->p, p->start, p->end);
for (i = p->start; i < p->end; i++) {
// don't use redundant entries; see below
if (!isCodepointStart(p->s[i]))
continue;
s = (GString *) g_hash_table_lookup(p->p->features, &i);
g_string_append_printf(s, "\"%s\" %" PRIu32 ", ",
featureTag, param);
@ -226,10 +238,16 @@ static gboolean applyFeatures(gpointer key, gpointer value, gpointer data)
struct foreachParams *p = (struct foreachParams *) data;
size_t *pos = (size_t *) key;
GString *s = (GString *) value;
size_t n;
// remove the trailing comma/space
g_string_truncate(s, s->len - 2);
addattr(p, *pos, *pos + 1,
// make sure we cover an entire code point
// otherwise Pango will break apart multi-byte characters, spitting out U+FFFD characters at the invalid points
n = 1;
while (!isCodepointStart(p->s[*pos + n]))
n++;
addattr(p, *pos, *pos + n,
FUTURE_pango_attr_font_features_new(s->str));
return TRUE; // always delete; we're emptying the map
}
@ -244,6 +262,7 @@ PangoAttrList *attrstrToPangoAttrList(uiDrawTextLayoutParams *p/*TODO, NSArray *
{
struct foreachParams fep;
fep.s = uiAttributedStringString(p->String);
fep.attrs = pango_attr_list_new();
fep.features = g_hash_table_new_full(
featurePosHash, featurePosEqual,