@@ -38,33 +38,16 @@ typedef struct
38
38
} error_def ;
39
39
40
40
41
- static error_def errors [83 ];
42
- static const unsigned int nerrors = 83 ;
43
-
44
-
45
- static int error_finder (const void * key , const void * member )
46
- {
47
- FT_Error err = * ((FT_Error * )key );
48
- error_def * entry = (error_def * )member ;
49
-
50
- if (entry -> code == err ) {
51
- return 0 ;
52
- } else if (entry -> code < err ) {
53
- return 1 ;
54
- } else {
55
- return -1 ;
56
- }
57
- }
41
+ static error_def errors [256 ];
58
42
59
43
60
44
int ftpy_exc (FT_Error error )
61
45
{
62
46
error_def * entry ;
63
47
64
48
if (error ) {
65
- entry = (error_def * )bsearch (
66
- & error , errors , nerrors , sizeof (error_def ), error_finder );
67
- if (entry == NULL ) {
49
+ entry = & errors [error ];
50
+ if (entry -> code == 0 ) {
68
51
PyErr_Format (
69
52
PyExc_RuntimeError , "unknown freetype exception %x" , error );
70
53
return 1 ;
@@ -77,95 +60,134 @@ int ftpy_exc(FT_Error error)
77
60
return 0 ;
78
61
}
79
62
80
- #define DEF_ERROR (c , m , x ) \
81
- errors[i].code = c; errors[i].msg = m; errors[i].cls = x; ++i;
82
-
83
- int setup_errors () {
84
- unsigned int i = 0 ;
85
-
86
- DEF_ERROR (0x00 , "no error" , PyExc_Exception );
87
- DEF_ERROR (0x01 , "cannot open resource" , PyExc_IOError );
88
- DEF_ERROR (0x02 , "unknown file format" , PyExc_ValueError );
89
- DEF_ERROR (0x03 , "broken file" , PyExc_IOError );
90
- DEF_ERROR (0x04 , "invalid FreeType version" , PyExc_RuntimeError );
91
- DEF_ERROR (0x05 , "module version is too low" , PyExc_RuntimeError );
92
- DEF_ERROR (0x06 , "invalid argument" , PyExc_ValueError );
93
- DEF_ERROR (0x07 , "unimplemented feature" , PyExc_NotImplementedError );
94
- DEF_ERROR (0x08 , "broken table" , PyExc_ValueError );
95
- DEF_ERROR (0x09 , "broken offset within table" , PyExc_ValueError );
96
- DEF_ERROR (0x10 , "invalid glyph index" , PyExc_IndexError );
97
- DEF_ERROR (0x11 , "invalid character code" , PyExc_ValueError );
98
- DEF_ERROR (0x12 , "unsupported glyph image format" , PyExc_ValueError );
99
- DEF_ERROR (0x13 , "cannot render this glyph format" , PyExc_NotImplementedError );
100
- DEF_ERROR (0x14 , "invalid outline" , PyExc_ValueError );
101
- DEF_ERROR (0x15 , "invalid composite glyph" , PyExc_ValueError );
102
- DEF_ERROR (0x16 , "too many hints" , PyExc_ValueError );
103
- DEF_ERROR (0x17 , "invalid pixel size" , PyExc_ValueError );
104
- DEF_ERROR (0x20 , "invalid object handle" , PyExc_ValueError );
105
- DEF_ERROR (0x21 , "invalid library handle" , PyExc_ValueError );
106
- DEF_ERROR (0x22 , "invalid module handle" , PyExc_ValueError );
107
- DEF_ERROR (0x23 , "invalid face handle" , PyExc_ValueError );
108
- DEF_ERROR (0x24 , "invalid size handle" , PyExc_ValueError );
109
- DEF_ERROR (0x25 , "invalid glyph slot handle" , PyExc_ValueError );
110
- DEF_ERROR (0x26 , "invalid charmap handle" , PyExc_ValueError );
111
- DEF_ERROR (0x27 , "invalid cache manager handle" , PyExc_ValueError );
112
- DEF_ERROR (0x28 , "invalid stream handle" , PyExc_ValueError );
113
- DEF_ERROR (0x30 , "too many modules" , PyExc_MemoryError );
114
- DEF_ERROR (0x31 , "too many extensions" , PyExc_MemoryError );
115
- DEF_ERROR (0x40 , "out of memory" , PyExc_MemoryError );
116
- DEF_ERROR (0x41 , "unlisted object" , PyExc_KeyError );
117
- DEF_ERROR (0x51 , "cannot open stream" , PyExc_IOError );
118
- DEF_ERROR (0x52 , "invalid stream seek" , PyExc_IOError );
119
- DEF_ERROR (0x53 , "invalid stream skip" , PyExc_IOError );
120
- DEF_ERROR (0x54 , "invalid stream read" , PyExc_IOError );
121
- DEF_ERROR (0x55 , "invalid stream operation" , PyExc_IOError );
122
- DEF_ERROR (0x56 , "invalid frame operation" , PyExc_IOError );
123
- DEF_ERROR (0x57 , "nested frame access" , PyExc_IOError );
124
- DEF_ERROR (0x58 , "invalid frame read" , PyExc_IOError );
125
- DEF_ERROR (0x60 , "raster uninitialized" , PyExc_ValueError );
126
- DEF_ERROR (0x61 , "raster corrupted" , PyExc_ValueError );
127
- DEF_ERROR (0x62 , "raster overflow" , PyExc_OverflowError );
128
- DEF_ERROR (0x63 , "negative height while rastering" , PyExc_ValueError );
129
- DEF_ERROR (0x70 , "too many registered caches" , PyExc_MemoryError );
130
- DEF_ERROR (0x80 , "invalid opcode" , PyExc_ValueError );
131
- DEF_ERROR (0x81 , "too few arguments" , PyExc_TypeError );
132
- DEF_ERROR (0x82 , "stack overflow" , PyExc_RuntimeError );
133
- DEF_ERROR (0x83 , "code overflow" , PyExc_OverflowError );
134
- DEF_ERROR (0x84 , "bad argument" , PyExc_TypeError );
135
- DEF_ERROR (0x85 , "division by zero" , PyExc_ZeroDivisionError );
136
- DEF_ERROR (0x86 , "invalid reference" , PyExc_ValueError );
137
- DEF_ERROR (0x87 , "found debug opcode" , PyExc_SyntaxError );
138
- DEF_ERROR (0x88 , "found ENDF opcode in execution stream" , PyExc_SyntaxError );
139
- DEF_ERROR (0x89 , "nested DEFS" , PyExc_SyntaxError );
140
- DEF_ERROR (0x8A , "invalid code range" , PyExc_ValueError );
141
- DEF_ERROR (0x8B , "execution context too long" , PyExc_RuntimeError );
142
- DEF_ERROR (0x8C , "too many function definitions" , PyExc_MemoryError );
143
- DEF_ERROR (0x8D , "too many instruction definitions" , PyExc_MemoryError );
144
- DEF_ERROR (0x8E , "SFNT font table missing" , PyExc_AttributeError );
145
- DEF_ERROR (0x8F , "horizontal header (hhea) table missing" , PyExc_AttributeError );
146
- DEF_ERROR (0x90 , "locations (loca) table missing" , PyExc_AttributeError );
147
- DEF_ERROR (0x91 , "name table missing" , PyExc_AttributeError );
148
- DEF_ERROR (0x92 , "character map (cmap) table missing" , PyExc_AttributeError );
149
- DEF_ERROR (0x93 , "horizontal metrics (hmtx) table missing" , PyExc_AttributeError );
150
- DEF_ERROR (0x94 , "PostScript (post) table missing" , PyExc_AttributeError );
151
- DEF_ERROR (0x95 , "invalid horizontal metrics" , PyExc_ValueError );
152
- DEF_ERROR (0x96 , "invalid character map (cmap) format" , PyExc_ValueError );
153
- DEF_ERROR (0x97 , "invalid ppem value" , PyExc_ValueError );
154
- DEF_ERROR (0x98 , "invalid vertical metrics" , PyExc_ValueError );
155
- DEF_ERROR (0x99 , "could not find context" , PyExc_AttributeError );
156
- DEF_ERROR (0x9A , "invalid PostScript (post, table format" , PyExc_ValueError );
157
- DEF_ERROR (0x9B , "invalid PostScript (post, table" , PyExc_ValueError );
158
- DEF_ERROR (0xA0 , "opcode syntax error" , PyExc_SyntaxError );
159
- DEF_ERROR (0xA1 , "argument stack underflow" , PyExc_RuntimeError );
160
- DEF_ERROR (0xA2 , "ignore" , PyExc_Exception );
161
- DEF_ERROR (0xB0 , "`STARTFONT` field missing" , PyExc_KeyError );
162
- DEF_ERROR (0xB1 , "`FONT` field missing" , PyExc_KeyError );
163
- DEF_ERROR (0xB2 , "`SIZE` field missing" , PyExc_KeyError );
164
- DEF_ERROR (0xB3 , "`CHARS` field missing" , PyExc_KeyError );
165
- DEF_ERROR (0xB4 , "`STARTCHAR` field missing" , PyExc_KeyError );
166
- DEF_ERROR (0xB5 , "`ENCODING` field missing" , PyExc_KeyError );
167
- DEF_ERROR (0xB6 , "`BBX` field missing" , PyExc_KeyError );
168
- DEF_ERROR (0xB7 , "`BBX` too big" , PyExc_MemoryError );
63
+ #define DEF_ERROR (c , ignored , m , x ) \
64
+ errors[c].code = c; errors[c].msg = m; errors[c].cls = x;
65
+
66
+ int setup_errors (void ) {
67
+ memset (errors , 0 , sizeof (error_def ) * 256 );
68
+
69
+ DEF_ERROR (FT_Err_Ok , 0x00 , "no error" , PyExc_Exception );
70
+
71
+ DEF_ERROR (FT_Err_Cannot_Open_Resource , 0x01 , "cannot open resource" , PyExc_IOError );
72
+ DEF_ERROR (FT_Err_Unknown_File_Format , 0x02 , "unknown file format" , PyExc_ValueError );
73
+ DEF_ERROR (FT_Err_Invalid_File_Format , 0x03 , "broken file" , PyExc_IOError );
74
+ DEF_ERROR (FT_Err_Invalid_Version , 0x04 , "invalid FreeType version" , PyExc_RuntimeError );
75
+ DEF_ERROR (FT_Err_Lower_Module_Version , 0x05 , "module version is too low" , PyExc_RuntimeError );
76
+ DEF_ERROR (FT_Err_Invalid_Argument , 0x06 , "invalid argument" , PyExc_ValueError );
77
+ DEF_ERROR (FT_Err_Unimplemented_Feature , 0x07 , "unimplemented feature" , PyExc_NotImplementedError );
78
+ DEF_ERROR (FT_Err_Invalid_Table , 0x08 , "broken table" , PyExc_ValueError );
79
+ DEF_ERROR (FT_Err_Invalid_Offset , 0x09 , "broken offset within table" , PyExc_ValueError );
80
+ DEF_ERROR (FT_Err_Array_Too_Large , 0x0A , "array allocation size too large" , PyExc_MemoryError );
81
+ DEF_ERROR (FT_Err_Missing_Module , 0x0B , "missing module" , PyExc_RuntimeError );
82
+ DEF_ERROR (FT_Err_Missing_Property , 0x0C , "missing property" , PyExc_KeyError );
83
+
84
+ /* glyph/character errors */
85
+
86
+ DEF_ERROR (FT_Err_Invalid_Glyph_Index , 0x10 , "invalid glyph index" , PyExc_IndexError );
87
+ DEF_ERROR (FT_Err_Invalid_Character_Code , 0x11 , "invalid character code" , PyExc_ValueError );
88
+ DEF_ERROR (FT_Err_Invalid_Glyph_Format , 0x12 , "unsupported glyph image format" , PyExc_ValueError );
89
+ DEF_ERROR (FT_Err_Cannot_Render_Glyph , 0x13 , "cannot render this glyph format" , PyExc_RuntimeError );
90
+ DEF_ERROR (FT_Err_Invalid_Outline , 0x14 , "invalid outline" , PyExc_ValueError );
91
+ DEF_ERROR (FT_Err_Invalid_Composite , 0x15 , "invalid composite glyph" , PyExc_ValueError );
92
+ DEF_ERROR (FT_Err_Too_Many_Hints , 0x16 , "too many hints" , PyExc_ValueError );
93
+ DEF_ERROR (FT_Err_Invalid_Pixel_Size , 0x17 , "invalid pixel size" , PyExc_ValueError );
94
+
95
+ /* handle errors */
96
+
97
+ DEF_ERROR (FT_Err_Invalid_Handle , 0x20 , "invalid object handle" , PyExc_ValueError );
98
+ DEF_ERROR (FT_Err_Invalid_Library_Handle , 0x21 , "invalid library handle" , PyExc_ValueError );
99
+ DEF_ERROR (FT_Err_Invalid_Driver_Handle , 0x22 , "invalid module handle" , PyExc_ValueError );
100
+ DEF_ERROR (FT_Err_Invalid_Face_Handle , 0x23 , "invalid face handle" , PyExc_ValueError );
101
+ DEF_ERROR (FT_Err_Invalid_Size_Handle , 0x24 , "invalid size handle" , PyExc_ValueError );
102
+ DEF_ERROR (FT_Err_Invalid_Slot_Handle , 0x25 , "invalid glyph slot handle" , PyExc_ValueError );
103
+ DEF_ERROR (FT_Err_Invalid_CharMap_Handle , 0x26 , "invalid charmap handle" , PyExc_ValueError );
104
+ DEF_ERROR (FT_Err_Invalid_Cache_Handle , 0x27 , "invalid cache manager handle" , PyExc_ValueError );
105
+ DEF_ERROR (FT_Err_Invalid_Stream_Handle , 0x28 , "invalid stream handle" , PyExc_ValueError );
106
+
107
+ /* driver errors */
108
+
109
+ DEF_ERROR (FT_Err_Too_Many_Drivers , 0x30 , "too many modules" , PyExc_ValueError );
110
+ DEF_ERROR (FT_Err_Too_Many_Extensions , 0x31 , "too many extensions" , PyExc_ValueError );
111
+
112
+ /* memory errors */
113
+
114
+ DEF_ERROR (FT_Err_Out_Of_Memory , 0x40 , "out of memory" , PyExc_MemoryError );
115
+ DEF_ERROR (FT_Err_Unlisted_Object , 0x41 , "unlisted object" , PyExc_MemoryError );
116
+
117
+ /* stream errors */
118
+
119
+ DEF_ERROR (FT_Err_Cannot_Open_Stream , 0x51 , "cannot open stream" , PyExc_IOError );
120
+ DEF_ERROR (FT_Err_Invalid_Stream_Seek , 0x52 , "invalid stream seek" , PyExc_IOError );
121
+ DEF_ERROR (FT_Err_Invalid_Stream_Skip , 0x53 , "invalid stream skip" , PyExc_IOError );
122
+ DEF_ERROR (FT_Err_Invalid_Stream_Read , 0x54 , "invalid stream read" , PyExc_IOError );
123
+ DEF_ERROR (FT_Err_Invalid_Stream_Operation , 0x55 , "invalid stream operation" , PyExc_IOError );
124
+ DEF_ERROR (FT_Err_Invalid_Frame_Operation , 0x56 , "invalid frame operation" , PyExc_IOError );
125
+ DEF_ERROR (FT_Err_Nested_Frame_Access , 0x57 , "nested frame access" , PyExc_IOError );
126
+ DEF_ERROR (FT_Err_Invalid_Frame_Read , 0x58 , "invalid frame read" , PyExc_IOError );
127
+
128
+ /* raster errors */
129
+
130
+ DEF_ERROR (FT_Err_Raster_Uninitialized , 0x60 , "raster uninitialized" , PyExc_ValueError );
131
+ DEF_ERROR (FT_Err_Raster_Corrupted , 0x61 , "raster corrupted" , PyExc_ValueError );
132
+ DEF_ERROR (FT_Err_Raster_Overflow , 0x62 , "raster overflow" , PyExc_ValueError );
133
+ DEF_ERROR (FT_Err_Raster_Negative_Height , 0x63 , "negative height while rastering" , PyExc_ValueError );
134
+
135
+ /* cache errors */
136
+
137
+ DEF_ERROR (FT_Err_Too_Many_Caches , 0x70 , "too many registered caches" , PyExc_MemoryError );
138
+
139
+ /* TrueType and SFNT errors */
140
+
141
+ DEF_ERROR (FT_Err_Invalid_Opcode , 0x80 , "invalid opcode" , PyExc_ValueError );
142
+ DEF_ERROR (FT_Err_Too_Few_Arguments , 0x81 , "too few arguments" , PyExc_ValueError );
143
+ DEF_ERROR (FT_Err_Stack_Overflow , 0x82 , "stack overflow" , PyExc_ValueError );
144
+ DEF_ERROR (FT_Err_Code_Overflow , 0x83 , "code overflow" , PyExc_ValueError );
145
+ DEF_ERROR (FT_Err_Bad_Argument , 0x84 , "bad argument" , PyExc_ValueError );
146
+ DEF_ERROR (FT_Err_Divide_By_Zero , 0x85 , "division by zero" , PyExc_ValueError );
147
+ DEF_ERROR (FT_Err_Invalid_Reference , 0x86 , "invalid reference" , PyExc_ValueError );
148
+ DEF_ERROR (FT_Err_Debug_OpCode , 0x87 , "found debug opcode" , PyExc_ValueError );
149
+ DEF_ERROR (FT_Err_ENDF_In_Exec_Stream , 0x88 , "found ENDF opcode in execution stream" , PyExc_ValueError );
150
+ DEF_ERROR (FT_Err_Nested_DEFS , 0x89 , "nested DEFS" , PyExc_ValueError );
151
+ DEF_ERROR (FT_Err_Invalid_CodeRange , 0x8A , "invalid code range" , PyExc_ValueError );
152
+ DEF_ERROR (FT_Err_Execution_Too_Long , 0x8B , "execution context too long" , PyExc_ValueError );
153
+ DEF_ERROR (FT_Err_Too_Many_Function_Defs , 0x8C , "too many function definitions" , PyExc_ValueError );
154
+ DEF_ERROR (FT_Err_Too_Many_Instruction_Defs , 0x8D , "too many instruction definitions" , PyExc_ValueError );
155
+ DEF_ERROR (FT_Err_Table_Missing , 0x8E , "SFNT font table missing" , PyExc_ValueError );
156
+ DEF_ERROR (FT_Err_Horiz_Header_Missing , 0x8F , "horizontal header (FT_Err_hhea) table missing" , PyExc_ValueError );
157
+ DEF_ERROR (FT_Err_Locations_Missing , 0x90 , "locations (FT_Err_loca) table missing" , PyExc_ValueError );
158
+ DEF_ERROR (FT_Err_Name_Table_Missing , 0x91 , "name table missing" , PyExc_ValueError );
159
+ DEF_ERROR (FT_Err_CMap_Table_Missing , 0x92 , "character map (FT_Err_cmap) table missing" , PyExc_ValueError );
160
+ DEF_ERROR (FT_Err_Hmtx_Table_Missing , 0x93 , "horizontal metrics (FT_Err_hmtx) table missing" , PyExc_ValueError );
161
+ DEF_ERROR (FT_Err_Post_Table_Missing , 0x94 , "PostScript (FT_Err_post) table missing" , PyExc_ValueError );
162
+ DEF_ERROR (FT_Err_Invalid_Horiz_Metrics , 0x95 , "invalid horizontal metrics" , PyExc_ValueError );
163
+ DEF_ERROR (FT_Err_Invalid_CharMap_Format , 0x96 , "invalid character map (FT_Err_cmap) format" , PyExc_ValueError );
164
+ DEF_ERROR (FT_Err_Invalid_PPem , 0x97 , "invalid ppem value" , PyExc_ValueError );
165
+ DEF_ERROR (FT_Err_Invalid_Vert_Metrics , 0x98 , "invalid vertical metrics" , PyExc_ValueError );
166
+ DEF_ERROR (FT_Err_Could_Not_Find_Context , 0x99 , "could not find context" , PyExc_ValueError );
167
+ DEF_ERROR (FT_Err_Invalid_Post_Table_Format , 0x9A , "invalid PostScript (FT_Err_post) table format" , PyExc_ValueError );
168
+ DEF_ERROR (FT_Err_Invalid_Post_Table , 0x9B , "invalid PostScript (FT_Err_post) table" , PyExc_ValueError );
169
+
170
+ /* CFF, CID, and Type 1 errors */
171
+
172
+ DEF_ERROR (FT_Err_Syntax_Error , 0xA0 , "opcode syntax error" , PyExc_ValueError );
173
+ DEF_ERROR (FT_Err_Stack_Underflow , 0xA1 , "argument stack underflow" , PyExc_ValueError );
174
+ DEF_ERROR (FT_Err_Ignore , 0xA2 , "ignore" , PyExc_ValueError );
175
+ DEF_ERROR (FT_Err_No_Unicode_Glyph_Name , 0xA3 , "no Unicode glyph name found" , PyExc_ValueError );
176
+ DEF_ERROR (FT_Err_Glyph_Too_Big , 0xA4 , "glyph to big for hinting" , PyExc_ValueError );
177
+
178
+ /* BDF errors */
179
+
180
+ DEF_ERROR (FT_Err_Missing_Startfont_Field , 0xB0 , "`STARTFONT' field missing" , PyExc_ValueError );
181
+ DEF_ERROR (FT_Err_Missing_Font_Field , 0xB1 , "`FONT' field missing" , PyExc_ValueError );
182
+ DEF_ERROR (FT_Err_Missing_Size_Field , 0xB2 , "`SIZE' field missing" , PyExc_ValueError );
183
+ DEF_ERROR (FT_Err_Missing_Fontboundingbox_Field , 0xB3 , "`FONTBOUNDINGBOX' field missing" , PyExc_ValueError );
184
+ DEF_ERROR (FT_Err_Missing_Chars_Field , 0xB4 , "`CHARS' field missing" , PyExc_ValueError );
185
+ DEF_ERROR (FT_Err_Missing_Startchar_Field , 0xB5 , "`STARTCHAR' field missing" , PyExc_ValueError );
186
+ DEF_ERROR (FT_Err_Missing_Encoding_Field , 0xB6 , "`ENCODING' field missing" , PyExc_ValueError );
187
+ DEF_ERROR (FT_Err_Missing_Bbx_Field , 0xB7 , "`BBX' field missing" , PyExc_ValueError );
188
+ DEF_ERROR (FT_Err_Bbx_Too_Big , 0xB8 , "`BBX' too big" , PyExc_ValueError );
189
+ DEF_ERROR (FT_Err_Corrupted_Font_Header , 0xB9 , "Font header corrupted or missing fields" , PyExc_ValueError );
190
+ DEF_ERROR (FT_Err_Corrupted_Font_Glyphs , 0xBA , "Font glyphs corrupted or missing !fields" , PyExc_ValueError );
169
191
170
192
return 0 ;
171
193
}
0 commit comments