Skip to content

Commit 5022a8a

Browse files
authored
Merge pull request #496 from treeform/guzba
faster draw smooth using line gather then blend
2 parents 14b79c8 + e6e1056 commit 5022a8a

File tree

2 files changed

+38
-12
lines changed

2 files changed

+38
-12
lines changed

pixie.nimble

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
version = "4.4.0"
1+
version = "5.0.0"
22
author = "Andre von Houck and Ryan Oldenburg"
33
description = "Full-featured 2d graphics library for Nim."
44
license = "MIT"

src/pixie/images.nim

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -561,7 +561,7 @@ proc drawSmooth(a, b: Image, transform: Mat3, blendMode: BlendMode) =
561561
if blendMode == MaskBlend and yStart > 0:
562562
zeroMem(a.data[0].addr, yStart * a.width * 4)
563563

564-
let blender = blendMode.blender()
564+
var sampleLine = newSeq[ColorRGBX](a.width)
565565
for y in yStart ..< yEnd:
566566
# Determine where we should start and stop drawing in the x dimension
567567
var
@@ -582,21 +582,47 @@ proc drawSmooth(a, b: Image, transform: Mat3, blendMode: BlendMode) =
582582
xStart = clamp(xMin.floor.int, 0, a.width)
583583
xEnd = clamp(xMax.ceil.int, 0, a.width)
584584

585-
if blendMode == MaskBlend and xStart > 0:
586-
zeroMem(a.data[a.dataIndex(0, y)].addr, xStart * 4)
587-
588585
var srcPos = p + dx * xStart.float32 + dy * y.float32
589586
srcPos = vec2(srcPos.x - h, srcPos.y - h)
590587
for x in xStart ..< xEnd:
591-
let
592-
backdrop = a.unsafe[x, y]
593-
sample = b.getRgbaSmooth(srcPos.x, srcPos.y)
594-
blended = blender(backdrop, sample)
595-
a.unsafe[x, y] = blended
588+
sampleLine[x] = b.getRgbaSmooth(srcPos.x, srcPos.y)
596589
srcPos += dx
597590

598-
if blendMode == MaskBlend and a.width - xEnd > 0:
599-
zeroMem(a.data[a.dataIndex(xEnd, y)].addr, (a.width - xEnd) * 4)
591+
case blendMode:
592+
of NormalBlend:
593+
blendLineNormal(
594+
a.getUncheckedArray(xStart, y),
595+
cast[ptr UncheckedArray[ColorRGBX]](sampleLine[xStart].addr),
596+
xEnd - xStart
597+
)
598+
599+
of OverwriteBlend:
600+
blendLineOverwrite(
601+
a.getUncheckedArray(xStart, y),
602+
cast[ptr UncheckedArray[ColorRGBX]](sampleLine[xStart].addr),
603+
xEnd - xStart
604+
)
605+
606+
of MaskBlend:
607+
{.linearScanEnd.}
608+
if blendMode == MaskBlend and xStart > 0:
609+
zeroMem(a.data[a.dataIndex(0, y)].addr, xStart * 4)
610+
611+
blendLineMask(
612+
a.getUncheckedArray(xStart, y),
613+
cast[ptr UncheckedArray[ColorRGBX]](sampleLine[xStart].addr),
614+
xEnd - xStart
615+
)
616+
617+
if blendMode == MaskBlend and a.width - xEnd > 0:
618+
zeroMem(a.data[a.dataIndex(xEnd, y)].addr, (a.width - xEnd) * 4)
619+
else:
620+
blendLine(
621+
a.getUncheckedArray(xStart, y),
622+
cast[ptr UncheckedArray[ColorRGBX]](sampleLine[xStart].addr),
623+
xEnd - xStart,
624+
blendMode.blender()
625+
)
600626

601627
if blendMode == MaskBlend and a.height - yEnd > 0:
602628
zeroMem(

0 commit comments

Comments
 (0)