aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video/fb_draw.h
diff options
context:
space:
mode:
authorPavel Pisa <pisa@cmp.felk.cvut.cz>2007-10-16 04:29:21 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-10-16 12:43:19 -0400
commit779121e9f17525769c04a00475fd85600c8c04eb (patch)
tree757aad067bed869bfdd2dc2eb2f652a7f4e5e071 /drivers/video/fb_draw.h
parent3c03ec209af1dd8223888630482f1b2353dc6284 (diff)
fbdev: Support for byte-reversed framebuffer formats
Allow generic frame-buffer code to correctly write texts and blit images for 1, 2 and 4 bit per pixel frame-buffer organizations when pixels in bytes are organized to in opposite order than bytes in long type. Overhead should be reasonable. If option is not selected, than compiler should eliminate completely all overhead. The feature is disabled at compile time if CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set. [adaplas] Convert helper functions to macros if feature is not enabled. Signed-off-by: Pavel Pisa <pisa@cmp.felk.cvut.cz> Signed-off-by: Antonino Daplas <adaplas@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/video/fb_draw.h')
-rw-r--r--drivers/video/fb_draw.h68
1 files changed, 68 insertions, 0 deletions
diff --git a/drivers/video/fb_draw.h b/drivers/video/fb_draw.h
index c5c45203833b..816843f06bb7 100644
--- a/drivers/video/fb_draw.h
+++ b/drivers/video/fb_draw.h
@@ -2,6 +2,7 @@
2#define _FB_DRAW_H 2#define _FB_DRAW_H
3 3
4#include <asm/types.h> 4#include <asm/types.h>
5#include <linux/fb.h>
5 6
6 /* 7 /*
7 * Compose two values, using a bitmask as decision value 8 * Compose two values, using a bitmask as decision value
@@ -69,4 +70,71 @@ pixel_to_pat( u32 bpp, u32 pixel)
69 } 70 }
70} 71}
71#endif 72#endif
73
74#ifdef CONFIG_FB_CFB_REV_PIXELS_IN_BYTE
75
76static inline u32 fb_shifted_pixels_mask_u32(u32 index, u32 bswapmask)
77{
78 u32 mask;
79
80 if (!bswapmask) {
81 mask = FB_SHIFT_HIGH(~(u32)0, index);
82 } else {
83 mask = 0xff << FB_LEFT_POS(8);
84 mask = FB_SHIFT_LOW(mask, index & (bswapmask)) & mask;
85 mask = FB_SHIFT_HIGH(mask, index & ~(bswapmask));
86#if defined(__i386__) || defined(__x86_64__)
87 /* Shift argument is limited to 0 - 31 on x86 based CPU's */
88 if(index + bswapmask < 32)
89#endif
90 mask |= FB_SHIFT_HIGH(~(u32)0,
91 (index + bswapmask) & ~(bswapmask));
92 }
93 return mask;
94}
95
96static inline unsigned long fb_shifted_pixels_mask_long(u32 index, u32 bswapmask)
97{
98 unsigned long mask;
99
100 if (!bswapmask) {
101 mask = FB_SHIFT_HIGH(~0UL, index);
102 } else {
103 mask = 0xff << FB_LEFT_POS(8);
104 mask = FB_SHIFT_LOW(mask, index & (bswapmask)) & mask;
105 mask = FB_SHIFT_HIGH(mask, index & ~(bswapmask));
106#if defined(__i386__) || defined(__x86_64__)
107 /* Shift argument is limited to 0 - 31 on x86 based CPU's */
108 if(index + bswapmask < BITS_PER_LONG)
109#endif
110 mask |= FB_SHIFT_HIGH(~0UL,
111 (index + bswapmask) & ~(bswapmask));
112 }
113 return mask;
114}
115
116
117static inline u32 fb_compute_bswapmask(struct fb_info *info)
118{
119 u32 bswapmask = 0;
120 unsigned bpp = info->var.bits_per_pixel;
121
122 if ((bpp < 8) && (info->var.nonstd & FB_NONSTD_REV_PIX_IN_B)) {
123 /*
124 * Reversed order of pixel layout in bytes
125 * works only for 1, 2 and 4 bpp
126 */
127 bswapmask = 7 - bpp + 1;
128 }
129 return bswapmask;
130}
131
132#else /* CONFIG_FB_CFB_REV_PIXELS_IN_BYTE */
133
134#define fb_shifted_pixels_mask_u32(i, b) FB_SHIFT_HIGH(~(u32)0, (i))
135#define fb_shifted_pixels_mask_long(i, b) FB_SHIFT_HIGH(~0UL, (i))
136#define fb_compute_bswapmask(...) 0
137
138#endif /* CONFIG_FB_CFB_REV_PIXELS_IN_BYTE */
139
72#endif /* FB_DRAW_H */ 140#endif /* FB_DRAW_H */