Merge pull request #350 from guzba/master
simpler source position when not rotated or scaled
This commit is contained in:
commit
357dd9b26a
1 changed files with 14 additions and 28 deletions
|
@ -696,7 +696,7 @@ proc drawUber(
|
||||||
filterBy2 *= 2
|
filterBy2 *= 2
|
||||||
|
|
||||||
let
|
let
|
||||||
hasRotation = not(dx == vec2(1, 0) and dy == vec2(0, 1))
|
hasRotationOrScaling = not(dx == vec2(1, 0) and dy == vec2(0, 1))
|
||||||
smooth = not(
|
smooth = not(
|
||||||
dx.length == 1.0 and
|
dx.length == 1.0 and
|
||||||
dy.length == 1.0 and
|
dy.length == 1.0 and
|
||||||
|
@ -740,7 +740,7 @@ proc drawUber(
|
||||||
xMax = max(xMax, at.x)
|
xMax = max(xMax, at.x)
|
||||||
|
|
||||||
var xStart, xStop: int
|
var xStart, xStop: int
|
||||||
if hasRotation or smooth:
|
if hasRotationOrScaling or smooth:
|
||||||
xStart = xMin.floor.int
|
xStart = xMin.floor.int
|
||||||
xStop = xMax.ceil.int
|
xStop = xMax.ceil.int
|
||||||
else:
|
else:
|
||||||
|
@ -786,14 +786,15 @@ proc drawUber(
|
||||||
|
|
||||||
else:
|
else:
|
||||||
var x = xStart
|
var x = xStart
|
||||||
if not hasRotation:
|
if not hasRotationOrScaling:
|
||||||
|
let
|
||||||
|
srcPos = p + dx * x.float32 + dy * y.float32
|
||||||
|
sy = srcPos.y.int
|
||||||
|
var sx = srcPos.x.int
|
||||||
|
|
||||||
when type(a) is Image and type(b) is Image:
|
when type(a) is Image and type(b) is Image:
|
||||||
if blendMode in {bmNormal, bmOverwrite} and
|
if blendMode in {bmNormal, bmOverwrite} and
|
||||||
isOpaque(b.data, b.dataIndex(xStart, y), xStop - xStart):
|
isOpaque(b.data, b.dataIndex(xStart, y), xStop - xStart):
|
||||||
let
|
|
||||||
srcPos = p + dx * x.float32 + dy * y.float32
|
|
||||||
sx = srcPos.x.int
|
|
||||||
sy = srcPos.y.int
|
|
||||||
copyMem(
|
copyMem(
|
||||||
a.data[a.dataIndex(x, y)].addr,
|
a.data[a.dataIndex(x, y)].addr,
|
||||||
b.data[b.dataIndex(sx, sy)].addr,
|
b.data[b.dataIndex(sx, sy)].addr,
|
||||||
|
@ -805,10 +806,6 @@ proc drawUber(
|
||||||
case blendMode:
|
case blendMode:
|
||||||
of bmOverwrite:
|
of bmOverwrite:
|
||||||
for _ in 0 ..< (xStop - xStart) div 16:
|
for _ in 0 ..< (xStop - xStart) div 16:
|
||||||
let
|
|
||||||
srcPos = p + dx * x.float32 + dy * y.float32
|
|
||||||
sx = srcPos.x.int
|
|
||||||
sy = srcPos.y.int
|
|
||||||
when type(a) is Image:
|
when type(a) is Image:
|
||||||
when type(b) is Image:
|
when type(b) is Image:
|
||||||
for q in [0, 4, 8, 12]:
|
for q in [0, 4, 8, 12]:
|
||||||
|
@ -833,13 +830,10 @@ proc drawUber(
|
||||||
let sourceVec = mm_loadu_si128(b.data[b.dataIndex(sx, sy)].addr)
|
let sourceVec = mm_loadu_si128(b.data[b.dataIndex(sx, sy)].addr)
|
||||||
mm_storeu_si128(a.data[a.dataIndex(x, y)].addr, sourceVec)
|
mm_storeu_si128(a.data[a.dataIndex(x, y)].addr, sourceVec)
|
||||||
x += 16
|
x += 16
|
||||||
|
sx += 16
|
||||||
of bmNormal:
|
of bmNormal:
|
||||||
let vec255 = mm_set1_epi32(cast[int32](uint32.high))
|
let vec255 = mm_set1_epi32(cast[int32](uint32.high))
|
||||||
for _ in 0 ..< (xStop - xStart) div 16:
|
for _ in 0 ..< (xStop - xStart) div 16:
|
||||||
let
|
|
||||||
srcPos = p + dx * x.float32 + dy * y.float32
|
|
||||||
sx = srcPos.x.int
|
|
||||||
sy = srcPos.y.int
|
|
||||||
when type(a) is Image:
|
when type(a) is Image:
|
||||||
when type(b) is Image:
|
when type(b) is Image:
|
||||||
for q in [0, 4, 8, 12]:
|
for q in [0, 4, 8, 12]:
|
||||||
|
@ -884,13 +878,10 @@ proc drawUber(
|
||||||
maskNormalInlineSimd(backdropVec, sourceVec)
|
maskNormalInlineSimd(backdropVec, sourceVec)
|
||||||
)
|
)
|
||||||
x += 16
|
x += 16
|
||||||
|
sx += 16
|
||||||
of bmMask:
|
of bmMask:
|
||||||
let vec255 = mm_set1_epi32(cast[int32](uint32.high))
|
let vec255 = mm_set1_epi32(cast[int32](uint32.high))
|
||||||
for _ in 0 ..< (xStop - xStart) div 16:
|
for _ in 0 ..< (xStop - xStart) div 16:
|
||||||
let
|
|
||||||
srcPos = p + dx * x.float32 + dy * y.float32
|
|
||||||
sx = srcPos.x.int
|
|
||||||
sy = srcPos.y.int
|
|
||||||
when type(a) is Image:
|
when type(a) is Image:
|
||||||
when type(b) is Image:
|
when type(b) is Image:
|
||||||
for q in [0, 4, 8, 12]:
|
for q in [0, 4, 8, 12]:
|
||||||
|
@ -933,15 +924,12 @@ proc drawUber(
|
||||||
maskMaskInlineSimd(backdropVec, sourceVec)
|
maskMaskInlineSimd(backdropVec, sourceVec)
|
||||||
)
|
)
|
||||||
x += 16
|
x += 16
|
||||||
|
sx += 16
|
||||||
else:
|
else:
|
||||||
when type(a) is Image:
|
when type(a) is Image:
|
||||||
if blendMode.hasSimdBlender():
|
if blendMode.hasSimdBlender():
|
||||||
let blenderSimd = blendMode.blenderSimd()
|
let blenderSimd = blendMode.blenderSimd()
|
||||||
for _ in 0 ..< (xStop - xStart) div 16:
|
for _ in 0 ..< (xStop - xStart) div 16:
|
||||||
let
|
|
||||||
srcPos = p + dx * x.float32 + dy * y.float32
|
|
||||||
sx = srcPos.x.int
|
|
||||||
sy = srcPos.y.int
|
|
||||||
when type(b) is Image:
|
when type(b) is Image:
|
||||||
for q in [0, 4, 8, 12]:
|
for q in [0, 4, 8, 12]:
|
||||||
let
|
let
|
||||||
|
@ -964,15 +952,12 @@ proc drawUber(
|
||||||
# Shuffle 32 bits off for the next iteration
|
# Shuffle 32 bits off for the next iteration
|
||||||
values = mm_srli_si128(values, 4)
|
values = mm_srli_si128(values, 4)
|
||||||
x += 16
|
x += 16
|
||||||
|
sx += 16
|
||||||
else: # is a Mask
|
else: # is a Mask
|
||||||
if blendMode.hasSimdMasker():
|
if blendMode.hasSimdMasker():
|
||||||
let maskerSimd = blendMode.maskerSimd()
|
let maskerSimd = blendMode.maskerSimd()
|
||||||
for _ in 0 ..< (xStop - xStart) div 16:
|
for _ in 0 ..< (xStop - xStart) div 16:
|
||||||
let
|
let backdrop = mm_loadu_si128(a.data[a.dataIndex(x, y)].addr)
|
||||||
srcPos = p + dx * x.float32 + dy * y.float32
|
|
||||||
sx = srcPos.x.int
|
|
||||||
sy = srcPos.y.int
|
|
||||||
backdrop = mm_loadu_si128(a.data[a.dataIndex(x, y)].addr)
|
|
||||||
when type(b) is Image:
|
when type(b) is Image:
|
||||||
# Need to read 16 colors and pack their alpha values
|
# Need to read 16 colors and pack their alpha values
|
||||||
let
|
let
|
||||||
|
@ -989,6 +974,7 @@ proc drawUber(
|
||||||
maskerSimd(backdrop, source)
|
maskerSimd(backdrop, source)
|
||||||
)
|
)
|
||||||
x += 16
|
x += 16
|
||||||
|
sx += 16
|
||||||
|
|
||||||
var srcPos = p + dx * x.float32 + dy * y.float32
|
var srcPos = p + dx * x.float32 + dy * y.float32
|
||||||
srcPos = vec2(
|
srcPos = vec2(
|
||||||
|
|
Loading…
Reference in a new issue