store winding as int directly

This commit is contained in:
Ryan Oldenburg 2021-01-27 03:47:03 -06:00
parent eb360887ab
commit bb7ec44fce

View file

@ -724,7 +724,7 @@ iterator segments*(s: seq[Vec2]): Segment =
for i in 0 ..< s.len - 1: for i in 0 ..< s.len - 1:
yield(segment(s[i], s[i + 1])) yield(segment(s[i], s[i + 1]))
proc quickSort(a: var seq[(float32, bool)], inl, inr: int) = proc quickSort(a: var seq[(float32, int16)], inl, inr: int) =
var var
r = inr r = inr
l = inl l = inl
@ -744,7 +744,7 @@ proc quickSort(a: var seq[(float32, bool)], inl, inr: int) =
quickSort(a, inl, r) quickSort(a, inl, r)
quickSort(a, l, inr) quickSort(a, l, inr)
proc computeBounds(segments: seq[(Segment, bool)]): Rect = proc computeBounds(segments: seq[(Segment, int16)]): Rect =
var var
xMin = float32.high xMin = float32.high
xMax = float32.low xMax = float32.low
@ -772,18 +772,17 @@ proc fillShapes(
color: ColorRGBA, color: ColorRGBA,
windingRule: WindingRule windingRule: WindingRule
) = ) =
var sortedSegments: seq[(Segment, bool)] var sortedSegments: seq[(Segment, int16)]
for shape in shapes: for shape in shapes:
for segment in shape.segments: for segment in shape.segments:
if segment.at.y == segment.to.y: # Skip horizontal if segment.at.y == segment.to.y: # Skip horizontal
continue continue
let winding = segment.at.y > segment.to.y if segment.at.y > segment.to.y:
if winding:
var segment = segment var segment = segment
swap(segment.at, segment.to) swap(segment.at, segment.to)
sortedSegments.add((segment, winding)) sortedSegments.add((segment, -1.int16))
else: else:
sortedSegments.add((segment, winding)) sortedSegments.add((segment, 1.int16))
# Figure out the total bounds of all the shapes, # Figure out the total bounds of all the shapes,
# rasterize only within the total bounds # rasterize only within the total bounds
@ -801,7 +800,7 @@ proc fillShapes(
initialOffset = offset / 2 initialOffset = offset / 2
var var
hits = newSeq[(float32, bool)](4) hits = newSeq[(float32, int16)](4)
coverages = newSeq[uint8](image.width) coverages = newSeq[uint8](image.width)
numHits: int numHits: int
@ -868,7 +867,7 @@ proc fillShapes(
for j in i ..< fillStart + fillLen: for j in i ..< fillStart + fillLen:
coverages[j] += sampleCoverage coverages[j] += sampleCoverage
count += (if winding: -1 else: 1) count += winding
x = at x = at
# Apply the coverage and blend # Apply the coverage and blend