xserver

xserver with xephyr scale patch
git clone https://git.neptards.moe/u3shit/xserver.git
Log | Files | Refs | README | LICENSE

fbfillsp.c (2875B)


      1 /*
      2  * Copyright © 1998 Keith Packard
      3  *
      4  * Permission to use, copy, modify, distribute, and sell this software and its
      5  * documentation for any purpose is hereby granted without fee, provided that
      6  * the above copyright notice appear in all copies and that both that
      7  * copyright notice and this permission notice appear in supporting
      8  * documentation, and that the name of Keith Packard not be used in
      9  * advertising or publicity pertaining to distribution of the software without
     10  * specific, written prior permission.  Keith Packard makes no
     11  * representations about the suitability of this software for any purpose.  It
     12  * is provided "as is" without express or implied warranty.
     13  *
     14  * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
     15  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
     16  * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
     17  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
     18  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
     19  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
     20  * PERFORMANCE OF THIS SOFTWARE.
     21  */
     22 
     23 #ifdef HAVE_DIX_CONFIG_H
     24 #include <dix-config.h>
     25 #endif
     26 
     27 #include "fb.h"
     28 
     29 void
     30 fbFillSpans(DrawablePtr pDrawable,
     31             GCPtr pGC, int n, DDXPointPtr ppt, int *pwidth, int fSorted)
     32 {
     33     RegionPtr pClip = fbGetCompositeClip(pGC);
     34     BoxPtr pextent, pbox;
     35     int nbox;
     36     int extentX1, extentX2, extentY1, extentY2;
     37     int fullX1, fullX2, fullY1;
     38     int partX1, partX2;
     39 
     40     pextent = RegionExtents(pClip);
     41     extentX1 = pextent->x1;
     42     extentY1 = pextent->y1;
     43     extentX2 = pextent->x2;
     44     extentY2 = pextent->y2;
     45     while (n--) {
     46         fullX1 = ppt->x;
     47         fullY1 = ppt->y;
     48         fullX2 = fullX1 + (int) *pwidth;
     49         ppt++;
     50         pwidth++;
     51 
     52         if (fullY1 < extentY1 || extentY2 <= fullY1)
     53             continue;
     54 
     55         if (fullX1 < extentX1)
     56             fullX1 = extentX1;
     57 
     58         if (fullX2 > extentX2)
     59             fullX2 = extentX2;
     60 
     61         if (fullX1 >= fullX2)
     62             continue;
     63 
     64         nbox = RegionNumRects(pClip);
     65         if (nbox == 1) {
     66             fbFill(pDrawable, pGC, fullX1, fullY1, fullX2 - fullX1, 1);
     67         }
     68         else {
     69             pbox = RegionRects(pClip);
     70             while (nbox--) {
     71                 if (pbox->y1 <= fullY1 && fullY1 < pbox->y2) {
     72                     partX1 = pbox->x1;
     73                     if (partX1 < fullX1)
     74                         partX1 = fullX1;
     75                     partX2 = pbox->x2;
     76                     if (partX2 > fullX2)
     77                         partX2 = fullX2;
     78                     if (partX2 > partX1) {
     79                         fbFill(pDrawable, pGC,
     80                                partX1, fullY1, partX2 - partX1, 1);
     81                     }
     82                 }
     83                 pbox++;
     84             }
     85         }
     86     }
     87 }