2 * linux/drivers/video/console/fbcon_rotate.h -- Software Display Rotation
4 * Copyright (C) 2005 Antonino Daplas <adaplas@pol.net>
6 * This file is subject to the terms and conditions of the GNU General Public
7 * License. See the file COPYING in the main directory of this archive
11 #ifndef _FBCON_ROTATE_H
12 #define _FBCON_ROTATE_H
14 #define FNTCHARCNT(fd) (((int *)(fd))[-3])
16 #define GETVYRES(s,i) ({ \
17 (s == SCROLL_REDRAW || s == SCROLL_MOVE) ? \
18 (i)->var.yres : (i)->var.yres_virtual; })
20 #define GETVXRES(s,i) ({ \
21 (s == SCROLL_REDRAW || s == SCROLL_MOVE || !(i)->fix.xpanstep) ? \
22 (i)->var.xres : (i)->var.xres_virtual; })
25 static inline int pattern_test_bit(u32 x
, u32 y
, u32 pitch
, const char *pat
)
27 u32 tmp
= (y
* pitch
) + x
, index
= tmp
/ 8, bit
= tmp
% 8;
30 return (*pat
) & (0x80 >> bit
);
33 static inline void pattern_set_bit(u32 x
, u32 y
, u32 pitch
, char *pat
)
35 u32 tmp
= (y
* pitch
) + x
, index
= tmp
/ 8, bit
= tmp
% 8;
39 (*pat
) |= 0x80 >> bit
;
42 static inline void rotate_ud(const char *in
, char *out
, u32 width
, u32 height
)
45 int shift
= (8 - (width
% 8)) & 7;
47 width
= (width
+ 7) & ~7;
49 for (i
= 0; i
< height
; i
++) {
50 for (j
= 0; j
< width
; j
++) {
51 if (pattern_test_bit(j
, i
, width
, in
))
52 pattern_set_bit(width
- (1 + j
+ shift
),
60 static inline void rotate_cw(const char *in
, char *out
, u32 width
, u32 height
)
62 int i
, j
, h
= height
, w
= width
;
63 int shift
= (8 - (height
% 8)) & 7;
65 width
= (width
+ 7) & ~7;
66 height
= (height
+ 7) & ~7;
68 for (i
= 0; i
< h
; i
++) {
69 for (j
= 0; j
< w
; j
++) {
70 if (pattern_test_bit(j
, i
, width
, in
))
71 pattern_set_bit(height
- 1 - i
- shift
, j
,
78 static inline void rotate_ccw(const char *in
, char *out
, u32 width
, u32 height
)
80 int i
, j
, h
= height
, w
= width
;
81 int shift
= (8 - (width
% 8)) & 7;
83 width
= (width
+ 7) & ~7;
84 height
= (height
+ 7) & ~7;
86 for (i
= 0; i
< h
; i
++) {
87 for (j
= 0; j
< w
; j
++) {
88 if (pattern_test_bit(j
, i
, width
, in
))
89 pattern_set_bit(i
, width
- 1 - j
- shift
,
95 extern void fbcon_rotate_cw(struct fbcon_ops
*ops
);
96 extern void fbcon_rotate_ud(struct fbcon_ops
*ops
);
97 extern void fbcon_rotate_ccw(struct fbcon_ops
*ops
);