github.com/rajveermalviya/gamen@v0.1.2-0.20220930195403-9be15877c1aa/internal/xcb/include/X11/Xregion.h (about)

     1  /************************************************************************
     2  
     3  Copyright 1987, 1998  The Open Group
     4  
     5  Permission to use, copy, modify, distribute, and sell this software and its
     6  documentation for any purpose is hereby granted without fee, provided that
     7  the above copyright notice appear in all copies and that both that
     8  copyright notice and this permission notice appear in supporting
     9  documentation.
    10  
    11  The above copyright notice and this permission notice shall be included in
    12  all copies or substantial portions of the Software.
    13  
    14  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    15  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    16  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
    17  OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
    18  AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
    19  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    20  
    21  Except as contained in this notice, the name of The Open Group shall not be
    22  used in advertising or otherwise to promote the sale, use or other dealings
    23  in this Software without prior written authorization from The Open Group.
    24  
    25  
    26  Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
    27  
    28                          All Rights Reserved
    29  
    30  Permission to use, copy, modify, and distribute this software and its
    31  documentation for any purpose and without fee is hereby granted,
    32  provided that the above copyright notice appear in all copies and that
    33  both that copyright notice and this permission notice appear in
    34  supporting documentation, and that the name of Digital not be
    35  used in advertising or publicity pertaining to distribution of the
    36  software without specific, written prior permission.
    37  
    38  DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
    39  ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
    40  DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
    41  ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
    42  WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
    43  ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
    44  SOFTWARE.
    45  
    46  ************************************************************************/
    47  
    48  #ifndef _X11_XREGION_H_
    49  #define _X11_XREGION_H_
    50  
    51  typedef struct {
    52      short x1, x2, y1, y2;
    53  } Box, BOX, BoxRec, *BoxPtr;
    54  
    55  typedef struct {
    56      short x, y, width, height;
    57  }RECTANGLE, RectangleRec, *RectanglePtr;
    58  
    59  #define TRUE 1
    60  #define FALSE 0
    61  #define MAXSHORT 32767
    62  #define MINSHORT -MAXSHORT
    63  #ifndef MAX
    64  #define MAX(a,b) (((a) > (b)) ? (a) : (b))
    65  #endif
    66  #ifndef MIN
    67  #define MIN(a,b) (((a) < (b)) ? (a) : (b))
    68  #endif
    69  
    70  
    71  /*
    72   *   clip region
    73   */
    74  
    75  typedef struct _XRegion {
    76      long size;
    77      long numRects;
    78      BOX *rects;
    79      BOX extents;
    80  } REGION;
    81  
    82  /* Xutil.h contains the declaration:
    83   * typedef struct _XRegion *Region;
    84   */
    85  
    86  /*  1 if two BOXs overlap.
    87   *  0 if two BOXs do not overlap.
    88   *  Remember, x2 and y2 are not in the region
    89   */
    90  #define EXTENTCHECK(r1, r2) \
    91  	((r1)->x2 > (r2)->x1 && \
    92  	 (r1)->x1 < (r2)->x2 && \
    93  	 (r1)->y2 > (r2)->y1 && \
    94  	 (r1)->y1 < (r2)->y2)
    95  
    96  /*
    97   *  update region extents
    98   */
    99  #define EXTENTS(r,idRect){\
   100              if((r)->x1 < (idRect)->extents.x1)\
   101                (idRect)->extents.x1 = (r)->x1;\
   102              if((r)->y1 < (idRect)->extents.y1)\
   103                (idRect)->extents.y1 = (r)->y1;\
   104              if((r)->x2 > (idRect)->extents.x2)\
   105                (idRect)->extents.x2 = (r)->x2;\
   106              if((r)->y2 > (idRect)->extents.y2)\
   107                (idRect)->extents.y2 = (r)->y2;\
   108          }
   109  
   110  /*
   111   *   Check to see if there is enough memory in the present region.
   112   */
   113  #define MEMCHECK(reg, rect, firstrect){\
   114          if ((reg)->numRects >= ((reg)->size - 1)){\
   115            BoxPtr tmpRect = Xrealloc ((firstrect), \
   116                                       (2 * (sizeof(BOX)) * ((reg)->size))); \
   117            if (tmpRect == NULL) \
   118              return(0);\
   119            (firstrect) = tmpRect; \
   120            (reg)->size *= 2;\
   121            (rect) = &(firstrect)[(reg)->numRects];\
   122           }\
   123         }
   124  
   125  /*  this routine checks to see if the previous rectangle is the same
   126   *  or subsumes the new rectangle to add.
   127   */
   128  
   129  #define CHECK_PREVIOUS(Reg, R, Rx1, Ry1, Rx2, Ry2)\
   130                 (!(((Reg)->numRects > 0)&&\
   131                    ((R-1)->y1 == (Ry1)) &&\
   132                    ((R-1)->y2 == (Ry2)) &&\
   133                    ((R-1)->x1 <= (Rx1)) &&\
   134                    ((R-1)->x2 >= (Rx2))))
   135  
   136  /*  add a rectangle to the given Region */
   137  #define ADDRECT(reg, r, rx1, ry1, rx2, ry2){\
   138      if (((rx1) < (rx2)) && ((ry1) < (ry2)) &&\
   139          CHECK_PREVIOUS((reg), (r), (rx1), (ry1), (rx2), (ry2))){\
   140                (r)->x1 = (rx1);\
   141                (r)->y1 = (ry1);\
   142                (r)->x2 = (rx2);\
   143                (r)->y2 = (ry2);\
   144                EXTENTS((r), (reg));\
   145                (reg)->numRects++;\
   146                (r)++;\
   147              }\
   148          }
   149  
   150  
   151  
   152  /*  add a rectangle to the given Region */
   153  #define ADDRECTNOX(reg, r, rx1, ry1, rx2, ry2){\
   154              if ((rx1 < rx2) && (ry1 < ry2) &&\
   155                  CHECK_PREVIOUS((reg), (r), (rx1), (ry1), (rx2), (ry2))){\
   156                (r)->x1 = (rx1);\
   157                (r)->y1 = (ry1);\
   158                (r)->x2 = (rx2);\
   159                (r)->y2 = (ry2);\
   160                (reg)->numRects++;\
   161                (r)++;\
   162              }\
   163          }
   164  
   165  #define EMPTY_REGION(pReg) pReg->numRects = 0
   166  
   167  #define REGION_NOT_EMPTY(pReg) pReg->numRects
   168  
   169  #define INBOX(r, x, y) \
   170        ( ( ((r).x2 >  x)) && \
   171          ( ((r).x1 <= x)) && \
   172          ( ((r).y2 >  y)) && \
   173          ( ((r).y1 <= y)) )
   174  
   175  /*
   176   * number of points to buffer before sending them off
   177   * to scanlines() :  Must be an even number
   178   */
   179  #define NUMPTSTOBUFFER 200
   180  
   181  /*
   182   * used to allocate buffers for points and link
   183   * the buffers together
   184   */
   185  typedef struct _POINTBLOCK {
   186      XPoint pts[NUMPTSTOBUFFER];
   187      struct _POINTBLOCK *next;
   188  } POINTBLOCK;
   189  
   190  #endif /* _X11_XREGION_H_ */