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

📄 sprite.c

📁 远程桌面连接工具
💻 C
📖 第 1 页 / 共 4 页
字号:
    int			updated;    VisualPtr		pVisual;    pPriv = (rfbSpriteScreenPtr) pScreen->devPrivates[rfbSpriteScreenIndex].ptr;    SCREEN_PROLOGUE(pScreen, StoreColors);        (*pScreen->StoreColors) (pMap, ndef, pdef);    SCREEN_EPILOGUE(pScreen, StoreColors, rfbSpriteStoreColors);    if (pPriv->pColormap == pMap)    {	updated = 0;	pVisual = pMap->pVisual;	if (pVisual->class == DirectColor)	{	    /* Direct color - match on any of the subfields */#define MaskMatch(a,b,mask) ((a) & (pVisual->mask) == (b) & (pVisual->mask))#define UpdateDAC(plane,dac,mask) {\    if (MaskMatch (pPriv->colors[plane].pixel,pdef[i].pixel,mask)) {\	pPriv->colors[plane].dac = pdef[i].dac; \	updated = 1; \    } \}#define CheckDirect(plane) \	    UpdateDAC(plane,red,redMask) \	    UpdateDAC(plane,green,greenMask) \	    UpdateDAC(plane,blue,blueMask)	    for (i = 0; i < ndef; i++)	    {		CheckDirect (SOURCE_COLOR)		CheckDirect (MASK_COLOR)	    }	}	else	{	    /* PseudoColor/GrayScale - match on exact pixel */	    for (i = 0; i < ndef; i++)	    {	    	if (pdef[i].pixel == pPriv->colors[SOURCE_COLOR].pixel)	    	{		    pPriv->colors[SOURCE_COLOR] = pdef[i];		    if (++updated == 2)		    	break;	    	}	    	if (pdef[i].pixel == pPriv->colors[MASK_COLOR].pixel)	    	{		    pPriv->colors[MASK_COLOR] = pdef[i];		    if (++updated == 2)		    	break;	    	}	    }	}    	if (updated)    	{	    pPriv->checkPixels = TRUE;	    if (rfbScreen.cursorIsDrawn)	    	rfbSpriteRemoveCursor (pScreen);    	}    }}static voidrfbSpriteFindColors (pScreen)    ScreenPtr	pScreen;{    rfbSpriteScreenPtr	pScreenPriv = (rfbSpriteScreenPtr)			    pScreen->devPrivates[rfbSpriteScreenIndex].ptr;    CursorPtr		pCursor;    xColorItem		*sourceColor, *maskColor;    pCursor = pScreenPriv->pCursor;    sourceColor = &pScreenPriv->colors[SOURCE_COLOR];    maskColor = &pScreenPriv->colors[MASK_COLOR];    if (pScreenPriv->pColormap != pScreenPriv->pInstalledMap ||	!(pCursor->foreRed == sourceColor->red &&	  pCursor->foreGreen == sourceColor->green &&          pCursor->foreBlue == sourceColor->blue &&	  pCursor->backRed == maskColor->red &&	  pCursor->backGreen == maskColor->green &&	  pCursor->backBlue == maskColor->blue))    {	pScreenPriv->pColormap = pScreenPriv->pInstalledMap;	sourceColor->red = pCursor->foreRed;	sourceColor->green = pCursor->foreGreen;	sourceColor->blue = pCursor->foreBlue;	FakeAllocColor (pScreenPriv->pColormap, sourceColor);	maskColor->red = pCursor->backRed;	maskColor->green = pCursor->backGreen;	maskColor->blue = pCursor->backBlue;	FakeAllocColor (pScreenPriv->pColormap, maskColor);	/* "free" the pixels right away, don't let this confuse you */	FakeFreeColor(pScreenPriv->pColormap, sourceColor->pixel);	FakeFreeColor(pScreenPriv->pColormap, maskColor->pixel);    }    pScreenPriv->checkPixels = FALSE;}/* * BackingStore wrappers */static voidrfbSpriteSaveDoomedAreas (pWin, pObscured, dx, dy)    WindowPtr	pWin;    RegionPtr	pObscured;    int		dx, dy;{    ScreenPtr		pScreen;    rfbSpriteScreenPtr   pScreenPriv;    BoxRec		cursorBox;    pScreen = pWin->drawable.pScreen;        SCREEN_PROLOGUE (pScreen, SaveDoomedAreas);    pScreenPriv = (rfbSpriteScreenPtr) pScreen->devPrivates[rfbSpriteScreenIndex].ptr;    if (rfbScreen.cursorIsDrawn)    {	cursorBox = pScreenPriv->saved;	if (dx || dy) 	{	    cursorBox.x1 += dx;	    cursorBox.y1 += dy;	    cursorBox.x2 += dx;	    cursorBox.y2 += dy;	}	if (RECT_IN_REGION( pScreen, pObscured, &cursorBox) != rgnOUT)	    rfbSpriteRemoveCursor (pScreen);    }    (*pScreen->SaveDoomedAreas) (pWin, pObscured, dx, dy);    SCREEN_EPILOGUE (pScreen, SaveDoomedAreas, rfbSpriteSaveDoomedAreas);}static RegionPtrrfbSpriteRestoreAreas (pWin, prgnExposed)    WindowPtr	pWin;    RegionPtr	prgnExposed;{    ScreenPtr		pScreen;    rfbSpriteScreenPtr   pScreenPriv;    RegionPtr		result;    pScreen = pWin->drawable.pScreen;        SCREEN_PROLOGUE (pScreen, RestoreAreas);    pScreenPriv = (rfbSpriteScreenPtr) pScreen->devPrivates[rfbSpriteScreenIndex].ptr;    if (rfbScreen.cursorIsDrawn)    {	if (RECT_IN_REGION( pScreen, prgnExposed, &pScreenPriv->saved) != rgnOUT)	    rfbSpriteRemoveCursor (pScreen);    }    result = (*pScreen->RestoreAreas) (pWin, prgnExposed);    SCREEN_EPILOGUE (pScreen, RestoreAreas, rfbSpriteRestoreAreas);    return result;}/* * Window wrappers */static voidrfbSpritePaintWindowBackground (pWin, pRegion, what)    WindowPtr	pWin;    RegionPtr	pRegion;    int		what;{    ScreenPtr	    pScreen;    rfbSpriteScreenPtr    pScreenPriv;    pScreen = pWin->drawable.pScreen;    SCREEN_PROLOGUE (pScreen, PaintWindowBackground);    pScreenPriv = (rfbSpriteScreenPtr) pScreen->devPrivates[rfbSpriteScreenIndex].ptr;    if (rfbScreen.cursorIsDrawn)    {	/*	 * If the cursor is on the same screen as the window, check the	 * region to paint for the cursor and remove it as necessary	 */	if (RECT_IN_REGION( pScreen, pRegion, &pScreenPriv->saved) != rgnOUT)	    rfbSpriteRemoveCursor (pScreen);    }    (*pScreen->PaintWindowBackground) (pWin, pRegion, what);    SCREEN_EPILOGUE (pScreen, PaintWindowBackground, rfbSpritePaintWindowBackground);}static voidrfbSpritePaintWindowBorder (pWin, pRegion, what)    WindowPtr	pWin;    RegionPtr	pRegion;    int		what;{    ScreenPtr	    pScreen;    rfbSpriteScreenPtr    pScreenPriv;    pScreen = pWin->drawable.pScreen;    SCREEN_PROLOGUE (pScreen, PaintWindowBorder);    pScreenPriv = (rfbSpriteScreenPtr) pScreen->devPrivates[rfbSpriteScreenIndex].ptr;    if (rfbScreen.cursorIsDrawn)    {	/*	 * If the cursor is on the same screen as the window, check the	 * region to paint for the cursor and remove it as necessary	 */	if (RECT_IN_REGION( pScreen, pRegion, &pScreenPriv->saved) != rgnOUT)	    rfbSpriteRemoveCursor (pScreen);    }    (*pScreen->PaintWindowBorder) (pWin, pRegion, what);    SCREEN_EPILOGUE (pScreen, PaintWindowBorder, rfbSpritePaintWindowBorder);}static voidrfbSpriteCopyWindow (pWin, ptOldOrg, pRegion)    WindowPtr	pWin;    DDXPointRec	ptOldOrg;    RegionPtr	pRegion;{    ScreenPtr	    pScreen;    rfbSpriteScreenPtr    pScreenPriv;    BoxRec	    cursorBox;    int		    dx, dy;    pScreen = pWin->drawable.pScreen;    SCREEN_PROLOGUE (pScreen, CopyWindow);    pScreenPriv = (rfbSpriteScreenPtr) pScreen->devPrivates[rfbSpriteScreenIndex].ptr;    if (rfbScreen.cursorIsDrawn)    {	/*	 * check both the source and the destination areas.  The given	 * region is source relative, so offset the cursor box by	 * the delta position	 */	cursorBox = pScreenPriv->saved;	dx = pWin->drawable.x - ptOldOrg.x;	dy = pWin->drawable.y - ptOldOrg.y;	cursorBox.x1 -= dx;	cursorBox.x2 -= dx;	cursorBox.y1 -= dy;	cursorBox.y2 -= dy;	if (RECT_IN_REGION( pScreen, pRegion, &pScreenPriv->saved) != rgnOUT ||	    RECT_IN_REGION( pScreen, pRegion, &cursorBox) != rgnOUT)	    rfbSpriteRemoveCursor (pScreen);    }    (*pScreen->CopyWindow) (pWin, ptOldOrg, pRegion);    SCREEN_EPILOGUE (pScreen, CopyWindow, rfbSpriteCopyWindow);}static voidrfbSpriteClearToBackground (pWin, x, y, w, h, generateExposures)    WindowPtr pWin;    short x,y;    unsigned short w,h;    Bool generateExposures;{    ScreenPtr		pScreen;    rfbSpriteScreenPtr	pScreenPriv;    int			realw, realh;    pScreen = pWin->drawable.pScreen;    SCREEN_PROLOGUE (pScreen, ClearToBackground);    pScreenPriv = (rfbSpriteScreenPtr) pScreen->devPrivates[rfbSpriteScreenIndex].ptr;    if (GC_CHECK(pWin))    {	if (!(realw = w))	    realw = (int) pWin->drawable.width - x;	if (!(realh = h))	    realh = (int) pWin->drawable.height - y;	if (ORG_OVERLAP(&pScreenPriv->saved, pWin->drawable.x, pWin->drawable.y,			x, y, realw, realh))	{	    rfbSpriteRemoveCursor (pScreen);	}    }    (*pScreen->ClearToBackground) (pWin, x, y, w, h, generateExposures);    SCREEN_EPILOGUE (pScreen, ClearToBackground, rfbSpriteClearToBackground);}/* * GC Func wrappers */static voidrfbSpriteValidateGC (pGC, changes, pDrawable)    GCPtr	pGC;    Mask	changes;    DrawablePtr	pDrawable;{    GC_FUNC_PROLOGUE (pGC);    (*pGC->funcs->ValidateGC) (pGC, changes, pDrawable);        pGCPriv->wrapOps = NULL;    if (pDrawable->type == DRAWABLE_WINDOW && ((WindowPtr) pDrawable)->viewable)    {	WindowPtr   pWin;	RegionPtr   pRegion;	pWin = (WindowPtr) pDrawable;	pRegion = &pWin->clipList;	if (pGC->subWindowMode == IncludeInferiors)	    pRegion = &pWin->borderClip;	if (REGION_NOTEMPTY(pDrawable->pScreen, pRegion))	    pGCPriv->wrapOps = pGC->ops;    }    GC_FUNC_EPILOGUE (pGC);}static voidrfbSpriteChangeGC (pGC, mask)    GCPtr	    pGC;    unsigned long   mask;{    GC_FUNC_PROLOGUE (pGC);    (*pGC->funcs->ChangeGC) (pGC, mask);        GC_FUNC_EPILOGUE (pGC);}static voidrfbSpriteCopyGC (pGCSrc, mask, pGCDst)    GCPtr	    pGCSrc, pGCDst;    unsigned long   mask;{    GC_FUNC_PROLOGUE (pGCDst);    (*pGCDst->funcs->CopyGC) (pGCSrc, mask, pGCDst);        GC_FUNC_EPILOGUE (pGCDst);}static voidrfbSpriteDestroyGC (pGC)    GCPtr   pGC;{    GC_FUNC_PROLOGUE (pGC);    (*pGC->funcs->DestroyGC) (pGC);        GC_FUNC_EPILOGUE (pGC);}static voidrfbSpriteChangeClip (pGC, type, pvalue, nrects)    GCPtr   pGC;    int		type;    pointer	pvalue;    int		nrects;{    GC_FUNC_PROLOGUE (pGC);    (*pGC->funcs->ChangeClip) (pGC, type, pvalue, nrects);    GC_FUNC_EPILOGUE (pGC);}static voidrfbSpriteCopyClip(pgcDst, pgcSrc)    GCPtr pgcDst, pgcSrc;{    GC_FUNC_PROLOGUE (pgcDst);    (* pgcDst->funcs->CopyClip)(pgcDst, pgcSrc);    GC_FUNC_EPILOGUE (pgcDst);}static voidrfbSpriteDestroyClip(pGC)    GCPtr	pGC;{    GC_FUNC_PROLOGUE (pGC);    (* pGC->funcs->DestroyClip)(pGC);    GC_FUNC_EPILOGUE (pGC);}/* * GC Op wrappers */static voidrfbSpriteFillSpans(pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted)    DrawablePtr pDrawable;    GCPtr	pGC;    int		nInit;			/* number of spans to fill */    DDXPointPtr pptInit;		/* pointer to list of start points */    int		*pwidthInit;		/* pointer to list of n widths */    int 	fSorted;{    GC_SETUP(pDrawable, pGC);    if (GC_CHECK((WindowPtr) pDrawable))    {	register DDXPointPtr    pts;	register int    	*widths;	register int    	nPts;	for (pts = pptInit, widths = pwidthInit, nPts = nInit;	     nPts--;	     pts++, widths++) 	{	     if (SPN_OVERLAP(&pScreenPriv->saved,pts->y,pts->x,*widths))	     {		 rfbSpriteRemoveCursor (pDrawable->pScreen);		 break;	     }	}    }    GC_OP_PROLOGUE (pGC);    (*pGC->ops->FillSpans) (pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted);    GC_OP_EPILOGUE (pGC);}static voidrfbSpriteSetSpans(pDrawable, pGC, psrc, ppt, pwidth, nspans, fSorted)    DrawablePtr		pDrawable;    GCPtr		pGC;    char		*psrc;    register DDXPointPtr ppt;    int			*pwidth;    int			nspans;    int			fSorted;{    GC_SETUP(pDrawable, pGC);    if (GC_CHECK((WindowPtr) pDrawable))    {	register DDXPointPtr    pts;	register int    	*widths;	register int    	nPts;	for (pts = ppt, widths = pwidth, nPts = nspans;	     nPts--;	     pts++, widths++) 	{	     if (SPN_OVERLAP(&pScreenPriv->saved,pts->y,pts->x,*widths))	     {		 rfbSpriteRemoveCursor(pDrawable->pScreen);		 break;	     }	}    }    GC_OP_PROLOGUE (pGC);    (*pGC->ops->SetSpans) (pDrawable, pGC, psrc, ppt, pwidth, nspans, fSorted);    GC_OP_EPILOGUE (pGC);}static voidrfbSpritePutImage(pDrawable, pGC, depth, x, y, w, h, leftPad, format, pBits)    DrawablePtr	  pDrawable;    GCPtr   	  pGC;    int		  depth;    int	    	  x;    int	    	  y;    int	    	  w;    int	    	  h;    int	    	  format;    char    	  *pBits;{    GC_SETUP(pDrawable, pGC);    if (GC_CHECK((WindowPtr) pDrawable))    {	if (ORG_OVERLAP(&pScreenPriv->saved,pDrawable->x,pDrawable->y,			x,y,w,h)) 	{	    rfbSpriteRemoveCursor (pDrawable->pScreen);	}    }    GC_OP_PROLOGUE (pGC);    (*pGC->ops->PutImage) (pDrawable, pGC, depth, x, y, w, h, leftPad, format, pBits);    GC_OP_EPILOGUE (pGC);}static RegionPtrrfbSpriteCopyArea (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty)    DrawablePtr	  pSrc;    DrawablePtr	  pDst;    GCPtr   	  pGC;    int	    	  srcx;    int	    	  srcy;    int	    	  w;    int	    	  h;

⌨️ 快捷键说明

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