import benchy, chroma, pixie/images include pixie/blends let backdrop = newImage(256, 256) source = newImage(256, 256) source.fill(rgba(100, 100, 100, 100)) template reset() = backdrop.fill(rgba(0, 0, 0, 255)) reset() timeIt "blendNormal": for i in 0 ..< backdrop.data.len: backdrop.data[i] = blendNormal(backdrop.data[i], source.data[i]) reset() # timeIt "blendNormalFloats": # for i in 0 ..< backdrop.data.len: # backdrop.data[i] = blendNormalFloats( # backdrop.data[i].color, source.data[i].color # ).rgba # reset() timeIt "blendDarken": for i in 0 ..< backdrop.data.len: backdrop.data[i] = blendDarken(backdrop.data[i], source.data[i]) reset() # timeIt "blendDarkenFloats": # for i in 0 ..< backdrop.data.len: # backdrop.data[i] = blendDarkenFloats( # backdrop.data[i].color, source.data[i].color # ).rgba # reset() timeIt "blendMultiply": for i in 0 ..< backdrop.data.len: backdrop.data[i] = blendMultiply(backdrop.data[i], source.data[i]) reset() # timeIt "blendMultiplyFloats": # for i in 0 ..< backdrop.data.len: # backdrop.data[i] = blendMultiplyFloats( # backdrop.data[i].color, source.data[i].color # ).rgba # reset() timeIt "blendLinearBurn": for i in 0 ..< backdrop.data.len: backdrop.data[i] = blendLinearBurn(backdrop.data[i], source.data[i]) reset() # timeIt "blendLinearBurnFloats": # for i in 0 ..< backdrop.data.len: # backdrop.data[i] = blendLinearBurnFloats( # backdrop.data[i].color, source.data[i].color # ).rgba # reset() timeIt "blendColorBurn": for i in 0 ..< backdrop.data.len: backdrop.data[i] = blendColorBurn(backdrop.data[i], source.data[i]) reset() # timeIt "blendColorBurnFloats": # for i in 0 ..< backdrop.data.len: # backdrop.data[i] = blendColorBurnFloats( # backdrop.data[i].color, source.data[i].color # ).rgba # reset() timeIt "blendLighten": for i in 0 ..< backdrop.data.len: backdrop.data[i] = blendLighten(backdrop.data[i], source.data[i]) reset() # timeIt "blendLightenFloats": # for i in 0 ..< backdrop.data.len: # backdrop.data[i] = blendLightenFloats( # backdrop.data[i].color, source.data[i].color # ).rgba # reset() timeIt "blendScreen": for i in 0 ..< backdrop.data.len: backdrop.data[i] = blendScreen(backdrop.data[i], source.data[i]) reset() # timeIt "blendScreenFloats": # for i in 0 ..< backdrop.data.len: # backdrop.data[i] = blendScreenFloats( # backdrop.data[i].color, source.data[i].color # ).rgba # reset() timeIt "blendLinearDodge": for i in 0 ..< backdrop.data.len: backdrop.data[i] = blendLinearDodge(backdrop.data[i], source.data[i]) reset() # timeIt "blendLinearDodgeFloats": # for i in 0 ..< backdrop.data.len: # backdrop.data[i] = blendLinearDodgeFloats( # backdrop.data[i].color, source.data[i].color # ).rgba # reset() timeIt "blendColorDodge": for i in 0 ..< backdrop.data.len: backdrop.data[i] = blendColorDodge(backdrop.data[i], source.data[i]) reset() # timeIt "blendColorDodgeFloats": # for i in 0 ..< backdrop.data.len: # backdrop.data[i] = blendColorDodgeFloats( # backdrop.data[i].color, source.data[i].color # ).rgba # reset() timeIt "blendOverlay": for i in 0 ..< backdrop.data.len: backdrop.data[i] = blendOverlay(backdrop.data[i], source.data[i]) reset() # timeIt "blendOverlayFloats": # for i in 0 ..< backdrop.data.len: # backdrop.data[i] = blendOverlayFloats( # backdrop.data[i].color, source.data[i].color # ).rgba # reset() timeIt "blendSoftLight": for i in 0 ..< backdrop.data.len: backdrop.data[i] = blendSoftLight(backdrop.data[i], source.data[i]) reset() # timeIt "blendSoftLightFloats": # for i in 0 ..< backdrop.data.len: # backdrop.data[i] = blendSoftLightFloats( # backdrop.data[i].color, source.data[i].color # ).rgba # reset() timeIt "blendHardLight": for i in 0 ..< backdrop.data.len: backdrop.data[i] = blendHardLight(backdrop.data[i], source.data[i]) reset() # timeIt "blendHardLightFloats": # for i in 0 ..< backdrop.data.len: # backdrop.data[i] = blendHardLightFloats( # backdrop.data[i].color, source.data[i].color # ).rgba # reset() timeIt "blendDifference": for i in 0 ..< backdrop.data.len: backdrop.data[i] = blendDifference(backdrop.data[i], source.data[i]) reset() # timeIt "blendDifferenceFloats": # for i in 0 ..< backdrop.data.len: # backdrop.data[i] = blendDifferenceFloats( # backdrop.data[i].color, source.data[i].color # ).rgba # reset() timeIt "blendExclusion": for i in 0 ..< backdrop.data.len: backdrop.data[i] = blendExclusion(backdrop.data[i], source.data[i]) reset() # timeIt "blendExclusionFloats": # for i in 0 ..< backdrop.data.len: # backdrop.data[i] = blendExclusionFloats( # backdrop.data[i].color, source.data[i].color # ).rgba # reset() timeIt "blendHue": for i in 0 ..< backdrop.data.len: backdrop.data[i] = blendHue(backdrop.data[i], source.data[i]) reset() # timeIt "blendHueFloats": # for i in 0 ..< backdrop.data.len: # backdrop.data[i] = blendHueFloats( # backdrop.data[i].color, source.data[i].color # ).rgba # reset() timeIt "blendSaturation": for i in 0 ..< backdrop.data.len: backdrop.data[i] = blendSaturation(backdrop.data[i], source.data[i]) reset() # timeIt "blendSaturationFloats": # for i in 0 ..< backdrop.data.len: # backdrop.data[i] = blendSaturationFloats( # backdrop.data[i].color, source.data[i].color # ).rgba reset() timeIt "blendColor": for i in 0 ..< backdrop.data.len: backdrop.data[i] = blendColor(backdrop.data[i], source.data[i]) reset() # timeIt "blendColorFloats": # for i in 0 ..< backdrop.data.len: # backdrop.data[i] = blendColorFloats( # backdrop.data[i].color, source.data[i].color # ).rgba # reset() timeIt "blendLuminosity": for i in 0 ..< backdrop.data.len: backdrop.data[i] = blendLuminosity(backdrop.data[i], source.data[i]) reset() # timeIt "blendLuminosityFloats": # for i in 0 ..< backdrop.data.len: # backdrop.data[i] = blendLuminosityFloats( # backdrop.data[i].color, source.data[i].color # ).rgba # reset() timeIt "blendMask": for i in 0 ..< backdrop.data.len: backdrop.data[i] = blendMask(backdrop.data[i], source.data[i]) reset() # timeIt "blendMaskFloats": # for i in 0 ..< backdrop.data.len: # backdrop.data[i] = blendMaskFloats( # backdrop.data[i].color, source.data[i].color # ).rgba # reset() timeIt "blendSubtractMask": for i in 0 ..< backdrop.data.len: backdrop.data[i] = blendSubtractMask(backdrop.data[i], source.data[i]) reset() # timeIt "blendSubtractMaskFloats": # for i in 0 ..< backdrop.data.len: # backdrop.data[i] = blendSubtractMaskFloats( # backdrop.data[i].color, source.data[i].color # ).rgba # reset() timeIt "blendIntersectMask": for i in 0 ..< backdrop.data.len: backdrop.data[i] = blendIntersectMask(backdrop.data[i], source.data[i]) reset() # timeIt "blendIntersectMaskFloats": # for i in 0 ..< backdrop.data.len: # backdrop.data[i] = blendIntersectMaskFloats( # backdrop.data[i].color, source.data[i].color # ).rgba # reset() timeIt "blendExcludeMask": for i in 0 ..< backdrop.data.len: backdrop.data[i] = blendExcludeMask(backdrop.data[i], source.data[i]) reset() # timeIt "blendExcludeMaskFloats": # for i in 0 ..< backdrop.data.len: # backdrop.data[i] = blendExcludeMaskFloats( # backdrop.data[i].color, source.data[i].color # ).rgba # reset() timeIt "blendNormalPremultiplied": for i in 0 ..< backdrop.data.len: backdrop.data[i] = blendNormalPremultiplied(backdrop.data[i], source.data[i]) when defined(amd64) and not defined(pixieNoSimd): import nimsimd/sse2 timeIt "blendNormalPremultiplied [simd]": for i in countup(0, backdrop.data.len - 4, 4): let b = mm_loadu_si128(backdrop.data[i].addr) s = mm_loadu_si128(source.data[i].addr) mm_storeu_si128(backdrop.data[i].addr, blendNormalPremultiplied(b, s))