This commit is contained in:
Ryan Oldenburg 2021-12-12 00:28:17 -06:00
parent 720e5ae019
commit 790146e553

View file

@ -1394,25 +1394,29 @@ proc fillCoverage(
x += 16 x += 16
proc applyCoverage(rgbx: ColorRGBX, coverage: uint8): ColorRGBX {.inline.} =
if coverage != 255:
result.r = ((rgbx.r.uint32 * coverage) div 255).uint8
result.g = ((rgbx.g.uint32 * coverage) div 255).uint8
result.b = ((rgbx.b.uint32 * coverage) div 255).uint8
result.a = ((rgbx.a.uint32 * coverage) div 255).uint8
else:
result = rgbx
let blender = blendMode.blender() let blender = blendMode.blender()
while x < startX + coverages.len: for x in x ..< startX + coverages.len:
let coverage = coverages[x - startX] let coverage = coverages[x - startX]
if coverage != 0 or blendMode == bmExcludeMask: if coverage != 0 or blendMode == bmExcludeMask:
if blendMode == bmNormal and coverage == 255 and rgbx.a == 255: if blendMode == bmNormal and coverage == 255 and rgbx.a == 255:
# Skip blending # Skip blending
image.unsafe[x, y] = rgbx image.unsafe[x, y] = rgbx
else: else:
var source = rgbx let
if coverage != 255: source = rgbx.applyCoverage(coverage)
source.r = ((source.r.uint32 * coverage) div 255).uint8 backdrop = image.unsafe[x, y]
source.g = ((source.g.uint32 * coverage) div 255).uint8
source.b = ((source.b.uint32 * coverage) div 255).uint8
source.a = ((source.a.uint32 * coverage) div 255).uint8
let backdrop = image.unsafe[x, y]
image.unsafe[x, y] = blender(backdrop, source) image.unsafe[x, y] = blender(backdrop, source)
elif blendMode == bmMask: elif blendMode == bmMask:
image.unsafe[x, y] = rgbx(0, 0, 0, 0) image.unsafe[x, y] = rgbx(0, 0, 0, 0)
inc x
if blendMode == bmMask: if blendMode == bmMask:
image.clearUnsafe(0, y, startX, y) image.clearUnsafe(0, y, startX, y)
@ -1446,14 +1450,13 @@ proc fillCoverage(
x += 16 x += 16
let masker = blendMode.masker() let masker = blendMode.masker()
while x < startX + coverages.len: for x in x ..< startX + coverages.len:
let coverage = coverages[x - startX] let coverage = coverages[x - startX]
if coverage != 0 or blendMode == bmExcludeMask: if coverage != 0 or blendMode == bmExcludeMask:
let backdrop = mask.unsafe[x, y] let backdrop = mask.unsafe[x, y]
mask.unsafe[x, y] = masker(backdrop, coverage) mask.unsafe[x, y] = masker(backdrop, coverage)
elif blendMode == bmMask: elif blendMode == bmMask:
mask.unsafe[x, y] = 0 mask.unsafe[x, y] = 0
inc x
if blendMode == bmMask: if blendMode == bmMask:
mask.clearUnsafe(0, y, startX, y) mask.clearUnsafe(0, y, startX, y)