Prepared the OS X backend for adding feature attributes. Each feature will be a separate attribute for better composability.
This commit is contained in:
parent
ff986858f1
commit
9a19c65323
|
@ -12,23 +12,32 @@ struct foreachParams {
|
||||||
NSMutableArray *backgroundBlocks;
|
NSMutableArray *backgroundBlocks;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define maxFeatures 32
|
||||||
|
|
||||||
|
struct fontParams {
|
||||||
|
uiDrawFontDescriptor desc;
|
||||||
|
uint16_t featureTypes[maxFeatures];
|
||||||
|
uint16_t featureSpecifiers[maxFeatures];
|
||||||
|
size_t nFeatures;
|
||||||
|
};
|
||||||
|
|
||||||
static void ensureFontInRange(struct foreachParams *p, size_t start, size_t end)
|
static void ensureFontInRange(struct foreachParams *p, size_t start, size_t end)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
NSNumber *n;
|
NSNumber *n;
|
||||||
uiDrawFontDescriptor *new;
|
struct fontParams *new;
|
||||||
|
|
||||||
for (i = start; i < end; i++) {
|
for (i = start; i < end; i++) {
|
||||||
n = [NSNumber numberWithInteger:i];
|
n = [NSNumber numberWithInteger:i];
|
||||||
if ([p->converted objectForKey:n] != nil)
|
if ([p->converted objectForKey:n] != nil)
|
||||||
continue;
|
continue;
|
||||||
new = uiNew(uiDrawFontDescriptor);
|
new = uiNew(struct fontParams);
|
||||||
*new = *(p->defaultFont);
|
new->desc = *(p->defaultFont);
|
||||||
[p->converted setObject:[NSValue valueWithPointer:new] forKey:n];
|
[p->converted setObject:[NSValue valueWithPointer:new] forKey:n];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void adjustFontInRange(struct foreachParams *p, size_t start, size_t end, void (^adj)(uiDrawFontDescriptor *desc))
|
static void adjustFontInRange(struct foreachParams *p, size_t start, size_t end, void (^adj)(struct fontParams *fp))
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
NSNumber *n;
|
NSNumber *n;
|
||||||
|
@ -37,7 +46,7 @@ static void adjustFontInRange(struct foreachParams *p, size_t start, size_t end,
|
||||||
for (i = start; i < end; i++) {
|
for (i = start; i < end; i++) {
|
||||||
n = [NSNumber numberWithInteger:i];
|
n = [NSNumber numberWithInteger:i];
|
||||||
v = (NSValue *) [p->converted objectForKey:n];
|
v = (NSValue *) [p->converted objectForKey:n];
|
||||||
adj((uiDrawFontDescriptor *) [v pointerValue]);
|
adj((struct fontParams *) [v pointerValue]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,32 +83,32 @@ static int processAttribute(uiAttributedString *s, uiAttributeSpec *spec, size_t
|
||||||
switch (spec->Type) {
|
switch (spec->Type) {
|
||||||
case uiAttributeFamily:
|
case uiAttributeFamily:
|
||||||
ensureFontInRange(p, start, end);
|
ensureFontInRange(p, start, end);
|
||||||
adjustFontInRange(p, start, end, ^(uiDrawFontDescriptor *desc) {
|
adjustFontInRange(p, start, end, ^(struct fontParams *fp) {
|
||||||
desc->Family = (char *) (spec->Value);
|
fp->desc.Family = (char *) (spec->Value);
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case uiAttributeSize:
|
case uiAttributeSize:
|
||||||
ensureFontInRange(p, start, end);
|
ensureFontInRange(p, start, end);
|
||||||
adjustFontInRange(p, start, end, ^(uiDrawFontDescriptor *desc) {
|
adjustFontInRange(p, start, end, ^(struct fontParams *fp) {
|
||||||
desc->Size = spec->Double;
|
fp->desc.Size = spec->Double;
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case uiAttributeWeight:
|
case uiAttributeWeight:
|
||||||
ensureFontInRange(p, start, end);
|
ensureFontInRange(p, start, end);
|
||||||
adjustFontInRange(p, start, end, ^(uiDrawFontDescriptor *desc) {
|
adjustFontInRange(p, start, end, ^(struct fontParams *fp) {
|
||||||
desc->Weight = (uiDrawTextWeight) (spec->Value);
|
fp->desc.Weight = (uiDrawTextWeight) (spec->Value);
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case uiAttributeItalic:
|
case uiAttributeItalic:
|
||||||
ensureFontInRange(p, start, end);
|
ensureFontInRange(p, start, end);
|
||||||
adjustFontInRange(p, start, end, ^(uiDrawFontDescriptor *desc) {
|
adjustFontInRange(p, start, end, ^(struct fontParams *fp) {
|
||||||
desc->Italic = (uiDrawTextItalic) (spec->Value);
|
fp->desc.Italic = (uiDrawTextItalic) (spec->Value);
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case uiAttributeStretch:
|
case uiAttributeStretch:
|
||||||
ensureFontInRange(p, start, end);
|
ensureFontInRange(p, start, end);
|
||||||
adjustFontInRange(p, start, end, ^(uiDrawFontDescriptor *desc) {
|
adjustFontInRange(p, start, end, ^(struct fontParams *fp) {
|
||||||
desc->Stretch = (uiDrawTextStretch) (spec->Value);
|
fp->desc.Stretch = (uiDrawTextStretch) (spec->Value);
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case uiAttributeColor:
|
case uiAttributeColor:
|
||||||
|
@ -144,17 +153,17 @@ static CTFontRef fontdescToCTFont(uiDrawFontDescriptor *fd)
|
||||||
static void applyAndFreeFontAttributes(struct foreachParams *p)
|
static void applyAndFreeFontAttributes(struct foreachParams *p)
|
||||||
{
|
{
|
||||||
[p->converted enumerateKeysAndObjectsUsingBlock:^(NSNumber *key, NSValue *val, BOOL *stop) {
|
[p->converted enumerateKeysAndObjectsUsingBlock:^(NSNumber *key, NSValue *val, BOOL *stop) {
|
||||||
uiDrawFontDescriptor *desc;
|
struct fontParams *fp;
|
||||||
CTFontRef font;
|
CTFontRef font;
|
||||||
CFRange range;
|
CFRange range;
|
||||||
|
|
||||||
desc = (uiDrawFontDescriptor *) [val pointerValue];
|
fp = (struct fontParams *) [val pointerValue];
|
||||||
font = fontdescToCTFont(desc);
|
font = fontdescToCTFont(&(fp->desc));
|
||||||
range.location = [key integerValue];
|
range.location = [key integerValue];
|
||||||
range.length = 1;
|
range.length = 1;
|
||||||
CFAttributedStringSetAttribute(p->mas, range, kCTFontAttributeName, font);
|
CFAttributedStringSetAttribute(p->mas, range, kCTFontAttributeName, font);
|
||||||
CFRelease(font);
|
CFRelease(font);
|
||||||
uiFree(desc);
|
uiFree(fp);
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue