1 | /* |
2 | * linux/drivers/video/console/fbcon_rotate.h -- Software Display Rotation |
3 | * |
4 | * Copyright (C) 2005 Antonino Daplas <adaplas@pol.net> |
5 | * |
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 |
8 | * for more details. |
9 | */ |
10 | |
11 | #ifndef _FBCON_ROTATE_H |
12 | #define _FBCON_ROTATE_H |
13 | |
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 | |
23 | static 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 | |
31 | static 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 | |
40 | static 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(x: j, y: i, pitch: width, pat: in)) |
50 | pattern_set_bit(x: width - (1 + j + shift), |
51 | y: height - (1 + i), |
52 | pitch: width, pat: out); |
53 | } |
54 | |
55 | } |
56 | } |
57 | |
58 | static 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(x: j, y: i, pitch: width, pat: in)) |
69 | pattern_set_bit(x: height - 1 - i - shift, y: j, |
70 | pitch: height, pat: out); |
71 | |
72 | } |
73 | } |
74 | } |
75 | |
76 | static 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(x: j, y: i, pitch: width, pat: in)) |
87 | pattern_set_bit(x: i, y: width - 1 - j - shift, |
88 | pitch: height, pat: out); |
89 | } |
90 | } |
91 | } |
92 | |
93 | extern void fbcon_rotate_cw(struct fbcon_ops *ops); |
94 | extern void fbcon_rotate_ud(struct fbcon_ops *ops); |
95 | extern void fbcon_rotate_ccw(struct fbcon_ops *ops); |
96 | #endif |
97 | |