Welcome!
This is the community forum for my apps Pythonista and Editorial.
For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.
How to improve speed of drawing? Very slow scene view.
-
Unfortunately @JonB I confirm that it crashes on 64 bit.
-
Which line is crashing? Do you have the fault handler installed?
-
https://gist.github.com/7a73b8c3abab4dc502ef2314574c6744
For some reason I was missing a slew of definitions. Try this one on 64bit...
-
@JonB i get "No method found for mutableCopy" on line 80
-
https://gist.github.com/80660624600c28c8e7812b15e0652568
How about this one.... -
@JonB this one raises the exception from line 15
-
can you paste the full traceback? Also, did you place the Panvaria.ttf file in the same folder? I probably should have mentioned that!
-
@JonB yes, i have the file in the same folder.
Traceback (most recent call last): File "/private/var/mobile/Containers/Shared/AppGroup/2CB744A3-0F69-40E1-A5F1-95E464DBFC21/Pythonista3/Documents/PythonistaGit/VF/64bit.py", line 144, in <module> [glyphs_list, variation_values]=setupGlyphs(size=512,letter='e') File "/private/var/mobile/Containers/Shared/AppGroup/2CB744A3-0F69-40E1-A5F1-95E464DBFC21/Pythonista3/Documents/PythonistaGit/VF/64bit.py", line 78, in setupGlyphs basefont = c.CGFontCreateWithDataProvider(provider); File "/private/var/mobile/Containers/Shared/AppGroup/2CB744A3-0F69-40E1-A5F1-95E464DBFC21/Pythonista3/Documents/PythonistaGit/VF/64bit.py", line 15, in errcheck raise Exception('{} returned void pointer with args\n{}'.format(func.__name__,args)) Exception: CGFontCreateWithDataProvider returned void pointer with args (6242820560,)```
-
added a little extra diagnostics, and tried passing provider as objcinstancee.
https://gist.github.com/b4c3e011e768320753e3c54405c56380 -
@JonB here's the traceback
Traceback (most recent call last): File "/private/var/mobile/Containers/Shared/AppGroup/2CB744A3-0F69-40E1-A5F1-95E464DBFC21/Pythonista3/Documents/PythonistaGit/VF/64bit.py", line 148, in <module> [glyphs_list, variation_values]=setupGlyphs(size=512,letter='e') File "/private/var/mobile/Containers/Shared/AppGroup/2CB744A3-0F69-40E1-A5F1-95E464DBFC21/Pythonista3/Documents/PythonistaGit/VF/64bit.py", line 82, in setupGlyphs basefont = c.CGFontCreateWithDataProvider(provider); File "/private/var/mobile/Containers/Shared/AppGroup/2CB744A3-0F69-40E1-A5F1-95E464DBFC21/Pythonista3/Documents/PythonistaGit/VF/64bit.py", line 15, in errcheck raise Exception('{} returned void pointer with args\n{}'.format(func.__name__,args)) Exception: CGFontCreateWithDataProvider returned void pointer with args (<b'__NSCFType': <CGDataProvider 0x17418b530>>,)```
-
How did yoy get the ttf into the device? i think this is saying the font file is invalid.
This version downloads the font directly
https://gist.github.com/7a766eb282c71bf7d27bd13fb4926482 -
@JonB there was indeed something wrong with the file. this script just crashes the app. is there a method to catch errors on crash?
-
@dgelessus has a pythonista_startup repo that installs a fault handler and uncaught exception handler which write to a fault log, so you can see which line (for segfaults and the like) or an objc stack trace in the case of objc errors (which often include a helpful message)
https://github.com/dgelessus/pythonista_startup
See the readme, there are several scripts here, personally I just use the enable_faulthandler one.
You could also set a breakpoint by long pressing in the debugger, and just keep single stepping until the crash happens.
-
https://gist.github.com/38a5434b4ebd28775dab08d181a00771
Here is a version that logs all cdll calls to glyphlog.txt. if you can post that someplace, we can see exactly what is crashing. -
@JonB thank you for hints on debugging, definetely helpful.
Here's the error log: https://gist.github.com/5bac67b24317b5e5b4badc06bee1b1c5
-
whoops, I missed one of the definitions.
https://gist.github.com/a30ddae506762c96e533f98668ad46dd
This should do it now....maybeThought for a future improvement....a CDLL which prevents calling a function unless restype and argtypes have specifically been defined.
-
@JonB unfortunatelly: https://gist.github.com/5f53f356c0c85fa9525efd13a1000198
-
well, getting close at least.
try
c.CTFontCreatePathForGlyph.restype = c_void_p
I tried to get fancy, setting restype to a callable, which maybe was a mistake.Also, I am a little wary of CGGlyph. You could try redefining that. maybe try c_int, or c_int32.
You could also try setting the transform (third argument) to None, just incase there is a problem with the CaTransform.
-
@JonB Callable
restype
s are broken and deprecated - if you setrestype
to a callable,ctypes
assumes that the return value is a 32-bit int. Most likely you didn't notice anything because you're on a 32-bit device, but on 64-bit devices this will cut off pointers and things will crash.I think the currently recommended way to do post-processing on a return value is to set
restype
to a regularctypes
type, and then set the C function'serrcheck
attribute as described in thectypes
docs (underCFUNCTYPE
probably). This will work regardless of pointer size, because you're tellingctypes
the return type viarestype
.This is another situation where
ctypes
makes default choices that silently do the wrong thing on 64-bit machines. Ifctypes
doesn't know the type of an argument or return value, it defaults to 32-bit ints instead of throwing an error. On 32-bit systems this makes life easier, because almost everything fits into 32 bits, and you almost never need type declarations this way. But on 64-bit systems everything breaks because suddenly half of all ints are 64-bit. -
ok, good to know about callable restype, that was the last one, surely.
A lot of the problems up to this point were due to me forgetting to define restype/argtypes on some parameter, which worked fine for me on 32bit. At some point I think I will subclass CDLL to ensure that argtypes/restype have been user set before allowing call, to prevent this sort of carelessness.