ui/cocoa: Fix stride resolution of pixman image

A display can receive an image which its stride is greater than its
width. In fact, when a guest requests virtio-gpu to scan out a
smaller part of an image, virtio-gpu passes it to a display as an
image which its width represents the one of the part and its stride
equals to the one of the whole image.

This change makes ui/cocoa to cover such cases.

Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com>
Message-Id: <20210222144012.21486-1-akihiko.odaki@gmail.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
Akihiko Odaki 2021-02-22 23:40:12 +09:00 committed by Gerd Hoffmann
parent 8eb13bbbac
commit d9c32b8f7f
1 changed files with 4 additions and 4 deletions

View File

@ -450,19 +450,19 @@ QemuCocoaView *cocoaView;
int w = pixman_image_get_width(pixman_image);
int h = pixman_image_get_height(pixman_image);
int bitsPerPixel = PIXMAN_FORMAT_BPP(pixman_image_get_format(pixman_image));
int bitsPerComponent = DIV_ROUND_UP(bitsPerPixel, 8) * 2;
int stride = pixman_image_get_stride(pixman_image);
CGDataProviderRef dataProviderRef = CGDataProviderCreateWithData(
NULL,
pixman_image_get_data(pixman_image),
w * 4 * h,
stride * h,
NULL
);
CGImageRef imageRef = CGImageCreate(
w, //width
h, //height
bitsPerComponent, //bitsPerComponent
DIV_ROUND_UP(bitsPerPixel, 8) * 2, //bitsPerComponent
bitsPerPixel, //bitsPerPixel
(w * (bitsPerComponent/2)), //bytesPerRow
stride, //bytesPerRow
#ifdef __LITTLE_ENDIAN__
CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB), //colorspace for OS X >= 10.4
kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst,