xserver

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

GCOps.c (9910B)


      1 /*
      2 
      3 Copyright 1993 by Davor Matic
      4 
      5 Permission to use, copy, modify, distribute, and sell this software
      6 and its documentation for any purpose is hereby granted without fee,
      7 provided that the above copyright notice appear in all copies and that
      8 both that copyright notice and this permission notice appear in
      9 supporting documentation.  Davor Matic makes no representations about
     10 the suitability of this software for any purpose.  It is provided "as
     11 is" without express or implied warranty.
     12 
     13 */
     14 
     15 #ifdef HAVE_XNEST_CONFIG_H
     16 #include <xnest-config.h>
     17 #endif
     18 
     19 #include <X11/X.h>
     20 #include <X11/Xproto.h>
     21 #include "regionstr.h"
     22 #include <X11/fonts/fontstruct.h>
     23 #include "gcstruct.h"
     24 #include "scrnintstr.h"
     25 #include "windowstr.h"
     26 #include "pixmapstr.h"
     27 #include "region.h"
     28 #include "servermd.h"
     29 
     30 #include "Xnest.h"
     31 
     32 #include "Display.h"
     33 #include "Screen.h"
     34 #include "XNGC.h"
     35 #include "XNFont.h"
     36 #include "GCOps.h"
     37 #include "Drawable.h"
     38 #include "Visual.h"
     39 
     40 void
     41 xnestFillSpans(DrawablePtr pDrawable, GCPtr pGC, int nSpans, xPoint * pPoints,
     42                int *pWidths, int fSorted)
     43 {
     44     ErrorF("xnest warning: function xnestFillSpans not implemented\n");
     45 }
     46 
     47 void
     48 xnestSetSpans(DrawablePtr pDrawable, GCPtr pGC, char *pSrc,
     49               xPoint * pPoints, int *pWidths, int nSpans, int fSorted)
     50 {
     51     ErrorF("xnest warning: function xnestSetSpans not implemented\n");
     52 }
     53 
     54 void
     55 xnestGetSpans(DrawablePtr pDrawable, int maxWidth, DDXPointPtr pPoints,
     56               int *pWidths, int nSpans, char *pBuffer)
     57 {
     58     ErrorF("xnest warning: function xnestGetSpans not implemented\n");
     59 }
     60 
     61 void
     62 xnestQueryBestSize(int class, unsigned short *pWidth, unsigned short *pHeight,
     63                    ScreenPtr pScreen)
     64 {
     65     unsigned int width, height;
     66 
     67     width = *pWidth;
     68     height = *pHeight;
     69 
     70     XQueryBestSize(xnestDisplay, class,
     71                    xnestDefaultWindows[pScreen->myNum],
     72                    width, height, &width, &height);
     73 
     74     *pWidth = width;
     75     *pHeight = height;
     76 }
     77 
     78 void
     79 xnestPutImage(DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y,
     80               int w, int h, int leftPad, int format, char *pImage)
     81 {
     82     XImage *ximage;
     83 
     84     ximage = XCreateImage(xnestDisplay, xnestDefaultVisual(pDrawable->pScreen),
     85                           depth, format, leftPad, (char *) pImage,
     86                           w, h, BitmapPad(xnestDisplay),
     87                           (format == ZPixmap) ?
     88                           PixmapBytePad(w, depth) : BitmapBytePad(w + leftPad));
     89 
     90     if (ximage) {
     91         XPutImage(xnestDisplay, xnestDrawable(pDrawable), xnestGC(pGC),
     92                   ximage, 0, 0, x, y, w, h);
     93         XFree(ximage);
     94     }
     95 }
     96 
     97 static int
     98 xnestIgnoreErrorHandler (Display     *dpy,
     99                          XErrorEvent *event)
    100 {
    101     return False; /* return value is ignored */
    102 }
    103 
    104 void
    105 xnestGetImage(DrawablePtr pDrawable, int x, int y, int w, int h,
    106               unsigned int format, unsigned long planeMask, char *pImage)
    107 {
    108     XImage *ximage;
    109     int length;
    110     int (*old_handler)(Display*, XErrorEvent*);
    111 
    112     /* we may get BadMatch error when xnest window is minimized */
    113     XSync(xnestDisplay, False);
    114     old_handler = XSetErrorHandler (xnestIgnoreErrorHandler);
    115 
    116     ximage = XGetImage(xnestDisplay, xnestDrawable(pDrawable),
    117                        x, y, w, h, planeMask, format);
    118     XSetErrorHandler(old_handler);
    119 
    120     if (ximage) {
    121         length = ximage->bytes_per_line * ximage->height;
    122 
    123         memmove(pImage, ximage->data, length);
    124 
    125         XDestroyImage(ximage);
    126     }
    127 }
    128 
    129 static Bool
    130 xnestBitBlitPredicate(Display * dpy, XEvent * event, char *args)
    131 {
    132     return event->type == GraphicsExpose || event->type == NoExpose;
    133 }
    134 
    135 static RegionPtr
    136 xnestBitBlitHelper(GCPtr pGC)
    137 {
    138     if (!pGC->graphicsExposures)
    139         return NullRegion;
    140     else {
    141         XEvent event;
    142         RegionPtr pReg, pTmpReg;
    143         BoxRec Box;
    144         Bool pending, overlap;
    145 
    146         pReg = RegionCreate(NULL, 1);
    147         pTmpReg = RegionCreate(NULL, 1);
    148         if (!pReg || !pTmpReg)
    149             return NullRegion;
    150 
    151         pending = True;
    152         while (pending) {
    153             XIfEvent(xnestDisplay, &event, xnestBitBlitPredicate, NULL);
    154 
    155             switch (event.type) {
    156             case NoExpose:
    157                 pending = False;
    158                 break;
    159 
    160             case GraphicsExpose:
    161                 Box.x1 = event.xgraphicsexpose.x;
    162                 Box.y1 = event.xgraphicsexpose.y;
    163                 Box.x2 = event.xgraphicsexpose.x + event.xgraphicsexpose.width;
    164                 Box.y2 = event.xgraphicsexpose.y + event.xgraphicsexpose.height;
    165                 RegionReset(pTmpReg, &Box);
    166                 RegionAppend(pReg, pTmpReg);
    167                 pending = event.xgraphicsexpose.count;
    168                 break;
    169             }
    170         }
    171 
    172         RegionDestroy(pTmpReg);
    173         RegionValidate(pReg, &overlap);
    174         return pReg;
    175     }
    176 }
    177 
    178 RegionPtr
    179 xnestCopyArea(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable,
    180               GCPtr pGC, int srcx, int srcy, int width, int height,
    181               int dstx, int dsty)
    182 {
    183     XCopyArea(xnestDisplay,
    184               xnestDrawable(pSrcDrawable), xnestDrawable(pDstDrawable),
    185               xnestGC(pGC), srcx, srcy, width, height, dstx, dsty);
    186 
    187     return xnestBitBlitHelper(pGC);
    188 }
    189 
    190 RegionPtr
    191 xnestCopyPlane(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable,
    192                GCPtr pGC, int srcx, int srcy, int width, int height,
    193                int dstx, int dsty, unsigned long plane)
    194 {
    195     XCopyPlane(xnestDisplay,
    196                xnestDrawable(pSrcDrawable), xnestDrawable(pDstDrawable),
    197                xnestGC(pGC), srcx, srcy, width, height, dstx, dsty, plane);
    198 
    199     return xnestBitBlitHelper(pGC);
    200 }
    201 
    202 void
    203 xnestPolyPoint(DrawablePtr pDrawable, GCPtr pGC, int mode, int nPoints,
    204                DDXPointPtr pPoints)
    205 {
    206     XDrawPoints(xnestDisplay, xnestDrawable(pDrawable), xnestGC(pGC),
    207                 (XPoint *) pPoints, nPoints, mode);
    208 }
    209 
    210 void
    211 xnestPolylines(DrawablePtr pDrawable, GCPtr pGC, int mode, int nPoints,
    212                DDXPointPtr pPoints)
    213 {
    214     XDrawLines(xnestDisplay, xnestDrawable(pDrawable), xnestGC(pGC),
    215                (XPoint *) pPoints, nPoints, mode);
    216 }
    217 
    218 void
    219 xnestPolySegment(DrawablePtr pDrawable, GCPtr pGC, int nSegments,
    220                  xSegment * pSegments)
    221 {
    222     XDrawSegments(xnestDisplay, xnestDrawable(pDrawable), xnestGC(pGC),
    223                   (XSegment *) pSegments, nSegments);
    224 }
    225 
    226 void
    227 xnestPolyRectangle(DrawablePtr pDrawable, GCPtr pGC, int nRectangles,
    228                    xRectangle *pRectangles)
    229 {
    230     XDrawRectangles(xnestDisplay, xnestDrawable(pDrawable), xnestGC(pGC),
    231                     (XRectangle *) pRectangles, nRectangles);
    232 }
    233 
    234 void
    235 xnestPolyArc(DrawablePtr pDrawable, GCPtr pGC, int nArcs, xArc * pArcs)
    236 {
    237     XDrawArcs(xnestDisplay, xnestDrawable(pDrawable), xnestGC(pGC),
    238               (XArc *) pArcs, nArcs);
    239 }
    240 
    241 void
    242 xnestFillPolygon(DrawablePtr pDrawable, GCPtr pGC, int shape, int mode,
    243                  int nPoints, DDXPointPtr pPoints)
    244 {
    245     XFillPolygon(xnestDisplay, xnestDrawable(pDrawable), xnestGC(pGC),
    246                  (XPoint *) pPoints, nPoints, shape, mode);
    247 }
    248 
    249 void
    250 xnestPolyFillRect(DrawablePtr pDrawable, GCPtr pGC, int nRectangles,
    251                   xRectangle *pRectangles)
    252 {
    253     XFillRectangles(xnestDisplay, xnestDrawable(pDrawable), xnestGC(pGC),
    254                     (XRectangle *) pRectangles, nRectangles);
    255 }
    256 
    257 void
    258 xnestPolyFillArc(DrawablePtr pDrawable, GCPtr pGC, int nArcs, xArc * pArcs)
    259 {
    260     XFillArcs(xnestDisplay, xnestDrawable(pDrawable), xnestGC(pGC),
    261               (XArc *) pArcs, nArcs);
    262 }
    263 
    264 int
    265 xnestPolyText8(DrawablePtr pDrawable, GCPtr pGC, int x, int y, int count,
    266                char *string)
    267 {
    268     int width;
    269 
    270     XDrawString(xnestDisplay, xnestDrawable(pDrawable), xnestGC(pGC),
    271                 x, y, string, count);
    272 
    273     width = XTextWidth(xnestFontStruct(pGC->font), string, count);
    274 
    275     return width + x;
    276 }
    277 
    278 int
    279 xnestPolyText16(DrawablePtr pDrawable, GCPtr pGC, int x, int y, int count,
    280                 unsigned short *string)
    281 {
    282     int width;
    283 
    284     XDrawString16(xnestDisplay, xnestDrawable(pDrawable), xnestGC(pGC),
    285                   x, y, (XChar2b *) string, count);
    286 
    287     width = XTextWidth16(xnestFontStruct(pGC->font), (XChar2b *) string, count);
    288 
    289     return width + x;
    290 }
    291 
    292 void
    293 xnestImageText8(DrawablePtr pDrawable, GCPtr pGC, int x, int y, int count,
    294                 char *string)
    295 {
    296     XDrawImageString(xnestDisplay, xnestDrawable(pDrawable), xnestGC(pGC),
    297                      x, y, string, count);
    298 }
    299 
    300 void
    301 xnestImageText16(DrawablePtr pDrawable, GCPtr pGC, int x, int y, int count,
    302                  unsigned short *string)
    303 {
    304     XDrawImageString16(xnestDisplay, xnestDrawable(pDrawable), xnestGC(pGC),
    305                        x, y, (XChar2b *) string, count);
    306 }
    307 
    308 void
    309 xnestImageGlyphBlt(DrawablePtr pDrawable, GCPtr pGC, int x, int y,
    310                    unsigned int nGlyphs, CharInfoPtr * pCharInfo,
    311                    void *pGlyphBase)
    312 {
    313     ErrorF("xnest warning: function xnestImageGlyphBlt not implemented\n");
    314 }
    315 
    316 void
    317 xnestPolyGlyphBlt(DrawablePtr pDrawable, GCPtr pGC, int x, int y,
    318                   unsigned int nGlyphs, CharInfoPtr * pCharInfo,
    319                   void *pGlyphBase)
    320 {
    321     ErrorF("xnest warning: function xnestPolyGlyphBlt not implemented\n");
    322 }
    323 
    324 void
    325 xnestPushPixels(GCPtr pGC, PixmapPtr pBitmap, DrawablePtr pDst,
    326                 int width, int height, int x, int y)
    327 {
    328     /* only works for solid bitmaps */
    329     if (pGC->fillStyle == FillSolid) {
    330         XSetStipple(xnestDisplay, xnestGC(pGC), xnestPixmap(pBitmap));
    331         XSetTSOrigin(xnestDisplay, xnestGC(pGC), x, y);
    332         XSetFillStyle(xnestDisplay, xnestGC(pGC), FillStippled);
    333         XFillRectangle(xnestDisplay, xnestDrawable(pDst),
    334                        xnestGC(pGC), x, y, width, height);
    335         XSetFillStyle(xnestDisplay, xnestGC(pGC), FillSolid);
    336     }
    337     else
    338         ErrorF("xnest warning: function xnestPushPixels not implemented\n");
    339 }