This commit is contained in:
Ryan Oldenburg 2021-02-26 19:21:44 -06:00
parent 004182a122
commit 01b353f903
2 changed files with 13 additions and 37 deletions

View file

@ -327,7 +327,7 @@ proc blur*(image: Image, radius: float32, outOfBounds = ColorRGBX()) =
# TODO support offBounds for images. # TODO support offBounds for images.
template `*`(sample: ColorRGBX, a: uint32): array[4, uint32] = proc `*`(sample: ColorRGBX, a: uint32): array[4, uint32] {.inline.} =
[ [
sample.r * a, sample.r * a,
sample.g * a, sample.g * a,
@ -355,22 +355,13 @@ proc blur*(image: Image, radius: float32, outOfBounds = ColorRGBX()) =
for x in 0 ..< image.width: for x in 0 ..< image.width:
var values: array[4, uint32] var values: array[4, uint32]
for xx in x - radius ..< min(x + radius, 0): for xx in x - radius ..< min(x + radius, 0):
let values += outOfBounds * lookup[xx - x + radius]
sample = outOfBounds
a = lookup[xx - x + radius].uint32
values += sample * a
for xx in max(x - radius, 0) ..< min(x + radius, image.width): for xx in max(x - radius, 0) ..< min(x + radius, image.width):
let values += image.getRgbaUnsafe(xx, y) * lookup[xx - x + radius]
sample = image.getRgbaUnsafe(xx, y)
a = lookup[xx - x + radius].uint32
values += sample * a
for xx in max(x - radius, image.width) ..< x + radius: for xx in max(x - radius, image.width) ..< x + radius:
let values += outOfBounds * lookup[xx - x + radius]
sample = outOfBounds
a = lookup[xx - x + radius].uint32
values += sample * a
blurX.setRgbaUnsafe(x, y, values.rgbx()) blurX.setRgbaUnsafe(x, y, values.rgbx())
@ -379,22 +370,13 @@ proc blur*(image: Image, radius: float32, outOfBounds = ColorRGBX()) =
for x in 0 ..< image.width: for x in 0 ..< image.width:
var values: array[4, uint32] var values: array[4, uint32]
for yy in y - radius ..< min(y + radius, 0): for yy in y - radius ..< min(y + radius, 0):
let values += outOfBounds * lookup[yy - y + radius]
sample = outOfBounds
a = lookup[yy - y + radius].uint32
values += sample * a
for yy in max(y - radius, 0) ..< min(y + radius, image.height): for yy in max(y - radius, 0) ..< min(y + radius, image.height):
let values += blurX.getRgbaUnsafe(x, yy) * lookup[yy - y + radius]
sample = blurX.getRgbaUnsafe(x, yy)
a = lookup[yy - y + radius].uint32
values += sample * a
for yy in max(y - radius, image.height) ..< y + radius: for yy in max(y - radius, image.height) ..< y + radius:
let values += outOfBounds * lookup[yy - y + radius]
sample = outOfBounds
a = lookup[yy - y + radius].uint32
values += sample * a
image.setRgbaUnsafe(x, y, values.rgbx()) image.setRgbaUnsafe(x, y, values.rgbx())

View file

@ -168,16 +168,13 @@ proc blur*(mask: Mask, radius: float32, outOfBounds: uint8 = 0) =
for x in 0 ..< mask.width: for x in 0 ..< mask.width:
var value: uint32 var value: uint32
for xx in x - radius ..< min(x + radius, 0): for xx in x - radius ..< min(x + radius, 0):
let sample = outOfBounds value += outOfBounds * lookup[xx - x + radius]
value += sample * lookup[xx - x + radius].uint32
for xx in max(x - radius, 0) ..< min(x + radius, mask.width): for xx in max(x - radius, 0) ..< min(x + radius, mask.width):
let sample = mask.getValueUnsafe(xx, y) value += mask.getValueUnsafe(xx, y) * lookup[xx - x + radius]
value += sample * lookup[xx - x + radius].uint32
for xx in max(x - radius, mask.width) ..< x + radius: for xx in max(x - radius, mask.width) ..< x + radius:
let sample = outOfBounds value += outOfBounds * lookup[xx - x + radius]
value += sample * lookup[xx - x + radius].uint32
blurX.setValueUnsafe(x, y, (value div 1024 div 255).uint8) blurX.setValueUnsafe(x, y, (value div 1024 div 255).uint8)
@ -186,16 +183,13 @@ proc blur*(mask: Mask, radius: float32, outOfBounds: uint8 = 0) =
for x in 0 ..< mask.width: for x in 0 ..< mask.width:
var value: uint32 var value: uint32
for yy in y - radius ..< min(y + radius, 0): for yy in y - radius ..< min(y + radius, 0):
let sample = outOfBounds value += outOfBounds * lookup[yy - y + radius]
value += sample * lookup[yy - y + radius].uint32
for yy in max(y - radius, 0) ..< min(y + radius, mask.height): for yy in max(y - radius, 0) ..< min(y + radius, mask.height):
let sample = blurX.getValueUnsafe(x, yy) value += blurX.getValueUnsafe(x, yy) * lookup[yy - y + radius]
value += sample * lookup[yy - y + radius].uint32
for yy in max(y - radius, mask.height) ..< y + radius: for yy in max(y - radius, mask.height) ..< y + radius:
let sample = outOfBounds value += outOfBounds * lookup[yy - y + radius]
value += sample * lookup[yy - y + radius].uint32
mask.setValueUnsafe(x, y, (value div 1024 div 255).uint8) mask.setValueUnsafe(x, y, (value div 1024 div 255).uint8)