Compare commits
3 Commits
main
...
plugin-res
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2a4f81a5df | ||
|
|
0d55a99dd5 | ||
|
|
ca0831fe05 |
@@ -191,6 +191,11 @@ export type Plugin<P extends PluginTypeHelper = PluginTypeHelperDefault> = {
|
|||||||
StableDiffusionStyle[] | undefined
|
StableDiffusionStyle[] | undefined
|
||||||
>;
|
>;
|
||||||
|
|
||||||
|
/** If you want to provide a list of resolutions in pixels to choose from, you can return them via this function and they will be presented as a slider in the UI */
|
||||||
|
getStableDiffusionAllowedResolutions?: (
|
||||||
|
model?: ID
|
||||||
|
) => MaybePromise<{ width: number; height: number }[] | undefined>;
|
||||||
|
|
||||||
/** Determines the default count passed to `createStableDiffusionImages` */
|
/** Determines the default count passed to `createStableDiffusionImages` */
|
||||||
getStableDiffusionDefaultCount?: () => number | undefined;
|
getStableDiffusionDefaultCount?: () => number | undefined;
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
|
import * as ReactQuery from "@tanstack/react-query";
|
||||||
|
|
||||||
import { Generation } from "~/Generation";
|
import { Generation } from "~/Generation";
|
||||||
import { Size } from "~/Geometry";
|
import { Size } from "~/Geometry";
|
||||||
|
import { Plugin } from "~/Plugin";
|
||||||
import { Theme } from "~/Theme";
|
import { Theme } from "~/Theme";
|
||||||
|
|
||||||
export type Ratio = Size & { label?: string };
|
export type Ratio = Size & { label?: string };
|
||||||
@@ -151,8 +154,30 @@ export namespace Ratios {
|
|||||||
{ width: 4, height: 1 },
|
{ width: 4, height: 1 },
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
|
const gcd = (a: number, b: number): number => (b ? gcd(b, a % b) : a);
|
||||||
|
const simplifyAspectRatio = (width: number, height: number) => {
|
||||||
|
const divisor = gcd(width, height);
|
||||||
|
return { width: width / divisor, height: height / divisor } as Ratio;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const usePluginResolutions = (model?: ID) => {
|
||||||
|
const getStableDiffusionAllowedResolutions = Plugin.use(
|
||||||
|
({ getStableDiffusionAllowedResolutions }) =>
|
||||||
|
getStableDiffusionAllowedResolutions
|
||||||
|
);
|
||||||
|
|
||||||
|
return ReactQuery.useQuery({
|
||||||
|
enabled: !!getStableDiffusionAllowedResolutions,
|
||||||
|
|
||||||
|
queryKey: ["Generation.Image.Ratio.PluginResolutions.use"],
|
||||||
|
queryFn: async () =>
|
||||||
|
(await getStableDiffusionAllowedResolutions?.(model)) ?? [],
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
export const use = (id?: ID, fullControl = false) => {
|
export const use = (id?: ID, fullControl = false) => {
|
||||||
const { input } = Generation.Image.Input.use(id);
|
const { input } = Generation.Image.Input.use(id);
|
||||||
|
const { data: pluginResolutions } = usePluginResolutions(input?.model);
|
||||||
const bounds = Generation.Image.Size.Bounds.use(id);
|
const bounds = Generation.Image.Size.Bounds.use(id);
|
||||||
const ratios = useMemo(() => {
|
const ratios = useMemo(() => {
|
||||||
if (!input?.width || !input?.height || !bounds) return [];
|
if (!input?.width || !input?.height || !bounds) return [];
|
||||||
@@ -168,9 +193,19 @@ export namespace Ratios {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
const ratios = (fullControl ? presets : presets.slice(0, -2))
|
const ratios = pluginResolutions
|
||||||
.map(sizing)
|
? pluginResolutions.map(({ width, height }) => ({
|
||||||
.filter(({ input }) => input.width * input.height <= bounds.area.max);
|
...simplifyAspectRatio(width, height),
|
||||||
|
input: {
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
},
|
||||||
|
}))
|
||||||
|
: (fullControl ? presets : presets.slice(0, -2))
|
||||||
|
.map(sizing)
|
||||||
|
.filter(
|
||||||
|
({ input }) => input.width * input.height <= bounds.area.max
|
||||||
|
);
|
||||||
|
|
||||||
const flipped = ratios.map(({ width, height, input }) => ({
|
const flipped = ratios.map(({ width, height, input }) => ({
|
||||||
width: height,
|
width: height,
|
||||||
|
|||||||
Reference in New Issue
Block a user