This commit is contained in:
Steven Moder 2024-04-21 03:41:04 +08:00 committed by GitHub
commit 72e04f6d1b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 46 additions and 4 deletions

View file

@ -16,6 +16,10 @@ class CursorImage:
def __repr__(self) -> str:
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:
images: List[CursorImage]

View file

@ -7,7 +7,7 @@ from multiprocessing.pool import ThreadPool
from threading import Lock
from typing import BinaryIO
from win2xcur import scale, shadow
from win2xcur import scale, shadow, multiscale
from win2xcur.parser import open_blob
from win2xcur.writer import to_x11
@ -34,6 +34,10 @@ def main() -> None:
help='color of the shadow')
parser.add_argument('--scale', default=None, type=float,
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()
print_lock = Lock()
@ -48,7 +52,9 @@ def main() -> None:
print(f'Error occurred while processing {name}:', file=sys.stderr)
traceback.print_exc()
else:
if args.scale:
if args.multiscale:
multiscale.generates_frames(cursor=cursor, min_size=args.multiscale_min)
elif args.scale:
scale.apply_to_frames(cursor.frames, scale=args.scale)
if args.shadow:
shadow.apply_to_frames(cursor.frames, color=args.shadow_color, radius=args.shadow_radius,

32
win2xcur/multiscale.py Normal file
View file

@ -0,0 +1,32 @@
from win2xcur.cursor import CursorFrame, CursorImage
MULTSCALE = [16, 24, 32, 48, 64, 96, 128, 192, 256]
def generates_frames(cursor, min_size: int) -> None:
"""Generates multiple sizes for each cursor.
Args:
cursor (Cursor): The cursor to generate sizes for.
min_size (int): The minimum size to generate.
Returns:
List[Cursor]: The generated cursors.
"""
frames = cursor.frames
new_frames = []
image_size = frames[0].images[0].nominal
for size in MULTSCALE:
if size > image_size:
continue
if size < min_size:
break
for frame in frames:
new_images = []
for cur in frame:
new_cur = CursorImage(cur.image.clone(), cur.hotspot, cur.nominal)
new_cur.scale(size, size)
new_images.append(new_cur)
new_frame = CursorFrame(new_images, frame.delay)
new_frames.append(new_frame)
del cursor.frames[:]
cursor.frames.extend(new_frames)

View file

@ -6,7 +6,7 @@ from win2xcur.cursor import CursorFrame
def apply_to_frames(frames: List[CursorFrame], *, scale: float) -> None:
for frame in frames:
for cursor in frame:
cursor.image.scale(
cursor.scale(
int(round(cursor.image.width * scale)),
int(round(cursor.image.height) * scale),
)