-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathnode_scale.py
More file actions
79 lines (66 loc) · 2.18 KB
/
node_scale.py
File metadata and controls
79 lines (66 loc) · 2.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# encoding: utf-8
"""
"""
import typing as _t
from inspect import cleandoc as _cleandoc
from math import sqrt as _sqrt
from frozendict import deepfreeze as _deepfreeze
from comfy.comfy_types.node_typing import IO as _IO
from ._funcs import simple_result_from_approx_wh as _simple_result_from_approx_wh
from . import _meta
from .docstring_formatter import format_docstring as _format_docstring
from .slot_types import (
type_dict_res as _type_dict_res,
type_dict_step_default as _type_dict_step_default,
upscale_in_type as _upscale_in_type
)
_return_types = (_IO.INT, _IO.INT, _IO.FLOAT)
_return_names = ('width', 'height', 'scale')
_scale_type_dict = {k: v for k, v in _upscale_in_type[1].items() if k != 'tooltip'}
_scale_type_dict['min'] = 0.001
_input_types = _deepfreeze({
'required': {
'width': (_IO.INT, _type_dict_res),
'height': (_IO.INT, _type_dict_res),
'step': (_IO.INT, _type_dict_step_default),
'scale': (_IO.FLOAT, _scale_type_dict),
'direction': (_IO.BOOLEAN, {'default': True, 'label_on': 'res * scale', 'label_off': 'res / scale', 'tooltip': (
"Sometimes it's easier to specify scale by it's inverse: how much to scale DOWN by. This toggle controls that."
)}),
},
'hidden': {
'unique_id': 'UNIQUE_ID', # used for text display at the bottom of the node
},
})
class BestResolutionScale:
"""
Scale width and height by the same value + round them.
"""
NODE_NAME = 'BestResolutionScale'
CATEGORY = _meta.category
DESCRIPTION = _format_docstring(_cleandoc(__doc__))
OUTPUT_NODE = True
FUNCTION = 'main'
RETURN_TYPES = _return_types
RETURN_NAMES = _return_names
@classmethod
def INPUT_TYPES(cls):
return _input_types
@staticmethod
def main(
width: int, height: int, step: int, scale: float, direction: bool,
# show: bool,
unique_id: str = None
) -> _t.Tuple[int, int, float]:
scale = float(scale)
if not direction:
scale = 1.0 / scale
width_f = scale * width
height_f = scale * height
out_width, out_height = _simple_result_from_approx_wh(
width_f, height_f, step,
# show,
unique_id=unique_id, target_square_size=_sqrt(width_f * height_f),
status_suffix=f"\n({width}/{height}) * {scale:.3f} scale"
)
return out_width, out_height, scale