1 2from PyObjCTools.TestSupport import * 3from Quartz.CoreGraphics import * 4 5import sys 6 7if sys.version_info[0] != 2: 8 def buffer(value): 9 if isinstance(value, bytes): 10 return value 11 return value.encode('latin1') 12 13class TestCGFont (TestCase): 14 15 def testTypes(self): 16 self.assertIsCFType(CGFontRef) 17 18 def testConstants(self): 19 self.assertEqual(kCGFontPostScriptFormatType1, 1) 20 self.assertEqual(kCGFontPostScriptFormatType3, 3) 21 self.assertEqual(kCGFontPostScriptFormatType42, 42) 22 23 self.assertEqual(kCGFontIndexMax, ((1 << 16) - 2)) 24 self.assertEqual(kCGFontIndexInvalid, ((1 << 16) - 1)) 25 self.assertEqual(kCGGlyphMax, kCGFontIndexMax) 26 27 28 self.assertIsInstance(kCGFontVariationAxisName, unicode) 29 self.assertIsInstance(kCGFontVariationAxisMinValue, unicode) 30 self.assertIsInstance(kCGFontVariationAxisMaxValue, unicode) 31 self.assertIsInstance(kCGFontVariationAxisDefaultValue, unicode) 32 33 self.assertEqual(CGGlyphMin, 0) 34 self.assertEqual(CGGlyphMax, kCGGlyphMax) 35 36 37 38 @min_os_level('10.5') 39 # Most functions should work on 10.4 as well, except for the convenient 40 # contruction functions 41 def testFunctions(self): 42 self.assertIsInstance(CGFontGetTypeID(), (int, long)) 43 44 self.assertResultIsCFRetained(CGFontCreateWithFontName) 45 font = CGFontCreateWithFontName("Helvetica") 46 self.assertIsInstance(font, CGFontRef) 47 48 self.assertResultIsCFRetained(CGFontCreateCopyWithVariations) 49 font = CGFontCreateCopyWithVariations(font, None) 50 self.assertIsInstance(font, CGFontRef) 51 52 v = CGFontRetain(font) 53 self.assertTrue(v is font) 54 CGFontRelease(font) 55 56 v = CGFontGetNumberOfGlyphs(font) 57 self.assertIsInstance(v, (int, long)) 58 59 v = CGFontGetUnitsPerEm(font) 60 self.assertIsInstance(v, (int, long)) 61 62 self.assertResultIsCFRetained(CGFontCopyPostScriptName) 63 v = CGFontCopyPostScriptName(font) 64 self.assertIsInstance(v, unicode) 65 66 self.assertResultIsCFRetained(CGFontCopyFullName) 67 v = CGFontCopyFullName(font) 68 self.assertIsInstance(v, unicode) 69 70 v = CGFontGetAscent(font) 71 self.assertIsInstance(v, (int, long)) 72 73 v = CGFontGetDescent(font) 74 self.assertIsInstance(v, (int, long)) 75 76 v = CGFontGetLeading(font) 77 self.assertIsInstance(v, (int, long)) 78 79 v = CGFontGetCapHeight(font) 80 self.assertIsInstance(v, (int, long)) 81 82 v = CGFontGetXHeight(font) 83 self.assertIsInstance(v, (int, long)) 84 85 v = CGFontGetFontBBox(font) 86 self.assertIsInstance(v, CGRect) 87 88 v = CGFontGetItalicAngle(font) 89 self.assertIsInstance(v, float) 90 91 v = CGFontGetStemV(font) 92 self.assertIsInstance(v, float) 93 94 v = CGFontCopyVariationAxes(font) 95 self.assertTrue(v is None or isinstance(v, CFArrayRef)) 96 97 v = CGFontCopyVariations(font) 98 self.assertTrue(v is None or isinstance(v, CFDictionaryRef)) 99 100 self.assertResultHasType(CGFontCanCreatePostScriptSubset, objc._C_BOOL) 101 v = CGFontCanCreatePostScriptSubset(font, kCGFontPostScriptFormatType1) 102 self.assertIsInstance(v, bool) 103 104 105 # PyObjC doesn't wrap ATSUI, therefore we cannot actually call 106 # the function. 107 #self.fail('CGFontCreateWithPlatformFont') 108 self.assertArgHasType(CGFontCreateWithPlatformFont, 0, 109 objc._C_UINT) 110 self.assertResultIsCFRetained(CGFontCreateWithPlatformFont) 111 112 113 data = open('/Library/Fonts/Webdings.ttf', 'rb').read() 114 self.assertResultIsCFRetained(CGFontCreateWithDataProvider) 115 font = CGFontCreateWithDataProvider( 116 CGDataProviderCreateWithCFData(buffer(data)) 117 ) 118 self.assertIsInstance(font, CGFontRef) 119 120 tags = CGFontCopyTableTags(font) 121 self.assertIsInstance(tags, tuple) 122 self.failIfEqual(len(tags), 0) 123 self.assertIsInstance(tags[0], (int, long)) 124 125 self.assertResultIsCFRetained(CGFontCopyTableForTag) 126 for tg in tags: 127 data = CGFontCopyTableForTag(font, 0) 128 if data is None: 129 continue 130 self.assertIsInstance(data, CFDataRef) 131 132 v = CGFontCopyGlyphNameForGlyph(font, ord('A')) 133 self.assertIsInstance(v, unicode) 134 135 glyphnames = ['chat', 'conference', 'woman' ] 136 137 v = CGFontGetGlyphWithGlyphName(font, glyphnames[0]) 138 self.assertIsInstance(v, (int, long)) 139 140 glyphs = [ CGFontGetGlyphWithGlyphName(font, nm) 141 for nm in glyphnames ] 142 143 self.assertResultHasType(CGFontGetGlyphAdvances, objc._C_BOOL) 144 v, advances = CGFontGetGlyphAdvances( 145 font, glyphs, len(glyphs), None) 146 self.assertIsInstance(v, bool) 147 self.assertEqual(len(advances), 3) 148 for v in advances: 149 self.assertIsInstance(v, (int, long)) 150 151 self.assertResultHasType(CGFontGetGlyphBBoxes, objc._C_BOOL) 152 v, bboxes = CGFontGetGlyphBBoxes( 153 font, glyphs, len(glyphs), None) 154 self.assertIsInstance(v, bool) 155 self.assertEqual(len(bboxes), 3) 156 for v in bboxes: 157 self.assertIsInstance(v, CGRect) 158 159 self.assertResultIsCFRetained(CGFontCreatePostScriptSubset) 160 psfont = CGFontCreatePostScriptSubset( 161 font, "pybobjc-characters", 162 kCGFontPostScriptFormatType42, 163 glyphs, len(glyphs), None) 164 self.assertIsInstance(psfont, CFDataRef) 165 166 167 self.assertResultIsCFRetained(CGFontCreatePostScriptEncoding) 168 map = glyphs + [0]*(256-len(glyphs)) 169 psfont = CGFontCreatePostScriptEncoding( 170 font, map) 171 self.assertIsInstance(psfont, CFDataRef) 172 173 174 175if __name__ == "__main__": 176 main() 177