@@ -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