diff --git a/win2xcur/main/win2xcur.py b/win2xcur/main/win2xcur.py index 2ff7264..ad570e0 100644 --- a/win2xcur/main/win2xcur.py +++ b/win2xcur/main/win2xcur.py @@ -33,7 +33,9 @@ def main() -> None: parser.add_argument('-c', '--shadow-color', default='#000000', help='color of the shadow') parser.add_argument('--scale', default=None, type=str, - help='Scale the cursor by the specified factor. Multi-scale "[0.125.0.1875,0.25]"') + help='Scale the cursor by the specified factor. Multi-scale "[0.125,0.1875,0.25]"') + parser.add_argument('--size', default=None, type=str, + help='Scale the cursor to the specified size. Multi-size "[32,28,64]"') args = parser.parse_args() print_lock = Lock() @@ -54,6 +56,13 @@ def main() -> None: scale.apply_to_frames(cursor.frames, scale=scales) else: cursor.frames = scale.apply_to_frames_MS(cursor.frames, scales=scales) + elif args.size: + sizes = eval(args.size) + if isinstance(sizes, (int, float)): + scale.apply_to_frames(cursor.frames, size=sizes) + else: + cursor.frames = scale.apply_to_frames_MS(cursor.frames, sizes=sizes) + 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/main/x2wincur.py b/win2xcur/main/x2wincur.py index 311cc2e..298a9d6 100644 --- a/win2xcur/main/x2wincur.py +++ b/win2xcur/main/x2wincur.py @@ -19,7 +19,9 @@ def main() -> None: parser.add_argument('-o', '--output', '--output-dir', default=os.curdir, help='Directory to store converted cursor files.') parser.add_argument('-S', '--scale', default=None, type=str, - help='Scale the cursor by the specified factor. Multi-scale "[0.125.0.1875,0.25]"') + help='Scale the cursor by the specified factor. Multi-scale "[0.125,0.1875,0.25]"') + parser.add_argument('--size', default=None, type=str, + help='Scale the cursor to the specified size. Multi-size "[32,28,64]"') args = parser.parse_args() print_lock = Lock() @@ -40,6 +42,13 @@ def main() -> None: scale.apply_to_frames(cursor.frames, scale=scales) else: cursor.frames = scale.apply_to_frames_MS(cursor.frames, scales=scales) + elif args.size: + sizes = eval(args.size) + if isinstance(sizes, (int, float)): + scale.apply_to_frames(cursor.frames, size=sizes) + else: + cursor.frames = scale.apply_to_frames_MS(cursor.frames, sizes=sizes) + ext, result = to_smart(cursor.frames) output = os.path.join(args.output, os.path.basename(name) + ext) with open(output, 'wb') as f: diff --git a/win2xcur/scale.py b/win2xcur/scale.py index 95cf68c..337bd04 100644 --- a/win2xcur/scale.py +++ b/win2xcur/scale.py @@ -3,21 +3,31 @@ from typing import List from win2xcur.cursor import CursorFrame -def apply_to_frames(frames: List[CursorFrame], *, scale: float) -> None: +def apply_to_frames(frames: List[CursorFrame], *, scale: float = None, size: int = None) -> None: for frame in frames: for cursor in frame: + if size: + scale = size / cursor.image.width cursor.image.scale( - int(round(cursor.image.width * scale)), - int(round(cursor.image.height * scale)), + size or int(round(cursor.image.width * scale)), + size or 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]: + +def apply_to_frames_MS(frames: List[CursorFrame], *, scales: List[float] = None, + sizes: List[int] = None) -> 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 + if scales is not None: + for scale in scales: + frames_s = [frame.clone() for frame in frames] + apply_to_frames(frames_s, scale=scale) + frames_MS.extend(frames_s) + else: + for size in sizes: + frames_s = [frame.clone() for frame in frames] + apply_to_frames(frames_s, size=size) + frames_MS.extend(frames_s) + return frames_MS