home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / X / mit / server / ddx / ibm / pgc / pgcWindow.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-07-16  |  4.4 KB  |  158 lines

  1. /*
  2.  * $XConsortium: pgcWindow.c,v 1.2 91/07/16 13:13:11 jap Exp $
  3.  *
  4.  * Copyright IBM Corporation 1987,1988,1989,1990,1991
  5.  *
  6.  * All Rights Reserved
  7.  *
  8.  * License to use, copy, modify, and distribute this software and its
  9.  * documentation for any purpose and without fee is hereby granted,
  10.  * provided that the above copyright notice appear in all copies and that
  11.  * both that copyright notice and this permission notice appear in
  12.  * supporting documentation, and that the name of IBM not be
  13.  * used in advertising or publicity pertaining to distribution of the
  14.  * software without specific, written prior permission.
  15.  *
  16.  * IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
  17.  * ALL IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS, AND 
  18.  * NONINFRINGEMENT OF THIRD PARTY RIGHTS, IN NO EVENT SHALL
  19.  * IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
  20.  * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  21.  * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
  22.  * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
  23.  * SOFTWARE.
  24.  *
  25. */
  26.  
  27. #include "X.h"
  28. #include "scrnintstr.h"
  29. #include "windowstr.h"
  30. #include "mfb.h"
  31. #include "mistruct.h"
  32. #include "regionstr.h"
  33.  
  34. #include "ibmTrace.h"
  35.  
  36. #include "pgc.h"
  37.  
  38. extern pgcScreenRec pgcScreenInfo[] ;
  39.  
  40. /*
  41. pgcCopyWindow copies only the parts of the destination that are
  42. visible in the source.
  43. */
  44.  
  45. void 
  46. pgcCopyWindow(pWin, ptOldOrg, prgnSrc)
  47.     register WindowPtr pWin ;
  48.     DDXPointRec ptOldOrg ;
  49.     RegionPtr prgnSrc ;
  50. {
  51.     RegionPtr prgnDst ;
  52.     register BoxPtr pbox ;
  53.     register int dx, dy ;
  54.     register int nbox ;
  55.     register int pm ;
  56.     BoxPtr pboxTmp, pboxNext, pboxBase, pboxNew ;
  57.     void (* fnp)() ;
  58.     pgcScreenPtr pPGCScreen ;
  59.     int index ;
  60.  
  61.     TRACE(("pgcCopyWindow(pWin= 0x%x, ptOldOrg= 0x%x, prgnSrc= 0x%x)\n", pWin, ptOldOrg, prgnSrc)) ;
  62.  
  63.     dx = ptOldOrg.x - pWin->drawable.x ;
  64.     dy = ptOldOrg.y - pWin->drawable.y ;
  65.     (* pWin->drawable.pScreen->TranslateRegion)(prgnSrc, -dx, -dy) ;
  66.  
  67.     prgnDst = (* pWin->drawable.pScreen->RegionCreate)(NULL, 1);
  68.     (* pWin->drawable.pScreen->Intersect)(prgnDst, &pWin->borderClip, prgnSrc) ;
  69.  
  70.     if ( !( nbox = REGION_NUM_RECTS(prgnDst) ) )
  71.     return;
  72.  
  73.     pbox = REGION_RECTS(prgnDst);
  74.  
  75.     pboxNew = 0 ;
  76.     if ( nbox > 1 ) {
  77.     if ( dy < 0 ) {
  78.         if ( dx > 0 ) {
  79.         /* walk source bottom to top */
  80.         /* keep ordering in each band, reverse order of bands */
  81.         if ( !( pboxNew =
  82.             (BoxPtr) ALLOCATE_LOCAL( sizeof( BoxRec ) * nbox ) ) )
  83.             return ;
  84.         pboxBase = pboxNext = pbox+nbox - 1 ;
  85.         while ( pboxBase >= pbox ) {
  86.             while ( ( pboxNext >= pbox )
  87.                  && ( pboxBase->y1 == pboxNext->y1 ) )
  88.                 pboxNext-- ;
  89.             pboxTmp = pboxNext + 1 ;
  90.             while ( pboxTmp <= pboxBase )
  91.                 *pboxNew++ = *pboxTmp++ ;
  92.             pboxBase = pboxNext ;
  93.         }
  94.         pboxNew -= nbox ;
  95.         pbox = pboxNew ;
  96.         }
  97.         else { /* dx <= 0 */
  98.         /* we can just reverse the entire list in place */
  99.         /* Do three-position swaps */
  100.         BoxRec tmpBox ;
  101.  
  102.         pboxBase = pbox ;
  103.         pboxNext = pbox + nbox - 1 ;
  104.         while ( pboxBase < pboxNext ) {
  105.             /* ****** Warning Structure Assignment !! ****** */
  106.             tmpBox    = *pboxBase ;
  107.             *pboxBase = *pboxNext ;
  108.             *pboxNext = tmpBox ;
  109.             pboxBase++ ;
  110.             pboxNext-- ;
  111.         }
  112.         }
  113.     }
  114.         else if ( dx < 0 ) {
  115.     /* walk source right to left */
  116.         /* reverse order of rects in each band */
  117.         if ( !( pboxNew = (BoxPtr)ALLOCATE_LOCAL(sizeof(BoxRec) * nbox) ) )
  118.         return ;
  119.         pboxBase = pboxNext = pbox ;
  120.         while (pboxBase < pbox+nbox)
  121.         {
  122.         while ((pboxNext < pbox+nbox) &&
  123.                (pboxNext->y1 == pboxBase->y1))
  124.             pboxNext++ ;
  125.         pboxTmp = pboxNext ;
  126.         while (pboxTmp != pboxBase)
  127.             *pboxNew++ = *--pboxTmp ;
  128.         pboxBase = pboxNext ;
  129.         }
  130.         pboxNew -= nbox ;
  131.         pbox = pboxNew ;
  132.     }
  133.     } /* END if nbox > 1 */
  134.  
  135.     /*
  136.      * call blit several times, the parms are:
  137.      *   blit( alu,rplanes, wplanes, srcx, srcy, destx, desty, width, height ) ;
  138.      */
  139.  
  140.     index = pWin->drawable.pScreen->myNum ;
  141.     pPGCScreen = &pgcScreenInfo[index] ;
  142.     fnp = pPGCScreen->blit ;
  143.  
  144.     pm = ( 1 << pWin->drawable.depth ) - 1 ;
  145.     for ( ; nbox-- ; pbox++ )
  146.     (* fnp)( GXcopy, pWin->drawable.pScreen,pm, 
  147.          pbox->x1 + dx, pbox->y1 + dy, 
  148.          pbox->x1, pbox->y1, 
  149.          pbox->x2 - pbox->x1, pbox->y2 - pbox->y1) ;
  150.  
  151.     /* free up stuff */
  152.     if ( pboxNew )
  153.     DEALLOCATE_LOCAL( pboxNew ) ;
  154.  
  155.     (* pWin->drawable.pScreen->RegionDestroy)(prgnDst) ;
  156.     return ;
  157. }
  158.