From 3bdc6c32663e45b6378b7d58d8988c8c409370b9 Mon Sep 17 00:00:00 2001 From: Ryan Oldenburg Date: Wed, 22 Jun 2022 13:21:11 -0500 Subject: [PATCH] faster partitioning by pre-sizing partition entries --- src/pixie/paths.nim | 40 +++++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/src/pixie/paths.nim b/src/pixie/paths.nim index f92a43f..527016c 100644 --- a/src/pixie/paths.nim +++ b/src/pixie/paths.nim @@ -1131,25 +1131,43 @@ proc partitionSegments( startY = top.uint32 partitionHeight = height.uint32 div numPartitions - for (segment, winding) in segments: - var entry = initPartitionEntry(segment, winding) - if partitionHeight == 0: - result[0].entries.add(move entry) - else: + var entries = newSeq[PartitionEntry](segments.len) + for i, (segment, winding) in segments: + entries[i] = initPartitionEntry(segment, winding) + + if numPartitions == 1: + result[0].entries = move entries + else: + iterator partitionRange( + segment: Segment, + numPartitions, startY, partitionHeight: uint32 + ): uint32 = var atPartition = max(0, segment.at.y - startY.float32).uint32 toPartition = max(0, segment.to.y - startY.float32).uint32 atPartition = atPartition div partitionHeight toPartition = toPartition div partitionHeight - atPartition = min(atPartition, result.high.uint32) - toPartition = min(toPartition, result.high.uint32) - for i in atPartition .. toPartition: - result[i].entries.add(entry) + atPartition = min(atPartition, numPartitions - 1) + toPartition = min(toPartition, numPartitions - 1) + for partitionIndex in atPartition .. toPartition: + yield partitionIndex + + var entryCounts = newSeq[int](numPartitions) + for (segment, _) in segments: + for partitionIndex in segment.partitionRange(numPartitions, startY, partitionHeight): + inc entryCounts[partitionIndex] + + for partitionIndex, entryCounts in entryCounts: + result[partitionIndex].entries.setLen(entryCounts) + + var indexes = newSeq[int](numPartitions) + for i, (segment, winding) in segments: + for partitionIndex in segment.partitionRange(numPartitions, startY, partitionHeight): + result[partitionIndex].entries[indexes[partitionIndex]] = entries[i] + inc indexes[partitionIndex] # Set the bottom values for the partitions (y value where this partition ends) - var partitionBottom = top + partitionHeight.int - for partition in result.mitems: partition.bottom = partitionBottom partition.requiresAntiAliasing =