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