diff options
author | enselic <enselic@f606c939-3180-4ac9-a4b8-4b8779d57d0a> | 2008-09-14 13:06:20 +0000 |
---|---|---|
committer | enselic <enselic@f606c939-3180-4ac9-a4b8-4b8779d57d0a> | 2008-09-14 13:06:20 +0000 |
commit | e5cdc6d4fbec00a52d06414ca243664bb8b40942 (patch) | |
tree | 60f4145527722c135e72cbe451b63f7499dd32a5 /recordmydesktop/src/rmd_setbrwindow.c | |
parent | 187945d42050c99c614ccf76099944b338461a19 (diff) |
src/*.[ch]: Rename files so that the name becomes
rmd_some_file.[ch]. The exceptions are recordmydesktop.c which is the
main file and skeleton.[ch] which are external files.
src/Makefile.am: Adapt.
git-svn-id: https://recordmydesktop.svn.sourceforge.net/svnroot/recordmydesktop/trunk@546 f606c939-3180-4ac9-a4b8-4b8779d57d0a
Diffstat (limited to 'recordmydesktop/src/rmd_setbrwindow.c')
-rw-r--r-- | recordmydesktop/src/rmd_setbrwindow.c | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/recordmydesktop/src/rmd_setbrwindow.c b/recordmydesktop/src/rmd_setbrwindow.c new file mode 100644 index 0000000..17b77bb --- /dev/null +++ b/recordmydesktop/src/rmd_setbrwindow.c @@ -0,0 +1,213 @@ +/****************************************************************************** +* recordMyDesktop * +******************************************************************************* +* * +* Copyright (C) 2006,2007,2008 John Varouhakis * +* * +* * +* This program is free software; you can redistribute it and/or modify * +* it under the terms of the GNU General Public License as published by * +* the Free Software Foundation; either version 2 of the License, or * +* (at your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* 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 General Public License * +* along with this program; if not, write to the Free Software * +* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * +* * +* * +* * +* For further information contact me at johnvarouhakis@gmail.com * +******************************************************************************/ + +#include "config.h" + +#include "rmd_types.h" + +#include "rmd_setbrwindow.h" + + +/** +*Align the recording window to a divisible by 2 pixel start and +*and a size divisible by 16. +* +* \param start x or y of the recording window +* +* \param size width or height of the recording window +* +* \param limit width or height of the Display +* +* \note This is called separately for width and height. +*/ +static void SizePack2_8_16(int *start, int *size, int limit) { + int octoffset,hexoffset; + + //align in two + //an odd x can always go down and still be in recording area. + //Resolutions come in even numbers + //so if x is an odd numer, width max is an odd number, too + //thus since x will go down one then width can go up one too and still + //be inbounds + (*size)+=((*size)%2)|((*start)%2); + //but if x goes down 1 and width is already even,it becomes odd so: + (*size)+=((*size)%2); + (*start)-=(*start)%2; + + + //32 bit pack align + //we already have disible by two width,so + //it's 2, 4 or 6 + octoffset=((*size)%8); + if(octoffset==2){ + (*size)-=2; + + } + else if(octoffset==6){ + if((*size)+(*start)+2<=limit) + (*size)+=2; + else if((*start)>=2){ + (*start)-=2; + (*size)+=2; + } + else{ + (*start)+=2; + (*size)-=4; + } + } + + else if(octoffset==4){ + if(((*size)+(*start)+2<=limit)&&((*start)>=2)){ + (*start)-=2; + (*size)+=4; + } + else if((*size)+(*start)+4<=limit){ + (*size)+=4; + } + else if((*start)>=4){ + (*start)-=4; + (*size)+=4; + } + else{ + (*start)+=2; + (*size)-=4; + } + } + + //16 divisble width(needed for shared memory only, + //but applied anyway since theora wants it, too) + //we already have divisibility by 8 so module + //by 16 is euther 8 or 0 + hexoffset=((*size)%16); + if(hexoffset){ + if(((*size)+(*start)+4<=limit)&&((*start)>=4)){ + (*start)-=4; + (*size)+=8; + } + else if((*size)+(*start)+8<=limit){ + (*size)+=8; + } + else if((*start)>=8){ + (*start)-=8; + (*size)+=8; + } + else{ + (*start)+=4; + (*size)-=8; + } + } + +} + + + +int SetBRWindow(Display *dpy, + BRWindow *brwin, + DisplaySpecs *specs, + ProgArgs *args){ + //before we start recording we have to make sure the ranges are valid + if(args->windowid==0){//root window + //first set it up + brwin->windowid=specs->root; + brwin->geom.x=brwin->geom.y=0; + brwin->geom.width=specs->width; + brwin->geom.height=specs->height; + brwin->rgeom.x=args->x; + brwin->rgeom.y=args->y; + brwin->rgeom.width=((args->width)? + args->width:specs->width-brwin->rgeom.x); + brwin->rgeom.height=((args->height)? + args->height:specs->height-brwin->rgeom.y); + //and then check validity + if((brwin->rgeom.x+brwin->rgeom.width>specs->width)|| + (brwin->rgeom.y+brwin->rgeom.height>specs->height)){ + fprintf(stderr,"Window size specification out of bounds!" + "(current resolution:%dx%d)\n", + specs->width,specs->height); + return 1; + } + } + else{ + Window wchid; + int transl_x,transl_y; + + XWindowAttributes attribs; + XGetWindowAttributes(dpy,args->windowid,&attribs); + if((attribs.map_state==IsUnviewable)||(attribs.map_state==IsUnmapped)){ + fprintf(stderr,"Window must be mapped and visible!\n"); + return 1; + } + XTranslateCoordinates(dpy, + specs->root, + args->windowid, + attribs.x, + attribs.y, + &transl_x, + &transl_y, + &wchid); + + brwin->geom.x=attribs.x-transl_x; + brwin->geom.y=attribs.y-transl_y; + brwin->geom.width=attribs.width; + brwin->geom.height=attribs.height; + if((brwin->geom.x+brwin->geom.width>specs->width)|| + (brwin->geom.y+brwin->geom.height>specs->height)){ + fprintf(stderr,"Window must be on visible screen area!\n"); + return 1; + } + + brwin->rgeom.x=brwin->geom.x+args->x; + brwin->rgeom.y=brwin->geom.y+args->y; + brwin->rgeom.width=((args->width)? + args->width:brwin->geom.width-args->x); + brwin->rgeom.height=((args->height)? + args->height:brwin->geom.height-args->y); + if((args->x+brwin->rgeom.width>brwin->geom.width)|| + (args->y+brwin->rgeom.height>brwin->geom.height)){ + fprintf(stderr,"Specified Area is larger than window!\n"); + return 1; + } + } + fprintf(stderr, "Initial recording window is set to:\n" + "X:%d Y:%d Width:%d Height:%d\n", + brwin->rgeom.x,brwin->rgeom.y, + brwin->rgeom.width,brwin->rgeom.height); + SizePack2_8_16(&brwin->rgeom.x,&brwin->rgeom.width,specs->width); + SizePack2_8_16(&brwin->rgeom.y,&brwin->rgeom.height,specs->height); + + fprintf(stderr, "Adjusted recording window is set to:\n" + "X:%d Y:%d Width:%d Height:%d\n", + brwin->rgeom.x,brwin->rgeom.y, + brwin->rgeom.width,brwin->rgeom.height); + + + + brwin->nbytes=(((brwin->rgeom.width+15)>>4)<<4)* + (((brwin->rgeom.height+15)>>4)<<4)* + ((specs->depth==16)?2:4); + + return 0; +} |