Commit d4fd2418 authored by AUTOMATIC's avatar AUTOMATIC
Browse files

add an option to use old hiresfix width/height behavior

add a visual effect to inactive hires fix elements
parent 8850fc23
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line

function setInactive(elem, inactive){
    console.log(elem)
    if(inactive){
        elem.classList.add('inactive')
    } else{
        elem.classList.remove('inactive')
    }
}

function onCalcResolutionHires(enable, width, height, hr_scale, hr_resize_x, hr_resize_y){
    console.log(enable, width, height, hr_scale, hr_resize_x, hr_resize_y)

    hrUpscaleBy = gradioApp().getElementById('txt2img_hr_scale')
    hrResizeX = gradioApp().getElementById('txt2img_hr_resize_x')
    hrResizeY = gradioApp().getElementById('txt2img_hr_resize_y')

    gradioApp().getElementById('txt2img_hires_fix_row2').style.display = opts.use_old_hires_fix_width_height ? "none" : ""

    setInactive(hrUpscaleBy, opts.use_old_hires_fix_width_height || hr_resize_x > 0 || hr_resize_y > 0)
    setInactive(hrResizeX, opts.use_old_hires_fix_width_height || hr_resize_x == 0)
    setInactive(hrResizeY, opts.use_old_hires_fix_width_height || hr_resize_y == 0)

    return [enable, width, height, hr_scale, hr_resize_x, hr_resize_y]
}
+11 −6
Original line number Diff line number Diff line
@@ -197,6 +197,15 @@ def restore_old_hires_fix_params(res):
    firstpass_width = res.get('First pass size-1', None)
    firstpass_height = res.get('First pass size-2', None)

    if shared.opts.use_old_hires_fix_width_height:
        hires_width = int(res.get("Hires resize-1", None))
        hires_height = int(res.get("Hires resize-2", None))

        if hires_width is not None and hires_height is not None:
            res['Size-1'] = hires_width
            res['Size-2'] = hires_height
            return

    if firstpass_width is None or firstpass_height is None:
        return

@@ -205,12 +214,8 @@ def restore_old_hires_fix_params(res):
    height = int(res.get("Size-2", 512))

    if firstpass_width == 0 or firstpass_height == 0:
        # old algorithm for auto-calculating first pass size
        desired_pixel_count = 512 * 512
        actual_pixel_count = width * height
        scale = math.sqrt(desired_pixel_count / actual_pixel_count)
        firstpass_width = math.ceil(scale * width / 64) * 64
        firstpass_height = math.ceil(scale * height / 64) * 64
        from modules import processing
        firstpass_width, firstpass_height = processing.old_hires_fix_first_pass_dimensions(width, height)

    res['Size-1'] = firstpass_width
    res['Size-2'] = firstpass_height
+24 −2
Original line number Diff line number Diff line
@@ -687,6 +687,18 @@ def process_images_inner(p: StableDiffusionProcessing) -> Processed:
    return res


def old_hires_fix_first_pass_dimensions(width, height):
    """old algorithm for auto-calculating first pass size"""

    desired_pixel_count = 512 * 512
    actual_pixel_count = width * height
    scale = math.sqrt(desired_pixel_count / actual_pixel_count)
    width = math.ceil(scale * width / 64) * 64
    height = math.ceil(scale * height / 64) * 64

    return width, height


class StableDiffusionProcessingTxt2Img(StableDiffusionProcessing):
    sampler = None

@@ -703,16 +715,26 @@ class StableDiffusionProcessingTxt2Img(StableDiffusionProcessing):
        self.hr_upscale_to_y = hr_resize_y

        if firstphase_width != 0 or firstphase_height != 0:
            print("firstphase_width/firstphase_height no longer supported; use hr_scale", file=sys.stderr)
            self.hr_scale = self.width / firstphase_width
            self.hr_upscale_to_x = self.width
            self.hr_upscale_to_y = self.height
            self.width = firstphase_width
            self.height = firstphase_height

        self.truncate_x = 0
        self.truncate_y = 0
        self.applied_old_hires_behavior_to = None

    def init(self, all_prompts, all_seeds, all_subseeds):
        if self.enable_hr:
            if opts.use_old_hires_fix_width_height and self.applied_old_hires_behavior_to != (self.width, self.height):
                self.hr_resize_x = self.width
                self.hr_resize_y = self.height
                self.hr_upscale_to_x = self.width
                self.hr_upscale_to_y = self.height

                self.width, self.height = old_hires_fix_first_pass_dimensions(self.width, self.height)
                self.applied_old_hires_behavior_to = (self.width, self.height)

            if self.hr_resize_x == 0 and self.hr_resize_y == 0:
                self.extra_generation_params["Hires upscale"] = self.hr_scale
                self.hr_upscale_to_x = int(self.width * self.hr_scale)
+1 −0
Original line number Diff line number Diff line
@@ -398,6 +398,7 @@ options_templates.update(options_section(('sd', "Stable Diffusion"), {
options_templates.update(options_section(('compatibility', "Compatibility"), {
    "use_old_emphasis_implementation": OptionInfo(False, "Use old emphasis implementation. Can be useful to reproduce old seeds."),
    "use_old_karras_scheduler_sigmas": OptionInfo(False, "Use old karras scheduler sigmas (0.1 to 10)."),
    "use_old_hires_fix_width_height": OptionInfo(False, "For hires fix, use width/height sliders to set final resolution rather than first pass (disables Upscale by, Resize width/height to)."),
}))

options_templates.update(options_section(('interrogate', "Interrogate Options"), {
+14 −9
Original line number Diff line number Diff line
@@ -267,7 +267,7 @@ def calc_resolution_hires(enable, width, height, hr_scale, hr_resize_x, hr_resiz
    with devices.autocast():
        p.init([""], [0], [0])

    return f"resize: from <span class='resolution'>{width}x{height}</span> to <span class='resolution'>{p.hr_upscale_to_x}x{p.hr_upscale_to_y}</span>"
    return f"resize: from <span class='resolution'>{p.width}x{p.height}</span> to <span class='resolution'>{p.hr_resize_x or p.hr_upscale_to_x}x{p.hr_resize_y or p.hr_upscale_to_y}</span>"


def apply_styles(prompt, prompt_neg, style1_name, style2_name):
@@ -745,15 +745,20 @@ def create_ui():
                            custom_inputs = modules.scripts.scripts_txt2img.setup_ui()

            hr_resolution_preview_inputs = [enable_hr, width, height, hr_scale, hr_resize_x, hr_resize_y]
            hr_resolution_preview_args = dict(
            for input in hr_resolution_preview_inputs:
                input.change(
                    fn=calc_resolution_hires,
                    inputs=hr_resolution_preview_inputs,
                    outputs=[hr_final_resolution],
                show_progress=False
                    show_progress=False,
                )
                input.change(
                    None,
                    _js="onCalcResolutionHires",
                    inputs=hr_resolution_preview_inputs,
                    outputs=[],
                    show_progress=False,
                )

            for input in hr_resolution_preview_inputs:
                input.change(**hr_resolution_preview_args)

            txt2img_gallery, generation_info, html_info, html_log = create_output_panel("txt2img", opts.outdir_txt2img_samples)
            parameters_copypaste.bind_buttons({"txt2img": txt2img_paste}, None, txt2img_prompt)
Loading