This commit is contained in:
IrisRainbowNeko 2025-02-08 03:29:21 +00:00 committed by GitHub
commit 0820eda840
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 61 additions and 9 deletions

View file

@ -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)

View file

@ -32,8 +32,10 @@ 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]"')
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()
@ -49,7 +51,18 @@ 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)
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)

View file

@ -18,8 +18,10 @@ def main() -> None:
help='X11 cursor files to convert (no extension)')
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=float,
help='Scale the cursor by the specified factor.')
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]"')
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()
@ -35,7 +37,18 @@ 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)
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:

View file

@ -3,10 +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] = None,
sizes: List[int] = None) -> List[CursorFrame]:
frames_MS = []
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