pixie/experiments/benchmark_cairo.nim

213 lines
4.5 KiB
Nim
Raw Normal View History

2021-11-26 05:30:05 +00:00
import benchy, cairo, chroma, math, pixie, pixie/paths {.all.}, strformat
proc doDiff(a, b: Image, name: string) =
let (diffScore, diffImage) = diff(a, b)
echo &"{name} score: {diffScore}"
diffImage.writeFile(&"{name}_diff.png")
2020-12-13 08:35:02 +00:00
2021-06-03 08:48:11 +00:00
block:
2021-11-26 05:30:05 +00:00
let path = newPath()
path.moveTo(0, 0)
path.lineTo(1920, 0)
path.lineTo(1920, 1080)
path.lineTo(0, 1080)
path.closePath()
let shapes = path.commandsToShapes(true, 1)
2021-06-25 21:54:32 +00:00
let
2021-06-03 08:48:11 +00:00
surface = imageSurfaceCreate(FORMAT_ARGB32, 1920, 1080)
ctx = surface.create()
ctx.setSourceRgba(0, 0, 1, 1)
timeIt "cairo1":
ctx.newPath()
2021-11-26 05:30:05 +00:00
ctx.moveTo(shapes[0][0].x, shapes[0][0].y)
for shape in shapes:
for v in shape:
ctx.lineTo(v.x, v.y)
2021-06-03 08:48:11 +00:00
ctx.fill()
surface.flush()
# discard surface.writeToPng("cairo1.png")
2021-06-25 21:54:32 +00:00
let a = newImage(1920, 1080)
2021-06-03 08:48:11 +00:00
timeIt "pixie1":
2021-11-13 01:42:35 +00:00
let p = newPath()
2021-11-26 05:30:05 +00:00
p.moveTo(shapes[0][0])
for shape in shapes:
for v in shape:
p.lineTo(v)
2021-11-30 23:37:30 +00:00
a.fillPath(p, rgbx(0, 0, 255, 255))
2021-06-03 08:48:11 +00:00
# a.writeFile("pixie1.png")
block:
2021-11-26 05:30:05 +00:00
let path = newPath()
path.moveTo(500, 240)
path.lineTo(1500, 240)
path.lineTo(1920, 600)
path.lineTo(0, 600)
path.closePath()
let shapes = path.commandsToShapes(true, 1)
2021-06-25 21:54:32 +00:00
let
2021-06-03 08:48:11 +00:00
surface = imageSurfaceCreate(FORMAT_ARGB32, 1920, 1080)
ctx = surface.create()
timeIt "cairo2":
2021-11-26 05:30:05 +00:00
ctx.setSourceRgba(1, 1, 1, 1)
let operator = ctx.getOperator()
ctx.setOperator(OperatorSource)
ctx.paint()
ctx.setOperator(operator)
ctx.setSourceRgba(0, 0, 1, 1)
2021-06-03 08:48:11 +00:00
ctx.newPath()
2021-11-26 05:30:05 +00:00
ctx.moveTo(shapes[0][0].x, shapes[0][0].y)
for shape in shapes:
for v in shape:
ctx.lineTo(v.x, v.y)
2021-06-03 08:48:11 +00:00
ctx.fill()
2021-11-26 05:30:05 +00:00
surface.flush()
2020-12-13 08:35:02 +00:00
2021-06-03 08:48:11 +00:00
# discard surface.writeToPng("cairo2.png")
2020-12-13 08:35:02 +00:00
2021-06-25 21:54:32 +00:00
let a = newImage(1920, 1080)
2020-12-13 08:35:02 +00:00
2021-06-03 08:48:11 +00:00
timeIt "pixie2":
2021-11-30 23:37:30 +00:00
a.fill(rgbx(255, 255, 255, 255))
2021-11-26 05:30:05 +00:00
2021-11-13 01:42:35 +00:00
let p = newPath()
2021-11-26 05:30:05 +00:00
p.moveTo(shapes[0][0])
for shape in shapes:
for v in shape:
p.lineTo(v)
2021-11-30 23:37:30 +00:00
a.fillPath(p, rgbx(0, 0, 255, 255))
2020-12-13 08:35:02 +00:00
2021-06-03 08:48:11 +00:00
# a.writeFile("pixie2.png")
2021-06-26 01:49:05 +00:00
2021-11-26 05:30:05 +00:00
block:
let path = parsePath("""
M 100,300
A 200,200 0,0,1 500,300
A 200,200 0,0,1 900,300
Q 900,600 500,900
Q 100,600 100,300 z
""")
let shapes = path.commandsToShapes(true, 1)
let
surface = imageSurfaceCreate(FORMAT_ARGB32, 1000, 1000)
ctx = surface.create()
timeIt "cairo3":
ctx.setSourceRgba(1, 1, 1, 1)
let operator = ctx.getOperator()
ctx.setOperator(OperatorSource)
ctx.paint()
ctx.setOperator(operator)
ctx.setSourceRgba(1, 0, 0, 1)
ctx.newPath()
ctx.moveTo(shapes[0][0].x, shapes[0][0].y)
for shape in shapes:
for v in shape:
ctx.lineTo(v.x, v.y)
ctx.fill()
surface.flush()
# discard surface.writeToPng("cairo3.png")
let a = newImage(1000, 1000)
timeIt "pixie3":
2021-11-30 23:37:30 +00:00
a.fill(rgbx(255, 255, 255, 255))
2021-11-26 05:30:05 +00:00
let p = newPath()
p.moveTo(shapes[0][0])
for shape in shapes:
for v in shape:
p.lineTo(v)
2021-11-30 23:37:30 +00:00
a.fillPath(p, rgbx(255, 0, 0, 255))
2021-11-26 05:30:05 +00:00
# a.writeFile("pixie3.png")
# doDiff(readImage("cairo3.png"), a, "cairo3")
2021-11-29 05:58:54 +00:00
block:
let path = newPath()
path.roundedRect(200, 200, 600, 600, 10, 10, 10, 10)
let shapes = path.commandsToShapes(true, 1)
2021-12-01 06:18:25 +00:00
# let
# surface = imageSurfaceCreate(FORMAT_ARGB32, 1000, 1000)
# ctx = surface.create()
2021-11-29 05:58:54 +00:00
2021-11-30 22:00:30 +00:00
# timeIt "cairo4":
2021-12-01 06:18:25 +00:00
# ctx.setSourceRgba(0, 0, 0, 0)
# let operator = ctx.getOperator()
# ctx.setOperator(OperatorSource)
# ctx.paint()
# ctx.setOperator(operator)
timeIt "cairo4":
let
surface = imageSurfaceCreate(FORMAT_ARGB32, 1000, 1000)
ctx = surface.create()
2021-11-30 22:00:30 +00:00
2021-11-29 08:13:31 +00:00
ctx.setSourceRgba(1, 0, 0, 0.5)
2021-11-29 05:58:54 +00:00
ctx.newPath()
ctx.moveTo(shapes[0][0].x, shapes[0][0].y)
for shape in shapes:
for v in shape:
ctx.lineTo(v.x, v.y)
ctx.fill()
surface.flush()
2021-11-29 08:13:31 +00:00
# discard surface.writeToPng("cairo4.png")
2021-11-29 05:58:54 +00:00
2021-11-30 22:00:30 +00:00
var a: Image
2021-11-29 05:58:54 +00:00
timeIt "pixie4":
2021-11-30 22:26:28 +00:00
a = newImage(1000, 1000)
2021-11-29 05:58:54 +00:00
let p = newPath()
p.moveTo(shapes[0][0])
for shape in shapes:
for v in shape:
p.lineTo(v)
2021-11-30 23:37:30 +00:00
a.fillPath(p, rgbx(127, 0, 0, 127))
2021-11-29 05:58:54 +00:00
2021-11-29 08:13:31 +00:00
# a.writeFile("pixie4.png")
2021-11-29 05:58:54 +00:00
2021-11-29 08:13:31 +00:00
# doDiff(readImage("cairo4.png"), a, "4")
2021-11-29 09:38:49 +00:00
timeIt "pixie4 mask":
2021-11-30 22:00:30 +00:00
let mask = newMask(1000, 1000)
2021-11-29 09:38:49 +00:00
let p = newPath()
p.moveTo(shapes[0][0])
for shape in shapes:
for v in shape:
p.lineTo(v)
mask.fillPath(p)
2021-11-30 22:00:30 +00:00
var tmp: Image
timeIt "pixie fillImage":
2021-11-30 23:46:22 +00:00
let p = newPath()
p.moveTo(shapes[0][0])
for shape in shapes:
for v in shape:
p.lineTo(v)
tmp = p.fillImage(1000, 1000, rgbx(127, 0, 0, 127))
2021-11-30 22:00:30 +00:00
# tmp.writeFile("tmp.png")