Läuft die Voice Acoustic VA-Remotecontrol (AllDSP AllControl) nativ unter Linux auf echtem wxGTK 3.0 — ohne Wine und ohne dekompilierten App-Code. Ausgeführt wird das unveränderte Python-2.7-Bytecode aus dem macOS-.app; C-Extensions (wxGTK/numpy/ scipy/PortAudio) kommen nativ aus Debian stretch. Enthält: va/ (Original-.pyc + pure-Python-Libs + Assets + launch.py mit den drei Linux-Fixes), Dockerfile/run.sh/entrypoint.sh, reference/ (dekompilierter Quellcode zum Debuggen) und README/STATUS. img.cache (378 MB, regenerierbar) ist per .gitignore ausgeschlossen. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
74 lines
2.0 KiB
Python
74 lines
2.0 KiB
Python
from FPDF import *
|
|
|
|
class Bookmark(FPDF):
|
|
def __init__(this,orientation='P',unit='mm',format='A4'):
|
|
FPDF.__init__(this,orientation,unit,format)
|
|
this.outlines=[]
|
|
this.OutlineRoot=None
|
|
|
|
def Bookmark(this,txt,level=0,y=0):
|
|
if(y==-1):
|
|
y=this.GetY()
|
|
this.outlines+=[{'t':txt,'l':level,'y':y,'p':this.PageNo()}]
|
|
|
|
def _putbookmarks(this):
|
|
nb=count(this.outlines)
|
|
if(nb==0):
|
|
return
|
|
lru={}
|
|
level=0
|
|
for i in range(len(this.outlines)):
|
|
o=this.outlines[i]
|
|
if(o['l']>0):
|
|
parent=lru[o['l']-1]
|
|
#Set parent and last pointers
|
|
this.outlines[i]['parent']=parent
|
|
this.outlines[parent]['last']=i
|
|
if(o['l']>level):
|
|
#Level increasing: set first pointer
|
|
this.outlines[parent]['first']=i
|
|
else:
|
|
this.outlines[i]['parent']=nb
|
|
if(o['l']<=level and i>0):
|
|
#Set prev and next pointers
|
|
prev=lru[o['l']]
|
|
this.outlines[prev]['next']=i
|
|
this.outlines[i]['prev']=prev
|
|
lru[o['l']]=i
|
|
level=o['l']
|
|
#Outline items
|
|
n=this.n+1
|
|
for i in range(len(this.outlines)):
|
|
o=this.outlines[i]
|
|
this._newobj()
|
|
this._out('<</Title '+this._textstring(o['t']))
|
|
this._out('/Parent '+str(n+o['parent'])+' 0 R')
|
|
if 'prev' in o:
|
|
this._out('/Prev '+str(n+o['prev'])+' 0 R')
|
|
if 'next' in o:
|
|
this._out('/Next '+str(n+o['next'])+' 0 R')
|
|
if 'first' in o:
|
|
this._out('/First '+str(n+o['first'])+' 0 R')
|
|
if 'last' in o:
|
|
this._out('/Last '+str(n+o['last'])+' 0 R')
|
|
this._out(sprintf('/Dest [%d 0 R /XYZ 0 %.2f null]',1+2*o['p'],(this.h-o['y'])*this.k))
|
|
this._out('/Count 0>>')
|
|
this._out('endobj')
|
|
#Outline root
|
|
this._newobj()
|
|
this.OutlineRoot=this.n
|
|
this._out('<</Type /Outlines /First '+str(n)+' 0 R')
|
|
this._out('/Last '+str(n+lru[0])+' 0 R>>')
|
|
this._out('endobj')
|
|
|
|
|
|
def _putresources(this):
|
|
FPDF._putresources(this)
|
|
this._putbookmarks()
|
|
|
|
def _putcatalog(this):
|
|
FPDF._putcatalog(this)
|
|
if(count(this.outlines)>0):
|
|
this._out('/Outlines '+str(this.OutlineRoot)+' 0 R')
|
|
this._out('/PageMode /UseOutlines')
|