static FBAreaPtr localAllocateOffscreenArea(ScreenPtr pScreen, int w, int h, int gran, MoveAreaCallbackProcPtr moveCB, RemoveAreaCallbackProcPtr removeCB, void *privData) { FBManagerPtr offman; FBAreaPtr area = NULL; offman = (FBManagerPtr) dixLookupPrivate(&pScreen->devPrivates, xf86FBScreenKey); if ((area = AllocateArea(offman, w, h, gran, moveCB, removeCB, privData))) SendCallFreeBoxCallbacks(offman); return area; }
static FBAreaPtr localAllocateOffscreenArea( ScreenPtr pScreen, int w, int h, int gran, MoveAreaCallbackProcPtr moveCB, RemoveAreaCallbackProcPtr removeCB, pointer privData ){ FBManagerPtr offman; FBAreaPtr area = NULL; offman = pScreen->devPrivates[xf86FBScreenIndex].ptr; if((area = AllocateArea(offman, w, h, gran, moveCB, removeCB, privData))) SendCallFreeBoxCallbacks(offman); return area; }
static Bool localResizeOffscreenArea( FBAreaPtr resize, int w, int h ){ FBManagerPtr offman; ScreenPtr pScreen; BoxRec OrigArea; RegionRec FreedReg; FBAreaPtr area = NULL; FBLinkPtr pLink, newLink, pLinkPrev = NULL; pScreen = resize->pScreen; offman = pScreen->devPrivates[xf86FBScreenIndex].ptr; /* find this link */ if(!(pLink = offman->UsedAreas)) return FALSE; while(&(pLink->area) != resize) { pLinkPrev = pLink; pLink = pLink->next; if(!pLink) return FALSE; } OrigArea.x1 = resize->box.x1; OrigArea.x2 = resize->box.x2; OrigArea.y1 = resize->box.y1; OrigArea.y2 = resize->box.y2; /* if it's smaller, this is easy */ if((w <= (resize->box.x2 - resize->box.x1)) && (h <= (resize->box.y2 - resize->box.y1))) { RegionRec NewReg; resize->box.x2 = resize->box.x1 + w; resize->box.y2 = resize->box.y1 + h; if((resize->box.y2 == OrigArea.y2) && (resize->box.x2 == OrigArea.x2)) return TRUE; REGION_INIT(pScreen, &FreedReg, &OrigArea, 1); REGION_INIT(pScreen, &NewReg, &(resize->box), 1); REGION_SUBTRACT(pScreen, &FreedReg, &FreedReg, &NewReg); REGION_UNION(pScreen, offman->FreeBoxes, offman->FreeBoxes, &FreedReg); REGION_UNINIT(pScreen, &FreedReg); REGION_UNINIT(pScreen, &NewReg); SendCallFreeBoxCallbacks(offman); return TRUE; } /* otherwise we remove the old region */ REGION_INIT(pScreen, &FreedReg, &OrigArea, 1); REGION_UNION(pScreen, offman->FreeBoxes, offman->FreeBoxes, &FreedReg); /* remove the old link */ if(pLinkPrev) pLinkPrev->next = pLink->next; else offman->UsedAreas = pLink->next; /* and try to add a new one */ if((area = AllocateArea(offman, w, h, resize->granularity, resize->MoveAreaCallback, resize->RemoveAreaCallback, resize->devPrivate.ptr))) { /* copy data over to our link and replace the new with old */ memcpy(resize, area, sizeof(FBArea)); pLinkPrev = NULL; newLink = offman->UsedAreas; while(&(newLink->area) != area) { pLinkPrev = newLink; newLink = newLink->next; } if(pLinkPrev) pLinkPrev->next = newLink->next; else offman->UsedAreas = newLink->next; pLink->next = offman->UsedAreas; offman->UsedAreas = pLink; xfree(newLink); /* AllocateArea added one but we really only exchanged one */ offman->NumUsedAreas--; } else { /* reinstate the old region */ REGION_SUBTRACT(pScreen, offman->FreeBoxes, offman->FreeBoxes, &FreedReg); REGION_UNINIT(pScreen, &FreedReg); pLink->next = offman->UsedAreas; offman->UsedAreas = pLink; return FALSE; } REGION_UNINIT(pScreen, &FreedReg); SendCallFreeBoxCallbacks(offman); return TRUE; }