54 lines
2.5 KiB
Python
54 lines
2.5 KiB
Python
from ..helpers import replace_zeros
|
|
from ..blend_modes_enum import BlendModes
|
|
import torch
|
|
|
|
def darken_burn(base_image: torch.Tensor, blend_image: torch.Tensor) -> torch.Tensor:
|
|
safe_base_image = replace_zeros(base_image)
|
|
result = 1 - (1 - blend_image) / safe_base_image
|
|
return torch.clamp(result, 0.0, 1.0)
|
|
|
|
def darken_darken(base_image: torch.Tensor, blend_image: torch.Tensor) -> torch.Tensor:
|
|
result = torch.min(base_image, blend_image)
|
|
return torch.clamp(result, 0.0, 1.0)
|
|
|
|
def darken_darker_color(base_image: torch.Tensor, blend_image: torch.Tensor) -> torch.Tensor:
|
|
base_sum = torch.sum(base_image, dim=-1, keepdim=True)
|
|
blend_sum = torch.sum(blend_image, dim=-1, keepdim=True)
|
|
return torch.where(base_sum < blend_sum, base_image, blend_image)
|
|
|
|
def darken_easy_burn(base_image: torch.Tensor, blend_image: torch.Tensor) -> torch.Tensor:
|
|
inverted_base_image = 1.0 - base_image
|
|
safe_inverted_base_image = replace_zeros(inverted_base_image)
|
|
result = 1.0 - torch.pow(safe_inverted_base_image, blend_image * (15 / 13))
|
|
return torch.clamp(result, 0.0, 1.0)
|
|
|
|
def darken_fog_darken(base_image: torch.Tensor, blend_image: torch.Tensor) -> torch.Tensor:
|
|
result_low = (1 - base_image) * base_image + base_image * blend_image
|
|
result_high = base_image * blend_image + base_image - torch.pow(base_image, 2)
|
|
result = torch.where(base_image < 0.5, result_low, result_high)
|
|
return torch.clamp(result, 0.0, 1.0)
|
|
|
|
def darken_gamma_dark(base_image: torch.Tensor, blend_image: torch.Tensor) -> torch.Tensor:
|
|
safe_base_image =replace_zeros(base_image)
|
|
result = torch.pow(blend_image, 1.0 / safe_base_image)
|
|
result = torch.where(base_image == 0.0, torch.zeros_like(result), result)
|
|
return torch.clamp(result, 0.0, 1.0)
|
|
|
|
def darken_linear_burn(base_image: torch.Tensor, blend_image: torch.Tensor) -> torch.Tensor:
|
|
result = base_image + blend_image - 1
|
|
return torch.clamp(result, 0.0, 1.0)
|
|
|
|
def darken_shade(base_image: torch.Tensor, blend_image: torch.Tensor) -> torch.Tensor:
|
|
result = 1.0 - ((1.0 - blend_image) * base_image + torch.sqrt(1.0 - base_image))
|
|
return torch.clamp(result, 0.0, 1.0)
|
|
|
|
darken_blend_functions = {
|
|
BlendModes.DARKEN_BURN: darken_burn,
|
|
BlendModes.DARKEN_DARKEN: darken_darken,
|
|
BlendModes.DARKEN_DARKER_COLOR: darken_darker_color,
|
|
BlendModes.DARKEN_EASY_BURN: darken_easy_burn,
|
|
BlendModes.DARKEN_FOG_DARKEN: darken_fog_darken,
|
|
BlendModes.DARKEN_GAMMA_DARK: darken_gamma_dark,
|
|
BlendModes.DARKEN_LINEAR_BURN: darken_linear_burn,
|
|
BlendModes.DARKEN_SHADE: darken_shade,
|
|
} |