This commit is contained in:
treeform 2021-12-03 16:50:02 -08:00
parent f522dbb9ff
commit 5ec38c068d
5 changed files with 54 additions and 75 deletions

View file

@ -64,6 +64,10 @@ var hourGlass = parsePath("""
M 20 20 L 180 20 L 20 180 L 180 180 z
""")
var hourGlass2 = parsePath("""
M 20 20 L 180 20 L 20 180 L 180 180 z M 62 24 L 132 24 L 50 173 L 156 173 z
""")
# Hole
var hole = parsePath("""
M 40 40 L 40 160 L 160 160 L 160 40 z
@ -88,6 +92,8 @@ when defined(bench):
test("cricle", cricle, 100)
test("halfAarc", halfAarc, 100)
test("hourGlass", hourGlass, 100)
test("hourGlass2", hourGlass2, wr=wrNonZero)
test("hourGlass2", hourGlass2, wr=wrEvenOdd)
test("hole", hole, 100)
test("holeEvenOdd", holeEvenOdd, 100, wr=wrNonZero)
test("holeEvenOdd", holeEvenOdd, 100, wr=wrEvenOdd)
@ -99,7 +105,8 @@ else:
# test("cricle", cricle)
# test("halfAarc", halfAarc)
# test("hourGlass", hourGlass)
#test("hole", hole, wr=wrEvenOdd)
test("holeEvenOdd", holeEvenOdd, wr=wrNonZero)
test("holeEvenOdd", holeEvenOdd, wr=wrEvenOdd)
test("hourGlass2", hourGlass2, wr=wrEvenOdd)
# test("hole", hole, wr=wrEvenOdd)
# test("holeEvenOdd", holeEvenOdd, wr=wrNonZero)
# test("holeEvenOdd", holeEvenOdd, wr=wrEvenOdd)
# test("letterG", letterG)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

View file

@ -2,6 +2,7 @@
import chroma, pixie/common, pixie/images, pixie/internal, pixie/paints,
pixie/paths, strutils, tables, vmath, xmlparser, xmltree
when defined(pixieDebugSvg):
import strtabs

View file

@ -2267,78 +2267,46 @@ when defined(pixieSweeps):
i = 0
while i < sweeps.len:
# TODO: Maybe finds all cuts first, add them to array, cut all lines at once.
for t in 0 ..< 10: # TODO: maybe while true:
# keep cutting sweep
var needsCut = false
var cutterLine: float32 = 0
block doubleFor:
for a in sweeps[i]:
let aSeg = segment(
vec2(a.atx, cutLines[i]),
vec2(a.tox, cutLines[i+1])
)
for b in sweeps[i]:
let bSeg = segment(
vec2(b.atx, cutLines[i]),
vec2(b.tox, cutLines[i+1])
)
var at: Vec2
if intersectsInner(aSeg, bSeg, at):
needsCut = true
cutterLine = at.y
break doubleFor
# TODO enable?
if false and needsCut:
# Doing a cut.
var
thisSweep = sweeps[i]
sweeps[i].setLen(0)
sweeps.insert(newSeq[SweepLine](), i + 1)
for a in thisSweep:
let seg = segment(vec2(a.atx, cutLines[i]), vec2(a.tox, cutLines[i+1]))
var at: Vec2
if intersects(line(vec2(0, cutterLine), vec2(1, cutterLine)), seg, at):
sweeps[i+0].add(toLine((segment(seg.at, at), a.winding)))
sweeps[i+1].add(toLine((segment(at, seg.to), a.winding)))
cutLines.binaryInsert(cutterLine)
else:
break
inc i
var crossCuts: seq[float32]
# i = 0
# while i < sweeps.len:
# # TODO: Maybe finds all cuts first, add them to array, cut all lines at once.
# for t in 0 ..< 10: # TODO: maybe while true:
# # keep cutting sweep
# var needsCut = false
# var cutterLine: float32 = 0
# block doubleFor:
# for a in sweeps[i]:
# let aSeg = segment(vec2(a.atx, cutLines[i]), vec2(a.tox, cutLines[i+1]))
# for b in sweeps[i]:
# let bSeg = segment(vec2(b.atx, cutLines[i]), vec2(b.tox, cutLines[i+1]))
# var at: Vec2
# if intersectsInner(aSeg, bSeg, at):
# needsCut = true
# cutterLine = at.y
# break doubleFor
# # TODO enable?
# if false and needsCut:
# # Doing a cut.
# var
# thisSweep = sweeps[i]
# sweeps[i].setLen(0)
# sweeps.insert(newSeq[SweepLine](), i + 1)
# for a in thisSweep:
# let seg = segment(vec2(a.atx, cutLines[i]), vec2(a.tox, cutLines[i+1]))
# var at: Vec2
# if intersects(line(vec2(0, cutterLine), vec2(1, cutterLine)), seg, at):
# sweeps[i+0].add(toLine((segment(seg.at, at), a.winding)))
# sweeps[i+1].add(toLine((segment(at, seg.to), a.winding)))
# cutLines.binaryInsert(cutterLine)
# else:
# break
# inc i
# echo i, " cut?"
for aIndex in 0 ..< sweeps[i].len:
let a = sweeps[i][aIndex]
# echo i, ":", sweeps.len, ":", cutLines.len
let aSeg = segment(vec2(a.atx, cutLines[i]), vec2(a.tox, cutLines[i+1]))
for bIndex in aIndex + 1 ..< sweeps[i].len:
let b = sweeps[i][bIndex]
let bSeg = segment(vec2(b.atx, cutLines[i]), vec2(b.tox, cutLines[i+1]))
var at: Vec2
if intersectsInner(aSeg, bSeg, at):
crossCuts.binaryInsert(at.y)
if crossCuts.len > 0:
var
thisSweep = sweeps[i]
yTop = cutLines[i]
yBottom = cutLines[i + 1]
sweeps[i].setLen(0)
for k in crossCuts:
let prevLen = cutLines.len
cutLines.binaryInsert(k)
if prevLen != cutLines.len:
sweeps.insert(newSeq[SweepLine](), i + 1)
for a in thisSweep:
var seg = segment(vec2(a.atx, yTop), vec2(a.tox, yBottom))
var at: Vec2
for j, cutterLine in crossCuts:
if intersects(line(vec2(0, cutterLine), vec2(1, cutterLine)), seg, at):
sweeps[i+j].add(toLine((segment(seg.at, at), a.winding)))
seg = segment(at, seg.to)
sweeps[i+crossCuts.len].add(toLine((seg, a.winding)))
i += crossCuts.len
inc i
i = 0
while i < sweeps.len:

View file

@ -1,6 +1,9 @@
import benchy, pixie/fileformats/svg
import benchy, pixie/fileformats/svg, pixie/fileformats/png
let data = readFile("tests/fileformats/svg/Ghostscript_Tiger.svg")
#let data = readFile("tests/fileformats/svg/rotatedRect.svg")
writeFile("tiger.png", decodeSvg(data).encodePng())
timeIt "svg decode":
discard decodeSvg(data)