@ -24,9 +24,9 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
* You should have received a copy of the GNU General Public License along
* with this program ; if not , write to the Free Software Foundation , Inc . ,
* 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA .
*/
# include "avformat.h"
@ -241,35 +241,21 @@ getCurrentPointer(AVFormatContext *s1, X11Grab *s, int *x, int *y)
}
}
# define DRAW_CURSOR_TEMPLATE(type_t) \
do { \
type_t * cursor ; \
int width_cursor ; \
uint16_t bm_b , bm_w , mask ; \
\
for ( line = 0 ; line < min ( 20 , ( y_off + height ) - * y ) ; line + + ) { \
if ( s - > mouse_wanted = = 1 ) { \
bm_b = mousePointerBlack [ line ] ; \
bm_w = mousePointerWhite [ line ] ; \
} else { \
bm_b = mousePointerWhite [ line ] ; \
bm_w = mousePointerBlack [ line ] ; \
} \
mask = ( 0x0001 < < 15 ) ; \
\
for ( cursor = ( type_t * ) im_data , width_cursor = 0 ; \
( ( width_cursor + * x ) < ( width + x_off ) & & width_cursor < 16 ) ; \
cursor + + , width_cursor + + ) { \
if ( ( bm_b & mask ) > 0 ) { \
* cursor & = ( ( ~ image - > red_mask ) & ( ~ image - > green_mask ) & ( ~ image - > blue_mask ) ) ; \
} else if ( ( bm_w & mask ) > 0 ) { \
* cursor | = ( image - > red_mask | image - > green_mask | image - > blue_mask ) ; \
} \
mask > > = 1 ; \
} \
im_data + = image - > bytes_per_line ; \
} \
} while ( 0 )
static void inline
apply_masks ( uint8_t * dst , int and , int or , int bits_per_pixel )
{
switch ( bits_per_pixel ) {
case 32 :
* ( uint32_t * ) dst = ( * ( uint32_t * ) dst & and ) | or ;
break ;
case 16 :
* ( uint16_t * ) dst = ( * ( uint16_t * ) dst & and ) | or ;
break ;
case 8 :
* dst = ( or ) ? 1 : 0 ;
break ;
}
}
static void
paintMousePointer ( AVFormatContext * s1 , X11Grab * s , int * x , int * y , XImage * image )
@ -299,20 +285,74 @@ paintMousePointer(AVFormatContext *s1, X11Grab *s, int *x, int *y, XImage *image
& & ( * y - y_off ) > = 0 & & * y < ( height + y_off ) ) {
int line ;
uint8_t * im_data = ( uint8_t * ) image - > data ;
const uint16_t * black ;
const uint16_t * white ;
int masks ;
int onepixel ;
/* Select correct pointer pixels */
if ( s - > mouse_wanted = = 1 ) {
/* Normal pointer */
black = mousePointerBlack ;
white = mousePointerWhite ;
} else {
/* Inverted pointer */
black = mousePointerWhite ;
white = mousePointerBlack ;
}
im_data + = ( image - > bytes_per_line * ( * y - y_off ) ) ; // shift to right line
im_data + = ( image - > bits_per_pixel / 8 * ( * x - x_off ) ) ; // shift to right pixel
switch ( image - > bits_per_pixel ) {
/* Select correct masks and pixel size */
switch ( image - > bits_per_pixel ) {
case 32 :
DRAW_CURSOR_TEMPLATE ( uint32_t ) ;
masks = ( image - > red_mask | image - > green_mask | image - > blue_mask ) ;
onepixel = 4 ;
break ;
case 24 :
/* XXX: Though the code seems to support 24bit images, the
* apply_masks lacks support for 24 bit */
masks = ( image - > red_mask | image - > green_mask | image - > blue_mask ) ;
onepixel = 3 ;
break ;
case 16 :
DRAW_CURSOR_TEMPLATE ( uint16_t ) ;
masks = ( image - > red_mask | image - > green_mask | image - > blue_mask ) ;
onepixel = 2 ;
break ;
default :
/* XXX: How do we deal with 24bit and 8bit modes ? */
case 8 :
masks = 1 ;
onepixel = 1 ;
break ;
default :
/* Shut up gcc */
masks = 0 ;
onepixel = 0 ;
}
/* Shift to right line */
im_data + = ( image - > bytes_per_line * ( * y - y_off ) ) ;
/* Shift to right pixel */
im_data + = ( image - > bits_per_pixel / 8 * ( * x - x_off ) ) ;
/* Draw the cursor - proper loop */
for ( line = 0 ; line < min ( 20 , ( y_off + height ) - * y ) ; line + + ) {
uint8_t * cursor = im_data ;
int width_cursor ;
uint16_t bm_b ;
uint16_t bm_w ;
bm_b = black [ line ] ;
bm_w = white [ line ] ;
for ( width_cursor = 0 ;
width_cursor < 16 & & ( width_cursor + * x ) < ( width + x_off ) ;
width_cursor + + ) {
apply_masks ( cursor ,
~ ( masks * ( bm_b & 1 ) ) , masks * ( bm_w & 1 ) ,
image - > bits_per_pixel ) ;
cursor + = onepixel ;
bm_b > > = 1 ;
bm_w > > = 1 ;
}
im_data + = image - > bytes_per_line ;
}
}
}
@ -359,7 +399,8 @@ XGetZPixmap(Display *dpy, Drawable d, XImage *image, int x, int y)
return True ;
}
static int x11grab_read_packet ( AVFormatContext * s1 , AVPacket * pkt )
static int
x11grab_read_packet ( AVFormatContext * s1 , AVPacket * pkt )
{
X11Grab * s = s1 - > priv_data ;
Display * dpy = s - > dpy ;
@ -416,7 +457,8 @@ static int x11grab_read_packet(AVFormatContext *s1, AVPacket *pkt)
return s - > frame_size ;
}
static int x11grab_read_close ( AVFormatContext * s1 )
static int
x11grab_read_close ( AVFormatContext * s1 )
{
X11Grab * x11grab = s1 - > priv_data ;