> Date: Mon, 14 Aug 2017 01:38:56 +0200 (CEST)
> From: Mark Kettenis <[email protected]>
>
> Because I have a laptop that needs it.
>
> ok?
Ping! Anybody?
> 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_ */
>
>