Implemented -[uiprivCombinedFontAttr hash].
This commit is contained in:
parent
9e57c78fb3
commit
93c375fd94
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue