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.
template `*`(sample: ColorRGBX, a: uint32): array[4, uint32] =
proc `*`(sample: ColorRGBX, a: uint32): array[4, uint32] {.inline.} =
[
sample.r * a,
sample.g * a,
@ -355,22 +355,13 @@ proc blur*(image: Image, radius: float32, outOfBounds = ColorRGBX()) =
for x in 0 ..< image.width:
var values: array[4, uint32]
for xx in x - radius ..< min(x + radius, 0):
let
sample = outOfBounds
a = lookup[xx - x + radius].uint32
values += sample * a
values += outOfBounds * lookup[xx - x + radius]
for xx in max(x - radius, 0) ..< min(x + radius, image.width):
let
sample = image.getRgbaUnsafe(xx, y)
a = lookup[xx - x + radius].uint32
values += sample * a
values += image.getRgbaUnsafe(xx, y) * lookup[xx - x + radius]
for xx in max(x - radius, image.width) ..< x + radius:
let
sample = outOfBounds
a = lookup[xx - x + radius].uint32
values += sample * a
values += outOfBounds * lookup[xx - x + radius]
blurX.setRgbaUnsafe(x, y, values.rgbx())
@ -379,22 +370,13 @@ proc blur*(image: Image, radius: float32, outOfBounds = ColorRGBX()) =
for x in 0 ..< image.width:
var values: array[4, uint32]
for yy in y - radius ..< min(y + radius, 0):
let
sample = outOfBounds
a = lookup[yy - y + radius].uint32
values += sample * a
values += outOfBounds * lookup[yy - y + radius]
for yy in max(y - radius, 0) ..< min(y + radius, image.height):
let
sample = blurX.getRgbaUnsafe(x, yy)
a = lookup[yy - y + radius].uint32
values += sample * a
values += blurX.getRgbaUnsafe(x, yy) * lookup[yy - y + radius]
for yy in max(y - radius, image.height) ..< y + radius:
let
sample = outOfBounds
a = lookup[yy - y + radius].uint32
values += sample * a
values += outOfBounds * lookup[yy - y + radius]
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:
var value: uint32
for xx in x - radius ..< min(x + radius, 0):
let sample = outOfBounds
value += sample * lookup[xx - x + radius].uint32
value += outOfBounds * lookup[xx - x + radius]
for xx in max(x - radius, 0) ..< min(x + radius, mask.width):
let sample = mask.getValueUnsafe(xx, y)
value += sample * lookup[xx - x + radius].uint32
value += mask.getValueUnsafe(xx, y) * lookup[xx - x + radius]
for xx in max(x - radius, mask.width) ..< x + radius:
let sample = outOfBounds
value += sample * lookup[xx - x + radius].uint32
value += outOfBounds * lookup[xx - x + radius]
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:
var value: uint32
for yy in y - radius ..< min(y + radius, 0):
let sample = outOfBounds
value += sample * lookup[yy - y + radius].uint32
value += outOfBounds * lookup[yy - y + radius]
for yy in max(y - radius, 0) ..< min(y + radius, mask.height):
let sample = blurX.getValueUnsafe(x, yy)
value += sample * lookup[yy - y + radius].uint32
value += blurX.getValueUnsafe(x, yy) * lookup[yy - y + radius]
for yy in max(y - radius, mask.height) ..< y + radius:
let sample = outOfBounds
value += sample * lookup[yy - y + radius].uint32
value += outOfBounds * lookup[yy - y + radius]
mask.setValueUnsafe(x, y, (value div 1024 div 255).uint8)