Пример #1
0
 def makeTestICNSDrawing(self, formats):
     drawBot.newDrawing()
     for i, size in enumerate(formats):
         drawBot.newPage(size, size)
         f = i / (len(formats) + 1)
         drawBot.fill(f, f, 1 - f)
         drawBot.rect(0, 0, size, size)
Пример #2
0
 def run(self, render_pass, renderer_state):
     use_pool = True
     if use_pool:
         pool = AppKit.NSAutoreleasePool.alloc().init()
     try:
         db.newDrawing()
         if renderer_state.previewing:
             ps = renderer_state.preview_scale
             db.size(self.rect.w * ps, self.rect.h * ps)
             db.scale(ps, ps)
             DATPen().rect(self.rect).f(self.bg).db_drawPath()
         else:
             db.size(self.rect.w, self.rect.h)
         render_pass.fn(*render_pass.args)
         result = None
         if renderer_state.previewing:
             previews = (render_pass.output_path.parent / "_previews")
             previews.mkdir(exist_ok=True, parents=True)
             preview_frame = previews / render_pass.output_path.name
             db.saveImage(str(preview_frame))
             result = preview_frame
         else:
             render_pass.output_path.parent.mkdir(exist_ok=True,
                                                  parents=True)
             db.saveImage(str(render_pass.output_path))
             result = render_pass.output_path
         db.endDrawing()
     finally:
         if use_pool:
             del pool
     return result
Пример #3
0
 def test_fontVariations(self):
     drawBot.newDrawing()
     var = drawBot.listFontVariations()
     self.assertEqual(var, {})
     drawBot.font("Skia")
     # get the default font variations
     var = drawBot.listFontVariations()
     var['wght'] = _roundDictValues(var['wght'], 3)
     var['wdth'] = _roundDictValues(var['wdth'], 3)
     expectedVar = OrderedDict({
         'wght': {'name': 'Weight', 'minValue': 0.48, 'maxValue': 3.2, 'defaultValue': 1.0},
         'wdth': {'name': 'Width', 'minValue': 0.62, 'maxValue': 1.3, 'defaultValue': 1.0},
     })
     self.assertEqual(var, expectedVar)
     # set a font variation
     var = drawBot.fontVariations(wght=5)
     expectedVarChanged = {'wght': 5, 'wdth': 1.0}
     self.assertEqual(var, expectedVarChanged)
     # clear all font variations settings
     var = drawBot.fontVariations(resetVariations=True)
     self.assertEqual(var, {'wght': 1.0, 'wdth': 1.0})
     drawBot.font("Helvetica")
     var = drawBot.listFontVariations()
     self.assertEqual(var, {})
     var = drawBot.fontVariations(wght=5)
     self.assertEqual(var, {"wght": 5})
Пример #4
0
 def test_newPage_following(self):
     drawBot.newDrawing()
     drawBot.size(400, 500)
     drawBot.newPage()
     self.assertEqual(drawBot.width(), 400)
     self.assertEqual(drawBot.height(), 500)
     self.assertEqual(drawBot.pageCount(), 2)
Пример #5
0
 def test_polygon_notEnoughPoints(self):
     drawBot.newDrawing()
     with self.assertRaises(TypeError):
         drawBot.polygon()
     with self.assertRaises(TypeError):
         drawBot.polygon((1, 2))
     drawBot.polygon((1, 2), (3, 4))
Пример #6
0
 def test_newPage_following(self):
     drawBot.newDrawing()
     drawBot.size(400, 500)
     drawBot.newPage()
     self.assertEqual(drawBot.width(), 400)
     self.assertEqual(drawBot.height(), 500)
     self.assertEqual(drawBot.pageCount(), 2)
    def draw(self):
        self.xFactor = self.targetXheight / currentXheight

        drawBot.newDrawing()
        drawBot.newPage("LetterLandscape")

        pageWidth = drawBot.width()

        drawBot.fill(0, 0, 0, 0.5)
        drawBot.stroke(0, 0, 0, 1)

        drawBot.rect(.5 * dpi, .5 * dpi, pageWidth - (1 * dpi),
                     self.targetXheight)

        drawBot.translate(0.5 * dpi, .5 * dpi)
        drawBot.scale(self.xFactor)

        for g in self.text:
            pen = CocoaPen(f)
            f[g].draw(pen)
            drawBot.drawPath(pen.path)
            drawBot.translate(f[g].width, 0)

        pdf = drawBot.pdfImage()
        # set the pdf data in the canvas
        self.w.canvas.setPDFDocument(pdf)
Пример #8
0
    def test(self):
        from drawBot.drawBotDrawingTools import _drawBotDrawingTool

        code = compile(source, "<%s>" % exampleName, "exec")

        namespace = {}
        _drawBotDrawingTool._addToNamespace(namespace)

        def mockSaveImage(path, **options):
            fileName = "example_mockSaveImage_" + os.path.basename(path)
            path = os.path.join(tempTestDataDir, fileName)
            drawBot.saveImage(path, **options)

        namespace["saveImage"] = mockSaveImage
        namespace["image"] = mockImage
        namespace["imageSize"] = mockImageSize
        namespace["imagePixelColor"] = mockImagePixelColor
        namespace["Variable"] = mockVariable
        namespace["printImage"] = mockPrintImage
        namespace["installFont"] = mockInstallFont
        namespace["uninstallFont"] = mockUninstallFont
        namespace["randint"] = mockRandInt

        randomSeed(0)
        drawBot.newDrawing()
        with StdOutCollector(captureStdErr=True):
            exec(code, namespace)
        fileName = "example_%s.png" % exampleName
        imagePath = os.path.join(tempTestDataDir, fileName)
        expectedImagePath = os.path.join(testDataDir, fileName)
        if doSaveImage:
            drawBot.saveImage(imagePath)
            self.assertImagesSimilar(imagePath, expectedImagePath)
Пример #9
0
 def test(self):
     # get the paths
     testPath = os.path.join(tempTestDataDir, "%s.%s" % (scriptName, ext))
     expectedPath = os.path.join(testDataDir,
                                 "expected_%s.%s" % (scriptName, ext))
     expectedOutputPath = os.path.join(testDataDir,
                                       "expected_%s.txt" % scriptName)
     expectedOutput = readExpectedOutput(expectedOutputPath)
     # get drawBot
     import drawBot
     # start a new drawing
     drawBot.newDrawing()
     # execute the script in place
     # temporarily ignore deprecation warnings (there are some from PyObjC :( )
     with warnings.catch_warnings():
         if ignoreDeprecationWarnings:
             warnings.simplefilter("ignore", DeprecationWarning)
         output = self.executeScriptPath(path)
     self.assertEqual(cleanupTraceback(output),
                      cleanupTraceback(expectedOutput))
     # save the image
     drawBot.saveImage(testPath)
     # tell drawBot drawing is done
     drawBot.endDrawing()
     self.assertForFileExtension(ext, expectedPath, testPath)
Пример #10
0
 def test_reloadFont(self):
     src = pathlib.Path(
         __file__).resolve().parent / "data" / "MutatorSans.ttf"
     assert src.exists()
     with tempfile.NamedTemporaryFile(suffix=".ttf") as ff:
         ff.write(src.read_bytes())
         firstModTime = os.stat(ff.name).st_mtime
         drawBot.newDrawing()
         drawBot.font(ff.name)
         self.assertEqual(ff.name, drawBot.fontFilePath())
         path = drawBot.BezierPath()
         path.text("E", font=ff.name, fontSize=1000)
         self.assertEqual((60.0, 0.0, 340.0, 700.0), path.bounds())
         ff.seek(0)
         ttf = TTFont(ff)
         ttf["glyf"]["E"].coordinates[0] = (400, 800)
         ff.seek(0)
         ttf.save(ff)
         secondModTime = os.stat(ff.name).st_mtime
         assert firstModTime != secondModTime, (firstModTime, secondModTime)
         drawBot.newDrawing()  # to clear the memoize cache in baseContext
         drawBot.font(ff.name)
         self.assertEqual(ff.name, drawBot.fontFilePath())
         path = drawBot.BezierPath()
         path.text("E", font=ff.name, fontSize=1000)
         self.assertEqual((60.0, 0.0, 400.0, 800.0), path.bounds())
Пример #11
0
 def test_newPage_empty_implicit_first_page(self):
     drawBot.newDrawing()
     drawBot.rect(100, 100, 200, 200)
     drawBot.newPage()
     self.assertEqual(drawBot.width(), 1000)
     self.assertEqual(drawBot.height(), 1000)
     self.assertEqual(drawBot.pageCount(), 2)
Пример #12
0
 def test_fontVariations(self):
     drawBot.newDrawing()
     var = drawBot.listFontVariations()
     self.assertEqual(var, {})
     drawBot.font("Skia")
     # get the default font variations
     var = drawBot.listFontVariations()
     expectedVar = {
         'wght': {
             'name': 'Weight',
             'minValue': 0.4799,
             'maxValue': 3.1999,
             'defaultValue': 1.0
         },
         'wdth': {
             'name': 'Width',
             'minValue': 0.6199,
             'maxValue': 1.2999,
             'defaultValue': 1.0
         }
     }
     self.assertEqual(var, expectedVar)
     # set a font variation
     var = drawBot.fontVariations(wght=5)
     expectedVarChanged = {'wght': 5, 'wdth': 1.0}
     self.assertEqual(var, expectedVarChanged)
     # clear all font variations settings
     var = drawBot.fontVariations(resetVariations=True)
     self.assertEqual(var, {'wght': 1.0, 'wdth': 1.0})
     drawBot.font("Helvetica")
     var = drawBot.listFontVariations()
     self.assertEqual(var, {})
     var = drawBot.fontVariations(wght=5)
     self.assertEqual(var, {"wght": 5})
Пример #13
0
def draw():
    for i in range(0, 100):
        drawBot.newDrawing()
        drawBot.newPage(1000, 1000)
        drawBot.radialGradient(
            (randint(1,500), randint(1,500)),                         # startPoint
            (randint(1,800), randint(1,800)),                         # endPoint
            [(randint(0,1), randint(0,1), randint(0,1)), (randint(0,1), randint(0,1), randint(0,1)), (randint(0,1), randint(0,1), randint(0,1))],  # colors
            [randint(0,1), randint(0,1), randint(0,1)],                         # locations
            randint(0,1),                                  # startRadius
            randint(0,800)                                # endRadius
        )
# draw a rectangle
        drawBot.rect(randint(0,100), randint(0,100), randint(0,1000), randint(0,1000))

# draw the path
        drawBot.drawPath()
        drawBot.blendMode("multiply")
# set a color
        drawBot.rect(randint(1,10), randint(1,10), randint(1,100), randint(1,100))

# draw oval x, y, width, height
        drawBot.oval(randint(1,500), randint(1,500), randint(1,500), randint(1,500))
        drawBot.oval(randint(1,500), randint(1,500), randint(1,500), randint(1,500))
        drawBot.cmykFill(randint(0,1), randint(0,1), randint(0,1), randint(0,1))
# draw a rectangle
        drawBot.rect(randint(1,10), randint(1,10), randint(1,1000), randint(1,1000))
# set an other color
        drawBot.cmykFill(randint(0,1), randint(0,1), randint(0,1), randint(0,1))
# overlap a second rectangle
        drawBot.rect(randint(1,500), randint(1,500), randint(1,600), randint(1,600))
        drawBot.saveImage(str(i) + '.png' )
        drawBot.endDrawing()
        print(str(i) + ' done.')
Пример #14
0
    def updateCanvas(self):
        db.newDrawing()
        db.newPage(1200, 740)
        self.draw()

        pdf = db.pdfImage()
        self.w.canvas.setPDFDocument(pdf)
Пример #15
0
 def test_fontVariations(self):
     drawBot.newDrawing()
     var = drawBot.listFontVariations()
     self.assertEqual(var, {})
     drawBot.font("Skia")
     # get the default font variations
     var = drawBot.listFontVariations()
     var['wght'] = _roundDictValues(var['wght'], 3)
     var['wdth'] = _roundDictValues(var['wdth'], 3)
     expectedVar = OrderedDict({
         'wght': {'name': 'Weight', 'minValue': 0.48, 'maxValue': 3.2, 'defaultValue': 1.0},
         'wdth': {'name': 'Width', 'minValue': 0.62, 'maxValue': 1.3, 'defaultValue': 1.0},
     })
     self.assertEqual(var, expectedVar)
     # set a font variation
     var = drawBot.fontVariations(wght=5)
     expectedVarChanged = {'wght': 5, 'wdth': 1.0}
     self.assertEqual(var, expectedVarChanged)
     # clear all font variations settings
     var = drawBot.fontVariations(resetVariations=True)
     self.assertEqual(var, {'wght': 1.0, 'wdth': 1.0})
     drawBot.font("Helvetica")
     var = drawBot.listFontVariations()
     self.assertEqual(var, {})
     var = drawBot.fontVariations(wght=5)
     self.assertEqual(var, {"wght": 5})
Пример #16
0
    def Composite(pens, rect, save_to, scale=2):
        db.newDrawing()
        rect = rect.scale(scale)
        db.newPage(rect.w, rect.h)

        def draw(pen, state, data):
            if state == 0:
                DrawBotPen(pen, rect).draw(scale=scale)
            elif state == -1:
                imgf = pen.data.get("imgf")
                if imgf:
                    im = db.ImageObject()
                    im.lockFocus()
                    db.size(rect.w+300, rect.h+300)
                    db.translate(150, 150)
                    db.scale(scale)
                    pen.data["im"] = im
            elif state == 1:
                imgf = pen.data.get("imgf")
                im = pen.data.get("im")
                if imgf and im:
                    im.unlockFocus()
                    imgf(im)
                    x, y = im.offset()
                    db.translate(-150, -150)
                    db.image(im, (x, y))
        
        if isinstance(pens, DATPen):
            pens = [pens]
        for dps in pens:
            dps.walk(draw)
        
        db.saveImage(str(save_to))
        db.endDrawing()
Пример #17
0
    def pageSetup(self):
        drawBot.newDrawing()
        drawBot.newPage("LetterLandscape")
        
        pageWidth = drawBot.width()
        pageHeight = drawBot.height()
        
        #drawBot.fill(0,0,0, 0.5)
        drawBot.stroke(0,0,0,.5)
        drawBot.strokeWidth(0.5)
        
        #this needs major clean up
        drawBot.line((margin, pageHeight-margin), (pageWidth-dpi, pageHeight-margin)) #xHeight line
        drawBot.line((margin, pageHeight-margin-self.xHeightTarget), (pageWidth-dpi, pageHeight-margin-self.xHeightTarget)) #baseline
        
        drawBot.line((margin, pageHeight-margin-(2.5*self.xHeightTarget)), (pageWidth-dpi, pageHeight-margin-(2.5*self.xHeightTarget))) #xHeight line
        drawBot.line((margin, pageHeight-margin-self.xHeightTarget-(2.5*self.xHeightTarget)), (pageWidth-dpi, pageHeight-margin-self.xHeightTarget-(2.5*self.xHeightTarget))) #baseline
        
        drawBot.line((margin, pageHeight-margin-(5*self.xHeightTarget)), (pageWidth-dpi, pageHeight-margin-(5*self.xHeightTarget))) #xHeight line
        drawBot.line((margin, pageHeight-margin-self.xHeightTarget-(5*self.xHeightTarget)), (pageWidth-dpi, pageHeight-margin-self.xHeightTarget-(5*self.xHeightTarget))) #baseline

        #drawBot.rect(margin, pageHeight-margin, pageWidth-dpi, -self.xHeightTarget)
        
        pdf = drawBot.pdfImage()
        # set the pdf data in the canvas
        self.w.canvas.setPDFDocument(pdf)
Пример #18
0
 def drawCurrentGlyph(self):
     db.newDrawing()
     db.translate(100, 100)
     db.scale(0.8)
     db.fill(None)
     db.stroke(0.2, 0.3, 1)
     db.rect(0, 0, 1000, 1000)
     db.stroke(None)
     db.translate(
         0, 120
     )  # Baseline at 120 from the bottom of the Ideographic Em Square
     db.fill(0, 1, 0, 0.3)
     db.stroke(0)
     db.lineJoin("round")
     dcSelection = set(self.w.deepComponentList.getSelection())
     aeSelection = set(self.w.atomicElementList.getSelection())
     if self._currentGlyphOutline is not None:
         drawOutline(self._currentGlyphOutline)
     if self._currentGlyphComponents:
         for dcIndex, (dcName, atomicElements) in enumerate(
             self._currentGlyphComponents
         ):
             for aeIndex, (aeName, atomicOutline) in enumerate(atomicElements):
                 if dcIndex in dcSelection:
                     if aeIndex in aeSelection:
                         db.fill(1, 0, 0, 0.3)
                     else:
                         db.fill(0, 0, 1, 0.3)
                 else:
                     db.fill(0, 0.3)
                 drawOutline(atomicOutline)
     db.endDrawing()
Пример #19
0
 def test_polygon_notEnoughPoints(self):
     drawBot.newDrawing()
     with self.assertRaises(TypeError):
         drawBot.polygon()
     with self.assertRaises(TypeError):
         drawBot.polygon((1, 2))
     drawBot.polygon((1, 2), (3, 4))
Пример #20
0
 def test_newPage_empty_implicit_first_page(self):
     drawBot.newDrawing()
     drawBot.rect(100, 100, 200, 200)
     drawBot.newPage()
     self.assertEqual(drawBot.width(), 1000)
     self.assertEqual(drawBot.height(), 1000)
     self.assertEqual(drawBot.pageCount(), 2)
Пример #21
0
 async def reload(self, trigger):
     try:
         load_drawbot = self.args.drawbot
         if load_drawbot:
             if not db:
                 raise Exception("Cannot run drawbot program without drawBot installed")
             else:
                 db.newDrawing()
         self.program = run_path(str(self.filepath))
         if load_drawbot:
             with tempfile.NamedTemporaryFile(suffix=".svg") as tf:
                 db.saveImage(tf.name)
                 self.preview.clear()
                 self.preview.send(f"<div class='drawbot-render'>{tf.read().decode('utf-8')}</div>", None)
             db.endDrawing()
         for k, v in self.program.items():
             if isinstance(v, coldtype.text.reader.Font):
                 await v.load()
                 if v.path not in self.watchee_paths():
                     self.watchees.append([Watchable.Font, v.path])
                 for ext in v.font.getExternalFiles():
                     if ext not in self.watchee_paths():
                         self.watchees.append([Watchable.Font, ext])
             elif isinstance(v, DefconFont):
                 p = Path(v.path).resolve()
                 if p not in self.watchee_paths():
                     self.watchees.append([Watchable.Font, p])
     except Exception as e:
         self.program = None
         self.show_error()
Пример #22
0
 def test_instructionStack(self):
     expected = [
         "reset None", "newPage 200 200", "save",
         "clipPath moveTo 5.0 5.0 lineTo 15.0 5.0 lineTo 15.0 15.0 lineTo 5.0 15.0 closePath",
         "restore", "image Image Object 10 10 0.5 None",
         "blendMode saturation", "transform 1 0 0 1 10 10",
         "drawPath moveTo 10.0 10.0 lineTo 110.0 10.0 lineTo 110.0 110.0 lineTo 10.0 110.0 closePath",
         "textBox foo bar 72.48291015625 84.0 55.0341796875 26.0 center",
         "frameDuration 10", "saveImage * {'myExtraAgrument': True}"
     ]
     with StdOutCollector() as output:
         import drawBot
         drawBot.newDrawing()
         drawBot.size(200, 200)
         drawBot.save()
         path = drawBot.BezierPath()
         path.rect(5, 5, 10, 10)
         drawBot.clipPath(path)
         drawBot.restore()
         im = drawBot.ImageObject()
         with im:
             drawBot.size(20, 20)
             drawBot.rect(5, 5, 10, 10)
         drawBot.image(im, (10, 10), alpha=.5)
         drawBot.blendMode("saturation")
         drawBot.translate(10, 10)
         drawBot.rect(10, 10, 100, 100)
         drawBot.text("foo bar", (100, 100), align="center")
         drawBot.frameDuration(10)
         drawBot.saveImage("*", myExtraAgrument=True)
         drawBot.endDrawing()
     self.assertEqual(output.lines(), expected)
Пример #23
0
def new_drawing(rect: Rect = Rect(1000, 1000), count=1, save_to=None):
    db.newDrawing()
    for idx in range(0, count):
        with new_page(rect) as r:
            yield idx, r
    if save_to:
        db.saveImage(str(save_to))
    db.endDrawing()
Пример #24
0
 def test_font_install(self):
     fontPath = os.path.join(testDataDir, "MutatorSans.ttf")
     drawBot.newDrawing()
     drawBot.newPage()
     postscriptName = drawBot.font(fontPath)
     self.assertEqual(postscriptName, "MutatorMathTest-LightCondensed")
     variations = drawBot.listFontVariations()
     self.assertEqual(variations, {'wdth': {'name': 'Width', 'minValue': 0.0, 'maxValue': 1000.0, 'defaultValue': 0.0}, 'wght': {'name': 'Weight', 'minValue': 0.0, 'maxValue': 1000.0, 'defaultValue': 0.0}})
Пример #25
0
 def __init__(self):
     drawBot.newDrawing()
     # A3, TODO: switch to A2.
     drawBot.newPage(1190, 842)
     self.stepIntoArena()
     self.juggle()
     path = '/Users/michiel/Desktop/circus.pdf'
     drawBot.saveImage(path)
Пример #26
0
 def test_polygon_unexpectedKeywordArgument(self):
     drawBot.newDrawing()
     drawBot.polygon((1, 2), (3, 4), close=True)
     drawBot.polygon((1, 2), (3, 4), close=False)
     with self.assertRaises(TypeError):
         drawBot.polygon((1, 2), (3, 4), closed=False)
     with self.assertRaises(TypeError):
         drawBot.polygon((1, 2), (3, 4), closed=False, foo=123)
Пример #27
0
 def test_newPage_empty_multiple(self):
     drawBot.newDrawing()
     drawBot.newPage()
     drawBot.newPage()
     drawBot.newPage()
     self.assertEqual(drawBot.width(), 1000)
     self.assertEqual(drawBot.height(), 1000)
     self.assertEqual(drawBot.pageCount(), 3)
Пример #28
0
 def test_polygon_unexpectedKeywordArgument(self):
     drawBot.newDrawing()
     drawBot.polygon((1, 2), (3, 4), close=True)
     drawBot.polygon((1, 2), (3, 4), close=False)
     with self.assertRaises(TypeError):
         drawBot.polygon((1, 2), (3, 4), closed=False)
     with self.assertRaises(TypeError):
         drawBot.polygon((1, 2), (3, 4), closed=False, foo=123)
Пример #29
0
 def test_newPage_empty_multiple(self):
     drawBot.newDrawing()
     drawBot.newPage()
     drawBot.newPage()
     drawBot.newPage()
     self.assertEqual(drawBot.width(), 1000)
     self.assertEqual(drawBot.height(), 1000)
     self.assertEqual(drawBot.pageCount(), 3)
Пример #30
0
    def draw(self, sender):

        db.newDrawing()
        db.newPage(300, 300)
        fill(random(), random(), random())
        db.rect(0, 0, 50, 50)

        self.pdf = db.pdfImage()
        self.w.drawView.setPDFDocument(self.pdf)
Пример #31
0
    def draw(self, saving=False, saveTo=None, fmt="pdf", layers=[], fill=None):
        savingToFont = isinstance(fmt, defcon.Font)
        if saving:
            db.newDrawing()
            self.saving = True
        else:
            self.saving = False

        db.newPage(*self.animation.dimensions)
        self.page = Rect.page()

        self.bps = {}
        for l in layers:
            self.bps[l] = RichBezier()

        with db.savedState():
            if fill and not saveTo:
                with db.savedState():
                    db.fill(*fill)
                    db.rect(*self.page)
            self.layers = layers
            self.animation.fn(self)
            self.layers = None
        if self.animation.burn:
            box = self.page.take(64,
                                 Edge.MinY).take(120,
                                                 Edge.MaxX).offset(-24, 24)
            db.fontSize(20)
            db.lineHeight(20)
            db.font("Menlo-Bold")
            db.fill(0, 0.8)
            db.rect(*box.inset(-14, -14).offset(0, 2))
            db.fill(1)
            db.textBox("{:07.2f}\n{:04d}\n{:%H:%M:%S}".format(
                self.time, self.i, datetime.datetime.now()),
                       box,
                       align="center")

        for k, bez in self.bps.items():
            with db.savedState():
                db.fill(*bez.fill)
                db.drawPath(bez.bp)

        if saving:
            if savingToFont:
                for k, bez in self.bps.items():
                    g = defcon.Glyph()
                    g.name = "frame_" + str(self.i)
                    g.unicode = self.i + 48  # to get to 0
                    g.width = self.animation.dimensions[0]
                    bez.bp.drawToPen(g.getPen())
                    fmt.insertGlyph(g)
            else:
                db.saveImage(f"{saveTo}/{self.i}.{fmt}")
            db.endDrawing()

        self.saving = False
Пример #32
0
 def test_linkURL_svg(self):
     expectedPath = os.path.join(testDataDir, "expected_svgLinkURL.svg")
     drawBot.newDrawing()
     drawBot.newPage(200, 200)
     drawBot.rect(10, 10, 20, 20)
     drawBot.linkURL("http://drawbot.com", (10, 10, 20, 20))
     with TempFile(suffix=".svg") as tmp:
         drawBot.saveImage(tmp.path)
         self.assertEqual(readData(tmp.path), readData(expectedPath), "Files %r and %s are not the same" % (tmp.path, expectedPath))
Пример #33
0
 def test_fontVariationNamedInstances(self):
     drawBot.newDrawing()
     namedInstances = drawBot.listNamedInstances()
     self.assertEqual(namedInstances, {})
     drawBot.font("Skia")
     namedInstances = drawBot.listNamedInstances()
     namedInstances = _roundInstanceLocations(namedInstances)
     expectedNamedInstances = {
         'Skia-Regular_Black': {
             'wght': 3.2,
             'wdth': 1.0
         },
         'Skia-Regular_Extended': {
             'wght': 1.0,
             'wdth': 1.3
         },
         'Skia-Regular_Condensed': {
             'wght': 1.0,
             'wdth': 0.61998
         },
         'Skia-Regular_Light': {
             'wght': 0.48,
             'wdth': 1.0
         },
         'Skia-Regular': {
             'wght': 1.0,
             'wdth': 1.0
         },
         'Skia-Regular_Black-Extended': {
             'wght': 3.2,
             'wdth': 1.3
         },
         'Skia-Regular_Light-Extended': {
             'wght': 0.48,
             'wdth': 1.3
         },
         'Skia-Regular_Black-Condensed': {
             'wght': 3.0,
             'wdth': 0.7
         },
         'Skia-Regular_Light-Condensed': {
             'wght': 0.48,
             'wdth': 0.7
         },
         'Skia-Regular_Bold': {
             'wght': 1.95,
             'wdth': 1.0
         }
     }
     expectedNamedInstances = _roundInstanceLocations(
         expectedNamedInstances)
     self.assertEqual(namedInstances, expectedNamedInstances)
     drawBot.font("Helvetica")
     namedInstances = drawBot.listNamedInstances("Skia")
     namedInstances = _roundInstanceLocations(namedInstances)
     self.assertEqual(namedInstances, expectedNamedInstances)
Пример #34
0
 def makeTestAnimation(self, numFrames=25, pageWidth=500, pageHeight=500):
     randomSeed(0)
     drawBot.newDrawing()
     for i in range(numFrames):
         drawBot.newPage(pageWidth, pageHeight)
         drawBot.frameDuration(1/25)
         drawBot.fill(1)
         drawBot.rect(0, 0, pageWidth, pageHeight)
         drawBot.fill(0)
         drawBot.rect(random.randint(0, 100), random.randint(0, 100), 400, 400)
Пример #35
0
 def test_export_svg_fallbackFont(self):
     expectedPath = os.path.join(testDataDir, "expected_svgSaveFallback.svg")
     drawBot.newDrawing()
     drawBot.newPage(100, 100)
     drawBot.fallbackFont("Courier")
     drawBot.font("Times")
     drawBot.text("a", (10, 10))
     with TempFile(suffix=".svg") as tmp:
         drawBot.saveImage(tmp.path)
         self.assertEqual(readData(tmp.path), readData(expectedPath), "Files %r and %s are not the same" % (tmp.path, expectedPath))
Пример #36
0
 def test_formattedStringURL_svg(self):
     expectedPath = os.path.join(testDataDir, "expected_formattedStringURL.svg")
     drawBot.newDrawing()
     drawBot.newPage(200, 200)
     drawBot.underline("single")
     drawBot.url("http://drawbot.com")
     drawBot.text("foo", (10, 10))
     with TempFile(suffix=".svg") as tmp:
         drawBot.saveImage(tmp.path)
         self.assertEqual(readData(tmp.path), readData(expectedPath), "Files %r and %s are not the same" % (tmp.path, expectedPath))
Пример #37
0
    def build(self):
        """Build the document by looping trough the pages, an then recursively
        tell every page to build itself (and its contained elements).
        """
        # Clear all previous drawing in the DrawBot canvas.
        drawBot.newDrawing()

        # Tell each page to build itself in DrawBot, including their child elements.
        for page in self.pages:
            page.build(self) # Passing self as document, in case the page needs more info.
        self.hasBuilt = True # Flag that we did this, in case called separate from self.export.
Пример #38
0
 def test_openTypeFeatures(self):
     drawBot.newDrawing()
     fea = drawBot.listOpenTypeFeatures()
     self.assertEqual(fea, {'liga': True})
     drawBot.font("Helvetica")
     fea = drawBot.listOpenTypeFeatures()
     self.assertEqual(fea, {'liga': True, 'tnum': True, 'pnum': False})
     fea = drawBot.listOpenTypeFeatures("HoeflerText-Regular")
     self.assertEqual(fea, {'liga': True, 'dlig': False, 'tnum': True, 'pnum': False, 'titl': True, 'onum': True, 'lnum': False})
     fea = drawBot.openTypeFeatures(liga=False)
     self.assertEqual(fea, {'liga': False, 'tnum': True, 'pnum': False})
     drawBot.font("LucidaGrande")
     fea = drawBot.openTypeFeatures(resetFeatures=True)
     self.assertEqual(fea, {'liga': True})
def GoldFactory(glyph, font=None, offset=10):
    glyph = RGlyph(glyph)
    box = glyph.bounds if version >= "3.0" else glyph.box
    if box is None:
        return None
    margin = offset * 2
    minx, miny, maxx, maxy = box
    w = maxx - minx + margin * 2
    h = maxy - miny + margin * 2

    drawBot.newDrawing()
    drawBot.newPage(w, h)
    drawBot.translate(-minx + margin, -miny + margin)

    if font is None:
        font = glyph.font if version >= "3.0" else glyph.getParent()

    glyphSet = font

    g = glyph.copy()

    for component in reversed(g.components):
        if version >= "3.0":
            decomposePen = DecomposePointPen(glyphSet, g.getPointPen())
        else:
            decomposePen = DecomposePointPen(glyphSet, g.getPointPen(), [1, 0, 0, 1, 0, 0])
        component.drawPoints(decomposePen)
        g.removeComponent(component)

    g.removeOverlap()

    minx, miny, maxx, maxy = g.bounds if version >= "3.0" else g.box

    setGoldGradient(minx, miny, maxx, maxy)
    drawBot.drawGlyph(g)

    pen = OutlinePen(glyphSet, offset=offset)
    g.draw(pen)
    pen.drawSettings(drawInner=True, drawOuter=True)

    dest = RGlyph()
    pen.drawPoints(dest.getPointPen())

    setGoldGradient(minx, miny, maxx, maxy, 4)
    drawBot.drawGlyph(dest)

    pdf = drawBot.pdfImage()
    page = pdf.pageAtIndex_(0)
    image = NSImage.alloc().initWithData_(page.dataRepresentation())
    return image, (minx-margin, miny-margin)
Пример #40
0
 def test(self):
     # get the paths
     testPath = os.path.join(tempTestDataDir, "%s.%s" % (scriptName, ext))
     expectedPath = os.path.join(testDataDir, "expected_%s.%s" % (scriptName, ext))
     expectedOutputPath = os.path.join(testDataDir, "expected_%s.txt" % scriptName)
     expectedOutput = readExpectedOutput(expectedOutputPath)
     # get drawBot
     import drawBot
     # start a new drawing
     drawBot.newDrawing()
     # execute the script in place
     # temporarily ignore deprecation warnings (there are some from PyObjC :( )
     with warnings.catch_warnings():
         if ignoreDeprecationWarnings:
             warnings.simplefilter("ignore", DeprecationWarning)
         output = self.executeScriptPath(path)
     self.assertEqual(cleanupTraceback(output), cleanupTraceback(expectedOutput))
     # save the image
     drawBot.saveImage(testPath)
     # tell drawBot drawing is done
     drawBot.endDrawing()
     self.assertForFileExtension(ext, expectedPath, testPath)
Пример #41
0
 def test_instructionStack(self):
     expected = [
         "reset None",
         "newPage 200 200",
         "save",
         "clipPath moveTo 5.0 5.0 lineTo 15.0 5.0 lineTo 15.0 15.0 lineTo 5.0 15.0 closePath",
         "restore",
         "image Image Object 10 10 0.5 None",
         "blendMode saturation",
         "transform 1 0 0 1 10 10",
         "drawPath moveTo 10.0 10.0 lineTo 110.0 10.0 lineTo 110.0 110.0 lineTo 10.0 110.0 closePath",
         "textBox foo bar 82.48291015625 84.0 35.0341796875 26.0 center",
         "frameDuration 10",
         "saveImage * {'myExtraAgrument': True}"
     ]
     with StdOutCollector() as output:
         import drawBot
         drawBot.newDrawing()
         drawBot.size(200, 200)
         drawBot.save()
         path = drawBot.BezierPath()
         path.rect(5, 5, 10, 10)
         drawBot.clipPath(path)
         drawBot.restore()
         im = drawBot.ImageObject()
         with im:
             drawBot.size(20, 20)
             drawBot.rect(5, 5, 10, 10)
         drawBot.image(im, (10, 10), alpha=.5)
         drawBot.blendMode("saturation")
         drawBot.translate(10, 10)
         drawBot.rect(10, 10, 100, 100)
         drawBot.text("foo bar", (100, 100), align="center")
         drawBot.frameDuration(10)
         drawBot.saveImage("*", myExtraAgrument=True)
         drawBot.endDrawing()
     self.assertEqual(output.lines(), expected)
Пример #42
0
    def test(self):
        import __future__
        from drawBot.drawBotDrawingTools import _drawBotDrawingTool

        compileFlags = __future__.CO_FUTURE_DIVISION
        code = compile(source, "<%s>" % exampleName, "exec", flags=compileFlags, dont_inherit=True)

        namespace = {}
        _drawBotDrawingTool._addToNamespace(namespace)
        def mockSaveImage(path, **options):
            fileName = "example_mockSaveImage_" + os.path.basename(path)
            path = os.path.join(tempTestDataDir, fileName)
            drawBot.saveImage(path, **options)
        namespace["saveImage"] = mockSaveImage
        namespace["image"] = mockImage
        namespace["imageSize"] = mockImageSize
        namespace["imagePixelColor"] = mockImagePixelColor
        namespace["Variable"] = mockVariable
        namespace["printImage"] = mockPrintImage
        namespace["installFont"] = mockInstallFont
        namespace["uninstallFont"] = mockUninstallFont
        namespace["randint"] = mockRandInt

        randomSeed(0)
        drawBot.newDrawing()
        with StdOutCollector(captureStdErr=True):
            exec(code, namespace)
        fileName = "example_%s.png" % exampleName
        imagePath = os.path.join(tempTestDataDir, fileName)
        expectedImagePath = os.path.join(testDataDir, fileName)
        if doSaveImage:
            drawBot.saveImage(imagePath)
            if allowFuzzyImageComparison:
                self.assertImagesSimilar(imagePath, expectedImagePath)
            else:
                self.assertFilesEqual(imagePath, expectedImagePath)
Пример #43
0
import drawBot
drawBot.newDrawing()
drawBot.size(200, 100)
p = drawBot.BezierPath()
p.oval(5, 5, 70, 70)
p.rect(25, 25, 70, 70)
drawBot.fill(0, 0.3)
drawBot.stroke(0)
drawBot.drawPath(p)
p.removeOverlap()
drawBot.translate(100, 0)
drawBot.drawPath(p)
Пример #44
0
 def test_openTypeFeatures_saveRestore(self):
     drawBot.newDrawing()
     drawBot.font("AppleBraille")
     drawBot.save()
     drawBot.restore()