From 64e6db2cef8613d54c4146c1da0618db09ed8d41 Mon Sep 17 00:00:00 2001 From: Ryan Oldenburg Date: Sun, 12 Dec 2021 23:01:35 -0600 Subject: [PATCH] nonsimd path --- src/pixie/blends.nim | 2 +- src/pixie/images.nim | 87 ++++++++++++++++++++++++++++++++------------ 2 files changed, 65 insertions(+), 24 deletions(-) diff --git a/src/pixie/blends.nim b/src/pixie/blends.nim index 371b50f..0eb83c8 100644 --- a/src/pixie/blends.nim +++ b/src/pixie/blends.nim @@ -165,7 +165,7 @@ proc SetSat(C: Color, s: float32): Color {.inline.} = if satC > 0: result = (C - min([C.r, C.g, C.b])) * s / satC -proc blendNormal(backdrop, source: ColorRGBX): ColorRGBX = +proc blendNormal*(backdrop, source: ColorRGBX): ColorRGBX = if backdrop.a == 0 or source.a == 255: return source if source.a == 0: diff --git a/src/pixie/images.nim b/src/pixie/images.nim index 3062b7c..2a8ea84 100644 --- a/src/pixie/images.nim +++ b/src/pixie/images.nim @@ -913,29 +913,70 @@ proc drawUber( clamp(srcPos.y, 0, b.height.float32) ) - for x in x ..< xMax: - let samplePos = ivec2((srcPos.x - h).int32, (srcPos.y - h).int32) - - when type(a) is Image: - let backdrop = a.unsafe[x, y] - when type(b) is Image: - let - sample = b.unsafe[samplePos.x, samplePos.y] - blended = blender(backdrop, sample) - else: # b is a Mask - let - sample = b.unsafe[samplePos.x, samplePos.y] - blended = blender(backdrop, rgbx(0, 0, 0, sample)) - a.unsafe[x, y] = blended - else: # a is a Mask - let backdrop = a.unsafe[x, y] - when type(b) is Image: - let sample = b.unsafe[samplePos.x, samplePos.y].a - else: # b is a Mask - let sample = b.unsafe[samplePos.x, samplePos.y] - a.unsafe[x, y] = masker(backdrop, sample) - - srcPos += dx + if blendMode == bmOverwrite: + for x in x ..< xMax: + let samplePos = ivec2((srcPos.x - h).int32, (srcPos.y - h).int32) + when type(a) is Image: + when type(b) is Image: + let source = b.unsafe[samplePos.x, samplePos.y] + else: # b is a Mask + let source = rgbx(0, 0, 0, b.unsafe[samplePos.x, samplePos.y]) + a.unsafe[x, y] = source + else: # a is a Mask + when type(b) is Image: + let source = b.unsafe[samplePos.x, samplePos.y].a + else: # b is a Mask + let source = b.unsafe[samplePos.x, samplePos.y] + a.unsafe[x, y] = source + srcPos += dx + elif blendMode == bmNormal: + for x in x ..< xMax: + let samplePos = ivec2((srcPos.x - h).int32, (srcPos.y - h).int32) + when type(a) is Image: + when type(b) is Image: + let source = b.unsafe[samplePos.x, samplePos.y] + else: # b is a Mask + let source = rgbx(0, 0, 0, b.unsafe[samplePos.x, samplePos.y]) + if source.a > 0: + if source.a == 255: + a.unsafe[x, y] = source + else: + let backdrop = a.unsafe[x, y] + a.unsafe[x, y] = blendNormal(backdrop, source) + else: # a is a Mask + when type(b) is Image: + let source = b.unsafe[samplePos.x, samplePos.y].a + else: # b is a Mask + let source = b.unsafe[samplePos.x, samplePos.y] + if source > 0: + if source == 255: + a.unsafe[x, y] = source + else: + let backdrop = a.unsafe[x, y] + a.unsafe[x, y] = blendAlpha(backdrop, source) + srcPos += dx + else: + for x in x ..< xMax: + let samplePos = ivec2((srcPos.x - h).int32, (srcPos.y - h).int32) + when type(a) is Image: + let backdrop = a.unsafe[x, y] + when type(b) is Image: + let + sample = b.unsafe[samplePos.x, samplePos.y] + blended = blender(backdrop, sample) + else: # b is a Mask + let + sample = b.unsafe[samplePos.x, samplePos.y] + blended = blender(backdrop, rgbx(0, 0, 0, sample)) + a.unsafe[x, y] = blended + else: # a is a Mask + let backdrop = a.unsafe[x, y] + when type(b) is Image: + let sample = b.unsafe[samplePos.x, samplePos.y].a + else: # b is a Mask + let sample = b.unsafe[samplePos.x, samplePos.y] + a.unsafe[x, y] = masker(backdrop, sample) + srcPos += dx if blendMode == bmMask: if a.width - xMax > 0: