Note that there are some explanatory texts on larger screens.

plurals
  1. POhelp to convert python ctypes struct to 64bit
    text
    copied!<p>I found this script attached to <a href="http://sourceforge.net/mailarchive/message.php?msg_name=slrnictd6c.s1n.mozbugbox%40mozbugbox.somehost.org" rel="nofollow">a thread in the fontforge-users mailing list</a>. It does <em>exactly</em> what I want. However, it seems only to work on 32bit systems, and I would really like to use it on my 64bit system. </p> <p>I've done a little reading but I can't work out how I should modify this script (presumably the stuct?) to make it work under a 64bit architecture. Can anyone help?</p> <p>Cheers!</p> <pre><code>#!/usr/bin/python # vim:ts=8:sw=4:expandtab:encoding=utf-8 # Export named font from PDF file using fontforge and ctypes import sys from ctypes import * STRING = c_char_p real = c_longdouble # We need the `map` attribute of SplineFont, so declear an incomplete struct. # see: http://sourceforge.net/projects/wqy/files/misc/ # file: fontforge-bindctypes-0.1.tar.bz2 class splinefont(Structure): pass SplineFont = splinefont splinefont._fields_ = [ ('fontname', STRING), ('fullname', STRING), ('familyname', STRING), ('weight', STRING), ('copyright', STRING), ('filename', STRING), ('defbasefilename', STRING), ('version', STRING), ('italicangle', real), ('upos', real), ('uwidth', real), ('ascent', c_int), ('descent', c_int), ('uniqueid', c_int), ('glyphcnt', c_int), ('glyphmax', c_int), ('glyphs', POINTER(c_void_p)), ('changed', c_uint, 1), ('changed_since_autosave', c_uint, 1), ('changed_since_xuidchanged', c_uint, 1), ('display_antialias', c_uint, 1), ('display_bbsized', c_uint, 1), ('dotlesswarn', c_uint, 1), ('onlybitmaps', c_uint, 1), ('serifcheck', c_uint, 1), ('issans', c_uint, 1), ('isserif', c_uint, 1), ('hasvmetrics', c_uint, 1), ('loading_cid_map', c_uint, 1), ('dupnamewarn', c_uint, 1), ('encodingchanged', c_uint, 1), ('multilayer', c_uint, 1), ('strokedfont', c_uint, 1), ('new', c_uint, 1), ('compacted', c_uint, 1), ('backedup', c_uint, 2), ('use_typo_metrics', c_uint, 1), ('weight_width_slope_only', c_uint, 1), ('save_to_dir', c_uint, 1), ('head_optimized_for_cleartype', c_uint, 1), ('ticked', c_uint, 1), ('internal_temp', c_uint, 1), ('complained_about_spiros', c_uint, 1), ('use_xuid', c_uint, 1), ('use_uniqueid', c_uint, 1), ('fv', c_void_p), ('metrics', c_void_p), ('uni_interp', c_int), ('for_new_glyphs', c_void_p), ('map', c_void_p), # ... ] def main(): if len(sys.argv) != 3: print "Usage: %s doc.pdf fontname" % sys.argv[0] sys.exit(2) pdfname = sys.argv[1] fontname = sys.argv[2] fontfile = fontname + '.ttf' # ctypes functions libc = CDLL("libc.so.6") libc.fopen.restype = c_void_p libc.fopen.argtype = [c_char_p, c_char_p] lib_ff = CDLL('libfontforge.so.1') # SplineFont *_SFReadPdfFont(FILE *pdf,char *filename, # char *select_this_font, enum openflags openflags) lib_ff._SFReadPdfFont.argtypes = [c_void_p, c_char_p, c_char_p, c_int] lib_ff._SFReadPdfFont.restype = POINTER(SplineFont) # int GenerateScript(SplineFont *sf, char *filename, char *bitmaptype, # int fmflags, int res, char *subfontdefinition, struct sflist *sfs, # EncMap *map, NameList *rename_to,int layer) lib_ff.GenerateScript.argytpes = [POINTER(SplineFont), c_char_p, c_char_p, c_int, c_int, c_char_p, c_void_p, c_void_p, c_void_p, c_int] lib_ff.GenerateScript.restype = c_int # need to somehow initialize libfontforge or it will segfault somewhere. lib_ff.doinitFontForgeMain() fobj = libc.fopen(pdfname, "rb") if not fobj: print "%s not found" % pdfname sys.exit(1) font = lib_ff._SFReadPdfFont(fobj, pdfname, fontname, 0) ret = 0 if bool(font): ret = lib_ff.GenerateScript(font, fontfile, None, -1, -1, None, None, font.contents.map, None, 1) if ret: print 'Font export to "%s".' % fontfile else: print "** Error ** Failed to export font!!" if __name__ == '__main__': main() </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload