diff options
author | Akihiko Odaki <akihiko.odaki@gmail.com> | 2021-02-22 23:40:12 +0900 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2021-03-04 09:35:03 +0100 |
commit | d9c32b8f7f5f05511d77a1ec1d1d35bf7bff2961 (patch) | |
tree | af057dd59799f4af9271adf7a8afb3413ec6bd46 /ui/cocoa.m | |
parent | 8eb13bbbac08aa077efcf9877c9646c4497d766c (diff) |
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>
Diffstat (limited to 'ui/cocoa.m')
-rw-r--r-- | ui/cocoa.m | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/ui/cocoa.m b/ui/cocoa.m index 5ad44b84aa..6a59f87316 100644 --- a/ui/cocoa.m +++ b/ui/cocoa.m @@ -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, |