From 7b02207537d35bfa1714bf8beafc921f717d100a Mon Sep 17 00:00:00 2001
From: 单军华
Date: Wed, 11 Jul 2018 10:47:42 +0800
Subject: [PATCH] 首次上传

---
 screendisplay/Pods/YYCategories/YYCategories/UIKit/UIFont+YYAdd.m |  269 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 269 insertions(+), 0 deletions(-)

diff --git a/screendisplay/Pods/YYCategories/YYCategories/UIKit/UIFont+YYAdd.m b/screendisplay/Pods/YYCategories/YYCategories/UIKit/UIFont+YYAdd.m
new file mode 100755
index 0000000..ada9047
--- /dev/null
+++ b/screendisplay/Pods/YYCategories/YYCategories/UIKit/UIFont+YYAdd.m
@@ -0,0 +1,269 @@
+//
+//  UIFont+YYAdd.m
+//  YYCategories <https://github.com/ibireme/YYCategories>
+//
+//  Created by ibireme on 14/5/11.
+//  Copyright (c) 2015 ibireme.
+//
+//  This source code is licensed under the MIT-style license found in the
+//  LICENSE file in the root directory of this source tree.
+//
+
+#import "UIFont+YYAdd.h"
+#import "YYCategoriesMacro.h"
+
+YYSYNTH_DUMMY_CLASS(UIFont_YYAdd)
+
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wprotocol"
+// Apple has implemented UIFont<NSCoding>, but did not make it public.
+
+@implementation UIFont (YYAdd)
+
+- (BOOL)isBold {
+    if (![self respondsToSelector:@selector(fontDescriptor)]) return NO;
+    return (self.fontDescriptor.symbolicTraits & UIFontDescriptorTraitBold) > 0;
+}
+
+- (BOOL)isItalic {
+    if (![self respondsToSelector:@selector(fontDescriptor)]) return NO;
+    return (self.fontDescriptor.symbolicTraits & UIFontDescriptorTraitItalic) > 0;
+}
+
+- (BOOL)isMonoSpace {
+    if (![self respondsToSelector:@selector(fontDescriptor)]) return NO;
+    return (self.fontDescriptor.symbolicTraits & UIFontDescriptorTraitMonoSpace) > 0;
+}
+
+- (BOOL)isColorGlyphs {
+    if (![self respondsToSelector:@selector(fontDescriptor)]) return NO;
+    return (CTFontGetSymbolicTraits((__bridge CTFontRef)self) & kCTFontTraitColorGlyphs) != 0;
+}
+
+- (CGFloat)fontWeight {
+    NSDictionary *traits = [self.fontDescriptor objectForKey:UIFontDescriptorTraitsAttribute];
+    return [traits[UIFontWeightTrait] floatValue];
+}
+
+- (UIFont *)fontWithBold {
+    if (![self respondsToSelector:@selector(fontDescriptor)]) return nil;
+    return [UIFont fontWithDescriptor:[self.fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold] size:self.pointSize];
+}
+
+- (UIFont *)fontWithItalic {
+    if (![self respondsToSelector:@selector(fontDescriptor)]) return nil;
+    return [UIFont fontWithDescriptor:[self.fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic] size:self.pointSize];
+}
+
+- (UIFont *)fontWithBoldItalic {
+    if (![self respondsToSelector:@selector(fontDescriptor)]) return nil;
+    return [UIFont fontWithDescriptor:[self.fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold | UIFontDescriptorTraitItalic] size:self.pointSize];
+}
+
+- (UIFont *)fontWithNormal {
+    if (![self respondsToSelector:@selector(fontDescriptor)]) return nil;
+    return [UIFont fontWithDescriptor:[self.fontDescriptor fontDescriptorWithSymbolicTraits:0] size:self.pointSize];
+}
+
++ (UIFont *)fontWithCTFont:(CTFontRef)CTFont {
+    if (!CTFont) return nil;
+    CFStringRef name = CTFontCopyPostScriptName(CTFont);
+    if (!name) return nil;
+    CGFloat size = CTFontGetSize(CTFont);
+    UIFont *font = [self fontWithName:(__bridge NSString *)(name) size:size];
+    CFRelease(name);
+    return font;
+}
+
++ (UIFont *)fontWithCGFont:(CGFontRef)CGFont size:(CGFloat)size {
+    if (!CGFont) return nil;
+    CFStringRef name = CGFontCopyPostScriptName(CGFont);
+    if (!name) return nil;
+    UIFont *font = [self fontWithName:(__bridge NSString *)(name) size:size];
+    CFRelease(name);
+    return font;
+}
+
+- (CTFontRef)CTFontRef CF_RETURNS_RETAINED {
+    CTFontRef font = CTFontCreateWithName((__bridge CFStringRef)self.fontName, self.pointSize, NULL);
+    return font;
+}
+
+- (CGFontRef)CGFontRef CF_RETURNS_RETAINED {
+    CGFontRef font = CGFontCreateWithFontName((__bridge CFStringRef)self.fontName);
+    return font;
+}
+
++ (BOOL)loadFontFromPath:(NSString *)path {
+    NSURL *url = [NSURL fileURLWithPath:path];
+    CFErrorRef error;
+    BOOL suc = CTFontManagerRegisterFontsForURL((__bridge CFTypeRef)url, kCTFontManagerScopeNone, &error);
+    if (!suc) {
+        NSLog(@"Failed to load font: %@", error);
+    }
+    return suc;
+}
+
++ (void)unloadFontFromPath:(NSString *)path {
+    NSURL *url = [NSURL fileURLWithPath:path];
+    CTFontManagerUnregisterFontsForURL((__bridge CFTypeRef)url, kCTFontManagerScopeNone, NULL);
+}
+
++ (UIFont *)loadFontFromData:(NSData *)data {
+    CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
+    if (!provider) return nil;
+    CGFontRef fontRef = CGFontCreateWithDataProvider(provider);
+    CGDataProviderRelease(provider);
+    if (!fontRef) return nil;
+    
+    CFErrorRef errorRef;
+    BOOL suc = CTFontManagerRegisterGraphicsFont(fontRef, &errorRef);
+    if (!suc) {
+        CFRelease(fontRef);
+        NSLog(@"%@", errorRef);
+        return nil;
+    } else {
+        CFStringRef fontName = CGFontCopyPostScriptName(fontRef);
+        UIFont *font = [UIFont fontWithName:(__bridge NSString *)(fontName) size:[UIFont systemFontSize]];
+        if (fontName) CFRelease(fontName);
+        CGFontRelease(fontRef);
+        return font;
+    }
+}
+
++ (BOOL)unloadFontFromData:(UIFont *)font {
+    CGFontRef fontRef = CGFontCreateWithFontName((__bridge CFStringRef)font.fontName);
+    if (!fontRef) return NO;
+    CFErrorRef errorRef;
+    BOOL suc = CTFontManagerUnregisterGraphicsFont(fontRef, &errorRef);
+    CFRelease(fontRef);
+    if (!suc) NSLog(@"%@", errorRef);
+    return suc;
+}
+
++ (NSData *)dataFromFont:(UIFont *)font {
+    CGFontRef cgFont = font.CGFontRef;
+    NSData *data = [self dataFromCGFont:cgFont];
+    CGFontRelease(cgFont);
+    return data;
+}
+
+typedef struct FontHeader {
+    int32_t fVersion;
+    uint16_t fNumTables;
+    uint16_t fSearchRange;
+    uint16_t fEntrySelector;
+    uint16_t fRangeShift;
+} FontHeader;
+
+typedef struct TableEntry {
+    uint32_t fTag;
+    uint32_t fCheckSum;
+    uint32_t fOffset;
+    uint32_t fLength;
+} TableEntry;
+
+static uint32_t CalcTableCheckSum(const uint32_t *table, uint32_t numberOfBytesInTable) {
+    uint32_t sum = 0;
+    uint32_t nLongs = (numberOfBytesInTable + 3) / 4;
+    while (nLongs-- > 0) {
+        sum += CFSwapInt32HostToBig(*table++);
+    }
+    return sum;
+}
+
+//Reference:
+//https://github.com/google/skia/blob/master/src%2Fports%2FSkFontHost_mac.cpp
++ (NSData *)dataFromCGFont:(CGFontRef)cgFont {
+    if (!cgFont) return nil;
+    
+    CFRetain(cgFont);
+    
+    CFArrayRef tags = CGFontCopyTableTags(cgFont);
+    if (!tags) return nil;
+    CFIndex tableCount = CFArrayGetCount(tags);
+    
+    size_t *tableSizes = malloc(sizeof(size_t) * tableCount);
+    memset(tableSizes, 0, sizeof(size_t) * tableCount);
+    
+    BOOL containsCFFTable = NO;
+    
+    size_t totalSize = sizeof(FontHeader) + sizeof(TableEntry) * tableCount;
+    
+    for (CFIndex index = 0; index < tableCount; index++) {
+        size_t tableSize = 0;
+        uint32_t aTag = (uint32_t)CFArrayGetValueAtIndex(tags, index);
+        if (aTag == kCTFontTableCFF && !containsCFFTable) {
+            containsCFFTable = YES;
+        }
+        CFDataRef tableDataRef = CGFontCopyTableForTag(cgFont, aTag);
+        if (tableDataRef) {
+            tableSize = CFDataGetLength(tableDataRef);
+            CFRelease(tableDataRef);
+        }
+        totalSize += (tableSize + 3) & ~3;
+        tableSizes[index] = tableSize;
+    }
+    
+    unsigned char *stream = malloc(totalSize);
+    memset(stream, 0, totalSize);
+    char *dataStart = (char *)stream;
+    char *dataPtr = dataStart;
+    
+    // compute font header entries
+    uint16_t entrySelector = 0;
+    uint16_t searchRange = 1;
+    while (searchRange < tableCount >> 1) {
+        entrySelector++;
+        searchRange <<= 1;
+    }
+    searchRange <<= 4;
+    
+    uint16_t rangeShift = (tableCount << 4) - searchRange;
+    
+    // write font header (also called sfnt header, offset subtable)
+    FontHeader *offsetTable = (FontHeader *)dataPtr;
+    
+    //OpenType Font contains CFF Table use 'OTTO' as version, and with .otf extension
+    //otherwise 0001 0000
+    offsetTable->fVersion = containsCFFTable ? 'OTTO' : CFSwapInt16HostToBig(1);
+    offsetTable->fNumTables = CFSwapInt16HostToBig((uint16_t)tableCount);
+    offsetTable->fSearchRange = CFSwapInt16HostToBig((uint16_t)searchRange);
+    offsetTable->fEntrySelector = CFSwapInt16HostToBig((uint16_t)entrySelector);
+    offsetTable->fRangeShift = CFSwapInt16HostToBig((uint16_t)rangeShift);
+    
+    dataPtr += sizeof(FontHeader);
+    
+    // write tables
+    TableEntry *entry = (TableEntry *)dataPtr;
+    dataPtr += sizeof(TableEntry) * tableCount;
+    
+    for (int index = 0; index < tableCount; ++index) {
+        uint32_t aTag = (uint32_t)CFArrayGetValueAtIndex(tags, index);
+        CFDataRef tableDataRef = CGFontCopyTableForTag(cgFont, aTag);
+        size_t tableSize = CFDataGetLength(tableDataRef);
+        
+        memcpy(dataPtr, CFDataGetBytePtr(tableDataRef), tableSize);
+        
+        entry->fTag = CFSwapInt32HostToBig((uint32_t)aTag);
+        entry->fCheckSum = CFSwapInt32HostToBig(CalcTableCheckSum((uint32_t *)dataPtr, (uint32_t)tableSize));
+        
+        uint32_t offset = (uint32_t)dataPtr - (uint32_t)dataStart;
+        entry->fOffset = CFSwapInt32HostToBig((uint32_t)offset);
+        entry->fLength = CFSwapInt32HostToBig((uint32_t)tableSize);
+        dataPtr += (tableSize + 3) & ~3;
+        ++entry;
+        CFRelease(tableDataRef);
+    }
+    
+    CFRelease(cgFont);
+    CFRelease(tags);
+    free(tableSizes);
+    NSData *fontData = [NSData dataWithBytesNoCopy:stream length:totalSize freeWhenDone:YES];
+    return fontData;
+}
+
+@end
+
+#pragma clang diagnostic pop

--
Gitblit v1.8.0