]> git.sesse.net Git - rdpsrv/blobdiff - Xserver/programs/Xserver/cfb/cfbbstore.c
Import X server from vnc-3.3.7.
[rdpsrv] / Xserver / programs / Xserver / cfb / cfbbstore.c
diff --git a/Xserver/programs/Xserver/cfb/cfbbstore.c b/Xserver/programs/Xserver/cfb/cfbbstore.c
new file mode 100644 (file)
index 0000000..022a048
--- /dev/null
@@ -0,0 +1,150 @@
+/*-
+ * cfbbstore.c --
+ *     Functions required by the backing-store implementation in MI.
+ *
+ * Copyright (c) 1987 by the Regents of the University of California
+ *
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ *
+ *
+ */
+#ifndef lint
+static char rcsid[] =
+"$XConsortium: cfbbstore.c,v 5.8 93/12/13 17:21:51 dpw Exp $ SPRITE (Berkeley)";
+#endif
+
+#include    "cfb.h"
+#include    "X.h"
+#include    "mibstore.h"
+#include    "regionstr.h"
+#include    "scrnintstr.h"
+#include    "pixmapstr.h"
+#include    "windowstr.h"
+
+/*-
+ *-----------------------------------------------------------------------
+ * cfbSaveAreas --
+ *     Function called by miSaveAreas to actually fetch the areas to be
+ *     saved into the backing pixmap. This is very simple to do, since
+ *     cfbDoBitblt is designed for this very thing. The region to save is
+ *     already destination-relative and we're given the offset to the
+ *     window origin, so we have only to create an array of points of the
+ *     u.l. corners of the boxes in the region translated to the screen
+ *     coordinate system and fetch the screen pixmap out of its devPrivate
+ *     field....
+ *
+ * Results:
+ *     None.
+ *
+ * Side Effects:
+ *     Data are copied from the screen into the pixmap.
+ *
+ *-----------------------------------------------------------------------
+ */
+void
+cfbSaveAreas(pPixmap, prgnSave, xorg, yorg, pWin)
+    PixmapPtr          pPixmap;        /* Backing pixmap */
+    RegionPtr          prgnSave;       /* Region to save (pixmap-relative) */
+    int                        xorg;           /* X origin of region */
+    int                        yorg;           /* Y origin of region */
+    WindowPtr          pWin;
+{
+    register DDXPointPtr pPt;
+    DDXPointPtr                pPtsInit;
+    register BoxPtr    pBox;
+    register int       i;
+    ScreenPtr          pScreen = pPixmap->drawable.pScreen;
+    PixmapPtr          pScrPix;
+    
+    i = REGION_NUM_RECTS(prgnSave);
+    pPtsInit = (DDXPointPtr)ALLOCATE_LOCAL(i * sizeof(DDXPointRec));
+    if (!pPtsInit)
+       return;
+    
+    pBox = REGION_RECTS(prgnSave);
+    pPt = pPtsInit;
+    while (--i >= 0) {
+       pPt->x = pBox->x1 + xorg;
+       pPt->y = pBox->y1 + yorg;
+       pPt++;
+       pBox++;
+    }
+
+#ifdef CFB_NEED_SCREEN_PRIVATE
+    pScrPix = (PixmapPtr) pScreen->devPrivates[cfbScreenPrivateIndex].ptr;
+#else
+    pScrPix = (PixmapPtr) pScreen->devPrivate;
+#endif
+
+    cfbDoBitbltCopy((DrawablePtr) pScrPix, (DrawablePtr)pPixmap,
+                   GXcopy, prgnSave, pPtsInit, ~0L);
+
+    DEALLOCATE_LOCAL (pPtsInit);
+}
+
+/*-
+ *-----------------------------------------------------------------------
+ * cfbRestoreAreas --
+ *     Function called by miRestoreAreas to actually fetch the areas to be
+ *     restored from the backing pixmap. This is very simple to do, since
+ *     cfbDoBitblt is designed for this very thing. The region to restore is
+ *     already destination-relative and we're given the offset to the
+ *     window origin, so we have only to create an array of points of the
+ *     u.l. corners of the boxes in the region translated to the pixmap
+ *     coordinate system and fetch the screen pixmap out of its devPrivate
+ *     field....
+ *
+ * Results:
+ *     None.
+ *
+ * Side Effects:
+ *     Data are copied from the pixmap into the screen.
+ *
+ *-----------------------------------------------------------------------
+ */
+void
+cfbRestoreAreas(pPixmap, prgnRestore, xorg, yorg, pWin)
+    PixmapPtr          pPixmap;        /* Backing pixmap */
+    RegionPtr          prgnRestore;    /* Region to restore (screen-relative)*/
+    int                        xorg;           /* X origin of window */
+    int                        yorg;           /* Y origin of window */
+    WindowPtr          pWin;
+{
+    register DDXPointPtr pPt;
+    DDXPointPtr                pPtsInit;
+    register BoxPtr    pBox;
+    register int       i;
+    ScreenPtr          pScreen = pPixmap->drawable.pScreen;
+    PixmapPtr          pScrPix;
+    
+    i = REGION_NUM_RECTS(prgnRestore);
+    pPtsInit = (DDXPointPtr)ALLOCATE_LOCAL(i*sizeof(DDXPointRec));
+    if (!pPtsInit)
+       return;
+    
+    pBox = REGION_RECTS(prgnRestore);
+    pPt = pPtsInit;
+    while (--i >= 0) {
+       pPt->x = pBox->x1 - xorg;
+       pPt->y = pBox->y1 - yorg;
+       pPt++;
+       pBox++;
+    }
+
+#ifdef CFB_NEED_SCREEN_PRIVATE
+    pScrPix = (PixmapPtr) pScreen->devPrivates[cfbScreenPrivateIndex].ptr;
+#else
+    pScrPix = (PixmapPtr) pScreen->devPrivate;
+#endif
+
+    cfbDoBitbltCopy((DrawablePtr)pPixmap, (DrawablePtr) pScrPix,
+                   GXcopy, prgnRestore, pPtsInit, ~0L);
+
+    DEALLOCATE_LOCAL (pPtsInit);
+}