All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vasily Khoruzhick <anarsoul@gmail.com>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: "qemu-devel@nongnu.org" <qemu-devel@nongnu.org>
Subject: Re: [Qemu-devel] [PATCH v2 1/2] pxa2xx_lcd: add proper rotation support
Date: Fri, 3 Jun 2011 18:33:42 +0300	[thread overview]
Message-ID: <201106031833.43108.anarsoul@gmail.com> (raw)
In-Reply-To: <1306920487-18705-1-git-send-email-anarsoul@gmail.com>

On Wednesday 01 June 2011 12:28:06 Vasily Khoruzhick wrote:
> Until now, pxa2xx_lcd only supported 90deg rotation, but
> some machines (for example Zipit Z2) needs 270deg rotation.
> 
> Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
> ---
> v2: codestyle fixes
> 
>  hw/framebuffer.c |    2 +
>  hw/pxa2xx_lcd.c  |   86
> +++++++++++++++++++++++++++++++++++++++++++++++------ input.c          |  
> 34 +++++++++++++++-----
>  qemu-options.hx  |    9 +++++
>  vl.c             |   11 ++++++-
>  5 files changed, 122 insertions(+), 20 deletions(-)
> 
> diff --git a/hw/framebuffer.c b/hw/framebuffer.c
> index 24cdf25..5e9ab5e 100644
> --- a/hw/framebuffer.c
> +++ b/hw/framebuffer.c
> @@ -78,6 +78,8 @@ void framebuffer_update_display(
>      dest = ds_get_data(ds);
>      if (dest_col_pitch < 0)
>          dest -= dest_col_pitch * (cols - 1);
> +    if (dest_row_pitch < 0)
> +        dest -= dest_row_pitch * (rows - 1);
>      first = -1;
>      addr = pd;
> 
> diff --git a/hw/pxa2xx_lcd.c b/hw/pxa2xx_lcd.c
> index e524802..a560bb0 100644
> --- a/hw/pxa2xx_lcd.c
> +++ b/hw/pxa2xx_lcd.c
> @@ -665,7 +665,7 @@ static void pxa2xx_palette_parse(PXA2xxLCDState *s, int
> ch, int bpp) }
>  }
> 
> -static void pxa2xx_lcdc_dma0_redraw_horiz(PXA2xxLCDState *s,
> +static void pxa2xx_lcdc_dma0_redraw_rot0(PXA2xxLCDState *s,
>                  target_phys_addr_t addr, int *miny, int *maxy)
>  {
>      int src_width, dest_width;
> @@ -692,7 +692,7 @@ static void
> pxa2xx_lcdc_dma0_redraw_horiz(PXA2xxLCDState *s, fn, s->dma_ch[0].palette,
> miny, maxy); }
> 
> -static void pxa2xx_lcdc_dma0_redraw_vert(PXA2xxLCDState *s,
> +static void pxa2xx_lcdc_dma0_redraw_rot90(PXA2xxLCDState *s,
>                 target_phys_addr_t addr, int *miny, int *maxy)
>  {
>      int src_width, dest_width;
> @@ -720,6 +720,61 @@ static void
> pxa2xx_lcdc_dma0_redraw_vert(PXA2xxLCDState *s, miny, maxy);
>  }
> 
> +static void pxa2xx_lcdc_dma0_redraw_rot180(PXA2xxLCDState *s,
> +                target_phys_addr_t addr, int *miny, int *maxy)
> +{
> +    int src_width, dest_width;
> +    drawfn fn = NULL;
> +    if (s->dest_width)
> +        fn = s->line_fn[s->transp][s->bpp];
> +    if (!fn)
> +        return;
> +
> +    src_width = (s->xres + 3) & ~3;     /* Pad to a 4 pixels multiple */
> +    if (s->bpp == pxa_lcdc_19pbpp || s->bpp == pxa_lcdc_18pbpp)
> +        src_width *= 3;
> +    else if (s->bpp > pxa_lcdc_16bpp)
> +        src_width *= 4;
> +    else if (s->bpp > pxa_lcdc_8bpp)
> +        src_width *= 2;
> +
> +    dest_width = s->xres * s->dest_width;
> +    *miny = 0;
> +    framebuffer_update_display(s->ds,
> +                               addr, s->xres, s->yres,
> +                               src_width, -dest_width, -s->dest_width,
> +                               s->invalidated,
> +                               fn, s->dma_ch[0].palette, miny, maxy);
> +}
> +
> +static void pxa2xx_lcdc_dma0_redraw_rot270(PXA2xxLCDState *s,
> +               target_phys_addr_t addr, int *miny, int *maxy)
> +{
> +    int src_width, dest_width;
> +    drawfn fn = NULL;
> +    if (s->dest_width)
> +        fn = s->line_fn[s->transp][s->bpp];
> +    if (!fn)
> +        return;
> +
> +    src_width = (s->xres + 3) & ~3;     /* Pad to a 4 pixels multiple */
> +    if (s->bpp == pxa_lcdc_19pbpp || s->bpp == pxa_lcdc_18pbpp)
> +        src_width *= 3;
> +    else if (s->bpp > pxa_lcdc_16bpp)
> +        src_width *= 4;
> +    else if (s->bpp > pxa_lcdc_8bpp)
> +        src_width *= 2;
> +
> +    dest_width = s->yres * s->dest_width;
> +    *miny = 0;
> +    framebuffer_update_display(s->ds,
> +                               addr, s->xres, s->yres,
> +                               src_width, -s->dest_width, dest_width,
> +                               s->invalidated,
> +                               fn, s->dma_ch[0].palette,
> +                               miny, maxy);
> +}
> +
>  static void pxa2xx_lcdc_resize(PXA2xxLCDState *s)
>  {
>      int width, height;
> @@ -730,10 +785,11 @@ static void pxa2xx_lcdc_resize(PXA2xxLCDState *s)
>      height = LCCR2_LPP(s->control[2]) + 1;
> 
>      if (width != s->xres || height != s->yres) {
> -        if (s->orientation)
> +        if (s->orientation == 90 || s->orientation == 270) {
>              qemu_console_resize(s->ds, height, width);
> -        else
> +        } else {
>              qemu_console_resize(s->ds, width, height);
> +        }
>          s->invalidated = 1;
>          s->xres = width;
>          s->yres = height;
> @@ -797,10 +853,11 @@ static void pxa2xx_update_display(void *opaque)
>      }
> 
>      if (miny >= 0) {
> -        if (s->orientation)
> +        if (s->orientation == 90 || s->orientation == 270) {
>              dpy_update(s->ds, miny, 0, maxy - miny, s->xres);
> -        else
> +        } else {
>              dpy_update(s->ds, 0, miny, s->xres, maxy - miny);
> +        }
>      }
>      pxa2xx_lcdc_int_update(s);
> 
> @@ -822,10 +879,19 @@ static void pxa2xx_lcdc_orientation(void *opaque, int
> angle) {
>      PXA2xxLCDState *s = (PXA2xxLCDState *) opaque;
> 
> -    if (angle) {
> -        s->dma_ch[0].redraw = pxa2xx_lcdc_dma0_redraw_vert;
> -    } else {
> -        s->dma_ch[0].redraw = pxa2xx_lcdc_dma0_redraw_horiz;
> +    switch (angle) {
> +    case 0:
> +        s->dma_ch[0].redraw = pxa2xx_lcdc_dma0_redraw_rot0;
> +        break;
> +    case 90:
> +        s->dma_ch[0].redraw = pxa2xx_lcdc_dma0_redraw_rot90;
> +        break;
> +    case 180:
> +        s->dma_ch[0].redraw = pxa2xx_lcdc_dma0_redraw_rot180;
> +        break;
> +    case 270:
> +        s->dma_ch[0].redraw = pxa2xx_lcdc_dma0_redraw_rot270;
> +        break;
>      }
> 
>      s->orientation = angle;
> diff --git a/input.c b/input.c
> index 5664d3a..f0a02e7 100644
> --- a/input.c
> +++ b/input.c
> @@ -148,7 +148,7 @@ void kbd_mouse_event(int dx, int dy, int dz, int
> buttons_state) QEMUPutMouseEntry *entry;
>      QEMUPutMouseEvent *mouse_event;
>      void *mouse_event_opaque;
> -    int width;
> +    int width, height;
> 
>      if (QTAILQ_EMPTY(&mouse_handlers)) {
>          return;
> @@ -160,15 +160,31 @@ void kbd_mouse_event(int dx, int dy, int dz, int
> buttons_state) mouse_event_opaque = entry->qemu_put_mouse_event_opaque;
> 
>      if (mouse_event) {
> -        if (graphic_rotate) {
> -            if (entry->qemu_put_mouse_event_absolute) {
> -                width = 0x7fff;
> -            } else {
> -                width = graphic_width - 1;
> -            }
> -            mouse_event(mouse_event_opaque, width - dy, dx, dz,
> buttons_state); +        if (entry->qemu_put_mouse_event_absolute) {
> +            width = 0x7fff;
> +            height = 0x7fff;
>          } else {
> -            mouse_event(mouse_event_opaque, dx, dy, dz, buttons_state);
> +            width = graphic_width - 1;
> +            height = graphic_height - 1;
> +        }
> +
> +        switch (graphic_rotate) {
> +        case 0:
> +            mouse_event(mouse_event_opaque,
> +                        dx, dy, dz, buttons_state);
> +            break;
> +        case 90:
> +            mouse_event(mouse_event_opaque,
> +                        width - dy, dx, dz, buttons_state);
> +            break;
> +        case 180:
> +            mouse_event(mouse_event_opaque,
> +                        width - dx, height - dy, dz, buttons_state);
> +            break;
> +        case 270:
> +            mouse_event(mouse_event_opaque,
> +                        dy, height - dx, dz, buttons_state);
> +            break;
>          }
>      }
>  }
> diff --git a/qemu-options.hx b/qemu-options.hx
> index 82e085a..46d8f25 100644
> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -771,6 +771,15 @@ STEXI
>  Rotate graphical output 90 deg left (only PXA LCD).
>  ETEXI
> 
> +DEF("rotate", HAS_ARG, QEMU_OPTION_rotate,
> +    "-rotate <deg>   rotate graphical output some deg left (only PXA
> LCD)\n", +    QEMU_ARCH_ALL)
> +STEXI
> +@item -rotate
> +@findex -rotate
> +Rotate graphical output some deg left (only PXA LCD).
> +ETEXI
> +
>  DEF("vga", HAS_ARG, QEMU_OPTION_vga,
>      "-vga [std|cirrus|vmware|qxl|xenfb|none]\n"
>      "                select video card type\n", QEMU_ARCH_ALL)
> diff --git a/vl.c b/vl.c
> index b362871..5074bfe 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -2289,7 +2289,16 @@ int main(int argc, char **argv, char **envp)
>  #endif
>                  break;
>              case QEMU_OPTION_portrait:
> -                graphic_rotate = 1;
> +                graphic_rotate = 90;
> +                break;
> +            case QEMU_OPTION_rotate:
> +                graphic_rotate = atoi(optarg);
> +                if (graphic_rotate != 0 && graphic_rotate != 90 &&
> +                    graphic_rotate != 180 && graphic_rotate != 270) {
> +                    fprintf(stderr,
> +                        "qemu: only 90, 180, 270 deg rotation is
> available\n"); +                    exit(1);
> +                }
>                  break;
>              case QEMU_OPTION_kernel:
>                  kernel_filename = optarg;

Ooops, I found a bug in rotation code, will resubmit fixed version soon.

  parent reply	other threads:[~2011-06-03 15:34 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-05-31 14:16 [Qemu-devel] [PATCH 1/2] pxa2xx_lcd: add proper rotation support Vasily Khoruzhick
2011-05-31 14:16 ` [Qemu-devel] [PATCH 2/2] Add support for Zipit Z2 machine Vasily Khoruzhick
2011-05-31 23:35   ` Peter Maydell
2011-06-01  6:25     ` Vasily Khoruzhick
2011-06-01  9:28     ` [Qemu-devel] [PATCH v2 1/2] pxa2xx_lcd: add proper rotation support Vasily Khoruzhick
2011-06-01  9:28       ` [Qemu-devel] [PATCH v2 2/2] Add support for Zipit Z2 machine Vasily Khoruzhick
2011-06-03 15:33       ` Vasily Khoruzhick [this message]
2011-06-03 15:36       ` [Qemu-devel] [PATCH v3 1/2] pxa2xx_lcd: add proper rotation support Vasily Khoruzhick
2011-06-03 15:36         ` [Qemu-devel] [PATCH v3 2/2] Add support for Zipit Z2 machine Vasily Khoruzhick
2011-06-03 15:38         ` [Qemu-devel] [PATCH v3 1/2] pxa2xx_lcd: add proper rotation support Vasily Khoruzhick
2011-06-08  8:52         ` Vasily Khoruzhick
2011-06-08  9:50         ` Peter Maydell
2011-06-08 11:22           ` Vasily Khoruzhick
2011-06-17 10:04             ` [Qemu-devel] [PATCH v4 " Vasily Khoruzhick
2011-06-17 10:04               ` [Qemu-devel] [PATCH v4 2/2] Add support for Zipit Z2 machine Vasily Khoruzhick
2011-06-21  9:47                 ` Vasily Khoruzhick
2011-06-24 14:45                 ` Peter Maydell
2011-06-24 17:06                   ` Vasily Khoruzhick
2011-06-24 17:16                     ` Peter Maydell
2011-07-06 13:52                       ` [Qemu-devel] [PATCH v5] " Vasily Khoruzhick
2011-07-11 15:26                         ` Vasily Khoruzhick
2011-07-28  8:19                           ` Vasily Khoruzhick
2011-07-12 17:31                         ` Peter Maydell
2011-07-30  5:04                         ` andrzej zaborowski
2011-06-21  9:47               ` [Qemu-devel] [PATCH v4 1/2] pxa2xx_lcd: add proper rotation support Vasily Khoruzhick
2011-07-04 20:11               ` andrzej zaborowski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=201106031833.43108.anarsoul@gmail.com \
    --to=anarsoul@gmail.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.