// 4 march 2018
#import "../common/attrstr.h"

// opentype.m
extern CFArrayRef uiprivOpenTypeFeaturesToCTFeatures(const uiOpenTypeFeatures *otf);

// aat.m
typedef void (^uiprivAATBlock)(uint16_t type, uint16_t selector);
extern void uiprivOpenTypeToAAT(char a, char b, char c, char d, uint32_t value, uiprivAATBlock f);

// fontmatch.m
@interface uiprivFontStyleData : NSObject {
	CTFontRef font;
	CTFontDescriptorRef desc;
	CFDictionaryRef traits;
	CTFontSymbolicTraits symbolic;
	double weight;
	double width;
	BOOL didStyleName;
	CFStringRef styleName;
	BOOL didVariation;
	CFDictionaryRef variation;
	BOOL hasRegistrationScope;
	CTFontManagerScope registrationScope;
	BOOL didPostScriptName;
	CFStringRef postScriptName;
	CTFontFormat fontFormat;
	BOOL didPreferredSubFamilyName;
	CFStringRef preferredSubFamilyName;
	BOOL didSubFamilyName;
	CFStringRef subFamilyName;
	BOOL didFullName;
	CFStringRef fullName;
	BOOL didPreferredFamilyName;
	CFStringRef preferredFamilyName;
	BOOL didFamilyName;
	CFStringRef familyName;
	BOOL didVariationAxes;
	CFArrayRef variationAxes;
}
- (id)initWithFont:(CTFontRef)f;
- (id)initWithDescriptor:(CTFontDescriptorRef)d;
- (BOOL)prepare;
- (void)ensureFont;
- (CTFontSymbolicTraits)symbolicTraits;
- (double)weight;
- (double)width;
- (CFStringRef)styleName;
- (CFDictionaryRef)variation;
- (BOOL)hasRegistrationScope;
- (CTFontManagerScope)registrationScope;
- (CFStringRef)postScriptName;
- (CFDataRef)table:(CTFontTableTag)tag;
- (CTFontFormat)fontFormat;
- (CFStringRef)fontName:(CFStringRef)key;
- (CFStringRef)preferredSubFamilyName;
- (CFStringRef)subFamilyName;
- (CFStringRef)fullName;
- (CFStringRef)preferredFamilyName;
- (CFStringRef)familyName;
- (CFArrayRef)variationAxes;
@end
extern CTFontDescriptorRef uiprivFontDescriptorToCTFontDescriptor(uiFontDescriptor *fd);
extern CTFontDescriptorRef uiprivCTFontDescriptorAppendFeatures(CTFontDescriptorRef desc, const uiOpenTypeFeatures *otf);
extern void uiprivFontDescriptorFromCTFontDescriptor(CTFontDescriptorRef ctdesc, uiFontDescriptor *uidesc);

// fonttraits.m
extern void uiprivProcessFontTraits(uiprivFontStyleData *d, uiFontDescriptor *out);

// fontvariation.m
extern NSDictionary *uiprivMakeVariationAxisDict(CFArrayRef axes, CFDataRef avarTable);
extern void uiprivProcessFontVariation(uiprivFontStyleData *d, NSDictionary *axisDict, uiFontDescriptor *out);

// attrstr.m
extern void uiprivInitUnderlineColors(void);
extern void uiprivUninitUnderlineColors(void);
extern CFAttributedStringRef uiprivAttributedStringToCFAttributedString(uiDrawTextLayoutParams *p, NSArray **backgroundParams);

// drawtext.m
// TODO figure out where this type should *really* go in all the headers...
@interface uiprivDrawTextBackgroundParams : NSObject {
	size_t start;
	size_t end;
	double r;
	double g;
	double b;
	double a;
}
- (id)initWithStart:(size_t)s end:(size_t)e r:(double)red g:(double)green b:(double)blue a:(double)alpha;
- (void)draw:(CGContextRef)c layout:(uiDrawTextLayout *)layout at:(double)x y:(double)y utf8Mapping:(const size_t *)u16tou8;
@end