Implemented -[uiprivCombinedFontAttr hash].

This commit is contained in:
Pietro Gagliardi 2018-03-05 08:59:45 -05:00
parent 9e57c78fb3
commit 93c375fd94
1 changed files with 55 additions and 9 deletions

View File

@ -85,16 +85,32 @@ enum {
}; };
static const int toc[] = { static const int toc[] = {
[uiAttributeFamily] = cFamily, [uiAttributeTypeFamily] = cFamily,
[uiAttributeSize] = cSize, [uiAttributeTypeSize] = cSize,
[uiAttributeWeight] = cWeight, [uiAttributeTypeWeight] = cWeight,
[uiAttributeItalic] = cItalic, [uiAttributeTypeItalic] = cItalic,
[uiAttributeStretch] = cStretch, [uiAttributeTypeStretch] = cStretch,
[uiAttributeFeatures] = cFeatures, [uiAttributeTypeFeatures] = cFeatures,
}; };
static uiForEach featuresHash(const uiOpenTypeFeatures *otf, char a, char b, char c, char d, uint32_t value, void *data)
{
NSUInteger *hash = (NSUInteger *) data;
uint32_t tag;
tag = (((uint32_t) a) & 0xFF) << 24;
tag |= (((uint32_t) b) & 0xFF) << 16;
tag |= (((uint32_t) c) & 0xFF) << 8;
tag |= ((uint32_t) d) & 0xFF;
*hash ^= tag;
*hash ^= value;
return uiForEachContinue;
}
@interface uiprivCombinedFontAttr : NSObject<NSCopying> { @interface uiprivCombinedFontAttr : NSObject<NSCopying> {
uiAttribute *attrs[nc]; uiAttribute *attrs[nc];
BOOL hasHash;
NSUInteger hash;
} }
- (void)setAttribute:(uiAttribute *)attr; - (void)setAttribute:(uiAttribute *)attr;
- (CTFontRef)toCTFontWithDefaultFont:(uiDrawFontDescriptor *)defaultFont; - (CTFontRef)toCTFontWithDefaultFont:(uiDrawFontDescriptor *)defaultFont;
@ -105,8 +121,10 @@ static const int toc[] = {
- (id)init - (id)init
{ {
self = [super init]; self = [super init];
if (self) if (self) {
memset(self->attrs, 0, nc * sizeof (uiAttribute *)); memset(self->attrs, 0, nc * sizeof (uiAttribute *));
self->hasHash = NO;
}
return self; return self;
} }
@ -131,6 +149,8 @@ static const int toc[] = {
for (i = 0; i < nc; i++) for (i = 0; i < nc; i++)
if (self->attrs[i] != NULL) if (self->attrs[i] != NULL)
ret->attrs[i] = uiprivAttributeRetain(self->attrs[i]); ret->attrs[i] = uiprivAttributeRetain(self->attrs[i]);
ret->hasHash = self->hasHash;
ret->hash = self->hash;
return ret; return ret;
} }
@ -142,6 +162,7 @@ static const int toc[] = {
if (self->attrs[index] != NULL) if (self->attrs[index] != NULL)
uiprivAttributeRelease(self->attrs[index]); uiprivAttributeRelease(self->attrs[index]);
self->attrs[index] = uiprivAttributeRetain(attr); self->attrs[index] = uiprivAttributeRetain(attr);
self->hasHash = NO;
} }
- (BOOL)isEqual:(id)bb - (BOOL)isEqual:(id)bb
@ -164,8 +185,33 @@ static const int toc[] = {
- (NSUInteger)hash - (NSUInteger)hash
{ {
// TODO implement this somehow; not quite sure how... if (self->hasHash)
return [super hash]; return self->hash;
@autoreleasepool {
NSString *family;
NSNumber *size;
self->hash = 0;
if (self->attrs[cFamily] != NULL) {
family = [NSString stringWithUTF8String:uiAttributeFamily(self->attrs[cFamily])];
// TODO make sure this aligns with case-insensitive compares when those are done in common/attribute.c
self->hash ^= [[family uppercaseString] hash];
}
if (self->attrs[cSize] != NULL) {
size = [NSNumber numberWithDouble:uiAttributeSize(self->attrs[cSize])];
self->hash ^= [size hash];
}
if (self->attrs[cWeight] != NULL)
self->hash ^= (NSUInteger) uiAttributeWeight(self->attrs[cWeight]);
if (self->attrs[cItalic] != NULL)
self->hash ^= (NSUInteger) uiAttributeItalic(self->attrs[cItalic]);
if (self->attrs[cStretch] != NULL)
self->hash ^= (NSUInteger) uiAttributeStretch(self->attrs[cStretch]);
if (self->attrs[cFeatures] != NULL)
uiOpenTypeFeaturesForEach(uiAttributeFeatures(self->attrs[cFeatures]), featuresHash, &(self->hash));
self->hasHash = YES;
}
return self->hash;
} }
- (CTFontRef)toCTFontWithDefaultFont:(uiDrawFontDescriptor *)defaultFont - (CTFontRef)toCTFontWithDefaultFont:(uiDrawFontDescriptor *)defaultFont