feat: multiscale

This commit is contained in:
Steven Moder 2024-04-11 19:52:21 +08:00
parent 8e71037f5f
commit 79710d8591
4 changed files with 14 additions and 4 deletions

View file

@ -51,4 +51,4 @@ For example, if you want to convert DMZ-White to Windows:
are using unconventional distros (e.g. Alpine) and are getting errors related are using unconventional distros (e.g. Alpine) and are getting errors related
to `wand`, please see the [Wand documentation on installation][wand-install]. to `wand`, please see the [Wand documentation on installation][wand-install].
[wand-install]: https://docs.wand-py.org/en/0.6.7/guide/install.html [wand-install]: https://docs.wand-py.org/en/0.6.7/guide/install.html

View file

@ -16,6 +16,10 @@ class CursorImage:
def __repr__(self) -> str: def __repr__(self) -> str:
return f'CursorImage(image={self.image!r}, hotspot={self.hotspot!r}, nominal={self.nominal!r})' return f'CursorImage(image={self.image!r}, hotspot={self.hotspot!r}, nominal={self.nominal!r})'
def scale(self, width: int, height: int) -> None:
self.image.scale(width, height)
self.nominal = max(width, height)
class CursorFrame: class CursorFrame:
images: List[CursorImage] images: List[CursorImage]

View file

@ -7,7 +7,7 @@ from multiprocessing.pool import ThreadPool
from threading import Lock from threading import Lock
from typing import BinaryIO from typing import BinaryIO
from win2xcur import scale, shadow from win2xcur import scale, shadow, multiscale
from win2xcur.parser import open_blob from win2xcur.parser import open_blob
from win2xcur.writer import to_x11 from win2xcur.writer import to_x11
@ -34,6 +34,10 @@ def main() -> None:
help='color of the shadow') help='color of the shadow')
parser.add_argument('--scale', default=None, type=float, parser.add_argument('--scale', default=None, type=float,
help='Scale the cursor by the specified factor.') help='Scale the cursor by the specified factor.')
parser.add_argument('--multiscale', action='store_true',
help='Generate multiple sizes for each cursor.')
parser.add_argument('--multiscale-min', type=int, default=12,
help='Minimum size to generate.')
args = parser.parse_args() args = parser.parse_args()
print_lock = Lock() print_lock = Lock()
@ -48,7 +52,9 @@ def main() -> None:
print(f'Error occurred while processing {name}:', file=sys.stderr) print(f'Error occurred while processing {name}:', file=sys.stderr)
traceback.print_exc() traceback.print_exc()
else: else:
if args.scale: if args.multiscale:
multisize.generates_frames(cursor=cursor, min_size=args.multiscale_min)
elif args.scale:
scale.apply_to_frames(cursor.frames, scale=args.scale) scale.apply_to_frames(cursor.frames, scale=args.scale)
if args.shadow: if args.shadow:
shadow.apply_to_frames(cursor.frames, color=args.shadow_color, radius=args.shadow_radius, shadow.apply_to_frames(cursor.frames, color=args.shadow_color, radius=args.shadow_radius,

View file

@ -6,7 +6,7 @@ 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:
for frame in frames: for frame in frames:
for cursor in frame: for cursor in frame:
cursor.image.scale( cursor.scale(
int(round(cursor.image.width * scale)), int(round(cursor.image.width * scale)),
int(round(cursor.image.height) * scale), int(round(cursor.image.height) * scale),
) )