2005-11-09 08:39:11 +03:00
/*
* linux / drivers / video / console / fbcon_rotate . h - - Software Display Rotation
*
* Copyright ( C ) 2005 Antonino Daplas < adaplas @ pol . net >
*
* This file is subject to the terms and conditions of the GNU General Public
* License . See the file COPYING in the main directory of this archive
* for more details .
*/
# ifndef _FBCON_ROTATE_H
# define _FBCON_ROTATE_H
# define GETVYRES(s,i) ({ \
( s = = SCROLL_REDRAW | | s = = SCROLL_MOVE ) ? \
( i ) - > var . yres : ( i ) - > var . yres_virtual ; } )
# define GETVXRES(s,i) ({ \
( s = = SCROLL_REDRAW | | s = = SCROLL_MOVE | | ! ( i ) - > fix . xpanstep ) ? \
( i ) - > var . xres : ( i ) - > var . xres_virtual ; } )
static inline int pattern_test_bit ( u32 x , u32 y , u32 pitch , const char * pat )
{
u32 tmp = ( y * pitch ) + x , index = tmp / 8 , bit = tmp % 8 ;
pat + = index ;
2005-11-29 00:43:52 +03:00
return ( * pat ) & ( 0x80 > > bit ) ;
2005-11-09 08:39:11 +03:00
}
static inline void pattern_set_bit ( u32 x , u32 y , u32 pitch , char * pat )
{
u32 tmp = ( y * pitch ) + x , index = tmp / 8 , bit = tmp % 8 ;
pat + = index ;
2005-11-29 00:43:52 +03:00
( * pat ) | = 0x80 > > bit ;
2005-11-09 08:39:11 +03:00
}
static inline void rotate_ud ( const char * in , char * out , u32 width , u32 height )
{
int i , j ;
2005-11-22 08:32:25 +03:00
int shift = ( 8 - ( width % 8 ) ) & 7 ;
2005-11-09 08:39:11 +03:00
width = ( width + 7 ) & ~ 7 ;
for ( i = 0 ; i < height ; i + + ) {
2009-08-07 02:07:30 +04:00
for ( j = 0 ; j < width - shift ; j + + ) {
2005-11-09 08:39:11 +03:00
if ( pattern_test_bit ( j , i , width , in ) )
pattern_set_bit ( width - ( 1 + j + shift ) ,
height - ( 1 + i ) ,
width , out ) ;
}
}
}
static inline void rotate_cw ( const char * in , char * out , u32 width , u32 height )
{
int i , j , h = height , w = width ;
int shift = ( 8 - ( height % 8 ) ) & 7 ;
width = ( width + 7 ) & ~ 7 ;
height = ( height + 7 ) & ~ 7 ;
for ( i = 0 ; i < h ; i + + ) {
for ( j = 0 ; j < w ; j + + ) {
if ( pattern_test_bit ( j , i , width , in ) )
pattern_set_bit ( height - 1 - i - shift , j ,
height , out ) ;
}
}
}
static inline void rotate_ccw ( const char * in , char * out , u32 width , u32 height )
{
int i , j , h = height , w = width ;
2005-11-22 08:32:25 +03:00
int shift = ( 8 - ( width % 8 ) ) & 7 ;
2005-11-09 08:39:11 +03:00
width = ( width + 7 ) & ~ 7 ;
height = ( height + 7 ) & ~ 7 ;
for ( i = 0 ; i < h ; i + + ) {
for ( j = 0 ; j < w ; j + + ) {
if ( pattern_test_bit ( j , i , width , in ) )
pattern_set_bit ( i , width - 1 - j - shift ,
height , out ) ;
}
}
}
2005-11-09 08:39:12 +03:00
extern void fbcon_rotate_cw ( struct fbcon_ops * ops ) ;
2005-11-09 08:39:13 +03:00
extern void fbcon_rotate_ud ( struct fbcon_ops * ops ) ;
2005-11-09 08:39:14 +03:00
extern void fbcon_rotate_ccw ( struct fbcon_ops * ops ) ;
2005-11-09 08:39:11 +03:00
# endif