diff --git a/src/pixie/blends.nim b/src/pixie/blends.nim index aca4bbc..72c7246 100644 --- a/src/pixie/blends.nim +++ b/src/pixie/blends.nim @@ -35,10 +35,10 @@ type bmIntersectMask bmExcludeMask - Blender* = proc(backdrop, source: ColorRGBA): ColorRGBA ## Function signature - ## returned by blender. - Masker* = proc(backdrop, source: uint8): uint8 ## Function signature returned - ## by masker. + Blender* = proc(backdrop, source: ColorRGBA): ColorRGBA + ## Function signature returned by blender. + Masker* = proc(backdrop, source: uint8): uint8 + ## Function signature returned by masker. when defined(release): {.push checks: off.} @@ -515,46 +515,10 @@ when defined(amd64) and not defined(pixieNoSimd): import nimsimd/sse2 type - BlenderSimd* = proc(blackdrop, source: M128i): M128i ## Function signature - ## returned by blenderSimd. - MaskerSimd* = proc(blackdrop, source: M128i): M128i ## Function signature - ## returned by maskerSimd. - - proc packAlphaValues*(v: M128i): M128i {.inline.} = - ## Shuffle the alpha values for these 4 colors to the first 4 bytes - result = mm_srli_epi32(v, 24) - let - i = mm_srli_si128(result, 3) - j = mm_srli_si128(result, 6) - k = mm_srli_si128(result, 9) - first32 = cast[M128i]([uint32.high, 0, 0, 0]) - result = mm_or_si128(mm_or_si128(result, i), mm_or_si128(j, k)) - result = mm_and_si128(result, first32) - - proc unpackAlphaValues*(v: M128i): M128i {.inline.} = - ## Unpack the first 32 bits into 4 rgba(0, 0, 0, value) - let - first32 = cast[M128i]([uint32.high, 0, 0, 0]) # First 32 bits - alphaMask = mm_set1_epi32(cast[int32](0xff000000)) # Only `a` - - result = mm_shuffle_epi32(v, MM_SHUFFLE(0, 0, 0, 0)) - - var - i = mm_and_si128(result, first32) - j = mm_and_si128(result, mm_slli_si128(first32, 4)) - k = mm_and_si128(result, mm_slli_si128(first32, 8)) - l = mm_and_si128(result, mm_slli_si128(first32, 12)) - - # Shift the values to `a` - i = mm_slli_si128(i, 3) - j = mm_slli_si128(j, 2) - k = mm_slli_si128(k, 1) - # l = mm_slli_si128(l, 0) - - result = mm_and_si128( - mm_or_si128(mm_or_si128(i, j), mm_or_si128(k, l)), - alphaMask - ) + BlenderSimd* = proc(blackdrop, source: M128i): M128i + ## Function signature returned by blenderSimd. + MaskerSimd* = proc(blackdrop, source: M128i): M128i + ## Function signature returned by maskerSimd. proc blendNormalSimd(backdrop, source: M128i): M128i = let diff --git a/src/pixie/images.nim b/src/pixie/images.nim index 6bd4d59..bf908c2 100644 --- a/src/pixie/images.nim +++ b/src/pixie/images.nim @@ -1,4 +1,4 @@ -import blends, bumpy, chroma, common, masks, system/memory, vmath +import blends, bumpy, chroma, common, masks, pixie/internal, system/memory, vmath when defined(amd64) and not defined(pixieNoSimd): import nimsimd/sse2 diff --git a/src/pixie/internal.nim b/src/pixie/internal.nim new file mode 100644 index 0000000..c2fc581 --- /dev/null +++ b/src/pixie/internal.nim @@ -0,0 +1,38 @@ +when defined(amd64) and not defined(pixieNoSimd): + import nimsimd/sse2 + + proc packAlphaValues*(v: M128i): M128i {.inline.} = + ## Shuffle the alpha values for these 4 colors to the first 4 bytes + result = mm_srli_epi32(v, 24) + let + i = mm_srli_si128(result, 3) + j = mm_srli_si128(result, 6) + k = mm_srli_si128(result, 9) + first32 = cast[M128i]([uint32.high, 0, 0, 0]) + result = mm_or_si128(mm_or_si128(result, i), mm_or_si128(j, k)) + result = mm_and_si128(result, first32) + + proc unpackAlphaValues*(v: M128i): M128i {.inline.} = + ## Unpack the first 32 bits into 4 rgba(0, 0, 0, value) + let + first32 = cast[M128i]([uint32.high, 0, 0, 0]) # First 32 bits + alphaMask = mm_set1_epi32(cast[int32](0xff000000)) # Only `a` + + result = mm_shuffle_epi32(v, MM_SHUFFLE(0, 0, 0, 0)) + + var + i = mm_and_si128(result, first32) + j = mm_and_si128(result, mm_slli_si128(first32, 4)) + k = mm_and_si128(result, mm_slli_si128(first32, 8)) + l = mm_and_si128(result, mm_slli_si128(first32, 12)) + + # Shift the values to `a` + i = mm_slli_si128(i, 3) + j = mm_slli_si128(j, 2) + k = mm_slli_si128(k, 1) + # l = mm_slli_si128(l, 0) + + result = mm_and_si128( + mm_or_si128(mm_or_si128(i, j), mm_or_si128(k, l)), + alphaMask + ) diff --git a/src/pixie/paths.nim b/src/pixie/paths.nim index 66af2df..777c9da 100644 --- a/src/pixie/paths.nim +++ b/src/pixie/paths.nim @@ -1,4 +1,5 @@ -import blends, bumpy, chroma, common, images, masks, paints, strutils, vmath +import blends, bumpy, chroma, common, images, masks, paints, pixie/internal, + strutils, vmath when defined(amd64) and not defined(pixieNoSimd): import nimsimd/sse2