diff mbox series

[v2] ui/cocoa: Fix stride resolution of pixman image

Message ID 20210222144012.21486-1-akihiko.odaki@gmail.com (mailing list archive)
State New, archived
Headers show
Series [v2] ui/cocoa: Fix stride resolution of pixman image | expand

Commit Message

Akihiko Odaki Feb. 22, 2021, 2:40 p.m. UTC
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>
---
 ui/cocoa.m | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

Comments

Gerd Hoffmann Feb. 24, 2021, 11:23 a.m. UTC | #1
On Mon, Feb 22, 2021 at 11:40:12PM +0900, Akihiko Odaki wrote:
> 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.

Probably not limited to virtio-gpu.  Wayland rounds display framebuffers
to the next multiple of 64, so when running -- for example -- 800x600
wayland will create an image 832 pixels wide.  Other UIs had simliar
issues.

Patch added to UI patch queue.

thanks,
  Gerd
Peter Maydell Feb. 24, 2021, 1:08 p.m. UTC | #2
On Wed, 24 Feb 2021 at 11:23, Gerd Hoffmann <kraxel@redhat.com> wrote:
>
> On Mon, Feb 22, 2021 at 11:40:12PM +0900, Akihiko Odaki wrote:
> > 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.
>
> Probably not limited to virtio-gpu.  Wayland rounds display framebuffers
> to the next multiple of 64, so when running -- for example -- 800x600
> wayland will create an image 832 pixels wide.  Other UIs had simliar
> issues.
>
> Patch added to UI patch queue.

Could you add Akihiko's explanation to the commit message
for the patch in your queue, please?

thanks
-- PMM
Gerd Hoffmann Feb. 25, 2021, 8:01 a.m. UTC | #3
On Wed, Feb 24, 2021 at 01:08:22PM +0000, Peter Maydell wrote:
> On Wed, 24 Feb 2021 at 11:23, Gerd Hoffmann <kraxel@redhat.com> wrote:
> >
> > On Mon, Feb 22, 2021 at 11:40:12PM +0900, Akihiko Odaki wrote:
> > > 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.
> >
> > Probably not limited to virtio-gpu.  Wayland rounds display framebuffers
> > to the next multiple of 64, so when running -- for example -- 800x600
> > wayland will create an image 832 pixels wide.  Other UIs had simliar
> > issues.
> >
> > Patch added to UI patch queue.
> 
> Could you add Akihiko's explanation to the commit message
> for the patch in your queue, please?

That _is_ the (v2) commit message ;)

Akihiko: new versions of a patch should be sent as new thread, not as
reply.  It is less confusing for both people and tools like b4
(https://pypi.org/project/b4/) which help with patch processing.

take care,
  Gerd
Akihiko Odaki Feb. 25, 2021, 8:38 a.m. UTC | #4
2021年2月25日(木) 17:02 Gerd Hoffmann <kraxel@redhat.com>:
>
> On Wed, Feb 24, 2021 at 01:08:22PM +0000, Peter Maydell wrote:
> > On Wed, 24 Feb 2021 at 11:23, Gerd Hoffmann <kraxel@redhat.com> wrote:
> > >
> > > On Mon, Feb 22, 2021 at 11:40:12PM +0900, Akihiko Odaki wrote:
> > > > 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.
> > >
> > > Probably not limited to virtio-gpu.  Wayland rounds display framebuffers
> > > to the next multiple of 64, so when running -- for example -- 800x600
> > > wayland will create an image 832 pixels wide.  Other UIs had simliar
> > > issues.
> > >
> > > Patch added to UI patch queue.
> >
> > Could you add Akihiko's explanation to the commit message
> > for the patch in your queue, please?
>
> That _is_ the (v2) commit message ;)
>
> Akihiko: new versions of a patch should be sent as new thread, not as
> reply.  It is less confusing for both people and tools like b4
> (https://pypi.org/project/b4/) which help with patch processing.

I didn't know that. Thanks for telling me that. I'll do so next time.

Regards,
Akihiko Odaki

>
> take care,
>   Gerd
>
diff mbox series

Patch

diff --git a/ui/cocoa.m b/ui/cocoa.m
index 0ef5fdf3b7a..2de72155dea 100644
--- a/ui/cocoa.m
+++ b/ui/cocoa.m
@@ -450,19 +450,19 @@  - (void) drawRect:(NSRect) rect
         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,