Spaces:
Running
on
Zero
Running
on
Zero
from __future__ import annotations | |
from enum import Enum | |
from typing import NamedTuple, TYPE_CHECKING | |
# Enum used to specify how the second stage aggregation is performed | |
# for 2-stage antialiased lines. | |
class AntialiasCombination(Enum): | |
SUM_1AGG = 1 | |
SUM_2AGG = 2 | |
MIN = 3 | |
MAX = 4 | |
FIRST = 5 | |
LAST = 6 | |
class AntialiasStage2(NamedTuple): | |
"""Configuration for second-stage combination of a single antialiased reduction.""" | |
combination: AntialiasCombination | |
zero: float | |
n_reduction: bool = False | |
categorical: bool = False | |
if TYPE_CHECKING: | |
UnzippedAntialiasStage2 = \ | |
tuple[tuple[AntialiasCombination], tuple[float], tuple[bool], tuple[bool]] | |
def two_stage_agg(antialias_stage_2: UnzippedAntialiasStage2 | None): | |
"""Information used to perform the correct stage 2 aggregation.""" | |
if not antialias_stage_2: | |
# Not using antialiased lines, doesn't matter what is returned. | |
return False, False | |
aa_combinations = antialias_stage_2[0] | |
# A single combination in (SUM_2AGG, FIRST, LAST, MIN) means that a 2-stage | |
# aggregation will be used, otherwise use a 1-stage aggregation that is | |
# faster. | |
use_2_stage_agg = False | |
for comb in aa_combinations: | |
if comb in (AntialiasCombination.SUM_2AGG, AntialiasCombination.MIN, | |
AntialiasCombination.FIRST, AntialiasCombination.LAST): | |
use_2_stage_agg = True | |
break | |
# Boolean overwrite flag is used in _full_antialias() is True to overwrite | |
# pixel values (using max of previous and new values) or False for the more | |
# complicated correction algorithm. Prefer overwrite=True for speed, but | |
# any SUM_1AGG implies overwrite=False. | |
overwrite = True | |
for comb in aa_combinations: | |
if comb == AntialiasCombination.SUM_1AGG: | |
overwrite = False | |
break | |
return overwrite, use_2_stage_agg | |