diff options
Diffstat (limited to 'recordmydesktop')
-rw-r--r-- | recordmydesktop/src/rmd_rectinsert.c | 259 |
1 files changed, 126 insertions, 133 deletions
diff --git a/recordmydesktop/src/rmd_rectinsert.c b/recordmydesktop/src/rmd_rectinsert.c index df43e15..bc70e44 100644 --- a/recordmydesktop/src/rmd_rectinsert.c +++ b/recordmydesktop/src/rmd_rectinsert.c @@ -56,7 +56,7 @@ */ static int CollideRects(WGeometry *wgeom1, WGeometry *wgeom2, - WGeometry **wgeom_return, + WGeometry wgeom_return[], int *ngeoms) { //1 fits in 2 if((wgeom1->x>=wgeom2->x)&& @@ -118,89 +118,88 @@ static int CollideRects(WGeometry *wgeom1, //group if((enclosed[1][0]&&enclosed[1][1])&& (wgeom1->width==wgeom2->width)){ - wgeom_return[0]=(WGeometry *)malloc(sizeof(WGeometry)); *ngeoms=1; - wgeom_return[0]->x=wgeom1->x; - wgeom_return[0]->y=wgeom1->y; - wgeom_return[0]->width=wgeom1->width; - wgeom_return[0]->height=wgeom2->height+wgeom2->y-wgeom1->y; + wgeom_return[0].x = wgeom1->x; + wgeom_return[0].y = wgeom1->y; + wgeom_return[0].width = wgeom1->width; + wgeom_return[0].height = wgeom2->height + wgeom2->y - wgeom1->y; return -10; } else if((enclosed[1][0]&&enclosed[1][2])&& (wgeom1->height==wgeom2->height)){ *ngeoms=1; - wgeom_return[0]->x=wgeom1->x; - wgeom_return[0]->y=wgeom1->y; - wgeom_return[0]->width=wgeom2->width+wgeom2->x-wgeom1->x; - wgeom_return[0]->height=wgeom1->height; + wgeom_return[0].x = wgeom1->x; + wgeom_return[0].y = wgeom1->y; + wgeom_return[0].width = wgeom2->width + wgeom2->x - wgeom1->x; + wgeom_return[0].height = wgeom1->height; return -10; } else if((enclosed[1][3]&&enclosed[1][1])&& (wgeom1->height==wgeom2->height)){ *ngeoms=1; - wgeom_return[0]->x=wgeom2->x; - wgeom_return[0]->y=wgeom2->y; - wgeom_return[0]->width=wgeom1->width+wgeom1->x-wgeom2->x; - wgeom_return[0]->height=wgeom2->height; + wgeom_return[0].x = wgeom2->x; + wgeom_return[0].y = wgeom2->y; + wgeom_return[0].width = wgeom1->width + wgeom1->x - wgeom2->x; + wgeom_return[0].height = wgeom2->height; return -10; } else if((enclosed[1][3]&&enclosed[1][2])&& (wgeom1->width==wgeom2->width)){ *ngeoms=1; - wgeom_return[0]->x=wgeom2->x; - wgeom_return[0]->y=wgeom2->y; - wgeom_return[0]->width=wgeom2->width; - wgeom_return[0]->height=wgeom1->height+wgeom1->y-wgeom2->y; + wgeom_return[0].x = wgeom2->x; + wgeom_return[0].y = wgeom2->y; + wgeom_return[0].width = wgeom2->width; + wgeom_return[0].height = wgeom1->height + wgeom1->y - wgeom2->y; return -10; } //if control reaches here therewasn't a group and we go on } if(tot2==2){ //break geom2 - wgeom_return[0]->x=wgeom2->x; - wgeom_return[0]->y=wgeom2->y; - wgeom_return[0]->width=wgeom2->width; - wgeom_return[0]->height=wgeom2->height; + wgeom_return[0].x = wgeom2->x; + wgeom_return[0].y = wgeom2->y; + wgeom_return[0].width = wgeom2->width; + wgeom_return[0].height = wgeom2->height; *ngeoms=1; if(enclosed[1][0]&&enclosed[1][1]){ - wgeom_return[0]->y=y1[1]; - wgeom_return[0]->height-=y1[1]-y2[0]; + wgeom_return[0].y = y1[1]; + wgeom_return[0].height -= y1[1] - y2[0]; } else if(enclosed[1][0]&&enclosed[1][2]){ - wgeom_return[0]->x=x1[1]; - wgeom_return[0]->width-=x1[1]-x2[0]; + wgeom_return[0].x = x1[1]; + wgeom_return[0].width -= x1[1] - x2[0]; } else if(enclosed[1][3]&&enclosed[1][1]) - wgeom_return[0]->width-=x2[1]-x1[0]; + wgeom_return[0].width -= x2[1] - x1[0]; else if(enclosed[1][3]&&enclosed[1][2]) - wgeom_return[0]->height-=y2[1]-y1[0]; + wgeom_return[0].height -= y2[1] - y1[0]; return -2; } else if(tot1==2){ //if the first one breaks(which is already inserted) //then we reenter the part that was left and the one //that was to be inserted - wgeom_return[1]->x=wgeom2->x; - wgeom_return[1]->y=wgeom2->y; - wgeom_return[1]->width=wgeom2->width; - wgeom_return[1]->height=wgeom2->height; - wgeom_return[0]->x=wgeom1->x; - wgeom_return[0]->y=wgeom1->y; - wgeom_return[0]->width=wgeom1->width; - wgeom_return[0]->height=wgeom1->height; + wgeom_return[1].x = wgeom2->x; + wgeom_return[1].y = wgeom2->y; + wgeom_return[1].width = wgeom2->width; + wgeom_return[1].height = wgeom2->height; + wgeom_return[0].x = wgeom1->x; + wgeom_return[0].y = wgeom1->y; + wgeom_return[0].width = wgeom1->width; + wgeom_return[0].height = wgeom1->height; *ngeoms=1; if(enclosed[0][0]&&enclosed[0][1]){ - wgeom_return[0]->y=y2[1]; - wgeom_return[0]->height-=y2[1]-y1[0]; + wgeom_return[0].y = y2[1]; + wgeom_return[0].height -= y2[1] - y1[0]; } else if(enclosed[0][0]&&enclosed[0][2]){ - wgeom_return[0]->x=x2[1]; - wgeom_return[0]->width-=x2[1]-x1[0]; + wgeom_return[0].x = x2[1]; + wgeom_return[0].width -= x2[1] - x1[0]; } else if(enclosed[0][3]&&enclosed[0][1]) - wgeom_return[0]->width-=x1[1]-x2[0]; + wgeom_return[0].width -= x1[1] - x2[0]; else if(enclosed[0][3]&&enclosed[0][2]) - wgeom_return[0]->height-=y1[1]-y2[0]; + wgeom_return[0].height -= y1[1] - y2[0]; return -1; } @@ -210,51 +209,51 @@ static int CollideRects(WGeometry *wgeom1, *ngeoms=2; if(enclosed[1][0]){ //first - wgeom_return[0]->x=x1[1]; - wgeom_return[0]->y=y2[0]; - wgeom_return[0]->width=wgeom2->width-x1[1]+x2[0]; - wgeom_return[0]->height=wgeom2->height; + wgeom_return[0].x = x1[1]; + wgeom_return[0].y = y2[0]; + wgeom_return[0].width = wgeom2->width - x1[1] + x2[0]; + wgeom_return[0].height = wgeom2->height; //second - wgeom_return[1]->x=x2[0]; - wgeom_return[1]->y=y1[1]; - wgeom_return[1]->width=x1[1]-x2[0]; - wgeom_return[1]->height=wgeom2->height-y1[1]+y2[0]; + wgeom_return[1].x = x2[0]; + wgeom_return[1].y = y1[1]; + wgeom_return[1].width = x1[1] - x2[0]; + wgeom_return[1].height = wgeom2->height - y1[1] + y2[0]; } else if(enclosed[1][1]){ //first - wgeom_return[0]->x=x2[0]; - wgeom_return[0]->y=y2[0]; - wgeom_return[0]->width=wgeom2->width-x2[1]+x1[0]; - wgeom_return[0]->height=wgeom2->height; + wgeom_return[0].x = x2[0]; + wgeom_return[0].y = y2[0]; + wgeom_return[0].width = wgeom2->width - x2[1] + x1[0]; + wgeom_return[0].height = wgeom2->height; //second - wgeom_return[1]->x=x1[0]; - wgeom_return[1]->y=y1[1]; - wgeom_return[1]->width=x2[1]-x1[0]; - wgeom_return[1]->height=wgeom2->height-y1[1]+y2[0]; + wgeom_return[1].x = x1[0]; + wgeom_return[1].y = y1[1]; + wgeom_return[1].width = x2[1] - x1[0]; + wgeom_return[1].height = wgeom2->height - y1[1] + y2[0]; } else if(enclosed[1][2]){ //first(same as [1][0]) - wgeom_return[0]->x=x1[1]; - wgeom_return[0]->y=y2[0]; - wgeom_return[0]->width=wgeom2->width-x1[1]+x2[0]; - wgeom_return[0]->height=wgeom2->height; + wgeom_return[0].x = x1[1]; + wgeom_return[0].y = y2[0]; + wgeom_return[0].width = wgeom2->width - x1[1] + x2[0]; + wgeom_return[0].height = wgeom2->height; //second - wgeom_return[1]->x=x2[0]; - wgeom_return[1]->y=y2[0]; - wgeom_return[1]->width=x1[1]-x2[0]; - wgeom_return[1]->height=wgeom2->height-y2[1]+y1[0]; + wgeom_return[1].x = x2[0]; + wgeom_return[1].y = y2[0]; + wgeom_return[1].width = x1[1] - x2[0]; + wgeom_return[1].height = wgeom2->height - y2[1] + y1[0]; } else if(enclosed[1][3]){ //first(same as [1][1]) - wgeom_return[0]->x=x2[0]; - wgeom_return[0]->y=y2[0]; - wgeom_return[0]->width=wgeom2->width-x2[1]+x1[0]; - wgeom_return[0]->height=wgeom2->height; + wgeom_return[0].x = x2[0]; + wgeom_return[0].y = y2[0]; + wgeom_return[0].width = wgeom2->width - x2[1] + x1[0]; + wgeom_return[0].height = wgeom2->height; //second - wgeom_return[1]->x=x1[0]; - wgeom_return[1]->y=y2[0]; - wgeom_return[1]->width=x2[1]-x1[0]; - wgeom_return[1]->height=wgeom2->height-y2[1]+y1[0]; + wgeom_return[1].x = x1[0]; + wgeom_return[1].y = y2[0]; + wgeom_return[1].width = x2[1] - x1[0]; + wgeom_return[1].height = wgeom2->height - y2[1] + y1[0]; } return -2; } @@ -269,23 +268,23 @@ static int CollideRects(WGeometry *wgeom1, *ngeoms=2; if(wgeom2->y<wgeom1->y){ //common - wgeom_return[0]->x=wgeom_return[1]->x=x2[0]; - wgeom_return[0]->width=wgeom_return[1]->width=wgeom2->width; + wgeom_return[0].x = wgeom_return[1].x = x2[0]; + wgeom_return[0].width = wgeom_return[1].width = wgeom2->width; - wgeom_return[0]->y=y2[0]; - wgeom_return[0]->height=wgeom2->height-y2[1]+y1[0]; - wgeom_return[1]->y=y1[1]; - wgeom_return[1]->height=y2[1]-y1[1]; + wgeom_return[0].y = y2[0]; + wgeom_return[0].height = wgeom2->height - y2[1] + y1[0]; + wgeom_return[1].y = y1[1]; + wgeom_return[1].height = y2[1] - y1[1]; } else{ //common - wgeom_return[0]->y=wgeom_return[1]->y=y2[0]; - wgeom_return[0]->height=wgeom_return[1]->height=wgeom2->height; + wgeom_return[0].y = wgeom_return[1].y = y2[0]; + wgeom_return[0].height = wgeom_return[1].height = wgeom2->height; - wgeom_return[0]->x=x2[0]; - wgeom_return[0]->width=wgeom2->width-x2[1]+x1[0]; - wgeom_return[1]->x=x1[1]; - wgeom_return[1]->width=x2[1]-x1[1]; + wgeom_return[0].x = x2[0]; + wgeom_return[0].width = wgeom2->width - x2[1] + x1[0]; + wgeom_return[1].x = x1[1]; + wgeom_return[1].width = x2[1] - x1[1]; } return -2; } @@ -316,27 +315,25 @@ int RectInsert(RectArea **root,WGeometry *wgeom){ total_insertions=1; } else{ - WGeometry *wgeom_return[2]; - wgeom_return[0]=(WGeometry *)malloc(sizeof(WGeometry)); - wgeom_return[1]=(WGeometry *)malloc(sizeof(WGeometry)); + WGeometry wgeom_return[2]; int ngeoms=0,insert_ok=1,i=0; temp=*root; while(insert_ok){ //if something is broken list does not procceed //(except on -1 collres case) - int collres=CollideRects(&(temp->geom),wgeom,wgeom_return,&ngeoms); + int collres = CollideRects(&temp->geom, wgeom, &wgeom_return[0], &ngeoms); if((!collres)) insert_ok=1; else{ for(i=0;i<ngeoms;i++){ - wgeom_return[i]->width+=(wgeom_return[i]->width%2)| - (wgeom_return[i]->x%2); - wgeom_return[i]->height+=(wgeom_return[i]->height%2)| - (wgeom_return[i]->y%2); - wgeom_return[i]->width+=(wgeom_return[i]->width%2); - wgeom_return[i]->height+=(wgeom_return[i]->height%2); - wgeom_return[i]->x-=wgeom_return[i]->x%2; - wgeom_return[i]->y-=wgeom_return[i]->y%2; + wgeom_return[i].width += (wgeom_return[i].width % 2) | + (wgeom_return[i].x % 2); + wgeom_return[i].height += (wgeom_return[i].height % 2) | + (wgeom_return[i].y % 2); + wgeom_return[i].width += (wgeom_return[i].width % 2); + wgeom_return[i].height += (wgeom_return[i].height % 2); + wgeom_return[i].x -= wgeom_return[i].x % 2; + wgeom_return[i].y -= wgeom_return[i].y % 2; } insert_ok=0; switch(collres){ @@ -382,12 +379,12 @@ int RectInsert(RectArea **root,WGeometry *wgeom){ case -1://current node is broken and reinserted //(in same pos) //newnode is also reinserted - if((wgeom_return[0]->width>0)&& - (wgeom_return[0]->height>0)){ - temp->geom.x=wgeom_return[0]->x; - temp->geom.y=wgeom_return[0]->y; - temp->geom.width=wgeom_return[0]->width; - temp->geom.height=wgeom_return[0]->height; + if (wgeom_return[0].width > 0 && + wgeom_return[0].height > 0) { + temp->geom.x = wgeom_return[0].x; + temp->geom.y = wgeom_return[0].y; + temp->geom.width = wgeom_return[0].width; + temp->geom.height = wgeom_return[0].height; if(temp->next==NULL){ temp->next=newnode; newnode->prev=temp; @@ -423,20 +420,20 @@ int RectInsert(RectArea **root,WGeometry *wgeom){ case -2://new is broken and reinserted if(temp->next==NULL){ total_insertions+=ngeoms; - newnode->geom.x=wgeom_return[0]->x; - newnode->geom.y=wgeom_return[0]->y; - newnode->geom.width=wgeom_return[0]->width; - newnode->geom.height=wgeom_return[0]->height; + newnode->geom.x = wgeom_return[0].x; + newnode->geom.y = wgeom_return[0].y; + newnode->geom.width = wgeom_return[0].width; + newnode->geom.height = wgeom_return[0].height; temp->next=newnode; newnode->prev=temp; if(ngeoms>1){ RectArea *newnode1= (RectArea *)malloc(sizeof(RectArea)); - newnode1->geom.x=wgeom_return[1]->x; - newnode1->geom.y=wgeom_return[1]->y; - newnode1->geom.width=wgeom_return[1]->width; - newnode1->geom.height=wgeom_return[1]->height; + newnode1->geom.x = wgeom_return[1].x; + newnode1->geom.y = wgeom_return[1].y; + newnode1->geom.width = wgeom_return[1].width; + newnode1->geom.height = wgeom_return[1].height; newnode->next=newnode1; newnode1->prev=newnode; newnode1->next=NULL; @@ -444,21 +441,20 @@ int RectInsert(RectArea **root,WGeometry *wgeom){ } else{ for(i=0;i<ngeoms;i++){ - if((wgeom_return[i]->width>0)&& - (wgeom_return[i]->height>0)) + if(wgeom_return[i].width > 0 && + wgeom_return[i].height > 0) total_insertions+= - RectInsert(&temp->next,wgeom_return[i]); + RectInsert(&temp->next, &wgeom_return[i]); } } break; case -10://grouped if(temp->prev==NULL){ if(temp->next==NULL){//empty list - newnode->geom.x=wgeom_return[0]->x; - newnode->geom.y=wgeom_return[0]->y; - newnode->geom.width=wgeom_return[0]->width; - newnode->geom.height= - wgeom_return[0]->height; + newnode->geom.x = wgeom_return[0].x; + newnode->geom.y = wgeom_return[0].y; + newnode->geom.width = wgeom_return[0].width; + newnode->geom.height = wgeom_return[0].height; *root=newnode; free(temp); @@ -468,17 +464,17 @@ int RectInsert(RectArea **root,WGeometry *wgeom){ *root=temp->next; (*root)->prev=NULL; free(temp); - if((wgeom_return[0]->width>0)&& - (wgeom_return[0]->height>0)) + if(wgeom_return[0].width > 0 && + wgeom_return[0].height > 0) total_insertions+= - RectInsert(root,wgeom_return[0]); + RectInsert(root, &wgeom_return[0]); } } else if(temp->next==NULL){//last, enter anyway - newnode->geom.x=wgeom_return[0]->x; - newnode->geom.y=wgeom_return[0]->y; - newnode->geom.width=wgeom_return[0]->width; - newnode->geom.height=wgeom_return[0]->height; + newnode->geom.x = wgeom_return[0].x; + newnode->geom.y = wgeom_return[0].y; + newnode->geom.width = wgeom_return[0].width; + newnode->geom.height = wgeom_return[0].height; temp->prev->next=newnode; newnode->prev=temp->prev; free(temp); @@ -489,10 +485,10 @@ int RectInsert(RectArea **root,WGeometry *wgeom){ temp->prev->next=temp->next; temp->next->prev=temp->prev; free(temp); - if((wgeom_return[0]->width>0)&& - (wgeom_return[0]->height>0)) + if(wgeom_return[0].width > 0 && + wgeom_return[0].height > 0) total_insertions+= - RectInsert(&temp1,wgeom_return[0]); + RectInsert(&temp1, &wgeom_return[0]); } break; } @@ -512,9 +508,6 @@ int RectInsert(RectArea **root,WGeometry *wgeom){ break; } }; - - free(wgeom_return[0]); - free(wgeom_return[1]); } return total_insertions; } |