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