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

📄 misprite.c

📁 远程桌面连接工具
💻 C
📖 第 1 页 / 共 4 页
字号:
static voidmiSpriteStoreColors (pMap, ndef, pdef)    ColormapPtr	pMap;    int		ndef;    xColorItem	*pdef;{    ScreenPtr		pScreen = pMap->pScreen;    miSpriteScreenPtr	pPriv;    int			i;    int			updated;    VisualPtr		pVisual;    pPriv = (miSpriteScreenPtr) pScreen->devPrivates[miSpriteScreenIndex].ptr;    SCREEN_PROLOGUE(pScreen, StoreColors);        (*pScreen->StoreColors) (pMap, ndef, pdef);    SCREEN_EPILOGUE(pScreen, StoreColors, miSpriteStoreColors);    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 (pPriv->isUp)	    	miSpriteRemoveCursor (pScreen);    	}    }}static voidmiSpriteFindColors (pScreen)    ScreenPtr	pScreen;{    miSpriteScreenPtr	pScreenPriv = (miSpriteScreenPtr)			    pScreen->devPrivates[miSpriteScreenIndex].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 voidmiSpriteSaveDoomedAreas (pWin, pObscured, dx, dy)    WindowPtr	pWin;    RegionPtr	pObscured;    int		dx, dy;{    ScreenPtr		pScreen;    miSpriteScreenPtr   pScreenPriv;    BoxRec		cursorBox;    pScreen = pWin->drawable.pScreen;        SCREEN_PROLOGUE (pScreen, SaveDoomedAreas);    pScreenPriv = (miSpriteScreenPtr) pScreen->devPrivates[miSpriteScreenIndex].ptr;    if (pScreenPriv->isUp)    {	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)	    miSpriteRemoveCursor (pScreen);    }    (*pScreen->SaveDoomedAreas) (pWin, pObscured, dx, dy);    SCREEN_EPILOGUE (pScreen, SaveDoomedAreas, miSpriteSaveDoomedAreas);}static RegionPtrmiSpriteRestoreAreas (pWin, prgnExposed)    WindowPtr	pWin;    RegionPtr	prgnExposed;{    ScreenPtr		pScreen;    miSpriteScreenPtr   pScreenPriv;    RegionPtr		result;    pScreen = pWin->drawable.pScreen;        SCREEN_PROLOGUE (pScreen, RestoreAreas);    pScreenPriv = (miSpriteScreenPtr) pScreen->devPrivates[miSpriteScreenIndex].ptr;    if (pScreenPriv->isUp)    {	if (RECT_IN_REGION( pScreen, prgnExposed, &pScreenPriv->saved) != rgnOUT)	    miSpriteRemoveCursor (pScreen);    }    result = (*pScreen->RestoreAreas) (pWin, prgnExposed);    SCREEN_EPILOGUE (pScreen, RestoreAreas, miSpriteRestoreAreas);    return result;}/* * Window wrappers */static voidmiSpritePaintWindowBackground (pWin, pRegion, what)    WindowPtr	pWin;    RegionPtr	pRegion;    int		what;{    ScreenPtr	    pScreen;    miSpriteScreenPtr    pScreenPriv;    pScreen = pWin->drawable.pScreen;    SCREEN_PROLOGUE (pScreen, PaintWindowBackground);    pScreenPriv = (miSpriteScreenPtr) pScreen->devPrivates[miSpriteScreenIndex].ptr;    if (pScreenPriv->isUp)    {	/*	 * 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)	    miSpriteRemoveCursor (pScreen);    }    (*pScreen->PaintWindowBackground) (pWin, pRegion, what);    SCREEN_EPILOGUE (pScreen, PaintWindowBackground, miSpritePaintWindowBackground);}static voidmiSpritePaintWindowBorder (pWin, pRegion, what)    WindowPtr	pWin;    RegionPtr	pRegion;    int		what;{    ScreenPtr	    pScreen;    miSpriteScreenPtr    pScreenPriv;    pScreen = pWin->drawable.pScreen;    SCREEN_PROLOGUE (pScreen, PaintWindowBorder);    pScreenPriv = (miSpriteScreenPtr) pScreen->devPrivates[miSpriteScreenIndex].ptr;    if (pScreenPriv->isUp)    {	/*	 * 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)	    miSpriteRemoveCursor (pScreen);    }    (*pScreen->PaintWindowBorder) (pWin, pRegion, what);    SCREEN_EPILOGUE (pScreen, PaintWindowBorder, miSpritePaintWindowBorder);}static voidmiSpriteCopyWindow (pWin, ptOldOrg, pRegion)    WindowPtr	pWin;    DDXPointRec	ptOldOrg;    RegionPtr	pRegion;{    ScreenPtr	    pScreen;    miSpriteScreenPtr    pScreenPriv;    BoxRec	    cursorBox;    int		    dx, dy;    pScreen = pWin->drawable.pScreen;    SCREEN_PROLOGUE (pScreen, CopyWindow);    pScreenPriv = (miSpriteScreenPtr) pScreen->devPrivates[miSpriteScreenIndex].ptr;    if (pScreenPriv->isUp)    {	/*	 * 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)	    miSpriteRemoveCursor (pScreen);    }    (*pScreen->CopyWindow) (pWin, ptOldOrg, pRegion);    SCREEN_EPILOGUE (pScreen, CopyWindow, miSpriteCopyWindow);}static voidmiSpriteClearToBackground (pWin, x, y, w, h, generateExposures)    WindowPtr pWin;    short x,y;    unsigned short w,h;    Bool generateExposures;{    ScreenPtr		pScreen;    miSpriteScreenPtr	pScreenPriv;    int			realw, realh;    pScreen = pWin->drawable.pScreen;    SCREEN_PROLOGUE (pScreen, ClearToBackground);    pScreenPriv = (miSpriteScreenPtr) pScreen->devPrivates[miSpriteScreenIndex].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))	{	    miSpriteRemoveCursor (pScreen);	}    }    (*pScreen->ClearToBackground) (pWin, x, y, w, h, generateExposures);    SCREEN_EPILOGUE (pScreen, ClearToBackground, miSpriteClearToBackground);}/* * GC Func wrappers */static voidmiSpriteValidateGC (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 voidmiSpriteChangeGC (pGC, mask)    GCPtr	    pGC;    unsigned long   mask;{    GC_FUNC_PROLOGUE (pGC);    (*pGC->funcs->ChangeGC) (pGC, mask);        GC_FUNC_EPILOGUE (pGC);}static voidmiSpriteCopyGC (pGCSrc, mask, pGCDst)    GCPtr	    pGCSrc, pGCDst;    unsigned long   mask;{    GC_FUNC_PROLOGUE (pGCDst);    (*pGCDst->funcs->CopyGC) (pGCSrc, mask, pGCDst);        GC_FUNC_EPILOGUE (pGCDst);}static voidmiSpriteDestroyGC (pGC)    GCPtr   pGC;{    GC_FUNC_PROLOGUE (pGC);    (*pGC->funcs->DestroyGC) (pGC);        GC_FUNC_EPILOGUE (pGC);}static voidmiSpriteChangeClip (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 voidmiSpriteCopyClip(pgcDst, pgcSrc)    GCPtr pgcDst, pgcSrc;{    GC_FUNC_PROLOGUE (pgcDst);    (* pgcDst->funcs->CopyClip)(pgcDst, pgcSrc);    GC_FUNC_EPILOGUE (pgcDst);}static voidmiSpriteDestroyClip(pGC)    GCPtr	pGC;{    GC_FUNC_PROLOGUE (pGC);    (* pGC->funcs->DestroyClip)(pGC);    GC_FUNC_EPILOGUE (pGC);}/* * GC Op wrappers */static voidmiSpriteFillSpans(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))	     {		 miSpriteRemoveCursor (pDrawable->pScreen);		 break;	     }	}    }    GC_OP_PROLOGUE (pGC);    (*pGC->ops->FillSpans) (pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted);    GC_OP_EPILOGUE (pGC);}static voidmiSpriteSetSpans(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))	     {		 miSpriteRemoveCursor(pDrawable->pScreen);		 break;	     }	}    }    GC_OP_PROLOGUE (pGC);    (*pGC->ops->SetSpans) (pDrawable, pGC, psrc, ppt, pwidth, nspans, fSorted);    GC_OP_EPILOGUE (pGC);}static voidmiSpritePutImage(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)) 	{	    miSpriteRemoveCursor (pDrawable->pScreen);	}    }    GC_OP_PROLOGUE (pGC);

⌨️ 快捷键说明

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