97 lines · c
1/*2 * linux/drivers/video/console/fbcon_rotate.h -- Software Display Rotation3 *4 * Copyright (C) 2005 Antonino Daplas <adaplas@pol.net>5 *6 * This file is subject to the terms and conditions of the GNU General Public7 * License. See the file COPYING in the main directory of this archive8 * for more details.9 */10 11#ifndef _FBCON_ROTATE_H12#define _FBCON_ROTATE_H13 14#define GETVYRES(s,i) ({ \15 (fb_scrollmode(s) == SCROLL_REDRAW || fb_scrollmode(s) == SCROLL_MOVE) ? \16 (i)->var.yres : (i)->var.yres_virtual; })17 18#define GETVXRES(s,i) ({ \19 (fb_scrollmode(s) == SCROLL_REDRAW || fb_scrollmode(s) == SCROLL_MOVE || !(i)->fix.xpanstep) ? \20 (i)->var.xres : (i)->var.xres_virtual; })21 22 23static inline int pattern_test_bit(u32 x, u32 y, u32 pitch, const char *pat)24{25 u32 tmp = (y * pitch) + x, index = tmp / 8, bit = tmp % 8;26 27 pat +=index;28 return (*pat) & (0x80 >> bit);29}30 31static inline void pattern_set_bit(u32 x, u32 y, u32 pitch, char *pat)32{33 u32 tmp = (y * pitch) + x, index = tmp / 8, bit = tmp % 8;34 35 pat += index;36 37 (*pat) |= 0x80 >> bit;38}39 40static inline void rotate_ud(const char *in, char *out, u32 width, u32 height)41{42 int i, j;43 int shift = (8 - (width % 8)) & 7;44 45 width = (width + 7) & ~7;46 47 for (i = 0; i < height; i++) {48 for (j = 0; j < width - shift; j++) {49 if (pattern_test_bit(j, i, width, in))50 pattern_set_bit(width - (1 + j + shift),51 height - (1 + i),52 width, out);53 }54 55 }56}57 58static inline void rotate_cw(const char *in, char *out, u32 width, u32 height)59{60 int i, j, h = height, w = width;61 int shift = (8 - (height % 8)) & 7;62 63 width = (width + 7) & ~7;64 height = (height + 7) & ~7;65 66 for (i = 0; i < h; i++) {67 for (j = 0; j < w; j++) {68 if (pattern_test_bit(j, i, width, in))69 pattern_set_bit(height - 1 - i - shift, j,70 height, out);71 72 }73 }74}75 76static inline void rotate_ccw(const char *in, char *out, u32 width, u32 height)77{78 int i, j, h = height, w = width;79 int shift = (8 - (width % 8)) & 7;80 81 width = (width + 7) & ~7;82 height = (height + 7) & ~7;83 84 for (i = 0; i < h; i++) {85 for (j = 0; j < w; j++) {86 if (pattern_test_bit(j, i, width, in))87 pattern_set_bit(i, width - 1 - j - shift,88 height, out);89 }90 }91}92 93extern void fbcon_rotate_cw(struct fbcon_ops *ops);94extern void fbcon_rotate_ud(struct fbcon_ops *ops);95extern void fbcon_rotate_ccw(struct fbcon_ops *ops);96#endif97