From 8128bcd89829298784ee8055a7c7cf4595a7af1b Mon Sep 17 00:00:00 2001 From: Ryan Oldenburg Date: Mon, 8 Aug 2022 18:22:44 -0500 Subject: [PATCH 1/2] faster draw smooth using line gather then blend --- src/pixie/images.nim | 48 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/src/pixie/images.nim b/src/pixie/images.nim index 55db070e..6b0f77ef 100644 --- a/src/pixie/images.nim +++ b/src/pixie/images.nim @@ -561,7 +561,7 @@ proc drawSmooth(a, b: Image, transform: Mat3, blendMode: BlendMode) = if blendMode == MaskBlend and yStart > 0: zeroMem(a.data[0].addr, yStart * a.width * 4) - let blender = blendMode.blender() + var sampleLine = newSeq[ColorRGBX](a.width) for y in yStart ..< yEnd: # Determine where we should start and stop drawing in the x dimension var @@ -582,21 +582,47 @@ proc drawSmooth(a, b: Image, transform: Mat3, blendMode: BlendMode) = xStart = clamp(xMin.floor.int, 0, a.width) xEnd = clamp(xMax.ceil.int, 0, a.width) - if blendMode == MaskBlend and xStart > 0: - zeroMem(a.data[a.dataIndex(0, y)].addr, xStart * 4) - var srcPos = p + dx * xStart.float32 + dy * y.float32 srcPos = vec2(srcPos.x - h, srcPos.y - h) for x in xStart ..< xEnd: - let - backdrop = a.unsafe[x, y] - sample = b.getRgbaSmooth(srcPos.x, srcPos.y) - blended = blender(backdrop, sample) - a.unsafe[x, y] = blended + sampleLine[x] = b.getRgbaSmooth(srcPos.x, srcPos.y) srcPos += dx - if blendMode == MaskBlend and a.width - xEnd > 0: - zeroMem(a.data[a.dataIndex(xEnd, y)].addr, (a.width - xEnd) * 4) + case blendMode: + of NormalBlend: + blendLineNormal( + a.getUncheckedArray(xStart, y), + cast[ptr UncheckedArray[ColorRGBX]](sampleLine[xStart].addr), + xEnd - xStart + ) + + of OverwriteBlend: + blendLineOverwrite( + a.getUncheckedArray(xStart, y), + cast[ptr UncheckedArray[ColorRGBX]](sampleLine[xStart].addr), + xEnd - xStart + ) + + of MaskBlend: + {.linearScanEnd.} + if blendMode == MaskBlend and xStart > 0: + zeroMem(a.data[a.dataIndex(0, y)].addr, xStart * 4) + + blendLineMask( + a.getUncheckedArray(xStart, y), + cast[ptr UncheckedArray[ColorRGBX]](sampleLine[xStart].addr), + xEnd - xStart + ) + + if blendMode == MaskBlend and a.width - xEnd > 0: + zeroMem(a.data[a.dataIndex(xEnd, y)].addr, (a.width - xEnd) * 4) + else: + blendLine( + a.getUncheckedArray(xStart, y), + cast[ptr UncheckedArray[ColorRGBX]](sampleLine[xStart].addr), + xEnd - xStart, + blendMode.blender() + ) if blendMode == MaskBlend and a.height - yEnd > 0: zeroMem( From e6e10563648f77f9ca8dd3e3e20eb6c87eed7db5 Mon Sep 17 00:00:00 2001 From: Ryan Oldenburg Date: Mon, 8 Aug 2022 21:30:55 -0500 Subject: [PATCH 2/2] 5.0.0 --- pixie.nimble | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pixie.nimble b/pixie.nimble index 13f93a54..09e00a60 100644 --- a/pixie.nimble +++ b/pixie.nimble @@ -1,4 +1,4 @@ -version = "4.4.0" +version = "5.0.0" author = "Andre von Houck and Ryan Oldenburg" description = "Full-featured 2d graphics library for Nim." license = "MIT"