Exemplo n.º 1
0
Arquivo: xf86fbman.c Projeto: aosm/X11
static void 
localFreeOffscreenLinear(FBLinearPtr linear)
{
   FBManagerPtr offman;
   FBLinearLinkPtr pLink, pLinkPrev = NULL;
   ScreenPtr pScreen = linear->pScreen;

   offman = pScreen->devPrivates[xf86FBScreenIndex].ptr;

   pLink = offman->LinearAreas;
   if(!pLink) return;  
 
   while(&(pLink->linear) != linear) {
        pLinkPrev = pLink;
        pLink = pLink->next;
        if(!pLink) return;
   }

   if(pLink->area) {  /* really an XY area */
#ifdef DEBUG
	ErrorF("FREEING AREA\n");
#endif
	localFreeOffscreenArea(pLink->area);
   	if(pLinkPrev)
	    pLinkPrev->next = pLink->next;
   	else offman->LinearAreas = pLink->next;
   	xfree(pLink); 
#ifdef DEBUG
   	Dump(offman->LinearAreas);
#endif
	return;
   }

   pLink->free = 1;

   if (pLink->next && pLink->next->free) {
      FBLinearLinkPtr p = pLink->next;
      pLink->linear.size += p->linear.size;
      pLink->next = p->next;
      free(p);
   }

   if(pLinkPrev) {
   	if (pLinkPrev->next && pLinkPrev->next->free && !pLinkPrev->area) {
      	    FBLinearLinkPtr p = pLinkPrev->next;
      	    pLinkPrev->linear.size += p->linear.size;
      	    pLinkPrev->next = p->next;
      	    free(p);
    	}
   } 
   
#ifdef DEBUG
   ErrorF("FREEING LINEAR\n");
   Dump(offman->LinearAreas);
#endif
}
Exemplo n.º 2
0
static void
localFreeOffscreenLinear(FBLinearPtr linear)
{
    FBManagerPtr offman;
    FBLinearLinkPtr pLink, pLinkPrev = NULL;
    ScreenPtr pScreen = linear->pScreen;

    offman = (FBManagerPtr) dixLookupPrivate(&pScreen->devPrivates,
                                             xf86FBScreenKey);
    pLink = offman->LinearAreas;
    if (!pLink)
        return;

    while (&(pLink->linear) != linear) {
        pLinkPrev = pLink;
        pLink = pLink->next;
        if (!pLink)
            return;
    }

    if (pLink->area) {          /* really an XY area */
        DebugF("FREEING AREA\n");
        localFreeOffscreenArea(pLink->area);
        if (pLinkPrev)
            pLinkPrev->next = pLink->next;
        else
            offman->LinearAreas = pLink->next;
        free(pLink);
        DumpDebug(offman->LinearAreas);
        return;
    }

    pLink->free = 1;

    if (pLink->next && pLink->next->free) {
        FBLinearLinkPtr p = pLink->next;

        pLink->linear.size += p->linear.size;
        pLink->next = p->next;
        free(p);
    }

    if (pLinkPrev) {
        if (pLinkPrev->next && pLinkPrev->next->free && !pLinkPrev->area) {
            FBLinearLinkPtr p = pLinkPrev->next;

            pLinkPrev->linear.size += p->linear.size;
            pLinkPrev->next = p->next;
            free(p);
        }
    }

    DebugF("FREEING LINEAR\n");
    DumpDebug(offman->LinearAreas);
}