summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--graphics/piddle/files/patch-2to32238
1 files changed, 2238 insertions, 0 deletions
diff --git a/graphics/piddle/files/patch-2to3 b/graphics/piddle/files/patch-2to3
new file mode 100644
index 000000000000..2393103c2106
--- /dev/null
+++ b/graphics/piddle/files/patch-2to3
@@ -0,0 +1,2238 @@
+--- src/piddle/PixMapWrapper.py.orig 2002-06-03 13:46:30 UTC
++++ src/piddle/PixMapWrapper.py
+@@ -93,7 +93,7 @@ class PixMapWrapper:
+
+ def __setattr__(self, attr, val):
+ if attr == 'baseAddr':
+- raise 'UseErr', "don't assign to .baseAddr -- assign to .data instead"
++ raise('UseErr', "don't assign to .baseAddr -- assign to .data instead")
+ elif attr == 'data':
+ self.__dict__['data'] = val
+ self._stuff('baseAddr', id(self.data) + MacOS.string_id_to_buffer)
+@@ -109,7 +109,7 @@ class PixMapWrapper:
+ elif attr == 'hRes' or attr == 'vRes':
+ # 16.16 fixed format, so just shift 16 bits
+ self._stuff(attr, int(val) << 16)
+- elif attr in _pmElemFormat.keys():
++ elif attr in list(_pmElemFormat.keys()):
+ # any other pm attribute -- just stuff
+ self._stuff(attr, val)
+ else:
+@@ -129,7 +129,7 @@ class PixMapWrapper:
+ elif attr == 'hRes' or attr == 'vRes':
+ # 16.16 fixed format, so just shift 16 bits
+ return self._unstuff(attr) >> 16
+- elif attr in _pmElemFormat.keys():
++ elif attr in list(_pmElemFormat.keys()):
+ # any other pm attribute -- just unstuff
+ return self._unstuff(attr)
+ else:
+@@ -151,7 +151,7 @@ class PixMapWrapper:
+ if y2 == None:
+ dest[3] = y1 + src[3]-src[1]
+ if not port: port = Qd.GetPort()
+- print "blit port:", port
++ print("blit port:", port)
+ Qd.CopyBits(self.PixMap(), port.portBits, src, tuple(dest),
+ QuickDraw.srcCopy, None)
+
+@@ -186,7 +186,7 @@ class PixMapWrapper:
+ # so convert if necessary
+ if format != imgformat.macrgb and format != imgformat.macrgb16:
+ # (LATER!)
+- raise "NotImplementedError", "conversion to macrgb or macrgb16"
++ raise("NotImplementedError", "conversion to macrgb or macrgb16")
+ self.data = s
+ self.bounds = (0,0,width,height)
+ self.cmpCount = 3
+@@ -207,7 +207,7 @@ class PixMapWrapper:
+ return self.data
+ # otherwise, convert to the requested format
+ # (LATER!)
+- raise "NotImplementedError", "data format conversion"
++ raise("NotImplementedError", "data format conversion")
+
+ def fromImage(self,im):
+ """Initialize this PixMap from a PIL Image object."""
+--- src/piddle/aigen.py.orig 2002-06-03 13:46:30 UTC
++++ src/piddle/aigen.py
+@@ -344,7 +344,7 @@ class FontCache:
+
+ def loadfont(self, fontname):
+ filename = AFMDIR + os.sep + fontname + '.afm'
+- print 'cache loading',filename
++ print('cache loading',filename)
+ assert os.path.exists(filename)
+ widths = parseAFMfile(filename)
+ self.__widtharrays[fontname] = widths
+@@ -357,7 +357,7 @@ class FontCache:
+ return self.__widtharrays[fontname]
+ except:
+ # font not found, use Courier
+- print 'Font',fontname,'not found - using Courier for widths'
++ print('Font',fontname,'not found - using Courier for widths')
+ return self.getfont('courier')
+
+
+@@ -369,7 +369,7 @@ class FontCache:
+ return w
+ def status(self):
+ #returns loaded fonts
+- return self.__widtharrays.keys()
++ return list(self.__widtharrays.keys())
+
+ TheFontCache = FontCache()
+
+@@ -443,8 +443,8 @@ class AIDocument:
+ self.transforms.originy = 0
+ # self.info.boundingBox = boundingbox
+ lx,ly, ux,uy, tx = boundingbox
+- print 'setBoundingBox', lx,ly, ux,uy, tx
+- print 'setBoundingBox', ux-lx,uy-ly
++ print('setBoundingBox', lx,ly, ux,uy, tx)
++ print('setBoundingBox', ux-lx,uy-ly)
+ self.info.pagesize = (ux-lx), (uy-ly)
+ ##XXX If the ArtSize is smaller than Letter Freehand always draws the
+ ##XXX origin as if the Art board was Letter sized, however the arboard
+@@ -459,7 +459,7 @@ class AIDocument:
+ # print self.transforms
+ # print self.transforms.originx
+ # print self.transforms.originy
+- print 'setBoundingBox', lx,ly, ux,uy
++ print('setBoundingBox', lx,ly, ux,uy)
+ self.info.boundingBox = lx, ly, ux, uy
+ self.transforms.height = uy
+
+@@ -479,16 +479,16 @@ class AIDocument:
+
+ def printXref(self):
+ self.startxref = sys.stdout.tell()
+- print 'xref'
+- print 0,len(self.objects) + 1
+- print '0000000000 65535 f'
++ print('xref')
++ print(0,len(self.objects) + 1)
++ print('0000000000 65535 f')
+ for pos in self.xref:
+- print '%0.10d 00000 n' % pos
++ print('%0.10d 00000 n' % pos)
+
+ def printTrailer(self):
+- print '''%%PageTrailer
++ print('''%%PageTrailer
+ gsave annotatepage grestore showpage
+-%%Trailer'''
++%%Trailer''')
+ # print '<< /Size %d /Root %d 0 R /Info %d 0 R>>' % (len(self.objects) + 1, 1, self.infopos)
+ # print 'startxref'
+ # print self.startxref
+@@ -496,7 +496,6 @@ gsave annotatepage grestore showpage
+ def printAI(self):
+ "prints it to standard output. Logs positions for doing trailer"
+ # print "%AI-1.0"
+-# print "%’“¦²"
+ i = 1
+ self.xref = []
+ # print self.objects
+@@ -510,7 +509,7 @@ gsave annotatepage grestore showpage
+ # i = i + 1
+ # self.printXref()
+ self.printTrailer()
+- print "%%EOF",
++ print("%%EOF", end=' ')
+
+
+ def addPage(self, page):
+@@ -570,10 +569,10 @@ class OutputGrabber:
+ def testOutputGrabber():
+ gr = OutputGrabber()
+ for i in range(10):
+- print 'line',i
++ print('line',i)
+ data = gr.getData()
+ gr.close()
+- print 'Data...',data
++ print('Data...',data)
+
+
+ ##############################################################
+@@ -587,7 +586,7 @@ def testOutputGrabber():
+ class AIObject:
+ "Base class for all AI objects"
+ def printAI(self):
+- print '% base AI object'
++ print('% base AI object')
+
+
+ class AILiteral(AIObject):
+@@ -595,7 +594,7 @@ class AILiteral(AIObject):
+ def __init__(self, text):
+ self.text = text
+ def printAI(self):
+- print self.text
++ print(self.text)
+
+
+
+@@ -608,7 +607,7 @@ class AICatalog(AIObject):
+ /Outlines %d 0 R
+ >>'''
+ def printAI(self):
+- print self.template % (self.RefPages, self.RefOutlines)
++ print(self.template % (self.RefPages, self.RefOutlines))
+
+ class AIHeader(AIObject):
+ # no features implemented yet
+@@ -622,26 +621,26 @@ class AIHeader(AIObject):
+ self.datestr = time.strftime("%x %I:%M %p", now)
+
+ def printAI(self):
+- print "%!PS-Adobe-3.0"
+- print "%%Creator: PIDDLE Adobe Illustrator backend"
+- print "%%Title: " +'(%s)' % self.title
+- print "%%For: " +'(%s)' % self.author
+- print "%%CreationDate: " +'(%s)' % self.datestr
+- print "%%DocumentProcessColors: Black"""
+- print '%%BoundingBox: ' + '%s %s %s %s' % self.boundingBox
++ print("%!PS-Adobe-3.0")
++ print("%%Creator: PIDDLE Adobe Illustrator backend")
++ print("%%Title: " +'(%s)' % self.title)
++ print("%%For: " +'(%s)' % self.author)
++ print("%%CreationDate: " +'(%s)' % self.datestr)
++ print("%%DocumentProcessColors: Black""")
++ print('%%BoundingBox: ' + '%s %s %s %s' % self.boundingBox)
+ #%%DocumentProcessColors: Cyan Magenta Yellow
+ #%%DocumentCustomColors: (PANTONE 156 CV)
+ #%%RGBCustomColor: red green blue (customcolorname)
+ #%%DocumentFonts: CooperBlack
+ #%%+ Minion-Regular
+ #%%DocumentFiles: WrathOfRalph
+- print "%AI5_FileFormat 3"
+- print "%AI3_ColorUsage: Color"
+- print '%AI5_ArtSize: ' + '%s %s' % self.pagesize
+- print '%AI5_Templatebox: ' + '%s %s' % self.pagesize
++ print("%AI5_FileFormat 3")
++ print("%AI3_ColorUsage: Color")
++ print('%AI5_ArtSize: ' + '%s %s' % self.pagesize)
++ print('%AI5_Templatebox: ' + '%s %s' % self.pagesize)
+ #%AI7_ImageSettings: flag
+- print '%AI5_TargetResolution: 300'
+- print '%%EndComments'
++ print('%AI5_TargetResolution: 300')
++ print('%%EndComments')
+
+
+ class AIProlog(AIObject):
+@@ -649,18 +648,18 @@ class AIProlog(AIObject):
+ def __init__(self):
+ self.FontList = []
+ def printAI(self):
+- print '%%BeginProlog'
+- print '%%EndProlog'
++ print('%%BeginProlog')
++ print('%%EndProlog')
+
+ class AISetUp(AIObject):
+ "null outline, does nothing yet"
+ def __init__(self):
+ self.FontList = []
+ def printAI(self):
+- print '%%BeginSetup'
++ print('%%BeginSetup')
+ if self.FontList:
+ pass
+- print '%%EndSetup'
++ print('%%EndSetup')
+
+ class AIPageCollection(AIObject):
+ "presumes PageList attribute set (list of integers)"
+@@ -671,7 +670,7 @@ class AIPageCollection(AIObject):
+ for page in self.PageList:
+ result = result + str(page) + ' 0 R '
+ result = result + ']\n>>'
+- print result
++ print(result)
+
+ #class AIBody(AIObject):
+ # """The Bastard. Needs list of Resources etc. Use a standard one for now.
+@@ -776,14 +775,14 @@ class AIStream(AIObject):
+
+
+ # print '<< /Length %d >>' % length
+- print '''%AI5_BeginLayer
++ print('''%AI5_BeginLayer
+ 1 1 1 1 0 0 0 79 128 255 Lb
+-(Foreground) Ln'''
+- print self.transformAI(self.originx, self.originy, self.height)
++(Foreground) Ln''')
++ print(self.transformAI(self.originx, self.originy, self.height))
+
+ # print 'XXXX', self.data
+- print '''LB
+-%AI5_EndLayer--'''
++ print('''LB
++%AI5_EndLayer--''')
+
+ def transformAI(self, ox, oy, ty):
+ # print 'transformAI', ox, oy
+@@ -806,7 +805,7 @@ class AIStream(AIObject):
+
+ class AIImage(AIObject):
+ def printAI(self):
+- print """<<
++ print("""<<
+ /Type /XObject
+ /Subtype /Image
+ /Name /Im0
+@@ -823,7 +822,7 @@ stream
+ B2BBC2 BB6F84 31BFC2 18EA3C 0E3E00 07FC00 03F800
+ 1E1800 1FF800>
+ endstream
+-endobj"""
++endobj""")
+
+ class AIType1Font(AIObject):
+ def __init__(self, key, font):
+@@ -837,11 +836,11 @@ class AIType1Font(AIObject):
+ /Encoding /WinAnsiEncoding
+ >>"""
+ def printAI(self):
+- print self.template % (self.keyname, self.fontname)
++ print(self.template % (self.keyname, self.fontname))
+
+ class AIProcSet(AIObject):
+ def printAI(self):
+- print "[/AI /Text]"
++ print("[/AI /Text]")
+
+
+
+@@ -876,4 +875,4 @@ def MakeFontDictionary(startpos, count):
+
+
+ #if __name__ == '__main__':
+-# print 'For test scripts, run test1.py to test7.py'
+\ No newline at end of file
++# print 'For test scripts, run test1.py to test7.py'
+--- src/piddle/discipline.py.orig 2002-06-03 13:46:30 UTC
++++ src/piddle/discipline.py
+@@ -4,28 +4,28 @@ from piddle import *
+ def checkMethods(parentMethod, childMethod):
+ "Make sure the child's method obey's the parent's interface; return 1 if OK."
+ # get the parameter names
+- pf = parentMethod.func_code
+- cf = childMethod.func_code
++ pf = parentMethod.__code__
++ cf = childMethod.__code__
+ pargs = pf.co_varnames[:pf.co_argcount]
+ cargs = cf.co_varnames[:cf.co_argcount]
+
+ # make sure they match, at least as far as the parent's go
+ if len(cargs) < len(pargs):
+- print "too few args"
++ print("too few args")
+ return 0
+ for i in range(len(pargs)):
+ if pargs[i] != cargs[i]:
+- print "arg names don't match"
++ print("arg names don't match")
+ return 0
+
+ # if child has any additional arguments, make sure
+ # they have default values
+ extras = len(cargs) - len(pargs)
+- defs = childMethod.func_defaults
++ defs = childMethod.__defaults__
+ if extras and (defs is None or len(defs) < extras):
+- print "need %s defaults, got %s" % (extras, defs)
+- print cargs
+- print pargs
++ print("need %s defaults, got %s" % (extras, defs))
++ print(cargs)
++ print(pargs)
+ return 0
+
+ # otherwise, it's OK
+@@ -41,17 +41,17 @@ def checkClasses(parent, child):
+ if type(item) != MethodType or name[0] == '_':
+ pass # print " %s is not a public method" % name
+ elif name in parentDir:
+- if not checkMethods(getattr(parent, name).im_func, item.im_func):
+- print "NAUGHTY CHILD disobeys arguments to", name
++ if not checkMethods(getattr(parent, name).__func__, item.__func__):
++ print("NAUGHTY CHILD disobeys arguments to", name)
+ else:
+- print " %s looks OK" % name
++ print(" %s looks OK" % name)
+ else:
+- print " %s is unique to the child" % name
++ print(" %s is unique to the child" % name)
+
+-foo = raw_input("backend to check (e.g., PDF):")
++foo = input("backend to check (e.g., PDF):")
+ if foo:
+ canvasname = foo+"Canvas"
+ module = __import__("piddle"+foo, globals(), locals(), [canvasname] )
+ child = getattr(module, canvasname)
+- print "\nChecking %s...\n" % canvasname
++ print("\nChecking %s...\n" % canvasname)
+ checkClasses( Canvas, child )
+--- src/piddle/pdfdoc.py.orig 2002-06-03 13:46:30 UTC
++++ src/piddle/pdfdoc.py
+@@ -18,7 +18,7 @@ import sys
+ import string
+ import time
+ import tempfile
+-import cStringIO
++import io
+ from types import *
+ from math import sin, cos, pi, ceil
+
+@@ -152,10 +152,10 @@ class PDFDocument:
+
+
+ def printTrailer(self):
+- print 'trailer'
+- print '<< /Size %d /Root %d 0 R /Info %d 0 R>>' % (len(self.objects) + 1, 1, self.infopos)
+- print 'startxref'
+- print self.startxref
++ print('trailer')
++ print(('<< /Size %d /Root %d 0 R /Info %d 0 R>>' % (len(self.objects) + 1, 1, self.infopos)))
++ print('startxref')
++ print((self.startxref))
+
+ def writeTrailer(self, f):
+ f.write('trailer' + LINEEND)
+@@ -176,7 +176,6 @@ class PDFDocument:
+ i = 1
+ self.xref = []
+ f.write("%PDF-1.2" + LINEEND) # for CID support
+- f.write("%íì¶¾" + LINEEND)
+ for obj in self.objects:
+ pos = f.tell()
+ self.xref.append(pos)
+@@ -201,20 +200,19 @@ class PDFDocument:
+
+ def printPDF(self):
+ "prints it to standard output. Logs positions for doing trailer"
+- print "%PDF-1.0"
+- print "%íì¶¾"
++ print("%PDF-1.0")
+ i = 1
+ self.xref = []
+ for obj in self.objects:
+ pos = sys.stdout.tell()
+ self.xref.append(pos)
+- print i, '0 obj'
++ print(i, '0 obj')
+ obj.printPDF()
+- print 'endobj'
++ print('endobj')
+ i = i + 1
+ self.printXref()
+ self.printTrailer()
+- print "%%EOF",
++ print("%%EOF", end=' ')
+
+ def addPage(self, page):
+ """adds page and stream at end. Maintains pages list"""
+@@ -235,16 +233,16 @@ class PDFDocument:
+ #self.objects.append(page.stream)
+
+ def hasFont(self, psfontname):
+- return self.fontMapping.has_key(psfontname)
++ return psfontname in self.fontMapping
+
+ def getInternalFontName(self, psfontname):
+ try:
+ return self.fontMapping[psfontname]
+ except:
+- raise PDFError, "Font %s not available in document" % psfontname
++ raise PDFError("Font %s not available in document" % psfontname)
+
+ def getAvailableFonts(self):
+- fontnames = self.fontMapping.keys()
++ fontnames = list(self.fontMapping.keys())
+ fontnames.sort()
+ return fontnames
+
+@@ -284,10 +282,10 @@ class OutputGrabber:
+ def testOutputGrabber():
+ gr = OutputGrabber()
+ for i in range(10):
+- print 'line',i
++ print('line',i)
+ data = gr.getData()
+ gr.close()
+- print 'Data...',data
++ print('Data...',data)
+
+
+ ##############################################################
+@@ -562,4 +560,4 @@ def MakeFontDictionary(startpos, count):
+ return dict
+
+ if __name__ == '__main__':
+- print 'For test scripts, run test1.py to test6.py'
++ print('For test scripts, run test1.py to test6.py')
+--- src/piddle/pdfgen.py.orig 2002-06-03 13:46:30 UTC
++++ src/piddle/pdfgen.py
+@@ -53,7 +53,7 @@ import sys
+ import string
+ import time
+ import tempfile
+-import cStringIO
++import io
+ from types import *
+ from math import sin, cos, tan, pi, ceil
+
+@@ -570,12 +570,12 @@ class Canvas:
+ try:
+ import Image
+ except ImportError:
+- print 'Python Imaging Library not available'
++ print('Python Imaging Library not available')
+ return
+ try:
+ import zlib
+ except ImportError:
+- print 'zlib not available'
++ print('zlib not available')
+ return
+
+ self._currentPageHasImages = 1
+@@ -605,9 +605,9 @@ class Canvas:
+ #write in blocks of (??) 60 characters per line to a list
+ compressed = imageFile.read()
+ encoded = pdfutils._AsciiBase85Encode(compressed)
+- outstream = cStringIO.StringIO(encoded)
++ outstream = io.StringIO(encoded)
+ dataline = outstream.read(60)
+- while dataline <> "":
++ while dataline != "":
+ imagedata.append(dataline)
+ dataline = outstream.read(60)
+ imagedata.append('EI')
+@@ -618,7 +618,7 @@ class Canvas:
+ cachedname = os.path.splitext(image)[0] + '.a85'
+ imagedata = open(cachedname,'rb').readlines()
+ #trim off newlines...
+- imagedata = map(string.strip, imagedata)
++ imagedata = list(map(string.strip, imagedata))
+
+ #parse line two for width, height
+ words = string.split(imagedata[1])
+@@ -643,9 +643,9 @@ class Canvas:
+ encoded = pdfutils._AsciiBase85Encode(compressed) #...sadly this isn't
+
+ #write in blocks of (??) 60 characters per line to a list
+- outstream = cStringIO.StringIO(encoded)
++ outstream = io.StringIO(encoded)
+ dataline = outstream.read(60)
+- while dataline <> "":
++ while dataline != "":
+ imagedata.append(dataline)
+ dataline = outstream.read(60)
+ imagedata.append('EI')
+@@ -680,48 +680,48 @@ class Canvas:
+ # This is based on Thomas Merz's code from GhostScript (viewjpeg.ps)
+ def readJPEGInfo(self, image):
+ "Read width, height and number of components from JPEG file"
+- import struct
++ import struct
+
+- #Acceptable JPEG Markers:
+- # SROF0=baseline, SOF1=extended sequential or SOF2=progressive
+- validMarkers = [0xC0, 0xC1, 0xC2]
++ #Acceptable JPEG Markers:
++ # SROF0=baseline, SOF1=extended sequential or SOF2=progressive
++ validMarkers = [0xC0, 0xC1, 0xC2]
+
+- #JPEG markers without additional parameters
+- noParamMarkers = \
+- [ 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0x01 ]
++ #JPEG markers without additional parameters
++ noParamMarkers = \
++ [ 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0x01 ]
+
+- #Unsupported JPEG Markers
+- unsupportedMarkers = \
+- [ 0xC3, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCD, 0xCE, 0xCF ]
++ #Unsupported JPEG Markers
++ unsupportedMarkers = \
++ [ 0xC3, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCD, 0xCE, 0xCF ]
+
+- #read JPEG marker segments until we find SOFn marker or EOF
+- done = 0
+- while not done:
+- x = struct.unpack('B', image.read(1))
+- if x[0] == 0xFF: #found marker
+- x = struct.unpack('B', image.read(1))
+- #print "Marker: ", '%0.2x' % x[0]
+- #check marker type is acceptable and process it
+- if x[0] in validMarkers:
+- image.seek(2, 1) #skip segment length
+- x = struct.unpack('B', image.read(1)) #data precision
+- if x[0] != 8:
+- raise 'PDFError', ' JPEG must have 8 bits per component'
+- y = struct.unpack('BB', image.read(2))
+- height = (y[0] << 8) + y[1]
+- y = struct.unpack('BB', image.read(2))
+- width = (y[0] << 8) + y[1]
+- y = struct.unpack('B', image.read(1))
+- color = y[0]
+- return width, height, color
+- done = 1
+- elif x[0] in unsupportedMarkers:
+- raise 'PDFError', ' Unsupported JPEG marker: %0.2x' % x[0]
+- elif x[0] not in noParamMarkers:
+- #skip segments with parameters
+- #read length and skip the data
+- x = struct.unpack('BB', image.read(2))
+- image.seek( (x[0] << 8) + x[1] - 2, 1)
++ #read JPEG marker segments until we find SOFn marker or EOF
++ done = 0
++ while not done:
++ x = struct.unpack('B', image.read(1))
++ if x[0] == 0xFF: #found marker
++ x = struct.unpack('B', image.read(1))
++ #print "Marker: ", '%0.2x' % x[0]
++ #check marker type is acceptable and process it
++ if x[0] in validMarkers:
++ image.seek(2, 1) #skip segment length
++ x = struct.unpack('B', image.read(1)) #data precision
++ if x[0] != 8:
++ raise('PDFError', ' JPEG must have 8 bits per component')
++ y = struct.unpack('BB', image.read(2))
++ height = (y[0] << 8) + y[1]
++ y = struct.unpack('BB', image.read(2))
++ width = (y[0] << 8) + y[1]
++ y = struct.unpack('B', image.read(1))
++ color = y[0]
++ return width, height, color
++ done = 1
++ elif x[0] in unsupportedMarkers:
++ raise('PDFError', ' Unsupported JPEG marker: %0.2x' % x[0])
++ elif x[0] not in noParamMarkers:
++ #skip segments with parameters
++ #read length and skip the data
++ x = struct.unpack('BB', image.read(2))
++ image.seek((x[0] << 8) + x[1] - 2, 1)
+
+ def setPageCompression(self, onoff=1):
+ """Possible values 1 or 0 (1 for 'on' is the default).
+@@ -763,17 +763,17 @@ class Canvas:
+ if direction in [0,90,180,270]:
+ direction_arg = '/Di /%d' % direction
+ else:
+- raise 'PDFError', ' directions allowed are 0,90,180,270'
++ raise('PDFError', ' directions allowed are 0,90,180,270')
+
+ if dimension in ['H', 'V']:
+ dimension_arg = '/Dm /%s' % dimension
+ else:
+- raise'PDFError','dimension values allowed are H and V'
++ raise('PDFError','dimension values allowed are H and V')
+
+ if motion in ['I','O']:
+ motion_arg = '/M /%s' % motion
+ else:
+- raise'PDFError','motion values allowed are I and O'
++ raise('PDFError','motion values allowed are I and O')
+
+
+ # this says which effects require which argument types from above
+@@ -789,7 +789,7 @@ class Canvas:
+ try:
+ args = PageTransitionEffects[effectname]
+ except KeyError:
+- raise 'PDFError', 'Unknown Effect Name "%s"' % effectname
++ raise('PDFError', 'Unknown Effect Name "%s"' % effectname)
+ self._pageTransitionString = ''
+ return
+
+@@ -1033,7 +1033,7 @@ class PDFTextObject:
+ if type(stuff) == StringType:
+ lines = string.split(string.strip(stuff), '\n')
+ if trim==1:
+- lines = map(string.strip,lines)
++ lines = list(map(string.strip,lines))
+ elif type(stuff) == ListType:
+ lines = stuff
+ elif type(stuff) == TupleType:
+@@ -1055,4 +1055,4 @@ class PDFTextObject:
+
+
+ if __name__ == '__main__':
+- print 'For test scripts, run testpdfgen.py'
++ print('For test scripts, run testpdfgen.py')
+--- src/piddle/pdfgeom.py.orig 2002-06-03 13:46:30 UTC
++++ src/piddle/pdfgeom.py
+@@ -10,7 +10,7 @@ So far, just Robert Kern's bezierArc.
+ from math import sin, cos, pi, ceil
+
+ def bezierArc(x1,y1, x2,y2, startAng=0, extent=90):
+- """bezierArc(x1,y1, x2,y2, startAng=0, extent=90) --> List of BÈzier
++ """bezierArc(x1,y1, x2,y2, startAng=0, extent=90) --> List of Bezier
+ curve control points.
+
+ (x1, y1) and (x2, y2) are the corners of the enclosing rectangle. The
+@@ -22,7 +22,7 @@ semi-circle.
+
+ The resulting coordinates are of the form (x1,y1, x2,y2, x3,y3, x4,y4)
+ such that the curve goes from (x1, y1) to (x4, y4) with (x2, y2) and
+-(x3, y3) as their respective BÈzier control points."""
++(x3, y3) as their respective Bezier control points."""
+
+ x1,y1, x2,y2 = min(x1,x2), max(y1,y2), max(x1,x2), min(y1,y2)
+
+--- src/piddle/pdfmetrics.py.orig 2002-06-03 13:46:30 UTC
++++ src/piddle/pdfmetrics.py
+@@ -93,7 +93,7 @@ class FontCache:
+
+ def loadfont(self, fontname):
+ filename = AFMDIR + os.sep + fontname + '.afm'
+- print 'cache loading',filename
++ print('cache loading',filename)
+ assert os.path.exists(filename)
+ widths = parseAFMfile(filename)
+ self.__widtharrays[fontname] = widths
+@@ -107,7 +107,7 @@ class FontCache:
+ return self.__widtharrays[fontname]
+ except:
+ # font not found, use Courier
+- print 'Font',fontname,'not found - using Courier for widths'
++ print('Font',fontname,'not found - using Courier for widths')
+ return self.getfont('courier')
+
+
+@@ -120,7 +120,7 @@ class FontCache:
+
+ def status(self):
+ #returns loaded fonts
+- return self.__widtharrays.keys()
++ return list(self.__widtharrays.keys())
+
+ TheFontCache = FontCache()
+
+--- src/piddle/pdfutils.py.orig 2002-06-03 13:46:30 UTC
++++ src/piddle/pdfutils.py
+@@ -3,7 +3,7 @@
+
+ import os
+ import string
+-import cStringIO
++import io
+
+ LINEEND = '\015\012'
+
+@@ -32,9 +32,9 @@ def cacheImageFile(filename):
+ encoded = _AsciiBase85Encode(compressed) #...sadly this isn't
+
+ #write in blocks of 60 characters per line
+- outstream = cStringIO.StringIO(encoded)
++ outstream = io.StringIO(encoded)
+ dataline = outstream.read(60)
+- while dataline <> "":
++ while dataline != "":
+ code.append(dataline)
+ dataline = outstream.read(60)
+
+@@ -45,7 +45,7 @@ def cacheImageFile(filename):
+ f = open(cachedname,'wb')
+ f.write(string.join(code, LINEEND)+LINEEND)
+ f.close()
+- print 'cached image as %s' % cachedname
++ print('cached image as %s' % cachedname)
+
+
+ def preProcessImages(spec):
+@@ -54,14 +54,14 @@ def preProcessImages(spec):
+ to save huge amounts of time when repeatedly building image
+ documents."""
+ import types
+- if type(spec) is types.StringType:
++ if type(spec) is bytes:
+ filelist = glob.glob(spec)
+ else: #list or tuple OK
+ filelist = spec
+
+ for filename in filelist:
+ if cachedImageExists(filename):
+- print 'cached version of %s already exists' % filename
++ print('cached version of %s already exists' % filename)
+ else:
+ cacheImageFile(filename)
+
+@@ -111,7 +111,7 @@ def _AsciiHexEncode(input):
+ """This is a verbose encoding used for binary data within
+ a PDF file. One byte binary becomes two bytes of ASCII."""
+ "Helper function used by images"
+- output = cStringIO.StringIO()
++ output = io.StringIO()
+ for char in input:
+ output.write('%02x' % ord(char))
+ output.write('>')
+@@ -126,7 +126,7 @@ def _AsciiHexDecode(input):
+ stripped = stripped[:-1] #chop off terminator
+ assert len(stripped) % 2 == 0, 'Ascii Hex stream has odd number of bytes'
+ i = 0
+- output = cStringIO.StringIO()
++ output = io.StringIO()
+ while i < len(stripped):
+ twobytes = stripped[i:i+2]
+ output.write(chr(eval('0x'+twobytes)))
+@@ -136,21 +136,21 @@ def _AsciiHexDecode(input):
+
+ def _AsciiHexTest(text='What is the average velocity of a sparrow?'):
+ "Do the obvious test for whether Ascii Hex encoding works"
+- print 'Plain text:', text
++ print('Plain text:', text)
+ encoded = _AsciiHexEncode(text)
+- print 'Encoded:', encoded
++ print('Encoded:', encoded)
+ decoded = _AsciiHexDecode(encoded)
+- print 'Decoded:', decoded
++ print('Decoded:', decoded)
+ if decoded == text:
+- print 'Passed'
++ print('Passed')
+ else:
+- print 'Failed!'
++ print('Failed!')
+
+ def _AsciiBase85Encode(input):
+ """This is a compact encoding used for binary data within
+ a PDF file. Four bytes of binary data become five bytes of
+ ASCII. This is the default method used for encoding images."""
+- outstream = cStringIO.StringIO()
++ outstream = io.StringIO()
+ # special rules apply if not a multiple of four bytes.
+ whole_word_count, remainder_size = divmod(len(input), 4)
+ cut = 4 * whole_word_count
+@@ -163,7 +163,7 @@ def _AsciiBase85Encode(input):
+ b3 = ord(body[offset+2])
+ b4 = ord(body[offset+3])
+
+- num = 16777216L * b1 + 65536 * b2 + 256 * b3 + b4
++ num = 16777216 * b1 + 65536 * b2 + 256 * b3 + b4
+
+ if num == 0:
+ #special case
+@@ -194,7 +194,7 @@ def _AsciiBase85Encode(input):
+ b3 = ord(lastbit[2])
+ b4 = ord(lastbit[3])
+
+- num = 16777216L * b1 + 65536 * b2 + 256 * b3 + b4
++ num = 16777216 * b1 + 65536 * b2 + 256 * b3 + b4
+
+ #solve for c1..c5
+ temp, c5 = divmod(num, 85)
+@@ -217,7 +217,7 @@ def _AsciiBase85Encode(input):
+ def _AsciiBase85Decode(input):
+ """This is not used - Acrobat Reader decodes for you - but a round
+ trip is essential for testing."""
+- outstream = cStringIO.StringIO()
++ outstream = io.StringIO()
+ #strip all whitespace
+ stripped = string.join(string.split(input),'')
+ #check end
+@@ -229,7 +229,7 @@ def _AsciiBase85Decode(input):
+ # special rules apply if not a multiple of five bytes.
+ whole_word_count, remainder_size = divmod(len(stripped), 5)
+ #print '%d words, %d leftover' % (whole_word_count, remainder_size)
+- assert remainder_size <> 1, 'invalid Ascii 85 stream!'
++ assert remainder_size != 1, 'invalid Ascii 85 stream!'
+ cut = 5 * whole_word_count
+ body, lastbit = stripped[0:cut], stripped[cut:]
+
+@@ -301,14 +301,14 @@ def _wrap(input, columns=60):
+
+ def _AsciiBase85Test(text='What is the average velocity of a sparrow?'):
+ "Do the obvious test for whether Base 85 encoding works"
+- print 'Plain text:', text
++ print('Plain text:', text)
+ encoded = _AsciiBase85Encode(text)
+- print 'Encoded:', encoded
++ print('Encoded:', encoded)
+ decoded = _AsciiBase85Decode(encoded)
+- print 'Decoded:', decoded
++ print('Decoded:', decoded)
+ if decoded == text:
+- print 'Passed'
++ print('Passed')
+ else:
+- print 'Failed!'
++ print('Failed!')
+
+
+--- src/piddle/piddle.py.orig 2002-06-03 13:48:50 UTC
++++ src/piddle/piddle.py
+@@ -143,7 +143,7 @@ class Color:
+ d["blue"] = _float(blue)
+
+ def __setattr__(self, name, value):
+- raise TypeError, "piddle.Color has read-only attributes"
++ raise TypeError("piddle.Color has read-only attributes")
+
+ def __mul__(self,x):
+ return Color(self.red*x, self.green*x, self.blue*x)
+@@ -369,7 +369,7 @@ class Font:
+ self.underline, repr(self.face))
+
+ def __setattr__(self, name, value):
+- raise TypeError, "piddle.Font has read-only attributes"
++ raise TypeError("piddle.Font has read-only attributes")
+
+
+ #-------------------------------------------------------------------------
+@@ -453,25 +453,23 @@ class Canvas:
+ but which might be buffered should be flushed to the screen"
+ pass
+
+- def save(self, file=None, format=None):
++ def save(self, file=None, format=None):
+
+- """For backends that can be save to a file or sent to a
+- stream, create a valid file out of what's currently been
+- drawn on the canvas. Trigger any finalization here.
+- Though some backends may allow further drawing after this call,
+- presume that this is not possible for maximum portability
++ """For backends that can be save to a file or sent to a
++ stream, create a valid file out of what's currently been
++ drawn on the canvas. Trigger any finalization here.
++ Though some backends may allow further drawing after this call,
++ presume that this is not possible for maximum portability
+
+- file may be either a string or a file object with a write method
+- if left as the default, the canvas's current name will be used
++ file may be either a string or a file object with a write method
++ if left as the default, the canvas's current name will be used
+
+- format may be used to specify the type of file format to use as
+- well as any corresponding extension to use for the filename
+- This is an optional argument and backends may ignore it if
+- they only produce one file format."""
+- pass
++ format may be used to specify the type of file format to use as
++ well as any corresponding extension to use for the filename
++ This is an optional argument and backends may ignore it if
++ they only produce one file format."""
++ pass
+
+-
+-
+ def setInfoLine(self, s):
+ "For interactive Canvases, displays the given string in the \
+ 'info line' somewhere where the user can probably see it."
+@@ -481,7 +479,7 @@ class Canvas:
+ def stringWidth(self, s, font=None):
+ "Return the logical width of the string if it were drawn \
+ in the current font (defaults to self.font)."
+- raise NotImplementedError, 'stringWidth'
++ raise NotImplementedError('stringWidth')
+
+ def fontHeight(self, font=None):
+ "Find the height of one line of text (baseline to baseline) of the given font."
+@@ -492,11 +490,11 @@ class Canvas:
+
+ def fontAscent(self, font=None):
+ "Find the ascent (height above base) of the given font."
+- raise NotImplementedError, 'fontAscent'
++ raise NotImplementedError('fontAscent')
+
+ def fontDescent(self, font=None):
+ "Find the descent (extent below base) of the given font."
+- raise NotImplementedError, 'fontDescent'
++ raise NotImplementedError('fontDescent')
+
+ #------------- drawing helpers --------------
+
+@@ -602,7 +600,7 @@ class Canvas:
+
+ def drawLine(self, x1,y1, x2,y2, color=None, width=None):
+ "Draw a straight line between x1,y1 and x2,y2."
+- raise NotImplementedError, 'drawLine'
++ raise NotImplementedError('drawLine')
+
+ def drawLines(self, lineList, color=None, width=None):
+ "Draw a set of lines of uniform color and width. \
+@@ -617,7 +615,7 @@ class Canvas:
+ def drawString(self, s, x,y, font=None, color=None, angle=0):
+ "Draw a string starting at location x,y."
+ # NOTE: the baseline goes on y; drawing covers (y-ascent,y+descent)
+- raise NotImplementedError, 'drawString'
++ raise NotImplementedError('drawString')
+
+
+ # For fillable shapes, edgeColor defaults to self.defaultLineColor,
+@@ -627,7 +625,7 @@ class Canvas:
+
+ def drawCurve(self, x1,y1, x2,y2, x3,y3, x4,y4,
+ edgeColor=None, edgeWidth=None, fillColor=None, closed=0):
+- "Draw a Bézier curve with control points x1,y1 to x4,y4."
++ "Draw a Bezier curve with control points x1,y1 to x4,y4."
+
+ pointlist = self.curvePoints(x1, y1, x2, y2, x3, y3, x4, y4)
+ self.drawPolygon(pointlist,
+@@ -697,7 +695,7 @@ class Canvas:
+ pointlist: a list of (x,y) tuples defining vertices
+ closed: if 1, adds an extra segment connecting the last point to the first
+ """
+- raise NotImplementedError, 'drawPolygon'
++ raise NotImplementedError('drawPolygon')
+
+ def drawFigure(self, partList,
+ edgeColor=None, edgeWidth=None, fillColor=None, closed=0):
+@@ -719,7 +717,7 @@ class Canvas:
+ elif op == figureCurve:
+ pointList.extend(apply(self.curvePoints,args))
+ else:
+- raise TypeError, "unknown figure operator: "+op
++ raise TypeError("unknown figure operator: ", op)
+
+ self.drawPolygon(pointList, edgeColor, edgeWidth, fillColor, closed=closed)
+
+@@ -729,7 +727,7 @@ class Canvas:
+ def drawImage(self, image, x1,y1, x2=None,y2=None):
+ """Draw a PIL Image into the specified rectangle. If x2 and y2 are
+ omitted, they are calculated from the image size."""
+- raise NotImplementedError, 'drawImage'
++ raise NotImplementedError('drawImage')
+
+
+
+@@ -748,9 +746,9 @@ def getFileObject(file):
+ if hasattr(file, "write"):
+ fileobj = file
+ else:
+- raise 'Invalid file argument to save'
++ raise('Invalid file argument to save')
+ else:
+- raise 'Invalid file argument to save'
++ raise('Invalid file argument to save')
+
+ return fileobj
+
+--- src/piddle/piddleAI.py.orig 2002-06-03 13:46:30 UTC
++++ src/piddle/piddleAI.py
+@@ -19,7 +19,7 @@ from piddle import *
+ import aigen
+ import string
+ import zlib
+-import cStringIO
++import io
+
+ from math import sin, cos, pi, ceil
+
+@@ -35,7 +35,7 @@ class AICanvas(Canvas):
+
+ def __init__(self, size=(0,0), name='piddle.ai'):
+ Canvas.__init__(self, size, name=name)
+- print name
++ print(name)
+ if name[-3:] == '.ai':
+ self.name = name
+ else:
+@@ -91,7 +91,7 @@ class AICanvas(Canvas):
+ self.setBoundingBox()
+ stream = self.winding + '\n' + self.winOrder
+ stream = [stream] + self.code
+- self.doc.setPage(stream)
++ self.doc.setPage(stream)
+
+ def save(self, file=None, format=None):
+ """Saves the file. If holding data, do
+@@ -99,7 +99,7 @@ class AICanvas(Canvas):
+ if len(self.code):
+ self.showPage()
+ self.doc.SaveToFile(self.name)
+- print 'saved', self.name
++ print('saved', self.name)
+
+
+
+@@ -428,7 +428,7 @@ class AICanvas(Canvas):
+ sl.append('l')
+ # print sl
+ # print sk
+- if i <> 0:
++ if i != 0:
+ self.code.append(tuple(sl))
+ self.code.append(tuple(sk))
+
+@@ -474,10 +474,10 @@ class AICanvas(Canvas):
+ edgeWidth=None, fillColor=None, closed=0):
+ start = pointlist[0]
+ pointlist = pointlist[1:]
+- x1 = min(map(lambda (x,y) : x, pointlist))
+- x2 = max(map(lambda (x,y) : x, pointlist))
+- y1 = min(map(lambda (x,y) : y, pointlist))
+- y2 = max(map(lambda (x,y) : y, pointlist))
++ x1 = min([x_y[0] for x_y in pointlist])
++ x2 = max([x_y1[0] for x_y1 in pointlist])
++ y1 = min([x_y2[1] for x_y2 in pointlist])
++ y2 = max([x_y3[1] for x_y3 in pointlist])
+ self._updateFillColor(fillColor)
+ self._updateLineWidth(edgeWidth)
+ self._updateLineColor(edgeColor)
+@@ -505,7 +505,7 @@ class AICanvas(Canvas):
+
+
+ def drawString():
+- print "Sorry Not yet impemented"
++ print("Sorry Not yet impemented")
+
+
+
+--- src/piddle/piddleFIG.py.orig 2002-06-03 13:46:30 UTC
++++ src/piddle/piddleFIG.py
+@@ -363,7 +363,7 @@ class FIGCanvas(Canvas):
+
+ def clear(self):
+ """Reset canvas to its default state."""
+- raise NotImplementedError, "clear"
++ raise NotImplementedError("clear")
+
+ def save(self, file=None, format=None):
+ """Write the current document to a file or stream and close the file.
+@@ -472,7 +472,7 @@ class FIGCanvas(Canvas):
+ }
+ self.code.append(code)
+ line = []
+- pointlist = map(lambda p, f=bp: (p[0]*bp, p[1]*bp), pointlist)
++ pointlist = list(map(lambda p, f=bp: (p[0]*bp, p[1]*bp), pointlist))
+ for coords in pointlist:
+ code = self.coord_fmt % coords
+ line.append(code)
+@@ -537,7 +537,7 @@ class FIGCanvas(Canvas):
+ self.code.append(code)
+ code = []
+ pointlist = [(x1, y1), (x1, y2), (x2, y2), (x2, y1), (x1, y1)]
+- pointlist = map(lambda p, f=bp: (p[0]*bp, p[1]*bp), pointlist)
++ pointlist = list(map(lambda p, f=bp: (p[0]*bp, p[1]*bp), pointlist))
+ for coords in pointlist:
+ code.append(self.coord_fmt % coords)
+ code = " ".join(code)
+--- src/piddle/piddleGL.py.orig 2002-06-03 13:46:30 UTC
++++ src/piddle/piddleGL.py
+@@ -61,7 +61,7 @@ try:
+ def vertexCB(self, O):
+ glVertex2d(O[0], O[1])
+ def combineCB(self, p1, p2, p3):
+- print len(p3)
++ print(len(p3))
+ return p3[0][-1]
+ def edgeFlagCB(self, *args):
+ pass
+@@ -149,7 +149,7 @@ class _GLCanvas(Canvas):
+ glCallList(list)
+ else:
+ func, args, kw = list
+- apply(func, args, kw)
++ func(*args, **kw)
+ glFlush()
+
+ def drawLine(self, x1,y1, x2,y2, color=None, width=None):
+@@ -274,7 +274,7 @@ class _GLCanvas(Canvas):
+ try:
+ import Image
+ except ImportError:
+- raise ImportError, 'Saving to a non-PPM format is not available because PIL is not installed'
++ raise ImportError('Saving to a non-PPM format is not available because PIL is not installed')
+ savefname = base+'.ppm'
+ glSavePPM(savefname, self._width, self._height)
+ i = Image.open(savefname)
+@@ -357,7 +357,7 @@ def getGLTTFontWrapper():
+ if face is None: face = 'arial'
+ face = string.lower(face)
+ self.face = face
+- if self.maps.has_key(face):
++ if face in self.maps:
+ face = self.maps[face]
+ if bold:
+ if italic:
+@@ -421,16 +421,16 @@ try:
+ pass
+
+ def keyboard(*args):
+- print args
++ print(args)
+
+ def mainloop(self):
+ glutMainLoop()
+- if _debug: print "# GlutCanvas available"
++ if _debug: print("# GlutCanvas available")
+ except NameError:
+ pass
+
+ try:
+- import Tkinter
++ import tkinter
+ from OpenGL.Tk import RawOpengl
+ class TkInteractive:
+ def __init__(self):
+@@ -463,7 +463,7 @@ try:
+ 'height':height})
+ self._width = width
+ self._height = height
+- apply(RawOpengl.__init__, (self,), kw)
++ RawOpengl.__init__(*(self,), **kw)
+ _GLCanvas.__init__(self, size=size, name=name)
+ TkInteractive.__init__(self)
+ self.bind('<Configure>', self.resize)
+@@ -474,7 +474,7 @@ try:
+ self.configure(width=w, height=h)
+ self._width = w
+ self._height= h
+- Tkinter.Frame.configure(self)
++ tkinter.Frame.configure(self)
+
+ def redraw(self):
+ if self._inList: self._saveList()
+@@ -489,7 +489,7 @@ try:
+
+ def setInfoLine(self, s):
+ pass
+- if _debug: print "# ToglCanvas available"
++ if _debug: print("# ToglCanvas available")
+ except ImportError:
+ pass
+
+@@ -498,7 +498,7 @@ try:
+ except NameError:
+ GLCanvas = GlutCanvas
+ except NameError:
+- raise ImportError, "Couldn't get either GLUT or Togl loaded"
++ raise ImportError("Couldn't get either GLUT or Togl loaded")
+
+ def getGLUTFontWrapper():
+ class GLUTFontWrapper:
+@@ -516,7 +516,7 @@ def getGLUTFontWrapper():
+ self.size=font.size
+ if face is None: face = 'glutStrokeRomanFixed'
+ face = string.lower(face)
+- if self.maps.has_key(face):
++ if face in self.maps:
+ face = self.maps[face]
+ self.glutface = face
+ def stringWidth(self, s):
+@@ -562,6 +562,6 @@ except ImportError:
+
+ if _debug:
+ if FontSupport == 0:
+- print "# Can't find font support"
++ print("# Can't find font support")
+ else:
+- print "# Using fonts from:", FontWrapper.__name__
++ print("# Using fonts from:", FontWrapper.__name__)
+--- src/piddle/piddleGTK/core.py.orig 2002-06-03 13:46:30 UTC
++++ src/piddle/piddleGTK/core.py
+@@ -98,7 +98,7 @@ class BasicCanvas(piddle.Canvas):
+ # and make sure the canvas is big enough:
+ iwidth = iheight = 0
+ for i in range(len(lineList)):
+- x1, y1, x2, y2 = map(int, map(round, lineList[i]))
++ x1, y1, x2, y2 = list(map(int, list(map(round, lineList[i]))))
+ iwidth = max(iwidth, x1, x2)
+ iheight = max(iheight, y1, y2)
+ #
+@@ -120,7 +120,7 @@ class BasicCanvas(piddle.Canvas):
+ return
+ angle = int(round(angle))
+ if angle != 0:
+- raise NotImplementedError, "rotated text not implemented"
++ raise NotImplementedError("rotated text not implemented")
+ if font is None:
+ font = self.defaultFont
+ lines = string.split(s, "\n")
+@@ -163,7 +163,7 @@ class BasicCanvas(piddle.Canvas):
+ def drawPolygon(self, pointlist, edgeColor=None, edgeWidth=None,
+ fillColor=None, closed=0):
+ if len(pointlist) < 3:
+- raise ValueError, "too few points in the point list"
++ raise ValueError("too few points in the point list")
+ # XXX lots more should be checked
+ if edgeColor is None:
+ edgeColor = self.defaultLineColor
+@@ -227,7 +227,7 @@ class BasicCanvas(piddle.Canvas):
+ def ensure_size(self, width, height):
+ # like __ensure_size(), but doesn't return buffer
+ if (width <= 0) or (height <= 0):
+- raise ValueError, "width and height must both be positive"
++ raise ValueError("width and height must both be positive")
+ self.__ensure_size(width, height)
+
+
+@@ -303,7 +303,7 @@ def _font_to_gdkfont(font):
+ try:
+ return _xlfd_to_gdkfont(xlfd)
+ except RuntimeError:
+- print "failed to load", xlfd
++ print("failed to load", xlfd)
+ raise
+
+
+--- src/piddle/piddleGTK/tests.py.orig 2002-06-03 13:46:30 UTC
++++ src/piddle/piddleGTK/tests.py
+@@ -36,8 +36,8 @@ def main():
+ top.add(bbox)
+ top.connect("destroy", gtk.mainquit)
+ top.connect("delete_event", gtk.mainquit)
+- tests = map((lambda test: (string.capitalize(test.__name__), test)),
+- piddletest.tests)
++ tests = list(map((lambda test: (string.capitalize(test.__name__), test)),
++ piddletest.tests))
+ tests.extend(testitems)
+ for name, test in tests:
+ b = gtk.GtkButton(name)
+@@ -118,7 +118,7 @@ def font_mapping(canvasClass):
+ key = piddleGTK.core._font_to_key(font)
+ xlfd = piddleGTK.core._fontkey_to_xlfd(key)
+ f.write("%s\n" % font)
+- f.write(" %s\n" % `key`)
++ f.write(" %s\n" % repr(key))
+ f.write(" %s\n\n" % xlfd)
+ # just have to have a .flush() method:
+ return f
+@@ -143,7 +143,7 @@ def onOver(canvas, x, y):
+ canvas.setInfoLine("onOver(%s, %s)" % (x, y))
+
+ def onKey(canvas, key, modifiers):
+- canvas.setInfoLine("onKey(%s, %s)" % (`key`, modifiers))
++ canvas.setInfoLine("onKey(%s, %s)" % (repr(key), modifiers))
+
+
+
+--- src/piddle/piddlePDF.py.orig 2002-06-03 13:46:30 UTC
++++ src/piddle/piddlePDF.py
+@@ -16,7 +16,7 @@ self.pdf which offers numerous lower-level drawing rou
+
+ #standard python library modules
+ import string
+-import cStringIO
++import io
+ import pdfmetrics
+ import glob
+ import os
+@@ -134,7 +134,7 @@ class PDFCanvas(Canvas):
+
+ #if they specified a size smaller than page,
+ # be helpful and centre their diagram
+- if self.pagesize <> self.drawingsize:
++ if self.pagesize != self.drawingsize:
+ dx = 0.5 * (self.pagesize[0] - self.drawingsize[0])
+ dy = 0.5 * (self.pagesize[1] - self.drawingsize[1])
+ self.pdf.translate(dx, dy)
+@@ -183,7 +183,7 @@ class PDFCanvas(Canvas):
+
+ if hasattr(file, 'write'):
+ self.pdf.save(fileobj=file)
+- elif isinstance(file, types.StringType):
++ elif isinstance(file, bytes):
+ self.pdf.save(filename=file)
+ else:
+ self.pdf.save()
+@@ -236,7 +236,7 @@ class PDFCanvas(Canvas):
+ face = 'serif'
+ else:
+ face = string.lower(font.face)
+- while font_face_map.has_key(face):
++ while face in font_face_map:
+ face = font_face_map[face]
+ #step 2, - resolve bold/italic to get the right PS font name
+ psname = ps_font_map[(face, font.bold, font.italic)]
+@@ -305,8 +305,8 @@ class PDFCanvas(Canvas):
+ else:
+ self.pdf.drawPath(
+ path,
+- (edge <> transparent), #whether to stroke
+- (fill <> transparent) #whether to fill
++ (edge != transparent), #whether to stroke
++ (fill != transparent) #whether to fill
+ )
+
+ #------------- drawing methods --------------
+@@ -372,7 +372,7 @@ class PDFCanvas(Canvas):
+ # inserting basic commands here to see if can get working
+ textobj = self.pdf.beginText()
+
+- if col <> self.defaultFillColor:
++ if col != self.defaultFillColor:
+ textobj.setFillColorRGB(col.red,col.green, col.blue)
+
+ if angle != 0 :
+--- src/piddle/piddlePIL.py.orig 2002-06-03 13:46:30 UTC
++++ src/piddle/piddlePIL.py
+@@ -42,10 +42,10 @@ else:
+ # load font metrics
+ try:
+ f = open(os.path.join(_fontprefix,'metrics.dat'), 'rb')
+- import cPickle
+- _widthmaps = cPickle.load(f)
+- _ascents = cPickle.load(f)
+- _descents = cPickle.load(f)
++ import pickle
++ _widthmaps = pickle.load(f)
++ _ascents = pickle.load(f)
++ _descents = pickle.load(f)
+ f.close()
+ except:
+ Log.write("Warning: unable to load font metrics!\n")
+@@ -86,12 +86,12 @@ def _matchingFontPath(font):
+ if type(face) == StringType:
+ path = _pilFontPath(face,size,font.bold)
+ path = string.split(path,os.sep)[-1]
+- if path in _widthmaps.keys(): return path
++ if path in list(_widthmaps.keys()): return path
+ else:
+ for item in font.face:
+ path = _pilFontPath(item,size,font.bold)
+ path = string.split(path,os.sep)[-1]
+- if path in _widthmaps.keys(): return path
++ if path in list(_widthmaps.keys()): return path
+ # not found? Try it with courier, which should always be there
+ path = _pilFontPath('courier',size,font.bold)
+ return string.split(path,os.sep)[-1]
+@@ -126,7 +126,7 @@ class PILCanvas( Canvas ):
+ self._pen = ImageDraw.ImageDraw(self._image)
+ self._pen.setink(0)
+ self._setFont( Font() )
+- self._pilversion = map(string.atoi, string.split(Image.VERSION, "."))
++ self._pilversion = list(map(string.atoi, string.split(Image.VERSION, ".")))
+ Canvas.__init__(self, size, name)
+
+ def __setattr__(self, attribute, value):
+@@ -157,7 +157,7 @@ class PILCanvas( Canvas ):
+ # below here, file is guaranteed to be a string
+ if format == None:
+ if '.' not in file:
+- raise TypeError, 'no file type given to save()'
++ raise TypeError('no file type given to save()')
+ filename = file
+ else:
+ filename = file + '.' + format
+@@ -344,7 +344,8 @@ class PILCanvas( Canvas ):
+ temppen = ImageDraw.ImageDraw(tempimg)
+ temppen.setink( (255,255,255) )
+ pilfont = _pilFont(font)
+- if not pilfont: raise "bad font!", font
++ if not pilfont:
++ raise("bad font!", font)
+ temppen.setfont( pilfont )
+ pos = [4, int(tempsize/2 - self.fontAscent(font)) - self.fontDescent(font)]
+ temppen.text( pos, s )
+@@ -391,8 +392,8 @@ def test():
+ canvas = PILCanvas()
+
+ canvas.defaultLineColor = Color(0.7,0.7,1.0) # light blue
+- canvas.drawLines( map(lambda i:(i*10,0,i*10,300), range(30)) )
+- canvas.drawLines( map(lambda i:(0,i*10,300,i*10), range(30)) )
++ canvas.drawLines( [(i*10,0,i*10,300) for i in range(30)] )
++ canvas.drawLines( [(0,i*10,300,i*10) for i in range(30)] )
+ canvas.defaultLineColor = black
+
+ canvas.drawLine(10,200, 20,190, color=red)
+--- src/piddle/piddlePS.py.orig 2002-06-03 13:46:30 UTC
++++ src/piddle/piddlePS.py
+@@ -38,7 +38,7 @@ piddlePS - a PostScript backend for the PIDDLE drawing
+
+
+ from piddle import *
+-import string, cStringIO
++import string, io
+ import piddlePSmetrics # for font info
+ import math
+
+@@ -309,7 +309,7 @@ translate
+ # once again, fall back to default, redundant, no?
+ face = string.lower(PiddleLegalFonts["serif"])
+ for reqFace in requested:
+- if PiddleLegalFonts.has_key(string.lower(reqFace)):
++ if string.lower(reqFace) in PiddleLegalFonts:
+ face = string.lower(PiddleLegalFonts[string.lower(reqFace)])
+ break
+
+@@ -591,7 +591,7 @@ translate
+ self.code.extend([
+ 'gsave',
+ '%s %s neg translate' % (x,y),
+- `angle`+' rotate'])
++ repr(angle)+' rotate'])
+ down = 0
+ for line in lines :
+ self._drawStringOneLine(line, 0, 0+down, font, color, angle)
+@@ -770,7 +770,7 @@ translate
+ figureCode.append("%s %s neg lineto" % tuple(args[:2]))
+ figureCode.append("%s %s neg %s %s neg %s %s neg curveto" % tuple(args[2:]))
+ else:
+- raise TypeError, "unknown figure operator: "+op
++ raise TypeError("unknown figure operator: "+op)
+
+ if closed:
+ figureCode.append("closepath")
+@@ -798,10 +798,10 @@ translate
+ try:
+ import Image
+ except ImportError:
+- print 'Python Imaging Library not available'
++ print('Python Imaging Library not available')
+ return
+ # For now let's start with 24 bit RGB images (following piddlePDF again)
+- print "Trying to drawImage in piddlePS"
++ print("Trying to drawImage in piddlePS")
+ component_depth = 8
+ myimage = image.convert('RGB')
+ imgwidth, imgheight = myimage.size
+@@ -811,7 +811,7 @@ translate
+ y2 = y1 + imgheight
+ drawwidth = x2 - x1
+ drawheight = y2 - y1
+- print 'Image size (%d, %d); Draw size (%d, %d)' % (imgwidth, imgheight, drawwidth, drawheight)
++ print('Image size (%d, %d); Draw size (%d, %d)' % (imgwidth, imgheight, drawwidth, drawheight))
+ # now I need to tell postscript how big image is
+
+ # "image operators assume that they receive sample data from
+@@ -851,15 +851,15 @@ translate
+ # piddlePDF again
+
+ rawimage = myimage.tostring()
+- assert(len(rawimage) == imgwidth*imgheight, 'Wrong amount of data for image')
++ assert(len(rawimage) == imgwidth*imgheight, 'Wrong amount of data for image')
+ #compressed = zlib.compress(rawimage) # no zlib at moment
+ hex_encoded = self._AsciiHexEncode(rawimage)
+
+ # write in blocks of 78 chars per line
+- outstream = cStringIO.StringIO(hex_encoded)
++ outstream = io.StringIO(hex_encoded)
+
+ dataline = outstream.read(78)
+- while dataline <> "":
++ while dataline != "":
+ self.code.append(dataline)
+ dataline= outstream.read(78)
+ self.code.append('% end of image data') # for clarity
+@@ -870,7 +870,7 @@ translate
+
+ def _AsciiHexEncode(self, input): # also based on piddlePDF
+ "Helper function used by images"
+- output = cStringIO.StringIO()
++ output = io.StringIO()
+ for char in input:
+ output.write('%02x' % ord(char))
+ output.reset()
+@@ -880,7 +880,7 @@ translate
+ try:
+ import Image
+ except ImportError:
+- print 'Python Imaging Library not available'
++ print('Python Imaging Library not available')
+ return
+ # I don't have zlib -cwl
+ # try:
+@@ -892,12 +892,12 @@ translate
+
+ ### what sort of image are we to draw
+ if image.mode=='L' :
+- print 'found image.mode= L'
++ print('found image.mode= L')
+ imBitsPerComponent = 8
+ imNumComponents = 1
+ myimage = image
+ elif image.mode == '1':
+- print 'found image.mode= 1'
++ print('found image.mode= 1')
+ myimage = image.convert('L')
+ imNumComponents = 1
+ myimage = image
+@@ -923,7 +923,7 @@ translate
+ self.code.append('/DeviceRGB setcolorspace')
+ elif imNumComponents == 1 :
+ self.code.append('/DeviceGray setcolorspace')
+- print 'setting colorspace gray'
++ print('setting colorspace gray')
+ # create the image dictionary
+ self.code.append("""
+ <<
+@@ -942,15 +942,15 @@ translate
+ 'image'])
+ # after image operator just need to dump image dat to file as hexstring
+ rawimage = myimage.tostring()
+- assert(len(rawimage) == imwidth*imheight, 'Wrong amount of data for image')
++ assert(len(rawimage) == imwidth*imheight, 'Wrong amount of data for image')
+ #compressed = zlib.compress(rawimage) # no zlib at moment
+ hex_encoded = self._AsciiHexEncode(rawimage)
+
+ # write in blocks of 78 chars per line
+- outstream = cStringIO.StringIO(hex_encoded)
++ outstream = io.StringIO(hex_encoded)
+
+ dataline = outstream.read(78)
+- while dataline <> "":
++ while dataline != "":
+ self.code.append(dataline)
+ dataline= outstream.read(78)
+ self.code.append('> % end of image data') # > is EOD for hex encoded filterfor clarity
+--- src/piddle/piddlePSmetrics.py.orig 2002-06-03 13:46:30 UTC
++++ src/piddle/piddlePSmetrics.py
+@@ -125,7 +125,7 @@ class FontCache:
+
+ def loadfont(self, fontname):
+ filename = AFMDIR + os.sep + fontname + '.afm'
+- print 'cache loading',filename
++ print('cache loading',filename)
+ assert os.path.exists(filename)
+ widths = parseAFMfile(filename)
+ self.__widtharrays[fontname] = widths
+@@ -139,7 +139,7 @@ class FontCache:
+ return self.__widtharrays[fontname]
+ except:
+ # font not found, use Courier
+- print 'Font',fontname,'not found - using Courier for widths'
++ print('Font',fontname,'not found - using Courier for widths')
+ return self.getfont('courier')
+
+
+@@ -152,7 +152,7 @@ class FontCache:
+
+ def status(self):
+ #returns loaded fonts
+- return self.__widtharrays.keys()
++ return list(self.__widtharrays.keys())
+
+ TheFontCache = FontCache()
+
+@@ -168,7 +168,7 @@ def psStringWidth(text, font, encoding):
+ try:
+ widths = _psWidths[encoding][string.lower(font) ]
+ except:
+- raise KeyError, "Improper encoding %s or font name %s" % (encoding, font)
++ raise KeyError("Improper encoding %s or font name %s" % (encoding, font))
+ w = 0
+ for char in text:
+ w = w + widths[ord(char)]
+--- src/piddle/piddleQD.py.orig 2002-06-03 13:46:30 UTC
++++ src/piddle/piddleQD.py
+@@ -63,7 +63,7 @@ _curCanvas = None
+
+ # global dictionary mapping font names to QD font IDs
+ _fontMap = {}
+-for item in filter(lambda x:x[0]!='_',dir(Fonts)):
++for item in [x for x in dir(Fonts) if x[0]!='_']:
+ _fontMap[string.lower(item)] = Fonts.__dict__[item]
+ _fontMap['system'] = Fonts.kFontIDGeneva
+ _fontMap['monospaced'] = Fonts.kFontIDMonaco
+@@ -248,7 +248,7 @@ class QDCanvas( Canvas ):
+ return 0 # font not found!
+
+ # cache the fontID for quicker reference next time!
+- font.__dict__['_QDfontID'] = fontID
++ font.__dict__['_QDfontID'] = fontID
+ # font._QDfontID = fontID
+ Qd.TextFont(fontID)
+
+@@ -569,19 +569,19 @@ def test():
+ #import Image
+ #canvas.drawImage( Image.open(path), 0,0,300,300 );
+
+- def myOnClick(canvas,x,y): print "clicked %s,%s" % (x,y)
++ def myOnClick(canvas,x,y): print("clicked %s,%s" % (x,y))
+ canvas.onClick = myOnClick
+
+ def myOnOver(canvas,x,y): canvas.setInfoLine( "mouse is over %s,%s" % (x,y) )
+
+ canvas.onOver = myOnOver
+
+- def myOnKey(canvas,key,mods): print "pressed %s with modifiers %s" % (key,mods)
++ def myOnKey(canvas,key,mods): print("pressed %s with modifiers %s" % (key,mods))
+ canvas.onKey = myOnKey
+
+
+- canvas.drawLines( map(lambda i:(i*10,0,i*10,300), range(30)) )
+- canvas.drawLines( map(lambda i:(0,i*10,300,i*10), range(30)) )
++ canvas.drawLines( [(i*10,0,i*10,300) for i in range(30)] )
++ canvas.drawLines( [(0,i*10,300,i*10) for i in range(30)] )
+ canvas.defaultLineColor = black
+
+ canvas.drawLine(10,200, 20,190, color=red)
+--- src/piddle/piddleSVG/piddleSVG.py.orig 2002-06-03 13:46:30 UTC
++++ src/piddle/piddleSVG/piddleSVG.py
+@@ -72,7 +72,7 @@ def _PointListToSVG(points,dupFirst=0):
+
+ """
+ outStr = ''
+- for i in xrange(len(points)):
++ for i in range(len(points)):
+ outStr = outStr + '%.2f,%.2f '%(points[i][0],points[i][1])
+ # add back on the first point. This is not required in the spec,
+ # but Adobe's beta-quality viewer seems to not like it being skipped
+@@ -159,7 +159,7 @@ class SVGCanvas( Canvas ):
+ familyStr = '\'%s\''%(face)
+ else:
+ familyStr = face
+- for i in xrange(1,len(font.face)):
++ for i in range(1,len(font.face)):
+ face = font.face[i]
+ if len(string.split(face)) > 1:
+ familyStr = ', \'%s\''%(face)
+@@ -241,14 +241,14 @@ class SVGCanvas( Canvas ):
+ def save(self, type=''):
+ if type == '':
+ if '.' not in self.name:
+- raise TypeError, 'no file type given to save()'
++ raise TypeError('no file type given to save()')
+ filename = self.name
+ else:
+ filename = self.name + '.' + type
+ outFile = open(filename,'w+')
+ outFile.write(self._txt+'</svg>')
+ outFile.close()
+- print filename, "saved"
++ print(filename, "saved")
+
+
+ #------------- drawing methods --------------
+@@ -515,7 +515,7 @@ class SVGCanvas( Canvas ):
+ pathStr = pathStr + self._FormArcStr(x1,y1,x2,y2,theta1,extent)
+
+ else:
+- raise TypeError, "unknown figure operator: "+op
++ raise TypeError("unknown figure operator: "+op)
+
+ if closed == 1:
+ pathStr = pathStr + 'Z'
+@@ -568,8 +568,8 @@ def test():
+ canvas = SVGCanvas(name="test")
+
+ canvas.defaultLineColor = Color(0.7,0.7,1.0) # light blue
+- canvas.drawLines( map(lambda i:(i*10,0,i*10,300), range(30)) )
+- canvas.drawLines( map(lambda i:(0,i*10,300,i*10), range(30)) )
++ canvas.drawLines( [(i*10,0,i*10,300) for i in range(30)] )
++ canvas.drawLines( [(0,i*10,300,i*10) for i in range(30)] )
+ canvas.defaultLineColor = black
+
+ canvas.drawLine(10,200, 20,190, color=red)
+--- src/piddle/piddleTK2/piddleTK.py.orig 2002-06-03 13:46:30 UTC
++++ src/piddle/piddleTK2/piddleTK.py
+@@ -15,7 +15,7 @@ You can find the latest version of this file:
+ via http://piddle.sourceforge.net
+ """
+
+-import Tkinter, tkFont
++import tkinter, tkinter.font
+ tk = Tkinter
+ import piddle
+ import string
+@@ -120,7 +120,7 @@ class FontManager:
+ # check if the user specified a generic face type
+ # like serif or monospaced. check is case-insenstive.
+ f = string.lower(font.face)
+- if self.__alt_faces.has_key(f):
++ if f in self.__alt_faces:
+ family = self.__alt_faces[f]
+ else:
+ family = font.face
+@@ -138,7 +138,7 @@ class FontManager:
+ key = (family,size,weight,slant,underline)
+
+ # check if we've already seen this font.
+- if self.font_cache.has_key(key):
++ if key in self.font_cache:
+ # yep, don't bother creating a new one. just fetch it.
+ font = self.font_cache[key]
+ else:
+@@ -146,7 +146,7 @@ class FontManager:
+ # this way we will return info about the actual font
+ # selected by Tk, which may be different than what we ask
+ # for if it's not availible.
+- font = tkFont.Font(self.master, family=family, size=size, weight=weight,
++ font = tkinter.font.Font(self.master, family=family, size=size, weight=weight,
+ slant=slant,underline=underline)
+ self.font_cache[(family,size,weight,slant,underline)] = font
+
+@@ -204,7 +204,7 @@ class BaseTKCanvas(tk.Canvas, piddle.Canvas):
+ tk.Canvas.update(self)
+
+ def clear(self):
+- map(self.delete,self._item_ids)
++ list(map(self.delete,self._item_ids))
+ self._item_ids = []
+
+ def _colorToTkColor(self, c):
+@@ -259,7 +259,7 @@ class BaseTKCanvas(tk.Canvas, piddle.Canvas):
+ font = self._font_manager.getTkFontString(font or self.defaultFont)
+ new_item = self.create_text(x, y, text=s,
+ font=font, fill=color,
+- anchor=Tkinter.W)
++ anchor=tkinter.W)
+ self._item_ids.append(new_item)
+
+ def _drawRotatedString(self, s, x,y, font=None, color=None, angle=0):
+@@ -292,7 +292,8 @@ class BaseTKCanvas(tk.Canvas, piddle.Canvas):
+ temppen.setink( (255,255,255) )
+ pilfont = pp._pilFont(font)
+
+- if not pilfont: raise "bad font!", font
++ if not pilfont:
++ raise("bad font!", font)
+
+ temppen.setfont( pilfont )
+ pos = [4, int(tempsize/2 - pilCan.fontAscent(font)) - pilCan.fontDescent(font)]
+@@ -390,7 +391,7 @@ class BaseTKCanvas(tk.Canvas, piddle.Canvas):
+ if fillColor == self.__TRANSPARENT:
+ # draw open-ended set of lines
+ d = { 'fill':edgeColor, 'width': edgeWidth}
+- new_item = apply(self.create_line, pointlist, d)
++ new_item = self.create_line(*pointlist, **d)
+ else:
+ # open filled shape.
+ # draw it twice:
+@@ -403,7 +404,7 @@ class BaseTKCanvas(tk.Canvas, piddle.Canvas):
+ self._item_ids.append(new_item)
+
+ d = { 'fill':edgeColor, 'width': edgeWidth}
+- new_item = apply(self.create_line, pointlist, d)
++ new_item = self.create_line(*pointlist, **d)
+
+ self._item_ids.append(new_item)
+
+@@ -433,7 +434,7 @@ class BaseTKCanvas(tk.Canvas, piddle.Canvas):
+ # unless I keep a copy of this PhotoImage, it seems to be garbage collected
+ # and the image is removed from the display after this function. weird
+ itk = ImageTk.PhotoImage(myimage, master=self)
+- new_item = self.create_image(x1, y1, image=itk, anchor=Tkinter.NW)
++ new_item = self.create_image(x1, y1, image=itk, anchor=tkinter.NW)
+ self._item_ids.append(new_item)
+ self._images.append(itk)
+
+--- src/piddle/piddleVCR.py.orig 2002-06-03 13:46:30 UTC
++++ src/piddle/piddleVCR.py
+@@ -167,7 +167,7 @@ class VCRCanvas( Canvas ):
+
+ def drawCurve(self, x1,y1, x2,y2, x3,y3, x4,y4,
+ edgeColor=None, edgeWidth=None, fillColor=None, closed=0):
+- "Draw a Bézier curve with control points x1,y1 to x4,y4."
++ "Draw a Bezier curve with control points x1,y1 to x4,y4."
+
+ self._recordfunc("drawCurve", x1,y1,x2,y2,x3,y3,x4,y4,edgeColor,edgeWidth,fillColor,closed)
+
+@@ -223,7 +223,7 @@ class VCRCanvas( Canvas ):
+ self._recordfunc("drawFigure", partList, edgeColor,edgeWidth,fillColor,closed)
+
+ def drawImage(self, image, x1,y1, x2=None,y2=None):
+- print "Warning!!! piddleVCR does not implent drawImage"
++ print("Warning!!! piddleVCR does not implent drawImage")
+ # These are thoughts on how to implement this using a shelf to store image
+ # it kept everyting contained in one file
+ # import shelve
+--- src/piddle/piddleWX.py.orig 2002-06-03 13:46:30 UTC
++++ src/piddle/piddleWX.py
+@@ -159,11 +159,11 @@ class _WXCanvasDefaultStatusBar(wxStatusBar):
+ self.redraw()
+
+ def OnOver(self, x, y):
+- self.text = `x` + "," + `y`
++ self.text = repr(x) + "," + repr(y)
+ self.redraw()
+
+ def OnClick(self, x, y):
+- self.text = `x` + "," + `y`
++ self.text = repr(x) + "," + repr(y)
+ self.click.SetValue(true)
+ self.redraw()
+
+--- src/piddle/piddleWxDc.py.orig 2002-06-03 13:46:30 UTC
++++ src/piddle/piddleWxDc.py
+@@ -56,7 +56,7 @@ class PiddleWxDc(piddle.Canvas):
+ if default_color is not None:
+ return self._getWXbrush(default_color)
+ else:
+- raise "WXcanvas error: Cannot create brush."
++ raise("WXcanvas error: Cannot create brush.")
+
+ return wxBrush(wxcolor)
+
+@@ -75,7 +75,7 @@ class PiddleWxDc(piddle.Canvas):
+ if default_color is not None:
+ return self._getWXpen(width, default_color)
+ else:
+- raise "WXcanvas error: Cannot create pen."
++ raise("WXcanvas error: Cannot create pen.")
+
+ return wxPen(wxcolor, width)
+
+@@ -236,7 +236,7 @@ class PiddleWxDc(piddle.Canvas):
+ # instead of just 2-tuples. Therefore, pointlist must be re-created as
+ # only 2-tuples
+
+- pointlist = map(lambda i: tuple(i), pointlist)
++ pointlist = [tuple(i) for i in pointlist]
+ if closed == 1:
+ pointlist.append(pointlist[0])
+
+@@ -260,11 +260,11 @@ class PiddleWxDc(piddle.Canvas):
+ try:
+ from PIL import Image
+ except ImportError:
+- print 'PIL not installed as package'
++ print('PIL not installed as package')
+ try:
+ import Image
+ except ImportError:
+- raise "PIL not available!"
++ raise("PIL not available!")
+
+ if (x2 and y2 and x2>x1 and y2>y1):
+ imgPil = image.resize((x2-x1,y2-y1))
+--- src/piddle/piddletest.py.orig 2002-06-03 13:46:30 UTC
++++ src/piddle/piddletest.py
+@@ -40,8 +40,8 @@ def basics(canvasClass):
+ def drawBasics(canvas):
+ saver = StateSaver(canvas) # leave canvas state as you found it, restores state when leaves scope
+ canvas.defaultLineColor = Color(0.7,0.7,1.0) # light blue
+- canvas.drawLines( map(lambda i:(i*10,0,i*10,300), range(30)) )
+- canvas.drawLines( map(lambda i:(0,i*10,300,i*10), range(30)) )
++ canvas.drawLines( [(i*10,0,i*10,300) for i in range(30)] )
++ canvas.drawLines( [(0,i*10,300,i*10) for i in range(30)] )
+ canvas.defaultLineColor = black
+
+ canvas.drawLine(10,200, 20,190, color=red)
+@@ -222,8 +222,8 @@ def drawRotstring(canvas):
+ canvas.drawString(s2, 150, 150, angle=ang)
+ cnum = (cnum+1) % len(colors)
+
+- canvas.drawString( "This is a\nrotated\nmulti-line string!!!", 350, 100, angle= -90, font=Font(underline=1) )
+- #canvas.drawString( "This is a\nrotated\nmulti-line string!!!", 400, 175, angle= -45, font=Font(underline=1) )
++ canvas.drawString( "This is a\nrotated\nmulti-line string!!!", 350, 100, angle= -90, font=Font(underline=1) )
++ #canvas.drawString( "This is a\nrotated\nmulti-line string!!!", 400, 175, angle= -45, font=Font(underline=1) )
+ return canvas
+
+ #----------------------------------------------------------------------
+@@ -232,32 +232,32 @@ def tkTest(testfunc):
+ # piddleTK tests are called from here because need TK's event loop
+ try :
+ import piddleTK
+- import Tkinter
++ import tkinter
+ except:
+- print "A module needed for piddleTK is not available, select another backend"
++ print("A module needed for piddleTK is not available, select another backend")
+ return
+
+- root = Tkinter.Tk()
+- frame = Tkinter.Frame(root) # label='piddletestTK'
++ root = tkinter.Tk()
++ frame = tkinter.Frame(root) # label='piddletestTK'
+
+ #tkcanvas = piddleTK.TKCanvas(size=(400,400), name='piddletestTK', master = frame)
+- # try new Tk canvas
+- tkcanvas = piddleTK.TKCanvas(size=(400,400), name='piddletestTK', master = frame)
+- bframe = Tkinter.Frame(root)
++ # try new Tk canvas
++ tkcanvas = piddleTK.TKCanvas(size=(400,400), name='piddletestTK', master = frame)
++ bframe = tkinter.Frame(root)
+
+- minimalB=Tkinter.Button(bframe, text='minimal test',
+- command= lambda c=tkcanvas : (c.clear(),drawMinimal(c), c.flush())).pack(side=Tkinter.LEFT)
+- basicB = Tkinter.Button(bframe, text='basic test',
+- command= lambda c=tkcanvas: (c.clear(),drawBasics(c),c.flush()) ).pack(side=Tkinter.LEFT)
+- spectB =Tkinter.Button(bframe, text='spectrum test',
+- command= lambda c=tkcanvas: (c.clear(),drawSpectrum(c),c.flush()) ).pack(side=Tkinter.LEFT)
+- stringsB = Tkinter.Button(bframe, text='strings test',
+- command= lambda c=tkcanvas:(c.clear(),drawStrings(c),c.flush()) ).pack(side=Tkinter.LEFT)
+- rotstrB = Tkinter.Button(bframe, text='rotated strings test',
+- command= lambda c=tkcanvas:(c.clear(), drawRotstring(c),c.flush()) ).pack(side=Tkinter.LEFT)
+- advancedB = Tkinter.Button(bframe, text='advanced test',
+- command= lambda c=tkcanvas:(c.clear(), drawAdvanced(c),c.flush() ) ).pack(side=Tkinter.LEFT)
+- bframe.pack(side=Tkinter.TOP)
++ minimalB=tkinter.Button(bframe, text='minimal test',
++ command= lambda c=tkcanvas : (c.clear(),drawMinimal(c), c.flush())).pack(side=tkinter.LEFT)
++ basicB = tkinter.Button(bframe, text='basic test',
++ command= lambda c=tkcanvas: (c.clear(),drawBasics(c),c.flush()) ).pack(side=tkinter.LEFT)
++ spectB =tkinter.Button(bframe, text='spectrum test',
++ command= lambda c=tkcanvas: (c.clear(),drawSpectrum(c),c.flush()) ).pack(side=tkinter.LEFT)
++ stringsB = tkinter.Button(bframe, text='strings test',
++ command= lambda c=tkcanvas:(c.clear(),drawStrings(c),c.flush()) ).pack(side=tkinter.LEFT)
++ rotstrB = tkinter.Button(bframe, text='rotated strings test',
++ command= lambda c=tkcanvas:(c.clear(), drawRotstring(c),c.flush()) ).pack(side=tkinter.LEFT)
++ advancedB = tkinter.Button(bframe, text='advanced test',
++ command= lambda c=tkcanvas:(c.clear(), drawAdvanced(c),c.flush() ) ).pack(side=tkinter.LEFT)
++ bframe.pack(side=tkinter.TOP)
+ frame.pack()
+ # try to draw before running mainloop
+ if testfunc== minimal:
+@@ -272,11 +272,11 @@ def tkTest(testfunc):
+ drawStrings(tkcanvas)
+ elif testfunc == rotstring :
+ drawRotstring(tkcanvas)
+- else :
+- print "Illegal testfunc handed to tkTest"
+- raise "Unsupported testfunc"
++ else:
++ print("Illegal testfunc handed to tkTest")
++ raise("Unsupported testfunc")
+
+- tkcanvas.flush()
++ tkcanvas.flush()
+
+ root.mainloop()
+ root.destroy()
+@@ -287,25 +287,25 @@ def wxTest(testfunc):
+ import piddleWX
+ from wxPython.wx import wxApp
+ except:
+- print "A module needed for piddleWX is not available, select another backend"
++ print("A module needed for piddleWX is not available, select another backend")
+ return
+
+- global wx_app
+- if not globals().has_key("wx_app"):
+- class CanvasApp(wxApp):
+- "The wxApp that runs canvas. Initializes windows, and handles redrawing"
+- def OnInit(self):
+- return 1
++ global wx_app
++ if "wx_app" not in globals():
++ class CanvasApp(wxApp):
++ "The wxApp that runs canvas. Initializes windows, and handles redrawing"
++ def OnInit(self):
++ return 1
+
+- wx_app = CanvasApp(0)
++ wx_app = CanvasApp(0)
+
+ # run the test, passing the canvas class and returning the canvas
+ canvas = testfunc(piddleWX.WXCanvas)
+-
++
+ canvas.flush()
+
+- # Run the main loop
+- wx_app.MainLoop()
++ # Run the main loop
++ wx_app.MainLoop()
+
+
+ def runtest(backend, testfunc):
+@@ -330,15 +330,15 @@ def runtest(backend, testfunc):
+
+ # do post-test cleanup
+ canvas.flush()
+- # handle save's here
++ # handle save's here
+ if backend == 'piddlePIL':
+ canvas.save(format='png') # save as a PNG file
+- elif backend == 'piddleVCR':
++ elif backend == 'piddleVCR':
+ filename = canvas.name + ".vcr"
+ canvas.save(filename)
+- print filename, "saved"
+- else: # if backend == 'piddlePS' or backend== 'piddlePDF':
+- canvas.save() # should be "pass'ed" by Canvas's that don't use save
++ print(filename, "saved")
++ else: # if backend == 'piddlePS' or backend== 'piddlePDF':
++ canvas.save() # should be "pass'ed" by Canvas's that don't use save
+
+
+ def mainLoop():
+@@ -358,34 +358,34 @@ def mainLoop():
+ else: bflag = ''
+ if i == test: tflag = '==>'
+ else: tflag = ''
+- print "%10s %-20s %10s %-20s" % (bflag, bstr, tflag, tstr)
++ print("%10s %-20s %10s %-20s" % (bflag, bstr, tflag, tstr))
+ i = i+1
+- print
++ print()
+
+- inp = raw_input("Selection (0 to exit): ")
+- print
++ inp = input("Selection (0 to exit): ")
++ print()
+
+ if inp == '0': return
+ if inp:
+ testinp = ''
+ if inp[-1] in string.letters: testinp = inp[-1]
+ elif inp[0] in string.letters: testinp = inp[0]
+- backinp = string.join(filter(lambda x:x in '0123456789',inp))
++ backinp = string.join([x for x in inp if x in '0123456789'])
+ if backinp:
+ backend = int(backinp)-1
+ if backend < len(backends):
+ docstr = __import__(backends[backend]).__doc__
+- if docstr: print docstr
+- else: print "<no doc string>"
++ if docstr: print(docstr)
++ else: print("<no doc string>")
+ else: backend = None
+ if testinp:
+ test = ord(string.upper(testinp[0])) - ord('A')
+ if test >= 0 and test < len(tests):
+ docstr = tests[test].__doc__
+ if docstr:
+- print docstr
++ print(docstr)
+ else: test = None
+- print
++ print()
+
+ # now, if we have a valid backend and test, run it
+ if backend != None and test != None:
+--- src/piddle/polyfunc.py.orig 2002-06-03 13:46:30 UTC
++++ src/piddle/polyfunc.py
+@@ -168,7 +168,7 @@ class AffineMatrix:
+
+ # would like to reshape the sequence, do w/ a loop for now
+ res = []
+- for ii in xrange(0,N, 2):
++ for ii in range(0,N, 2):
+ pt = self.transformPt( (seq[ii], seq[ii+1]) )
+ res.extend(pt)
+
+@@ -214,7 +214,7 @@ class CoordFrame:
+ def drawCircleAt(canvas, x,y,r, **kw):
+ # useful for marking a particular location w/ a glyph
+ df = canvas.__class__
+- apply(df.drawEllipse, (canvas, x-r, y-r, x+r,y+r), kw)
++ df.drawEllipse(*(canvas, x-r, y-r, x+r,y+r), **kw)
+
+
+ def drawCubicPolynomial(canvas, frame, xinterval, A=0.0, B=0.0, C=0.0, D=0.0,
+@@ -288,7 +288,7 @@ def runtest():
+ frame.drawFrameBox(canvas)
+ # draw a family of quadratics w/in the box w/ x-intercept x=0
+ NA = 10.0
+- for AA in xrange(1,NA,2):
++ for AA in range(1,NA,2):
+ drawQuad(canvas, frame, xinterval=(-10,10), A= AA/NA, B=0.0)
+
+ # now some other assorted quadratics
+@@ -316,7 +316,7 @@ def runtest():
+
+
+ if __name__== '__main__':
+- print 'Running test drawing assorted quadratics to qtest.ps'
++ print('Running test drawing assorted quadratics to qtest.ps')
+ import piddle
+ runtest()
+
+--- src/piddle/stringformat.py.orig 2002-06-03 13:46:30 UTC
++++ src/piddle/stringformat.py
+@@ -139,14 +139,14 @@ class StringSegment:
+ return y
+
+ def dump(self):
+- print "StringSegment: ]%s[" % self.s
+- print "\tsuper = ", self.super
+- print "\tsub = ", self.sub
+- print "\tbold = ", self.bold
+- print "\titalic = ",self.italic
+- print "\tunderline = ", self.underline
+- print "\twidth = ", self.width
+- print "\tgreek = ", self.greek
++ print("StringSegment: ]%s[" % self.s)
++ print("\tsuper = ", self.super)
++ print("\tsub = ", self.sub)
++ print("\tbold = ", self.bold)
++ print("\titalic = ",self.italic)
++ print("\tunderline = ", self.underline)
++ print("\twidth = ", self.width)
++ print("\tgreek = ", self.greek)
+
+ #------------------------------------------------------------------
+ # The StringFormatter will be able to format the following xml
+@@ -245,7 +245,7 @@ class StringFormatter(xmllib.XMLParser):
+ }
+
+ # automatically add handlers for all of the greek characters
+- for item in greekchars.keys():
++ for item in list(greekchars.keys()):
+ self.elements[item] = (lambda attr,self=self,letter=greekchars[item]: \
+ self.start_greek(attr,letter), self.end_greek)
+
+@@ -253,7 +253,7 @@ class StringFormatter(xmllib.XMLParser):
+ self.greek = 0
+ # set up dictionary for greek characters, this is a class variable
+ # should I copy it and then update it?
+- for item in greekchars.keys():
++ for item in list(greekchars.keys()):
+ self.entitydefs[item] = '<%s/>' % item
+
+ #----------------------------------------------------------------
+@@ -386,15 +386,15 @@ def test1():
+ drawString(canvas,"<u><b>hello there</b></u><super>hi</super>",10,20)
+ drawString(canvas,"hello!",10,40)
+
+- print "'hello!' width = ", stringWidth(canvas,"hello!")
+- print "'hello!' PIDDLE width = ", canvas.stringWidth("hello!")
++ print("'hello!' width = ", stringWidth(canvas,"hello!"))
++ print("'hello!' PIDDLE width = ", canvas.stringWidth("hello!"))
+
+ drawString(canvas, "<b>hello!</b> goodbye", 10,60)
+- print "'<b>hello!</b> goodbye' width = ", stringWidth(canvas,"<b>hello!</b> goodbye")
++ print("'<b>hello!</b> goodbye' width = ", stringWidth(canvas,"<b>hello!</b> goodbye"))
+ drawString(canvas, "hello!", 10,80, Font(bold=1))
+- print "'hello!' Font(bold=1) PIDDLE width = ", canvas.stringWidth("hello!",Font(bold=1))
++ print("'hello!' Font(bold=1) PIDDLE width = ", canvas.stringWidth("hello!",Font(bold=1)))
+ drawString(canvas, " goodbye", 10,100)
+- print "' goodbye' PIDDLE width = ", canvas.stringWidth(" goodbye")
++ print("' goodbye' PIDDLE width = ", canvas.stringWidth(" goodbye"))
+ canvas.flush()
+
+ def test2():
+@@ -493,21 +493,21 @@ def stringformatTest():
+ "<b><sub>bold+sub</sub></b> hello <u><super>underline+super</super></u>")
+
+ # break down the various string widths
+- print 'sw("<b><sub>bold+sub</sub></b>") = ', stringWidth(canvas,"<b><sub>bold+sub</sub></b>")
+- print 'sw(" hello ") = ', stringWidth(canvas," hello ")
+- print 'sw("<u><super>underline+super</super></u>") = ', \
+- stringWidth(canvas,"<u><super>underline+super</super></u>")
++ print('sw("<b><sub>bold+sub</sub></b>") = ', stringWidth(canvas,"<b><sub>bold+sub</sub></b>"))
++ print('sw(" hello ") = ', stringWidth(canvas," hello "))
++ print('sw("<u><super>underline+super</super></u>") = ', \
++ stringWidth(canvas,"<u><super>underline+super</super></u>"))
+
+ pwidth1 = canvas.stringWidth("bold+sub",Font(size=canvas.defaultFont.size-sizedelta, bold=1))
+- print "pwidth1 = ", pwidth1
++ print("pwidth1 = ", pwidth1)
+ pwidth2 = canvas.stringWidth(" hello ")
+- print "pwidth2 = ", pwidth2
++ print("pwidth2 = ", pwidth2)
+ pwidth3 = canvas.stringWidth("underline+super",
+ Font(size=canvas.defaultFont.size-sizedelta,underline=1))
+- print "pwidth3 = ", pwidth3
++ print("pwidth3 = ", pwidth3)
+
+ # these should be the same
+- print "sfwidth = ", sfwidth, " pwidth = ", pwidth1+pwidth2+pwidth3
++ print("sfwidth = ", sfwidth, " pwidth = ", pwidth1+pwidth2+pwidth3)
+
+ ################################################### testing greek characters
+ # looks better in a larger font
+@@ -515,21 +515,21 @@ def stringformatTest():
+ x = 10
+ y = canvas.defaultFont.size*1.5
+ drawString(canvas,"&alpha; &beta; <chi/> &Delta; <delta/>",x,y, Font(size=16), color = blue)
+- print "line starting with alpha should be font size 16"
++ print("line starting with alpha should be font size 16")
+ y = y+30
+ drawString(canvas,"&epsiv; &eta; &Gamma; <gamma/>",x,y, color = green)
+ y = y+30
+ drawString(canvas,"&iota; &kappa; &Lambda; <lambda/>",x,y, color = blue)
+ y = y+30
+ drawString(canvas,"<u>&mu;</u> &nu; <b>&Omega;</b> <omega/>",x,y, color = green)
+- print "mu should be underlined, Omega should be big and bold"
++ print("mu should be underlined, Omega should be big and bold")
+ y = y+30
+ drawString(canvas,"&omicron; &Phi; &phi; <phiv/>",x,y, color = blue)
+ y = y+30
+ drawString(canvas,"&Pi; &pi; &piv; <Psi/> &psi; &rho;",x,y, color = green)
+ y = y+30
+ drawString(canvas,"<u>&Sigma; &sigma; &sigmav; <tau/></u>",x,y, color = blue)
+- print "line starting with sigma should be completely underlined"
++ print("line starting with sigma should be completely underlined")
+ y = y+30
+ drawString(canvas,"&Theta; &theta; &thetav; <Xi/> &xi; &zeta;",x,y, color = green)
+ y= y+30