# ===-- __init__.py -------------------------------------------------------===## # # The KLEE Symbolic Virtual Machine # # This file is distributed under the University of Illinois Open Source # License. See LICENSE.TXT for details. # # ===----------------------------------------------------------------------===## from __future__ import division ### import math, os, random from Graphics.Geometry import vec2 from reportlab.pdfgen import canvas #from reportlab.graphics import shapes from reportlab.pdfbase import pdfmetrics """ class Canvas: def startDrawing(self, (w,h)): def endDrawing(self): def getAspect(self): def setColor(self, r, g, b): def setLineWidth(self, width): def drawOutlineBox(self, x0, y0, x1, y1): def drawFilledBox(self, x0, y0, x1, y1): def drawFilledPolygon(self, pts): def drawOutlineCircle(self, x, y, r): def startDrawPoints(self): def endDrawPoints(self): def drawPoint(self, x, y): def setPointSize(self, size): def drawLine(self, a, b): def drawLines(self, ptPairs): def drawLineStrip(self, pts): def pushTransform(self): def popTransform(self): def translate(self, x, y): def scale(self, x, y): def setFontSize(self, size): def drawString(self, (x, y), text): """ class BaseCanvas: def drawPoints(self, pts): self.startDrawPoints() for pt in pts: self.drawPoint(pt) self.endDrawPoints() def drawStringCentered(self, boxLL, boxUR, text): ll,ur = self.getStringBBox(text) stringSize = vec2.sub(ur,ll) boxSize = vec2.sub(boxUR,boxLL) deltaSize = vec2.sub(boxSize, stringSize) halfDeltaSize = vec2.mulN(deltaSize, .5) self.drawString(vec2.add(boxLL,halfDeltaSize), text) def getStringSize(self, string): ll,ur = self.getStringBBox(string) return vec2.sub(ur,ll) class PdfCanvas(BaseCanvas): def __init__(self, name, basePos=(300,400), baseScale=(250,250), pageSize=None): self._font = 'Times-Roman' self.c = canvas.Canvas(name, pagesize=pageSize) self.pointSize = 1 self.scaleX = self.scaleY = 1 self.state = [] self.basePos = tuple(basePos) self.baseScale = tuple(baseScale) self.lastFontSizeSet = None self.kLineScaleFactor = 1.95 def getAspect(self): return 1.0,1.0 def startDrawing(self): self.pointSize = 1 self.scaleX = self.scaleY = 1 self.translate((self.basePos[0] + self.baseScale[0], self.basePos[1] + self.baseScale[1])) self.scale(self.baseScale) self.setColor(0,0,0) self.setLineWidth(1) self.setPointSize(1) def finishPage(self): self.c.showPage() self.pointSize = 1 self.scaleX = self.scaleY = 1 self.translate((self.basePos[0] + self.baseScale[0], self.basePos[1] + self.baseScale[1])) self.scale(self.baseScale) self.setColor(0,0,0) self.setLineWidth(1) self.setPointSize(1) if self.lastFontSizeSet is not None: self.setFontSize(self.lastFontSizeSet) def endDrawing(self): self.c.showPage() self.c.save() def setColor(self, r, g, b): self.c.setStrokeColorRGB(r,g,b) self.c.setFillColorRGB(r,g,b) def setLineWidth(self, width): avgScale = (self.scaleX+self.scaleY)/2 self.c.setLineWidth(width/(self.kLineScaleFactor*avgScale)) def setPointSize(self, size): avgScale = (self.scaleX+self.scaleY)/2 self.pointSize = size/(4*avgScale) def drawOutlineBox(self, (x0, y0), (x1, y1)): self.c.rect(x0, y0, x1-x0, y1-y0, stroke=1, fill=0) def drawFilledBox(self, (x0, y0), (x1, y1)): self.c.rect(x0, y0, x1-x0, y1-y0, stroke=0, fill=1) def drawOutlineCircle(self, (x, y), r): self.c.circle(x, y, r, stroke=1, fill=0) def drawFilledCircle(self, (x, y), r): self.c.circle(x, y, r, stroke=0, fill=1) def drawFilledPolygon(self, pts): p = self.c.beginPath() p.moveTo(*pts[-1]) for x,y in pts: p.lineTo(x,y) self.c.drawPath(p, fill=1, stroke=0) def drawOutlinePolygon(self, pts): p = self.c.beginPath() p.moveTo(* pts[0]) for x,y in pts[1:]: p.lineTo(x,y) p.close() self.c.drawPath(p, fill=0, stroke=1) def startDrawPoints(self): pass def endDrawPoints(self): pass def drawPoint(self, (x, y)): self.c.circle(x, y, self.pointSize, stroke=0, fill=1) def drawLine(self, a, b): self.drawLines([(a,b)]) def drawLines(self, ptPairs): p = self.c.beginPath() for a,b in ptPairs: p.moveTo(a[0],a[1]) p.lineTo(b[0],b[1]) self.c.drawPath(p) def drawLineStrip(self, pts): p = self.c.beginPath() p.moveTo(pts[0][0],pts[0][1]) for pt in pts[1:]: p.lineTo(pt[0],pt[1]) self.c.drawPath(p) def drawBezier(self, (p0,p1,p2,p3)): self.c.bezier(*(p0+p1+p2+p3)) def pushTransform(self): self.state.append( (self.scaleX,self.scaleY) ) self.c.saveState() def popTransform(self): self.c.restoreState() self.scaleX,self.scaleY = self.state.pop() def translate(self, (x, y)): self.c.translate(x, y) def rotate(self, angle): self.c.rotate(angle*180/math.pi) def scale(self, (x, y)): self.scaleX *= x self.scaleY *= y self.c.scale(x, y) def setFont(self, fontName): self._font = {"Symbol":"Symbol", "Times":"Times-Roman"}.get(fontName,fontName) def setFontSize(self, size): self.lastFontSizeSet = size avgScale = (self.scaleX+self.scaleY)/2 self.fontSize = size/(2*avgScale) self.c.setFont(self._font, self.fontSize) # self.c.setFont("Times-Roman", size/(2*avgScale)) def drawString(self, (x, y), text): self.c.drawString(x, y, text) def drawOutlineString(self, (x,y), text): t = self.c.beginText(x, y) t.setTextRenderMode(1) t.textLine(text) t.setTextRenderMode(0) self.c.drawText(t) def getStringBBox(self, text): font = pdfmetrics.getFont(self._font) width = pdfmetrics.stringWidth(text, self._font, self.fontSize) ll = (0,0) ur = (width, (1.0 - font.face.ascent/2048.)*self.fontSize) ur = (width, (1.0 - font.face.ascent/2048.)*self.fontSize) return ll,ur