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_ */ > > > > >