f
This commit is contained in:
parent
f522dbb9ff
commit
5ec38c068d
|
@ -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 |
|
@ -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
|
||||
|
||||
|
|
|
@ -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 crossCuts: seq[float32]
|
||||
|
||||
# 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):
|
||||
needsCut = true
|
||||
cutterLine = at.y
|
||||
break doubleFor
|
||||
# TODO enable?
|
||||
if false and needsCut:
|
||||
# Doing a cut.
|
||||
crossCuts.binaryInsert(at.y)
|
||||
|
||||
if crossCuts.len > 0:
|
||||
var
|
||||
thisSweep = sweeps[i]
|
||||
yTop = cutLines[i]
|
||||
yBottom = cutLines[i + 1]
|
||||
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
|
||||
|
||||
# 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
|
||||
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:
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue