On Thu, Aug 17, 2017 at 09:28:43PM +0200, Mark Kettenis wrote:
> > Date: Mon, 14 Aug 2017 01:38:56 +0200 (CEST)
> > From: Mark Kettenis <mark.kette...@xs4all.nl>
> > 
> > Because I have a laptop that needs it.
> > 
> > ok?
> 
> Ping!  Anybody?

Reads fine. ok.

I don't see where rotation is enabled, e.g. where RI_ROTATE_CW or
RI_ROTATE_CCW would be set. I suppose on zaurus it was set by MD code?
Did anything apart from zaurus ever use rasops rotation support?

I have a tablet-like mini laptop for which I already use 90 deg
clock-wise rotation in X with wsfb. I'm delighted to learn this
could be done for text mode as well.

> > Index: dev/rasops/rasops.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/rasops/rasops.c,v
> > retrieving revision 1.46
> > diff -u -p -r1.46 rasops.c
> > --- dev/rasops/rasops.c     13 Aug 2017 22:28:23 -0000      1.46
> > +++ dev/rasops/rasops.c     13 Aug 2017 23:37:31 -0000
> > @@ -150,7 +150,7 @@ int     rasops_copyrows_rotated(void *, int,
> >  int        rasops_erasecols_rotated(void *, int, int, int, long);
> >  int        rasops_eraserows_rotated(void *, int, int, long);
> >  int        rasops_putchar_rotated(void *, int, int, u_int, long);
> > -void       rasops_rotate_font(int *);
> > +void       rasops_rotate_font(int *, int);
> >  
> >  /*
> >   * List of all rotated fonts
> > @@ -218,8 +218,9 @@ rasops_init(struct rasops_info *ri, int 
> >              * Pick the rotated version of this font. This will create it
> >              * if necessary.
> >              */
> > -           if (ri->ri_flg & RI_ROTATE_CW)
> > -                   rasops_rotate_font(&cookie);
> > +           if (ri->ri_flg & (RI_ROTATE_CW | RI_ROTATE_CCW))
> > +                   rasops_rotate_font(&cookie,
> > +                       ISSET(ri->ri_flg, RI_ROTATE_CCW));
> >  #endif
> >  
> >             if (wsfont_lock(cookie, &ri->ri_font,
> > @@ -341,7 +342,7 @@ rasops_reconfig(struct rasops_info *ri, 
> >             ri->ri_emuwidth--;
> >  
> >  #if NRASOPS_ROTATION > 0
> > -   if (ri->ri_flg & RI_ROTATE_CW) {
> > +   if (ri->ri_flg & (RI_ROTATE_CW | RI_ROTATE_CCW)) {
> >             ri->ri_rows = ri->ri_emuwidth / ri->ri_font->fontwidth;
> >             ri->ri_cols = ri->ri_emuheight / ri->ri_font->fontheight;
> >     } else
> > @@ -460,7 +461,7 @@ rasops_reconfig(struct rasops_info *ri, 
> >     }
> >  
> >  #if NRASOPS_ROTATION > 0
> > -   if (ri->ri_flg & RI_ROTATE_CW) {
> > +   if (ri->ri_flg & (RI_ROTATE_CW | RI_ROTATE_CCW)) {
> >             ri->ri_real_ops = ri->ri_ops;
> >             ri->ri_ops.copycols = rasops_copycols_rotated;
> >             ri->ri_ops.copyrows = rasops_copyrows_rotated;
> > @@ -958,7 +959,11 @@ rasops_do_cursor(struct rasops_info *ri)
> >             /* Rotate rows/columns */
> >             row = ri->ri_ccol;
> >             col = ri->ri_rows - ri->ri_crow - 1;
> > -   } else
> > +   } else if (ri->ri_flg & RI_ROTATE_CCW) {
> > +           /* Rotate rows/columns */
> > +           row = ri->ri_cols - ri->ri_ccol - 1;
> > +           col = ri->ri_crow;
> > +   } else          
> >  #endif
> >     {
> >             row = ri->ri_crow;
> > @@ -1153,7 +1158,7 @@ rasops_erasecols(void *cookie, int row, 
> >  #include <sys/malloc.h>
> >  
> >  void
> > -rasops_rotate_font(int *cookie)
> > +rasops_rotate_font(int *cookie, int ccw)
> >  {
> >     struct rotatedfont *f;
> >     int ncookie;
> > @@ -1169,7 +1174,7 @@ rasops_rotate_font(int *cookie)
> >      * We did not find a rotated version of this font. Ask the wsfont
> >      * code to compute one for us.
> >      */
> > -   if ((ncookie = wsfont_rotate(*cookie)) == -1)
> > +   if ((ncookie = wsfont_rotate(*cookie, ccw)) == -1)
> >             return;
> >  
> >     f = malloc(sizeof(struct rotatedfont), M_DEVBUF, M_WAITOK);
> > @@ -1230,15 +1235,18 @@ rasops_putchar_rotated(void *cookie, int
> >  
> >     ri = (struct rasops_info *)cookie;
> >  
> > +   if (ri->ri_flg & RI_ROTATE_CW)
> > +           row = ri->ri_rows - row - 1;
> > +   else
> > +           col = ri->ri_cols - col - 1;
> > +
> >     /* Do rotated char sans (side)underline */
> > -   rc = ri->ri_real_ops.putchar(cookie, col, ri->ri_rows - row - 1, uc,
> > -       attr & ~1);
> > +   rc = ri->ri_real_ops.putchar(cookie, col, row, uc, attr & ~1);
> >     if (rc != 0)
> >             return rc;
> >  
> >     /* Do rotated underline */
> > -   rp = ri->ri_bits + col * ri->ri_yscale + (ri->ri_rows - row - 1) * 
> > -       ri->ri_xscale;
> > +   rp = ri->ri_bits + col * ri->ri_yscale + row * ri->ri_xscale;
> >     height = ri->ri_font->fontheight;
> >  
> >     /* XXX this assumes 16-bit color depth */
> > Index: dev/rasops/rasops.h
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/rasops/rasops.h,v
> > retrieving revision 1.18
> > diff -u -p -r1.18 rasops.h
> > --- dev/rasops/rasops.h     15 Dec 2016 19:18:41 -0000      1.18
> > +++ dev/rasops/rasops.h     13 Aug 2017 23:37:31 -0000
> > @@ -52,10 +52,11 @@ struct wsdisplay_font;
> >  #define    RI_CLEARMARGINS 0x0020  /* clear display margins on startup */
> >  #define RI_CENTER  0x0040  /* center onscreen output */
> >  #define RI_CURSORCLIP      0x0080  /* cursor is currently clipped */
> > -#define    RI_ROTATE_CW    0x0100  /* display is rotated, quarter 
> > clockwise */
> > -#define RI_CFGDONE 0x0200  /* rasops_reconfig() completed successfully */
> > -#define RI_VCONS   0x0400  /* virtual consoles */
> > -#define RI_WRONLY  0x0800  /* avoid framebuffer reads */
> > +#define RI_ROTATE_CW       0x0100  /* display is rotated, 90 deg clockwise 
> > */
> > +#define RI_ROTATE_CCW      0x0200  /* display is rotated, 90 deg 
> > anti-clockwise */
> > +#define RI_CFGDONE 0x0400  /* rasops_reconfig() completed successfully */
> > +#define RI_VCONS   0x0800  /* virtual consoles */
> > +#define RI_WRONLY  0x1000  /* avoid framebuffer reads */
> >  
> >  struct rasops_screen;
> >  
> > Index: dev/wsfont/wsfont.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/wsfont/wsfont.c,v
> > retrieving revision 1.48
> > diff -u -p -r1.48 wsfont.c
> > --- dev/wsfont/wsfont.c     30 May 2017 13:14:44 -0000      1.48
> > +++ dev/wsfont/wsfont.c     13 Aug 2017 23:37:31 -0000
> > @@ -231,25 +231,14 @@ wsfont_enum(int (*cb)(void *, struct wsd
> >  
> >  #if NRASOPS_ROTATION > 0
> >  
> > -struct wsdisplay_font *wsfont_rotate_internal(struct wsdisplay_font *);
> > +void wsfont_rotate_cw(struct wsdisplay_font *, char *, int);
> > +void wsfont_rotate_ccw(struct wsdisplay_font *, char *, int);
> > +struct wsdisplay_font *wsfont_rotate_internal(struct wsdisplay_font *, 
> > int);
> >  
> > -struct wsdisplay_font *
> > -wsfont_rotate_internal(struct wsdisplay_font *font)
> > +void
> > +wsfont_rotate_cw(struct wsdisplay_font *font, char *newbits, int newstride)
> >  {
> > -   int b, n, r, newstride;
> > -   struct wsdisplay_font *newfont;
> > -   char *newbits;
> > -
> > -   /* Duplicate the existing font... */
> > -   newfont = malloc(sizeof *font, M_DEVBUF, M_WAITOK);
> > -
> > -   bcopy(font, newfont, sizeof *font);
> > -   newfont->cookie = NULL;
> > -
> > -   /* Allocate a buffer big enough for the rotated font. */
> > -   newstride = (font->fontheight + 7) / 8;
> > -   newbits = mallocarray(font->numchars, newstride * font->fontwidth,
> > -       M_DEVBUF, M_WAITOK | M_ZERO);
> > +   int b, n, r;
> >  
> >     /* Rotate the font a bit at a time. */
> >     for (n = 0; n < font->numchars; n++) {
> > @@ -271,6 +260,58 @@ wsfont_rotate_internal(struct wsdisplay_
> >                     }
> >             }
> >     }
> > +}
> > +
> > +void
> > +wsfont_rotate_ccw(struct wsdisplay_font *font, char *newbits, int 
> > newstride)
> > +{
> > +   int b, n, r;
> > +
> > +   /* Rotate the font a bit at a time. */
> > +   for (n = 0; n < font->numchars; n++) {
> > +           char *ch = font->data + (n * font->stride * font->fontheight);
> > +
> > +           for (r = 0; r < font->fontheight; r++) {
> > +                   for (b = 0; b < font->fontwidth; b++) {
> > +                           int bb = font->fontwidth - 1 - b;
> > +                           unsigned char *rb;
> > +
> > +                           rb = ch + (font->stride * r) + (b / 8);
> > +                           if (*rb & (0x80 >> (b % 8))) {
> > +                                   unsigned char *rrb;
> > +
> > +                                   rrb = newbits + (r / 8)
> > +                                       + (n * newstride * font->fontwidth)
> > +                                       + (newstride * bb);
> > +                                   *rrb |= (1 << (7 - (r % 8)));
> > +                           }
> > +                   }
> > +           }
> > +   }
> > +}
> > +
> > +struct wsdisplay_font *
> > +wsfont_rotate_internal(struct wsdisplay_font *font, int ccw)
> > +{
> > +   int newstride;
> > +   struct wsdisplay_font *newfont;
> > +   char *newbits;
> > +
> > +   /* Duplicate the existing font... */
> > +   newfont = malloc(sizeof *font, M_DEVBUF, M_WAITOK);
> > +
> > +   bcopy(font, newfont, sizeof *font);
> > +   newfont->cookie = NULL;
> > +
> > +   /* Allocate a buffer big enough for the rotated font. */
> > +   newstride = (font->fontheight + 7) / 8;
> > +   newbits = mallocarray(font->numchars, newstride * font->fontwidth,
> > +       M_DEVBUF, M_WAITOK | M_ZERO);
> > +
> > +   if (ccw)
> > +           wsfont_rotate_ccw(font, newbits, newstride);
> > +   else
> > +           wsfont_rotate_cw(font, newbits, newstride);
> >  
> >     newfont->data = newbits;
> >  
> > @@ -294,7 +335,7 @@ wsfont_rotate_internal(struct wsdisplay_
> >  }
> >  
> >  int
> > -wsfont_rotate(int cookie)
> > +wsfont_rotate(int cookie, int ccw)
> >  {
> >     int s, ncookie;
> >     struct wsdisplay_font *font;
> > @@ -304,7 +345,7 @@ wsfont_rotate(int cookie)
> >     origfont = wsfont_find0(cookie);
> >     splx(s);
> >  
> > -   font = wsfont_rotate_internal(origfont->font);
> > +   font = wsfont_rotate_internal(origfont->font, ccw);
> >     if (font == NULL)
> >             return (-1);
> >  
> > Index: dev/wsfont/wsfont.h
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/wsfont/wsfont.h,v
> > retrieving revision 1.10
> > diff -u -p -r1.10 wsfont.h
> > --- dev/wsfont/wsfont.h     20 Oct 2013 21:24:01 -0000      1.10
> > +++ dev/wsfont/wsfont.h     13 Aug 2017 23:37:31 -0000
> > @@ -73,6 +73,6 @@ void      wsfont_enum(int (*)(void *, struct 
> >  int        wsfont_lock(int, struct wsdisplay_font **, int, int);
> >  int        wsfont_unlock(int);
> >  int        wsfont_map_unichar(struct wsdisplay_font *, int);
> > -int        wsfont_rotate(int);
> > +int        wsfont_rotate(int, int);
> >  
> >  #endif     /* !_WSFONT_H_ */
> > 
> > 
> 

Reply via email to