1use core::fmt;
2use ffi;
3
4pub type FtResult<T> = Result<T, Error>;
5
6#[derive(Copy, Clone, PartialEq, Eq, Debug)]
7#[repr(i32)]
8pub enum Error {
9 Ok = ffi::FT_Err_Ok,
10 CannotOpenResource = ffi::FT_Err_Cannot_Open_Resource,
11 UnknownFileFormat = ffi::FT_Err_Unknown_File_Format,
12 InvalidFileFormat = ffi::FT_Err_Invalid_File_Format,
13 InvalidVersion = ffi::FT_Err_Invalid_Version,
14 LowerModuleVersion = ffi::FT_Err_Lower_Module_Version,
15 InvalidArgument = ffi::FT_Err_Invalid_Argument,
16 UnimplementedFeature = ffi::FT_Err_Unimplemented_Feature,
17 InvalidTable = ffi::FT_Err_Invalid_Table,
18 InvalidOffset = ffi::FT_Err_Invalid_Offset,
19 ArrayTooLarge = ffi::FT_Err_Array_Too_Large,
20 MissingModule = ffi::FT_Err_Missing_Module,
21 MissingProperty = ffi::FT_Err_Missing_Property,
22 InvalidGlyphIndex = ffi::FT_Err_Invalid_Glyph_Index,
23 InvalidCharacterCode = ffi::FT_Err_Invalid_Character_Code,
24 InvalidGlyphFormat = ffi::FT_Err_Invalid_Glyph_Format,
25 CannotRenderGlyph = ffi::FT_Err_Cannot_Render_Glyph,
26 InvalidOutline = ffi::FT_Err_Invalid_Outline,
27 InvalidComposite = ffi::FT_Err_Invalid_Composite,
28 TooManyHints = ffi::FT_Err_Too_Many_Hints,
29 InvalidPixelSize = ffi::FT_Err_Invalid_Pixel_Size,
30 InvalidHandle = ffi::FT_Err_Invalid_Handle,
31 InvalidLibraryHandle = ffi::FT_Err_Invalid_Library_Handle,
32 InvalidDriverHandle = ffi::FT_Err_Invalid_Driver_Handle,
33 InvalidFaceHandle = ffi::FT_Err_Invalid_Face_Handle,
34 InvalidSizeHandle = ffi::FT_Err_Invalid_Size_Handle,
35 InvalidSlotHandle = ffi::FT_Err_Invalid_Slot_Handle,
36 InvalidCharMapHandle = ffi::FT_Err_Invalid_CharMap_Handle,
37 InvalidCacheHandle = ffi::FT_Err_Invalid_Cache_Handle,
38 InvalidStreamHandle = ffi::FT_Err_Invalid_Stream_Handle,
39 TooManyDrivers = ffi::FT_Err_Too_Many_Drivers,
40 TooManyExtensions = ffi::FT_Err_Too_Many_Extensions,
41 OutOfMemory = ffi::FT_Err_Out_Of_Memory,
42 UnlistedObject = ffi::FT_Err_Unlisted_Object,
43 CannotOpenStream = ffi::FT_Err_Cannot_Open_Stream,
44 InvalidStreamSeek = ffi::FT_Err_Invalid_Stream_Seek,
45 InvalidStreamSkip = ffi::FT_Err_Invalid_Stream_Skip,
46 InvalidStreamRead = ffi::FT_Err_Invalid_Stream_Read,
47 InvalidStreamOperation = ffi::FT_Err_Invalid_Stream_Operation,
48 InvalidFrameOperation = ffi::FT_Err_Invalid_Frame_Operation,
49 NestedFrameAccess = ffi::FT_Err_Nested_Frame_Access,
50 InvalidFrameRead = ffi::FT_Err_Invalid_Frame_Read,
51 RasterUninitialized = ffi::FT_Err_Raster_Uninitialized,
52 RasterCorrupted = ffi::FT_Err_Raster_Corrupted,
53 RasterOverflow = ffi::FT_Err_Raster_Overflow,
54 RasterNegativeHeight = ffi::FT_Err_Raster_Negative_Height,
55 TooManyCaches = ffi::FT_Err_Too_Many_Caches,
56 InvalidOpcode = ffi::FT_Err_Invalid_Opcode,
57 TooFewArguments = ffi::FT_Err_Too_Few_Arguments,
58 StackOverflow = ffi::FT_Err_Stack_Overflow,
59 CodeOverflow = ffi::FT_Err_Code_Overflow,
60 BadArgument = ffi::FT_Err_Bad_Argument,
61 DivideByZero = ffi::FT_Err_Divide_By_Zero,
62 InvalidReference = ffi::FT_Err_Invalid_Reference,
63 DebugOpCode = ffi::FT_Err_Debug_OpCode,
64 ENDFInExecStream = ffi::FT_Err_ENDF_In_Exec_Stream,
65 NestedDEFS = ffi::FT_Err_Nested_DEFS,
66 InvalidCodeRange = ffi::FT_Err_Invalid_CodeRange,
67 ExecutionTooLong = ffi::FT_Err_Execution_Too_Long,
68 TooManyFunctionDefs = ffi::FT_Err_Too_Many_Function_Defs,
69 TooManyInstructionDefs = ffi::FT_Err_Too_Many_Instruction_Defs,
70 TableMissing = ffi::FT_Err_Table_Missing,
71 HorizHeaderMissing = ffi::FT_Err_Horiz_Header_Missing,
72 LocationsMissing = ffi::FT_Err_Locations_Missing,
73 NameTableMissing = ffi::FT_Err_Name_Table_Missing,
74 CMapTableMissing = ffi::FT_Err_CMap_Table_Missing,
75 HmtxTableMissing = ffi::FT_Err_Hmtx_Table_Missing,
76 PostTableMissing = ffi::FT_Err_Post_Table_Missing,
77 InvalidHorizMetrics = ffi::FT_Err_Invalid_Horiz_Metrics,
78 InvalidCharMapFormat = ffi::FT_Err_Invalid_CharMap_Format,
79 InvalidPPem = ffi::FT_Err_Invalid_PPem,
80 InvalidVertMetrics = ffi::FT_Err_Invalid_Vert_Metrics,
81 CouldNotFindContext = ffi::FT_Err_Could_Not_Find_Context,
82 InvalidPostTableFormat = ffi::FT_Err_Invalid_Post_Table_Format,
83 InvalidPostTable = ffi::FT_Err_Invalid_Post_Table,
84 Syntax = ffi::FT_Err_Syntax_Error,
85 StackUnderflow = ffi::FT_Err_Stack_Underflow,
86 Ignore = ffi::FT_Err_Ignore,
87 NoUnicodeGlyphName = ffi::FT_Err_No_Unicode_Glyph_Name,
88 MissingStartfontField = ffi::FT_Err_Missing_Startfont_Field,
89 MissingFontField = ffi::FT_Err_Missing_Font_Field,
90 MissingSizeField = ffi::FT_Err_Missing_Size_Field,
91 MissingFontboundingboxField = ffi::FT_Err_Missing_Fontboundingbox_Field,
92 MissingCharsField = ffi::FT_Err_Missing_Chars_Field,
93 MissingStartcharField = ffi::FT_Err_Missing_Startchar_Field,
94 MissingEncodingField = ffi::FT_Err_Missing_Encoding_Field,
95 MissingBbxField = ffi::FT_Err_Missing_Bbx_Field,
96 BbxTooBig = ffi::FT_Err_Bbx_Too_Big,
97 CorruptedFontHeader = ffi::FT_Err_Corrupted_Font_Header,
98 CorruptedFontGlyphs = ffi::FT_Err_Corrupted_Font_Glyphs,
99 Max = ffi::FT_Err_Max,
100 UnexpectedPixelMode,
101 InvalidPath,
102 Unknown
103}
104
105impl From<i32> for Error {
106 fn from(err: i32) -> Self {
107 match err {
108 ffi::FT_Err_Ok => Error::Ok,
109 ffi::FT_Err_Cannot_Open_Resource => Error::CannotOpenResource,
110 ffi::FT_Err_Unknown_File_Format => Error::UnknownFileFormat,
111 ffi::FT_Err_Invalid_File_Format => Error::InvalidFileFormat,
112 ffi::FT_Err_Invalid_Version => Error::InvalidVersion,
113 ffi::FT_Err_Lower_Module_Version => Error::LowerModuleVersion,
114 ffi::FT_Err_Invalid_Argument => Error::InvalidArgument,
115 ffi::FT_Err_Unimplemented_Feature => Error::UnimplementedFeature,
116 ffi::FT_Err_Invalid_Table => Error::InvalidTable,
117 ffi::FT_Err_Invalid_Offset => Error::InvalidOffset,
118 ffi::FT_Err_Array_Too_Large => Error::ArrayTooLarge,
119 ffi::FT_Err_Missing_Module => Error::MissingModule,
120 ffi::FT_Err_Missing_Property => Error::MissingProperty,
121 ffi::FT_Err_Invalid_Glyph_Index => Error::InvalidGlyphIndex,
122 ffi::FT_Err_Invalid_Character_Code => Error::InvalidCharacterCode,
123 ffi::FT_Err_Invalid_Glyph_Format => Error::InvalidGlyphFormat,
124 ffi::FT_Err_Cannot_Render_Glyph => Error::CannotRenderGlyph,
125 ffi::FT_Err_Invalid_Outline => Error::InvalidOutline,
126 ffi::FT_Err_Invalid_Composite => Error::InvalidComposite,
127 ffi::FT_Err_Too_Many_Hints => Error::TooManyHints,
128 ffi::FT_Err_Invalid_Pixel_Size => Error::InvalidPixelSize,
129 ffi::FT_Err_Invalid_Handle => Error::InvalidHandle,
130 ffi::FT_Err_Invalid_Library_Handle => Error::InvalidLibraryHandle,
131 ffi::FT_Err_Invalid_Driver_Handle => Error::InvalidDriverHandle,
132 ffi::FT_Err_Invalid_Face_Handle => Error::InvalidFaceHandle,
133 ffi::FT_Err_Invalid_Size_Handle => Error::InvalidSizeHandle,
134 ffi::FT_Err_Invalid_Slot_Handle => Error::InvalidSlotHandle,
135 ffi::FT_Err_Invalid_CharMap_Handle => Error::InvalidCharMapHandle,
136 ffi::FT_Err_Invalid_Cache_Handle => Error::InvalidCacheHandle,
137 ffi::FT_Err_Invalid_Stream_Handle => Error::InvalidStreamHandle,
138 ffi::FT_Err_Too_Many_Drivers => Error::TooManyDrivers,
139 ffi::FT_Err_Too_Many_Extensions => Error::TooManyExtensions,
140 ffi::FT_Err_Out_Of_Memory => Error::OutOfMemory,
141 ffi::FT_Err_Unlisted_Object => Error::UnlistedObject,
142 ffi::FT_Err_Cannot_Open_Stream => Error::CannotOpenStream,
143 ffi::FT_Err_Invalid_Stream_Seek => Error::InvalidStreamSeek,
144 ffi::FT_Err_Invalid_Stream_Skip => Error::InvalidStreamSkip,
145 ffi::FT_Err_Invalid_Stream_Read => Error::InvalidStreamRead,
146 ffi::FT_Err_Invalid_Stream_Operation => Error::InvalidStreamOperation,
147 ffi::FT_Err_Invalid_Frame_Operation => Error::InvalidFrameOperation,
148 ffi::FT_Err_Nested_Frame_Access => Error::NestedFrameAccess,
149 ffi::FT_Err_Invalid_Frame_Read => Error::InvalidFrameRead,
150 ffi::FT_Err_Raster_Uninitialized => Error::RasterUninitialized,
151 ffi::FT_Err_Raster_Corrupted => Error::RasterCorrupted,
152 ffi::FT_Err_Raster_Overflow => Error::RasterOverflow,
153 ffi::FT_Err_Raster_Negative_Height => Error::RasterNegativeHeight,
154 ffi::FT_Err_Too_Many_Caches => Error::TooManyCaches,
155 ffi::FT_Err_Invalid_Opcode => Error::InvalidOpcode,
156 ffi::FT_Err_Too_Few_Arguments => Error::TooFewArguments,
157 ffi::FT_Err_Stack_Overflow => Error::StackOverflow,
158 ffi::FT_Err_Code_Overflow => Error::CodeOverflow,
159 ffi::FT_Err_Bad_Argument => Error::BadArgument,
160 ffi::FT_Err_Divide_By_Zero => Error::DivideByZero,
161 ffi::FT_Err_Invalid_Reference => Error::InvalidReference,
162 ffi::FT_Err_Debug_OpCode => Error::DebugOpCode,
163 ffi::FT_Err_ENDF_In_Exec_Stream => Error::ENDFInExecStream,
164 ffi::FT_Err_Nested_DEFS => Error::NestedDEFS,
165 ffi::FT_Err_Invalid_CodeRange => Error::InvalidCodeRange,
166 ffi::FT_Err_Execution_Too_Long => Error::ExecutionTooLong,
167 ffi::FT_Err_Too_Many_Function_Defs => Error::TooManyFunctionDefs,
168 ffi::FT_Err_Too_Many_Instruction_Defs => Error::TooManyInstructionDefs,
169 ffi::FT_Err_Table_Missing => Error::TableMissing,
170 ffi::FT_Err_Horiz_Header_Missing => Error::HorizHeaderMissing,
171 ffi::FT_Err_Locations_Missing => Error::LocationsMissing,
172 ffi::FT_Err_Name_Table_Missing => Error::NameTableMissing,
173 ffi::FT_Err_CMap_Table_Missing => Error::CMapTableMissing,
174 ffi::FT_Err_Hmtx_Table_Missing => Error::HmtxTableMissing,
175 ffi::FT_Err_Post_Table_Missing => Error::PostTableMissing,
176 ffi::FT_Err_Invalid_Horiz_Metrics => Error::InvalidHorizMetrics,
177 ffi::FT_Err_Invalid_CharMap_Format => Error::InvalidCharMapFormat,
178 ffi::FT_Err_Invalid_PPem => Error::InvalidPPem,
179 ffi::FT_Err_Invalid_Vert_Metrics => Error::InvalidVertMetrics,
180 ffi::FT_Err_Could_Not_Find_Context => Error::CouldNotFindContext,
181 ffi::FT_Err_Invalid_Post_Table_Format => Error::InvalidPostTableFormat,
182 ffi::FT_Err_Invalid_Post_Table => Error::InvalidPostTable,
183 ffi::FT_Err_Syntax_Error => Error::Syntax,
184 ffi::FT_Err_Stack_Underflow => Error::StackUnderflow,
185 ffi::FT_Err_Ignore => Error::Ignore,
186 ffi::FT_Err_No_Unicode_Glyph_Name => Error::NoUnicodeGlyphName,
187 ffi::FT_Err_Missing_Startfont_Field => Error::MissingStartfontField,
188 ffi::FT_Err_Missing_Font_Field => Error::MissingFontField,
189 ffi::FT_Err_Missing_Size_Field => Error::MissingSizeField,
190 ffi::FT_Err_Missing_Fontboundingbox_Field => Error::MissingFontboundingboxField,
191 ffi::FT_Err_Missing_Chars_Field => Error::MissingCharsField,
192 ffi::FT_Err_Missing_Startchar_Field => Error::MissingStartcharField,
193 ffi::FT_Err_Missing_Encoding_Field => Error::MissingEncodingField,
194 ffi::FT_Err_Missing_Bbx_Field => Error::MissingBbxField,
195 ffi::FT_Err_Bbx_Too_Big => Error::BbxTooBig,
196 ffi::FT_Err_Corrupted_Font_Header => Error::CorruptedFontHeader,
197 ffi::FT_Err_Corrupted_Font_Glyphs => Error::CorruptedFontGlyphs,
198 ffi::FT_Err_Max => Error::Max,
199 _ => Error::Unknown
200 }
201 }
202}
203
204impl fmt::Display for Error {
205 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
206 f.write_str(self.describe())
207 }
208}
209
210impl Error {
211 fn describe(&self) -> &str {
212 use self::Error::*;
213 match *self {
214 Ok => "Ok",
215 CannotOpenResource => "Cannot open resource",
216 UnknownFileFormat => "Unknown file format",
217 InvalidFileFormat => "Invalid file format",
218 InvalidVersion => "Invalid version",
219 LowerModuleVersion => "Lower module version",
220 InvalidArgument => "Invalid argument",
221 UnimplementedFeature => "Unimplemented feature",
222 InvalidTable => "Invalid table",
223 InvalidOffset => "Invalid offset",
224 ArrayTooLarge => "Array too large",
225 MissingModule => "Missing module",
226 MissingProperty => "Missing property",
227 InvalidGlyphIndex => "Invalid glyph index",
228 InvalidCharacterCode => "Invalid character code",
229 InvalidGlyphFormat => "Invalid glyph format",
230 CannotRenderGlyph => "Cannot render glyph",
231 InvalidOutline => "Invalid outline",
232 InvalidComposite => "Invalid composite",
233 TooManyHints => "Too many hints",
234 InvalidPixelSize => "Invalid pixel size",
235 InvalidHandle => "Invalid handle",
236 InvalidLibraryHandle => "Invalid library handle",
237 InvalidDriverHandle => "Invalid driver handle",
238 InvalidFaceHandle => "Invalid face handle",
239 InvalidSizeHandle => "Invalid size handle",
240 InvalidSlotHandle => "Invalid slot handle",
241 InvalidCharMapHandle => "Invalid char map handle",
242 InvalidCacheHandle => "Invalid cache handle",
243 InvalidStreamHandle => "Invalid stream handle",
244 TooManyDrivers => "Too many drivers",
245 TooManyExtensions => "Too many extensions",
246 OutOfMemory => "Out of memory",
247 UnlistedObject => "Unlisted object",
248 CannotOpenStream => "Cannot open stream",
249 InvalidStreamSeek => "Invalid stream seek",
250 InvalidStreamSkip => "Invalid stream skip",
251 InvalidStreamRead => "Invalid stream read",
252 InvalidStreamOperation => "Invalid stream operation",
253 InvalidFrameOperation => "Invalid frame operation",
254 NestedFrameAccess => "Nested frame access",
255 InvalidFrameRead => "Invalid frame read",
256 RasterUninitialized => "Raster uninitialized",
257 RasterCorrupted => "Raster corrupted",
258 RasterOverflow => "Raster overflow",
259 RasterNegativeHeight => "Raster negative height",
260 TooManyCaches => "Too many caches",
261 InvalidOpcode => "Invalid opcode",
262 TooFewArguments => "Too few arguments",
263 StackOverflow => "Stack overflow",
264 CodeOverflow => "Code overflow",
265 BadArgument => "Bad argument",
266 DivideByZero => "Divide by zero",
267 InvalidReference => "Invalid reference",
268 DebugOpCode => "Debug op code",
269 ENDFInExecStream => "ENDF in exec stream",
270 NestedDEFS => "Nested DEFS",
271 InvalidCodeRange => "Invalid code range",
272 ExecutionTooLong => "Execution too long",
273 TooManyFunctionDefs => "Too many function defs",
274 TooManyInstructionDefs => "Too many instruction defs",
275 TableMissing => "Table missing",
276 HorizHeaderMissing => "Horiz header missing",
277 LocationsMissing => "Locations missing",
278 NameTableMissing => "Name table missing",
279 CMapTableMissing => "C map table missing",
280 HmtxTableMissing => "Hmtx table missing",
281 PostTableMissing => "Post table missing",
282 InvalidHorizMetrics => "Invalid horiz metrics",
283 InvalidCharMapFormat => "Invalid char map format",
284 InvalidPPem => "Invalid p pem",
285 InvalidVertMetrics => "Invalid vert metrics",
286 CouldNotFindContext => "Could not find context",
287 InvalidPostTableFormat => "Invalid post table format",
288 InvalidPostTable => "Invalid post table",
289 Syntax => "Syntax",
290 StackUnderflow => "Stack underflow",
291 Ignore => "Ignore",
292 NoUnicodeGlyphName => "No unicode glyph name",
293 MissingStartfontField => "Missing startfont field",
294 MissingFontField => "Missing font field",
295 MissingSizeField => "Missing size field",
296 MissingFontboundingboxField => "Missing fontboundingbox field",
297 MissingCharsField => "Missing chars field",
298 MissingStartcharField => "Missing startchar field",
299 MissingEncodingField => "Missing encoding field",
300 MissingBbxField => "Missing bbx field",
301 BbxTooBig => "Bbx too big",
302 CorruptedFontHeader => "Corrupted font header",
303 CorruptedFontGlyphs => "Corrupted font glyphs",
304 Max => "Max",
305 UnexpectedPixelMode => "Unexpected pixel mode",
306 InvalidPath => "Invalid path",
307 Unknown => "Unknown",
308 }
309 }
310}
311
312pub(crate) fn from_ftret(c: i32) -> FtResult<()> {
313 if c == ffi::FT_Err_Ok { Ok(()) } else { Err(c.into()) }
314}