mat -> transform
This commit is contained in:
parent
64e6db2cef
commit
ac6e6f6214
1 changed files with 24 additions and 24 deletions
|
@ -660,7 +660,7 @@ proc getRgbaSmooth*(
|
||||||
topMix
|
topMix
|
||||||
|
|
||||||
proc drawCorrect(
|
proc drawCorrect(
|
||||||
a, b: Image | Mask, mat = mat3(), tiled = false, blendMode = bmNormal
|
a, b: Image | Mask, transform = mat3(), tiled = false, blendMode = bmNormal
|
||||||
) {.raises: [PixieError].} =
|
) {.raises: [PixieError].} =
|
||||||
## Draws one image onto another using matrix with color blending.
|
## Draws one image onto another using matrix with color blending.
|
||||||
|
|
||||||
|
@ -670,11 +670,11 @@ proc drawCorrect(
|
||||||
let masker = blendMode.masker()
|
let masker = blendMode.masker()
|
||||||
|
|
||||||
var
|
var
|
||||||
matInv = mat.inverse()
|
inverseTransform = transform.inverse()
|
||||||
# Compute movement vectors
|
# Compute movement vectors
|
||||||
p = matInv * vec2(0 + h, 0 + h)
|
p = inverseTransform * vec2(0 + h, 0 + h)
|
||||||
dx = matInv * vec2(1 + h, 0 + h) - p
|
dx = inverseTransform * vec2(1 + h, 0 + h) - p
|
||||||
dy = matInv * vec2(0 + h, 1 + h) - p
|
dy = inverseTransform * vec2(0 + h, 1 + h) - p
|
||||||
filterBy2 = max(dx.length, dy.length)
|
filterBy2 = max(dx.length, dy.length)
|
||||||
b = b
|
b = b
|
||||||
|
|
||||||
|
@ -684,7 +684,7 @@ proc drawCorrect(
|
||||||
dx /= 2
|
dx /= 2
|
||||||
dy /= 2
|
dy /= 2
|
||||||
filterBy2 /= 2
|
filterBy2 /= 2
|
||||||
matInv = scale(vec2(1/2, 1/2)) * matInv
|
inverseTransform = scale(vec2(1/2, 1/2)) * inverseTransform
|
||||||
|
|
||||||
while filterBy2 <= 0.5:
|
while filterBy2 <= 0.5:
|
||||||
b = b.magnifyBy2()
|
b = b.magnifyBy2()
|
||||||
|
@ -692,12 +692,12 @@ proc drawCorrect(
|
||||||
dx *= 2
|
dx *= 2
|
||||||
dy *= 2
|
dy *= 2
|
||||||
filterBy2 *= 2
|
filterBy2 *= 2
|
||||||
matInv = scale(vec2(2, 2)) * matInv
|
inverseTransform = scale(vec2(2, 2)) * inverseTransform
|
||||||
|
|
||||||
for y in 0 ..< a.height:
|
for y in 0 ..< a.height:
|
||||||
for x in 0 ..< a.width:
|
for x in 0 ..< a.width:
|
||||||
let
|
let
|
||||||
samplePos = matInv * vec2(x.float32 + h, y.float32 + h)
|
samplePos = inverseTransform * vec2(x.float32 + h, y.float32 + h)
|
||||||
xFloat = samplePos.x - h
|
xFloat = samplePos.x - h
|
||||||
yFloat = samplePos.y - h
|
yFloat = samplePos.y - h
|
||||||
|
|
||||||
|
@ -721,14 +721,14 @@ proc drawCorrect(
|
||||||
a.setValueUnsafe(x, y, masker(backdrop, sample))
|
a.setValueUnsafe(x, y, masker(backdrop, sample))
|
||||||
|
|
||||||
proc drawUber(
|
proc drawUber(
|
||||||
a, b: Image | Mask, mat = mat3(), blendMode = bmNormal
|
a, b: Image | Mask, transform = mat3(), blendMode: BlendMode
|
||||||
) {.raises: [PixieError].} =
|
) {.raises: [PixieError].} =
|
||||||
let
|
let
|
||||||
corners = [
|
corners = [
|
||||||
mat * vec2(0, 0),
|
transform * vec2(0, 0),
|
||||||
mat * vec2(b.width.float32, 0),
|
transform * vec2(b.width.float32, 0),
|
||||||
mat * vec2(b.width.float32, b.height.float32),
|
transform * vec2(b.width.float32, b.height.float32),
|
||||||
mat * vec2(0, b.height.float32)
|
transform * vec2(0, b.height.float32)
|
||||||
]
|
]
|
||||||
perimeter = [
|
perimeter = [
|
||||||
segment(corners[0], corners[1]),
|
segment(corners[0], corners[1]),
|
||||||
|
@ -738,11 +738,11 @@ proc drawUber(
|
||||||
]
|
]
|
||||||
|
|
||||||
var
|
var
|
||||||
matInv = mat.inverse()
|
inverseTransform = transform.inverse()
|
||||||
# Compute movement vectors
|
# Compute movement vectors
|
||||||
p = matInv * vec2(0 + h, 0 + h)
|
p = inverseTransform * vec2(0 + h, 0 + h)
|
||||||
dx = matInv * vec2(1 + h, 0 + h) - p
|
dx = inverseTransform * vec2(1 + h, 0 + h) - p
|
||||||
dy = matInv * vec2(0 + h, 1 + h) - p
|
dy = inverseTransform * vec2(0 + h, 1 + h) - p
|
||||||
filterBy2 = max(dx.length, dy.length)
|
filterBy2 = max(dx.length, dy.length)
|
||||||
b = b
|
b = b
|
||||||
|
|
||||||
|
@ -763,15 +763,10 @@ proc drawUber(
|
||||||
let smooth = not(
|
let smooth = not(
|
||||||
dx.length == 1.0 and
|
dx.length == 1.0 and
|
||||||
dy.length == 1.0 and
|
dy.length == 1.0 and
|
||||||
mat[2, 0].fractional == 0.0 and
|
transform[2, 0].fractional == 0.0 and
|
||||||
mat[2, 1].fractional == 0.0
|
transform[2, 1].fractional == 0.0
|
||||||
)
|
)
|
||||||
|
|
||||||
when type(a) is Image:
|
|
||||||
let blender = blendMode.blender()
|
|
||||||
else: # a is a Mask
|
|
||||||
let masker = blendMode.masker()
|
|
||||||
|
|
||||||
# Determine where we should start and stop drawing in the y dimension
|
# Determine where we should start and stop drawing in the y dimension
|
||||||
var yMin, yMax: int
|
var yMin, yMax: int
|
||||||
if blendMode == bmMask:
|
if blendMode == bmMask:
|
||||||
|
@ -787,6 +782,11 @@ proc drawUber(
|
||||||
yMin = yMin.clamp(0, a.height)
|
yMin = yMin.clamp(0, a.height)
|
||||||
yMax = yMax.clamp(0, a.height)
|
yMax = yMax.clamp(0, a.height)
|
||||||
|
|
||||||
|
when type(a) is Image:
|
||||||
|
let blender = blendMode.blender()
|
||||||
|
else: # a is a Mask
|
||||||
|
let masker = blendMode.masker()
|
||||||
|
|
||||||
for y in yMin ..< yMax:
|
for y in yMin ..< yMax:
|
||||||
# Determine where we should start and stop drawing in the x dimension
|
# Determine where we should start and stop drawing in the x dimension
|
||||||
var
|
var
|
||||||
|
|
Loading…
Reference in a new issue