nodes_upscale extracted

This commit is contained in:
Lex Darlog (DRL)
2025-07-13 14:34:39 +05:00
parent ffd787a411
commit ecb6f5f292
3 changed files with 130 additions and 100 deletions
+1
View File
@@ -3,6 +3,7 @@
"""
from .nodes_simple import *
from .nodes_upscale import *
NODE_CLASS_MAPPINGS = {
"BestResolutionFromArea": BestResolutionFromArea,
+7 -100
View File
@@ -1,6 +1,6 @@
# encoding: utf-8
"""
The actual nodes defined by the package.
Simple (aka no-upscale) versions of nodes.
"""
import typing as _t
@@ -13,8 +13,6 @@ from frozendict import deepfreeze, frozendict
from comfy.comfy_types.node_typing import IO as _IO
from .node_types import *
from .enums import *
from ._funcs import (
aspect_ratios_sorted as _aspect_ratios_sorted,
number_to_int as _number_to_int,
@@ -22,9 +20,12 @@ from ._funcs import (
simple_result_from_approx_wh as _simple_result_from_approx_wh,
upscale_result_from_approx_wh as _upscale_result_from_approx_wh
)
from .enums import *
from .node_types import *
# ----------------------------------------------------------
# Tiny optimization by reusing the same immutable dict:
# A tiny optimization by reusing the same immutable dict:
_input_types_simple = deepfreeze({
'required': {
'width': (_IO.INT, dict(type_dict_res, **{'tooltip': "Approximate width"})),
@@ -88,6 +89,7 @@ class BestResolutionSimple:
unique_id=unique_id, target_square_size=_sqrt(width * height)
)
# ----------------------------------------------------------
_tooltip_aspect = (
"Two aspects together define an aspect ratio (16:9, 4:3, etc).\n"
@@ -173,6 +175,7 @@ class BestResolutionFromAspectRatio:
unique_id=unique_id, target_square_size=_sqrt(width_f * height_f)
)
# ----------------------------------------------------------
_input_types_area = deepfreeze({
'required': {
@@ -237,99 +240,3 @@ class BestResolutionFromArea:
# show,
unique_id=unique_id, target_square_size=square_size
)
_return_types_upscale = (_IO.INT, _IO.INT, _IO.INT, _IO.INT)
_return_ttips_upscale = frozendict({
'orig_w': "Width for original image",
'orig_h': "Height for original image",
'up_w': "Width for upscaled image",
'up_h': "Height for upscaled image"
})
_return_names_upscale = tuple(_return_ttips_upscale.keys())
# __priority_type = (_IO.BOOLEAN, {
# 'default': True, 'label_on': 'upscaled', 'label_off': 'original',
# 'tooltip': (
# "Which of the resolutions is more important to be as close to the desired as possible:\n\n"
# "When ON, the rounded with/height are first calculated for the UPSCALED resolution - and "
# "only then the original ones are back-tracked from them.\n"
# "When OFF, they're first calculated for the ORIGINAL resolution - and "
# "the upscaled ones are tracked forward from them."
# )
# })
__priority_type = (
RoundingPriority.all_values(),
{
'default': RoundingPriority.DESIRED.value,
'tooltip': (
"Defines what resolution to prioritize, as well as which order to perform rounding in:\n\n"
"• desired - first, approximate resolutions are calculated for both initial and upscaled size; "
"then, both are rounded. In both cases, the rounded resolution is closest to the desired one, "
"but aspect ratio might differ the most between sizes.\n\n"
"• original - first, initial resolution is calculated and rounded; then, upscaled one is detected from it. "
"Upscaled resolution might differ the most from the desired aspect ratio, but it follows the ratio from "
"initial size as much as possible.\n\n"
"• upscaled - vice versa: first, the rounded upscaled resolution is calculated; then, the initial one "
"back-tracked from it."
)
}
)
__extra_inputs_for_upscale_only = {
'priority': __priority_type,
'upscale': (_IO.FLOAT, {
'default': 1.5, 'min': 1.0, 'max': _sys.float_info.max, 'step': 0.25, 'round': 0.001,
# 'tooltip': "", # TODO
}),
'up_step': (_IO.INT, dict(type_dict_step_upscale1, **{
'tooltip': "Same as the main `step`, but for the upscaled resolution.",
})),
}
_input_types_area_upscale = deepfreeze({
'required': dict(
(k_v for k_v in _input_types_area['required'].items() if k_v[0] != 'show'),
**__extra_inputs_for_upscale_only,
# show=_input_types_area['required']['show'],
),
'hidden': {
'unique_id': 'UNIQUE_ID',
},
# 'optional': {},
})
class BestResolutionFromAreaUpscale:
NODE_NAME = 'BestResolutionFromAreaUpscale'
CATEGORY = "utils/resolution"
DESCRIPTION = _cleandoc(__doc__)
OUTPUT_NODE = True
FUNCTION = 'main'
RETURN_TYPES = _return_types_upscale
RETURN_NAMES = _return_names_upscale
RETURN_TYPES_TOOLTIPS = _return_ttips_upscale
@classmethod
def INPUT_TYPES(cls):
return _input_types_area_upscale
def main(
self, square_size: int, step: int, landscape: bool, aspect_a: float, aspect_b: float,
priority: _t.Union[RoundingPriority, str], upscale: float, up_step:int,
# show: bool,
unique_id: str = None
):
square_size: int = _number_to_int(square_size)
width_f, height_f = _float_width_height_from_area(square_size, landscape, aspect_a, aspect_b)
return _upscale_result_from_approx_wh(
width_f, height_f, step,
priority, upscale, up_step,
# show,
unique_id=unique_id, target_square_size=square_size
)
+122
View File
@@ -0,0 +1,122 @@
# encoding: utf-8
"""
Advanced versions of nodes - with upscale.
"""
import typing as _t
from inspect import cleandoc as _cleandoc
from math import sqrt as _sqrt
import sys as _sys
from frozendict import deepfreeze, frozendict
from comfy.comfy_types.node_typing import IO as _IO
from ._funcs import (
aspect_ratios_sorted as _aspect_ratios_sorted,
number_to_int as _number_to_int,
float_width_height_from_area as _float_width_height_from_area,
simple_result_from_approx_wh as _simple_result_from_approx_wh,
upscale_result_from_approx_wh as _upscale_result_from_approx_wh
)
from .enums import *
from .node_types import *
from .nodes_simple import _input_types_area
# ----------------------------------------------------------
_return_types_upscale = (_IO.INT, _IO.INT, _IO.INT, _IO.INT)
_return_ttips_upscale = frozendict({
'orig_w': "Width for original image",
'orig_h': "Height for original image",
'up_w': "Width for upscaled image",
'up_h': "Height for upscaled image"
})
_return_names_upscale = tuple(_return_ttips_upscale.keys())
# __priority_type = (_IO.BOOLEAN, {
# 'default': True, 'label_on': 'upscaled', 'label_off': 'original',
# 'tooltip': (
# "Which of the resolutions is more important to be as close to the desired as possible:\n\n"
# "When ON, the rounded with/height are first calculated for the UPSCALED resolution - and "
# "only then the original ones are back-tracked from them.\n"
# "When OFF, they're first calculated for the ORIGINAL resolution - and "
# "the upscaled ones are tracked forward from them."
# )
# })
__priority_type = (
RoundingPriority.all_values(),
{
'default': RoundingPriority.DESIRED.value,
'tooltip': (
"Defines what resolution to prioritize, as well as which order to perform rounding in:\n\n"
"• desired - first, approximate resolutions are calculated for both initial and upscaled size; "
"then, both are rounded. In both cases, the rounded resolution is closest to the desired one, "
"but aspect ratio might differ the most between sizes.\n\n"
"• original - first, initial resolution is calculated and rounded; then, upscaled one is detected from it. "
"Upscaled resolution might differ the most from the desired aspect ratio, but it follows the ratio from "
"initial size as much as possible.\n\n"
"• upscaled - vice versa: first, the rounded upscaled resolution is calculated; then, the initial one "
"back-tracked from it."
)
}
)
__extra_inputs_for_upscale_only = {
'priority': __priority_type,
'upscale': (_IO.FLOAT, {
'default': 1.5, 'min': 1.0, 'max': _sys.float_info.max, 'step': 0.25, 'round': 0.001,
# 'tooltip': "", # TODO
}),
'up_step': (_IO.INT, dict(type_dict_step_upscale1, **{
'tooltip': "Same as the main `step`, but for the upscaled resolution.",
})),
}
_input_types_area_upscale = deepfreeze({
'required': dict(
(k_v for k_v in _input_types_area['required'].items() if k_v[0] != 'show'),
**__extra_inputs_for_upscale_only,
# show=_input_types_area['required']['show'],
),
'hidden': {
'unique_id': 'UNIQUE_ID',
},
# 'optional': {},
})
class BestResolutionFromAreaUpscale:
NODE_NAME = 'BestResolutionFromAreaUpscale'
CATEGORY = "utils/resolution"
DESCRIPTION = _cleandoc(__doc__)
OUTPUT_NODE = True
FUNCTION = 'main'
RETURN_TYPES = _return_types_upscale
RETURN_NAMES = _return_names_upscale
RETURN_TYPES_TOOLTIPS = _return_ttips_upscale
@classmethod
def INPUT_TYPES(cls):
return _input_types_area_upscale
def main(
self, square_size: int, step: int, landscape: bool, aspect_a: float, aspect_b: float,
priority: _t.Union[RoundingPriority, str], upscale: float, up_step:int,
# show: bool,
unique_id: str = None
):
square_size: int = _number_to_int(square_size)
width_f, height_f = _float_width_height_from_area(square_size, landscape, aspect_a, aspect_b)
return _upscale_result_from_approx_wh(
width_f, height_f, step,
priority, upscale, up_step,
# show,
unique_id=unique_id, target_square_size=square_size
)