Files

56 lines
2.5 KiB
Python

from ..helpers import replace_zeros, float_to_uint8, uint8_to_float
from ..blend_modes_enum import BlendModes
import torch
def binary_and(base_image: torch.Tensor, blend_image: torch.Tensor) -> torch.Tensor:
result = float_to_uint8(base_image) & float_to_uint8(blend_image)
return uint8_to_float(result)
def binary_converse(base_image: torch.Tensor, blend_image: torch.Tensor) -> torch.Tensor:
result = ~float_to_uint8(base_image) | float_to_uint8(blend_image)
return uint8_to_float(result)
def binary_implication(base_image: torch.Tensor, blend_image: torch.Tensor) -> torch.Tensor:
result = float_to_uint8(base_image) | ~float_to_uint8(blend_image)
return uint8_to_float(result)
def binary_nand(base_image: torch.Tensor, blend_image: torch.Tensor) -> torch.Tensor:
result = ~(float_to_uint8(base_image) & float_to_uint8(blend_image))
return uint8_to_float(result)
def binary_nor(base_image: torch.Tensor, blend_image: torch.Tensor) -> torch.Tensor:
result = ~(float_to_uint8(base_image) | float_to_uint8(blend_image))
return uint8_to_float(result)
def binary_not_converse(base_image: torch.Tensor, blend_image: torch.Tensor) -> torch.Tensor:
result = float_to_uint8(base_image) & ~float_to_uint8(blend_image)
return uint8_to_float(result)
def binary_not_implication(base_image: torch.Tensor, blend_image: torch.Tensor) -> torch.Tensor:
result = ~float_to_uint8(base_image) & float_to_uint8(blend_image)
return uint8_to_float(result)
def binary_or(base_image: torch.Tensor, blend_image: torch.Tensor) -> torch.Tensor:
result = float_to_uint8(base_image) | float_to_uint8(blend_image)
return uint8_to_float(result)
def binary_xnor(base_image: torch.Tensor, blend_image: torch.Tensor) -> torch.Tensor:
result = ~(float_to_uint8(base_image) ^ float_to_uint8(blend_image))
return uint8_to_float(result)
def binary_xor(base_image: torch.Tensor, blend_image: torch.Tensor) -> torch.Tensor:
result = float_to_uint8(base_image) ^ float_to_uint8(blend_image)
return uint8_to_float(result)
binary_blend_functions = {
BlendModes.BINARY_AND: binary_and,
BlendModes.BINARY_CONVERSE: binary_converse,
BlendModes.BINARY_IMPLICATION: binary_implication,
BlendModes.BINARY_NAND: binary_nand,
BlendModes.BINARY_NOR: binary_nor,
BlendModes.BINARY_NOT_CONVERSE: binary_not_converse,
BlendModes.BINARY_NOT_IMPLICATION: binary_not_implication,
BlendModes.BINARY_OR: binary_or,
BlendModes.BINARY_XNOR: binary_xnor,
BlendModes.BINARY_XOR: binary_xor,
}