⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cfb8line.c

📁 远程桌面连接工具
💻 C
📖 第 1 页 / 共 3 页
字号:
/* * $TOG: cfb8line.c /main/33 1997/07/17 19:33:47 kaleb $ *Copyright (c) 1990  X ConsortiumPermission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software isfurnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included inall copies or substantial portions of the Software.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THEX CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER INAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR INCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.Except as contained in this notice, the name of the X Consortium shall not beused in advertising or otherwise to promote the sale, use or other dealingsin this Software without prior written authorization from the X Consortium. * * Author:  Keith Packard, MIT X Consortium * * $XFree86: xc/programs/Xserver/cfb/cfb8line.c,v 3.2.2.3 1997/07/19 04:59:19 dawes Exp $ * Jeff Anton'x fixes: cfb8line.c   97/02/07 */#include "X.h"#include "gcstruct.h"#include "windowstr.h"#include "pixmapstr.h"#include "regionstr.h"#include "scrnintstr.h"#include "mistruct.h"#include "cfb.h"#include "cfbmskbits.h"#include "cfbrrop.h"#include "miline.h"#ifdef PIXEL_ADDR#if defined(__GNUC__) && defined(mc68020)#define STUPID volatile#define REARRANGE#else#define STUPID#endif#ifdef __GNUC__/* lame compiler doesn't even look at 'register' attributes */#define I_H do{#define I_T }while(0);#define IMPORTANT_START I_H I_H I_H I_H I_H I_H I_H I_H I_H I_H#define IMPORTANT_END	I_T I_T I_T I_T I_T I_T I_T I_T I_T I_T#else#define IMPORTANT_START#define IMPORTANT_END#endif#define isClipped(c,ul,lr)  ((((c) - (ul)) | ((lr) - (c))) & ClipMask)#ifdef POLYSEGMENT# ifdef sun#  define WIDTH_FAST  1152# endif# ifdef ultrix#  define WIDTH_FAST  1024# endif# ifdef Mips#  define WIDTH_FAST 4096# endif# ifdef WIDTH_FAST#  if WIDTH_FAST == 1024#   define FAST_MUL(y)	((y) << 10)#  endif#  if WIDTH_FAST == 1152#   define FAST_MUL(y)	(((y) << 10) + ((y) << 7))#  endif#  if WIDTH_FAST == 1280#   define FAST_MUL(y)	(((y) << 10) + ((y) << 8))#  endif#  if WIDTH_FAST == 2048#   define FAST_MUL(y)	((y) << 11)#  endif#  if WIDTH_FAST == 4096#   define FAST_MUL(y)	((y) << 12)#  endif# endif# if defined(WIDTH_SHIFT)#  ifdef FAST_MUL#   define FUNC_NAME(e)	    RROP_NAME(RROP_NAME_CAT(e,Shift))#   if RROP == GXcopy#    define INCLUDE_OTHERS#    define SERIOUS_UNROLLING#   endif#   define INCLUDE_DRAW#   define NWIDTH(nwidth)   WIDTH_FAST#   define WIDTH_MUL(y,w)   FAST_MUL(y)#  endif# else#  define FUNC_NAME(e)	    RROP_NAME(e)#  define WIDTH_MUL(y,w)    ((y) * (w))#  define NWIDTH(nwidth)    (nwidth)#  define INCLUDE_DRAW#  if !defined (FAST_MUL) && RROP == GXcopy#   define INCLUDE_OTHERS#   define SERIOUS_UNROLLING#  endif# endif#else# define INCLUDE_DRAW# define WIDTH_MUL(y,w)	((y) * (w))# define NWIDTH(nwidth)	nwidth# ifdef PREVIOUS#  define FUNC_NAME(e)	RROP_NAME(RROP_NAME_CAT(e,Previous))# else#  define FUNC_NAME(e)	RROP_NAME(e)#  if RROP == GXcopy#   define INCLUDE_OTHERS#   ifdef PLENTIFUL_REGISTERS#    define SAVE_X2Y2#   endif#   define ORIGIN#   define SERIOUS_UNROLLING#  else#   define EITHER_MODE#  endif# endif#endif#if PSZ == 24#define PXL2ADR(x)  ((x)*3 >> 2)#if RROP == GXcopy#define body_rop \	    addrp = (PixelType *)((unsigned long)addrb & ~0x03); \	    switch((unsigned long)addrb & 3){ \	    case 0: \	      *addrp = (*addrp & 0xFF000000)|(piQxelXor[0] & 0xFFFFFF); \	      break; \	    case 1: \	      *addrp = (*addrp & 0xFF)|(piQxelXor[2] & 0xFFFFFF00); \	      break; \	    case 3: \	      *addrp = (*addrp & 0xFFFFFF)|(piQxelXor[0] & 0xFF000000); \	      *(addrp+1)=(*(addrp+1) & 0xFFFF0000)|(piQxelXor[1] & 0xFFFF); \	      break; \	    case 2: \	      *addrp = (*addrp & 0xFFFF)|(piQxelXor[1] & 0xFFFF0000); \	      *(addrp+1)=(*(addrp+1) & 0xFFFFFF00)|(piQxelXor[2] & 0xFF); \	      break; \	    }#endif#if RROP == GXxor#define body_rop \	    addrp = (PixelType *)((unsigned long)addrb & ~0x03); \	    switch((unsigned long)addrb & 3){ \	    case 0: \	      *addrp ^= piQxelXor[0] & 0xFFFFFF; \	      break; \	    case 1: \	      *addrp ^= piQxelXor[2] & 0xFFFFFF00; \	      break; \	    case 3: \	      *addrp ^= piQxelXor[0] & 0xFF000000; \	      *(addrp+1) ^= piQxelXor[1] & 0xFFFF; \	      break; \	    case 2: \	      *addrp ^= piQxelXor[1] & 0xFFFF0000; \	      *(addrp+1) ^= piQxelXor[2] & 0xFF; \	      break; \	    }#endif#if RROP == GXand#define body_rop \	    addrp = (PixelType *)((unsigned long)addrb & ~0x03); \	    switch((unsigned long)addrb & 3){ \	    case 0: \	      *addrp &= piQxelAnd[0] | 0xFF000000; \	      break; \	    case 1: \	      *addrp &= piQxelAnd[2] | 0xFF; \	      break; \	    case 3: \	      *addrp &= 0xFFFFFF | piQxelAnd[0]; \	      *(addrp+1) &= 0xFFFF0000 | piQxelAnd[1]; \	      break; \	    case 2: \	      *addrp &= 0xFFFF | piQxelAnd[1]; \	      *(addrp+1) &= 0xFFFFFF00 | piQxelAnd[2]; \	      break; \	    }#endif#if RROP == GXor#define body_rop \	    addrp = (PixelType *)((unsigned long)addrb & ~0x03); \	    switch((unsigned long)addrb & 3){ \	    case 0: \	      *addrp |= piQxelOr[0] & 0xFFFFFF; \	      break; \	    case 1: \	      *addrp |= piQxelOr[2] & 0xFFFFFF00; \	      break; \	    case 3: \	      *addrp |= piQxelOr[0] & 0xFF000000; \	      *(addrp+1) |= piQxelOr[1] & 0xFFFF; \	      break; \	    case 2: \	      *addrp |= piQxelOr[1] & 0xFFFF0000; \	      *(addrp+1) |= piQxelOr[2] & 0xFF; \	      break; \	    }#endif#if RROP == GXset#define body_rop \	    addrp = (PixelType *)((unsigned long)addrb & ~0x03); \	    switch((unsigned long)addrb & 3){ \	    case 0: \	      *addrp = (*addrp & (piQxelAnd[0]|0xFF000000)) \			^ (piQxelXor[0] & 0xFFFFFF); \	      break; \	    case 1: \	      *addrp = (*addrp & (piQxelAnd[2]|0xFF)) \			^ (piQxelXor[2] & 0xFFFFFF00); \	      break; \	    case 3: \	      *addrp = (*addrp & (piQxelAnd[0]|0xFFFFFF)) \			^ (piQxelXor[0] & 0xFF000000); \	      *(addrp+1) = (*(addrp+1) & (piQxelAnd[1]|0xFFFF0000)) \			^ (piQxelXor[1] & 0xFFFF); \	      break; \	    case 2: \	      *addrp = (*addrp & (piQxelAnd[1]|0xFFFF)) \			^ (piQxelXor[1] & 0xFFFF0000); \	      *(addrp+1) = (*(addrp+1) & (piQxelAnd[2]|0xFFFFFF00)) \			^ (piQxelXor[2] & 0xFF); \	      break; \	    }#endif#endif /* PSZ == 24 */#define BUGFIX_clip#ifdef INCLUDE_DRAWint#ifdef POLYSEGMENTFUNC_NAME(cfb8SegmentSS1Rect) (pDrawable, pGC, nseg, pSegInit)    DrawablePtr	pDrawable;    GCPtr	pGC;    int		nseg;    xSegment	*pSegInit;#elseFUNC_NAME(cfb8LineSS1Rect) (pDrawable, pGC, mode, npt, pptInit, pptInitOrig,			    x1p,y1p,x2p,y2p)    DrawablePtr pDrawable;    GCPtr	pGC;    int	mode;		/* Origin or Previous */    int	npt;		/* number of points */    DDXPointPtr pptInit, pptInitOrig;    int	*x1p, *y1p, *x2p, *y2p;#endif /* POLYSEGEMENT */{    register long   e;    register int    y1_or_e1;    register PixelType   *addrp;    register int    stepmajor;    register int    stepminor;#ifndef REARRANGE    register long   e3;#endif#ifdef mc68000    register short  x1_or_len;#else    register int    x1_or_len;#endif    RROP_DECLARE#ifdef SAVE_X2Y2# define c2 y2#else    register int    c2;#endif#ifndef ORIGIN    register int _x1, _y1, _x2, _y2;	/* only used for CoordModePrevious */    int extents_x1, extents_y1, extents_x2, extents_y2;#endif /* !ORIGIN */#ifndef PREVIOUS    register int upperleft, lowerright;    CARD32	 ClipMask = 0x80008000;#endif /* !PREVIOUS */#ifdef POLYSEGMENT    register int    capStyle;#endif /* POLYSEGMENT */#ifdef SAVE_X2Y2    register int    x2, y2;# define X1  x1_or_len# define Y1  y1_or_e1# define X2  x2# define Y2  y2#else# ifdef POLYSEGMENT#  define X1  x1_or_len#  define Y1  y1_or_e1# else#  define X1  intToX(y1_or_e1)#  define Y1  intToY(y1_or_e1)# endif /* POLYSEGMENT */# define X2  intToX(c2)# define Y2  intToY(c2)#endif /* SAVE_X2Y2 */    PixelType   *addr;    int		    nwidth;    cfbPrivGCPtr    devPriv;    BoxPtr	    extents;    int		    *ppt;#if PSZ == 24    int xBase;     /* x of addr */    int xOffset;   /* x of addrp */    int xOffset_t; /* x of t */    PixelType   *addrLineEnd;    char *addrb;    int stepmajor3, stepminor3, majordx, minordx;#endif#ifdef BUGFIX_clip    int ex_x1, ex_y1, ex_x2, ex_y2;#endif    int		    octant;    unsigned int    bias = miGetZeroLineBias(pDrawable->pScreen);    devPriv = cfbGetGCPrivate(pGC);    cfbGetPixelWidthAndPointer (pDrawable, nwidth, addr);#ifndef REARRANGE    RROP_FETCH_GCPRIV(devPriv);#endif    extents = &devPriv->pCompositeClip->extents;#ifndef PREVIOUS    c2 = *((int *) &pDrawable->x);    c2 -= (c2 & 0x8000) << 1;    upperleft = *((int *) &extents->x1) - c2;    lowerright = *((int *) &extents->x2) - c2 - 0x00010001;#endif /* !PREVIOUS */#ifdef BUGFIX_clip    ex_x1 = extents->x1 - pDrawable->x;    ex_y1 = extents->y1 - pDrawable->y;    ex_x2 = extents->x2 - pDrawable->x;    ex_y2 = extents->y2 - pDrawable->y;#endif#if PSZ == 24    xBase = pDrawable->x;    addr += WIDTH_MUL(pDrawable->y,nwidth);#else    addr = addr + WIDTH_MUL(pDrawable->y,nwidth) + pDrawable->x;#endif#ifdef POLYSEGMENT    capStyle = pGC->capStyle - CapNotLast;    ppt = (int *) pSegInit;    while (nseg--)#else /* POLYSEGMENT */#ifdef EITHER_MODE    mode -= CoordModePrevious;    if (!mode)#endif /* EITHER_MODE */	#ifndef ORIGIN    {	/* CoordModePrevious */	ppt = (int *)pptInit + 1;	_x1 = *x1p;	_y1 = *y1p;	extents_x1 = extents->x1 - pDrawable->x;	extents_x2 = extents->x2 - pDrawable->x;	extents_y1 = extents->y1 - pDrawable->y;	extents_y2 = extents->y2 - pDrawable->y;	if (_x1 < extents_x1 || _x1 >= extents_x2 ||	    _y1 < extents_y1 || _y1 >= extents_y2)	{	    c2 = *ppt++;	    intToCoord(c2, _x2, _y2);	    *x2p = _x1 + _x2;	    *y2p = _y1 + _y2;	    return 1;	}#if PSZ == 24	addrLineEnd = addr + WIDTH_MUL(_y1, nwidth);	xOffset = xBase + _x1;	addrb = (char *)addrLineEnd + xOffset * 3;	addrp = (PixelType *)((unsigned long)addrb & ~0x03);#else	addrp = addr + WIDTH_MUL(_y1, nwidth) + _x1;#endif	_x2 = _x1;	_y2 = _y1;	    }#endif /* !ORIGIN */#ifdef EITHER_MODE    else#endif /* EITHER_MODE */#ifndef PREVIOUS    {	ppt = (int *) pptInit;	c2 = *ppt++;	if (isClipped (c2, upperleft, lowerright))	{	    return 1;	}#ifdef SAVE_X2Y2	intToCoord(c2,x2,y2);#endif#if PSZ == 24	addrLineEnd = addr + WIDTH_MUL(Y2, nwidth);	xOffset = xBase + X2;	addrb = (char *)addrLineEnd + xOffset * 3;	addrp = (PixelType *)((unsigned long)addrb & ~0x03);#else	addrp = addr + WIDTH_MUL(Y2, nwidth) + X2;#endif    }#endif /* !PREVIOUS */        while (--npt)#endif /* POLYSEGMENT */    {#ifdef POLYSEGMENT	y1_or_e1 = ppt[0];	c2 = ppt[1];	ppt += 2;	if (isClipped(y1_or_e1,upperleft,lowerright)|isClipped(c2,upperleft,lowerright))	    break;	intToCoord(y1_or_e1,x1_or_len,y1_or_e1);	/* compute now to avoid needing x1, y1 later */#if PSZ == 24	addrLineEnd = addr + WIDTH_MUL(y1_or_e1, nwidth);	xOffset = xBase + x1_or_len;	addrb = (char *)addrLineEnd + xOffset * 3;	addrp = (PixelType *)((unsigned long)addrb & ~0x03);#else	addrp = addr + WIDTH_MUL(y1_or_e1, nwidth) + x1_or_len;#endif#else /* !POLYSEGMENT */#ifdef EITHER_MODE	if (!mode)#endif /* EITHER_MODE */	#ifndef ORIGIN	{		    /* CoordModePrevious */	    _x1 = _x2;	    _y1 = _y2;	    c2 = *ppt++;	    intToCoord(c2, _x2, _y2);	    _x2 = _x1 + _x2;	    _y2 = _y1 + _y2;#ifdef BUGFIX_clip	    if (_x2 < ex_x1 || _x2 >= ex_x2 ||		_y2 < ex_y1 || _y2 >= ex_y2)#else	    if (_x2 < extents_x1 || _x2 >= extents_x2 ||		_y2 < extents_y1 || _y2 >= extents_y2)#endif	    {		break;	    }	    CalcLineDeltas(_x1, _y1, _x2, _y2, x1_or_len, y1_or_e1,			   stepmajor, stepminor, 1, NWIDTH(nwidth), octant);	}#endif /* !ORIGIN */#ifdef EITHER_MODE	else#endif /* EITHER_MODE */#ifndef PREVIOUS        {#ifndef SAVE_X2Y2	    y1_or_e1 = c2;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -