         }
     }
     
+    var isFixedPitch: Bool {
+        return post.isFixedPitch != 0
+    }
+    var isItalic: Bool {
+        return head.macStyle & 2 != 0
+    }
+    var isBold: Bool {
+        return head.macStyle & 1 != 0
+    }
+    var isExpanded: Bool {
+        return head.macStyle & 64 != 0
+    }
+    var isCondensed: Bool {
+        return head.macStyle & 32 != 0
+    }
+    
+    var underlinePosition: Double {
+        return Double(post.underlinePosition.representingValue)
+    }
+    var underlineThickness: Double {
+        return Double(post.underlineThickness.representingValue)
+    }
+}
+
+extension SFNTFontFace {
+    
+    func queryName(_ id: Int) -> String? {
+        let macOSRoman = name.name.lazy.filter { $0.platform.platform == 1 && $0.platform.specific == 0 && $0.name == id }
+        let unicode = name.name.lazy.filter { $0.platform.platform == 0 && $0.name == id }
+        return macOSRoman.map { $0.value }.first ?? unicode.map { $0.value }.first
+    }
+    
+    var copyright: String? {
+        return queryName(0)
+    }
+    
+    var fontName: String? {
+        return queryName(6)
+    }
+    
+    var familyName: String? {
+        return queryName(1)
+    }
+    
+    var faceName: String? {
+        return queryName(2)
+    }
+    
+    var uniqueName: String? {
+        return queryName(3)
+    }
+    
+    var displayName: String? {
+        return queryName(4)
+    }
+    
     var version: String? {
         return queryName(5)
     }

        guard let _ = try? data.decode(BEInt16.self) else { return nil }
        guard let _ = try? data.decode(BEInt16.self) else { return nil }
        
        let count = Int(numberOfContours)
        
        guard let endPtsOfContours = try? (0..<count).map({ _ in try data.decode(BEUInt16.self) }) else { return nil }
        
        guard let instructionLength = try? data.decode(BEUInt16.self) else { return nil }
        
        guard let instructions = try? (0..<Int(instructionLength)).map({ _ in try data.decode(UInt8.self) }) else { return nil }
        
        var flags = [UInt8]()
        flags.reserveCapacity(count)
        while flags.count < count {
            guard let flag = try? data.decode(UInt8.self) else { return nil }
            flags.append(flag)
            if flag & 8 != 0 {

                if flag & bitMask.1 != 0 {
                    code = previousValue
                } else {
                    code = previousValue + Int16(try data.decode(BEInt16.self))
                }
            }
            return code
