Premultiply alpha when converting to Xcursor

This commit is contained in:
Quantum 2020-10-04 03:57:39 -04:00
parent b383486d67
commit b4fc7812e4
4 changed files with 16 additions and 4 deletions

View file

@ -1 +1,2 @@
numpy
Wand Wand

View file

@ -9,7 +9,7 @@ setup(
name='win2xcur', name='win2xcur',
version='0.0.3', version='0.0.3',
packages=find_packages(), packages=find_packages(),
install_requires=['Wand'], install_requires=['numpy', 'Wand'],
entry_points={ entry_points={
'console_scripts': [ 'console_scripts': [

10
win2xcur/utils.py Normal file
View file

@ -0,0 +1,10 @@
import numpy
def premultiply_alpha(source: bytes) -> bytes:
buffer = numpy.frombuffer(source, dtype=numpy.uint8).astype(numpy.double)
alpha = buffer[3::4] / 255.0
buffer[0::4] *= alpha
buffer[1::4] *= alpha
buffer[2::4] *= alpha
return buffer.astype(numpy.uint8).tobytes()

View file

@ -4,6 +4,7 @@ from typing import List
from win2xcur.cursor import CursorFrame from win2xcur.cursor import CursorFrame
from win2xcur.parser import XCursorParser from win2xcur.parser import XCursorParser
from win2xcur.utils import premultiply_alpha
def to_x11(frames: List[CursorFrame]) -> bytes: def to_x11(frames: List[CursorFrame]) -> bytes:
@ -15,7 +16,7 @@ def to_x11(frames: List[CursorFrame]) -> bytes:
header = XCursorParser.IMAGE_HEADER.pack( header = XCursorParser.IMAGE_HEADER.pack(
XCursorParser.IMAGE_HEADER.size, XCursorParser.IMAGE_HEADER.size,
XCursorParser.CHUNK_IMAGE, XCursorParser.CHUNK_IMAGE,
cursor.image.width, cursor.nominal,
1, 1,
cursor.image.width, cursor.image.width,
cursor.image.height, cursor.image.height,
@ -25,8 +26,8 @@ def to_x11(frames: List[CursorFrame]) -> bytes:
) )
chunks.append(( chunks.append((
XCursorParser.CHUNK_IMAGE, XCursorParser.CHUNK_IMAGE,
cursor.image.width, cursor.nominal,
header + bytes(cursor.image.export_pixels(channel_map='BGRA')) header + premultiply_alpha(bytes(cursor.image.export_pixels(channel_map='BGRA')))
)) ))
header = XCursorParser.FILE_HEADER.pack( header = XCursorParser.FILE_HEADER.pack(