From 46a7db90e0bbfa3fbed1a652a6d788a66091dd33 Mon Sep 17 00:00:00 2001 From: IrisRainbowNeko Date: Sat, 8 Feb 2025 10:51:29 +0800 Subject: [PATCH] multi scale; fix scale --- win2xcur/cursor.py | 5 +++++ win2xcur/main/win2xcur.py | 10 +++++++--- win2xcur/scale.py | 13 ++++++++++++- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/win2xcur/cursor.py b/win2xcur/cursor.py index 2925153..70227fd 100644 --- a/win2xcur/cursor.py +++ b/win2xcur/cursor.py @@ -16,6 +16,8 @@ class CursorImage: def __repr__(self) -> str: return f'CursorImage(image={self.image!r}, hotspot={self.hotspot!r}, nominal={self.nominal!r})' + def clone(self): + return CursorImage(self.image.clone(), self.hotspot, self.nominal) class CursorFrame: images: List[CursorImage] @@ -36,3 +38,6 @@ class CursorFrame: def __repr__(self) -> str: return f'CursorFrame(images={self.images!r}, delay={self.delay!r})' + + def clone(self): + return CursorFrame([img.clone() for img in self.images], self.delay) diff --git a/win2xcur/main/win2xcur.py b/win2xcur/main/win2xcur.py index 211b0cb..2ff7264 100644 --- a/win2xcur/main/win2xcur.py +++ b/win2xcur/main/win2xcur.py @@ -32,8 +32,8 @@ def main() -> None: help='y-offset of shadow (as fraction of height)') parser.add_argument('-c', '--shadow-color', default='#000000', help='color of the shadow') - parser.add_argument('--scale', default=None, type=float, - help='Scale the cursor by the specified factor.') + parser.add_argument('--scale', default=None, type=str, + help='Scale the cursor by the specified factor. Multi-scale "[0.125.0.1875,0.25]"') args = parser.parse_args() print_lock = Lock() @@ -49,7 +49,11 @@ def main() -> None: traceback.print_exc() else: if args.scale: - scale.apply_to_frames(cursor.frames, scale=args.scale) + scales = eval(args.scale) + if isinstance(scales, (int, float)): + scale.apply_to_frames(cursor.frames, scale=scales) + else: + cursor.frames = scale.apply_to_frames_MS(cursor.frames, scales=scales) if args.shadow: shadow.apply_to_frames(cursor.frames, color=args.shadow_color, radius=args.shadow_radius, sigma=args.shadow_sigma, xoffset=args.shadow_x, yoffset=args.shadow_y) diff --git a/win2xcur/scale.py b/win2xcur/scale.py index b25793e..95cf68c 100644 --- a/win2xcur/scale.py +++ b/win2xcur/scale.py @@ -8,5 +8,16 @@ def apply_to_frames(frames: List[CursorFrame], *, scale: float) -> None: for cursor in frame: cursor.image.scale( int(round(cursor.image.width * scale)), - int(round(cursor.image.height) * scale), + int(round(cursor.image.height * scale)), ) + cursor.nominal = int(cursor.nominal * scale) + hx, hy = cursor.hotspot + cursor.hotspot = (int(hx * scale), int(hy * scale)) + +def apply_to_frames_MS(frames: List[CursorFrame], *, scales: List[float]) -> List[CursorFrame]: + frames_MS = [] + for scale in scales: + frames_s = [frame.clone() for frame in frames] + apply_to_frames(frames_s, scale=scale) + frames_MS.extend(frames_s) + return frames_MS \ No newline at end of file