📄 tkwingdi.c
字号:
{ UINT result=SetPaletteEntries(hPal,iStart,cEntries,lppe); if(result){ InvalidateSelectedPalette(hPal); }#ifdef CKGRAPH_DEBUG else { dprintf("CkRealizePalette failed in %s %d\n",file,line); } tkWinGdi_SetPaletteEntries++; GTRACE(("%d:SetPaletteEntries(0x%x,%d,%d,..) return 0x%x in %s %d\n",tkWinGdi_SetPaletteEntries,hPal,iStart,cEntries,result,file,line);)#endif return result;}#ifdef CKGRAPH_DEBUGUINT CkGraph_ResizePalette(HPALETTE hPal,UINT nEntries,char* file,int line)#elseUINT CkGraph_ResizePalette(HPALETTE hPal,UINT nEntries)#endif /*CKGRAPH_DEBUG*/{ BOOL result=ResizePalette(hPal,nEntries); if(result){ InvalidateSelectedPalette(hPal); }#ifdef CKGRAPH_DEBUG else { dprintf("CkResizePalette failed in %s %d\n",file,line); } tkWinGdi_ResizePalette++; GTRACE(("%d:ResizePalette(0x%x,%d) return 0x%x in %s %d\n",tkWinGdi_ResizePalette,hPal,nEntries,result,file,line);)#endif return result;}#ifdef CKGRAPH_DEBUGint CkGraph_SetROP2(HDC hdc,int fnDrawMode,char* file,int line)#elseint CkGraph_SetROP2(HDC hdc,int fnDrawMode)#endif /*CKGRAPH_DEBUG*/{ GdiContext *devPtr=FINDCONTEXT(hdc); int ropout; //if already selected,make a simple return if(devPtr && devPtr->rop==fnDrawMode){#ifdef CKGRAPH_DEBUG //check if nobody behind us changed the ROP... if((ropout=GetROP2(hdc))!=fnDrawMode){ dprintf("rop is %d,should be %d in %s %d\n",ropout,fnDrawMode,file,line); fnDrawMode=SetROP2(hdc,fnDrawMode); }#endif return fnDrawMode; } ropout=SetROP2(hdc,fnDrawMode); if(ropout && devPtr){ devPtr->rop=fnDrawMode; }#ifdef CKGRAPH_DEBUG tkWinGdi_SetROP2++; if(!ropout) dprintf("CkSetROP2 failed in %s %d\n",file,line); GTRACE(("%d:SetROP2(0x%x,%d) return 0x%x in %s %d\n",tkWinGdi_SetROP2,hdc,fnDrawMode,ropout,file,line);)#endif return ropout;}#ifdef CKGRAPH_DEBUGint CkGraph_SetBkMode(HDC hdc,int iBkMode,char* file,int line)#elseint CkGraph_SetBkMode(HDC hdc,int iBkMode)#endif /*CKGRAPH_DEBUG*/{ GdiContext *devPtr=FINDCONTEXT(hdc); int bkout; //if already selected,make a simple return if(devPtr && devPtr->bkmode==iBkMode){#ifdef CKGRAPH_DEBUG //check if nobody behind us changed the bkmode... if((bkout=GetBkMode(hdc))!=iBkMode){ dprintf("bkmode is %d, should be %d in %s %d\n",bkout,iBkMode,file,line); SetBkMode(hdc,iBkMode); }#endif return iBkMode; } bkout=SetBkMode(hdc,iBkMode); if(bkout && devPtr){ devPtr->bkmode=iBkMode; }#ifdef CKGRAPH_DEBUG tkWinGdi_SetBkMode++; if(!bkout) dprintf("CkSetBkMode failed in %s %d\n",file,line); GTRACE(("%d:SetBkMode(0x%x,%d) return 0x%x in %s %d\n",tkWinGdi_SetBkMode,hdc,iBkMode,bkout,file,line);)#endif return bkout;}#ifdef CKGRAPH_DEBUGCOLORREF CkGraph_SetColor(HDC hdc,COLORREF color,int bk,char* file,int line)#elseCOLORREF CkGraph_SetColor(HDC hdc,COLORREF color,int bk)#endif /*CKGRAPH_DEBUG*/{ GdiContext *devPtr=FINDCONTEXT(hdc); COLORREF colorout; COLORREF* colorPtr; //if already selected,make a simple return if(devPtr) { if( *(colorPtr=(bk?&devPtr->bkcolor:&devPtr->textcolor))==color)#ifdef CKGRAPH_DEBUG //is it REALLY selected? //check if nobody behind us changed the colors... { COLORREF realbk; if((realbk=bk?GetBkColor(hdc):GetTextColor(hdc))!=color){ dprintf("%s is 0x%x,should be 0x%x in %s %d\n",bk?"bkcolor":"txtcolor",realbk,color,file,line); return bk?SetBkColor(hdc,color):SetTextColor(hdc,color); } return color; }#else return color;#endif } colorout=bk?SetBkColor(hdc,color):SetTextColor(hdc,color); if(colorout!=CLR_INVALID && devPtr){ *colorPtr=color; }#ifdef CKGRAPH_DEBUG if(bk) tkWinGdi_SetBkColor++; else tkWinGdi_SetTextColor++; if(colorout==CLR_INVALID) dprintf("%s failed in %s %d\n",bk?"CkSetBkColor":"CkSetTextColor",file,line); GTRACE(("%d:%s(0x%x,0x%x) return 0x%x in %s %d\n",bk?tkWinGdi_SetBkColor:tkWinGdi_SetTextColor,bk?"SetBkColor":"SetTextColor",hdc,color,colorout,file,line);)#endif return colorout;}#ifdef CKGRAPH_DEBUGint CkGraph_SetPolyFillMode(HDC hdc, int iMode,char* file,int line)#elseint CkGraph_SetPolyFillMode(HDC hdc, int iMode)#endif /*CKGRAPH_DEBUG*/{ GdiContext *devPtr=FINDCONTEXT(hdc); int fillout; //if already selected,make a simple return if(devPtr && devPtr->fillmode==iMode){#ifdef CKGRAPH_DEBUG //check if nobody behind us changed the fillmode... if((fillout=GetPolyFillMode(hdc))!=iMode){ dprintf("fillmode is %d,should be %d in %s %d\n",fillout,iMode,file,line); iMode=SetPolyFillMode(hdc,iMode); }#endif return iMode; } fillout=SetPolyFillMode(hdc,iMode); if(fillout && devPtr){ devPtr->fillmode=iMode; }#ifdef CKGRAPH_DEBUG tkWinGdi_SetPolyFillMode++; if(!fillout) dprintf("CkSetPolyFillMode failed in %s %d\n",file,line); GTRACE(("%d:SetPolyFillMode(0x%x,%d) return 0x%x in %s %d\n",tkWinGdi_SetPolyFillMode,hdc,iMode,fillout,file,line);)#endif return fillout;}#ifdef CKGRAPH_DEBUGHFONT CkGraph_SelectFont(HDC hdc,HFONT hfont,char* file,int line)#elseHFONT CkGraph_SelectFont(HDC hdc,HFONT hfont)#endif /*CKGRAPH_DEBUG*/{ GdiContext *devPtr=FINDCONTEXT(hdc); HFONT hout; //if already selected,make a simple return if(devPtr && devPtr->hobjs[CKOBJ_FONT]==(HGDIOBJ)hfont){#ifdef CKGRAPH_DEBUG hout=(HFONT)SelectObject(hdc,(HGDIOBJ)stock_SYSTEM_FONT); if(hout!=hfont){ dprintf("font is 0x%x,should be 0x%x in %s %d\n",hout,hfont,file,line); } hfont=(HFONT)SelectObject(hdc,(HGDIOBJ)hfont);#endif return hfont; } hout=(HFONT)SelectObject(hdc,(HGDIOBJ)hfont); if(hout && devPtr){ devPtr->hobjs[CKOBJ_FONT]=(HGDIOBJ)hfont; }#ifdef CKGRAPH_DEBUG tkWinGdi_SelectFont++; if(!hout) dprintf("CkSelectFont failed in %s %d\n",file,line); GTRACE(("%d:SelectFont(0x%x,0x%x) return 0x%x in %s %d\n",tkWinGdi_SelectFont,hdc,hfont,hout,file,line);)#endif return hout;}//DeleteObject functions#ifdef CKGRAPH_DEBUG#define CHECKSEL(x) if(!(x)){dprintf("%s failed in %s,line %d\n",##x,__FILE__,__LINE__);}#define DODELETEOBJECT(type,hobj,file,line) DoDeleteObject(type,hobj,file,line)static int DoDeleteObject(int type,HGDIOBJ hobj,char* file,int line)#else#define CHECKSEL(x) x#define DODELETEOBJECT(type,hobj,file,line) DoDeleteObject(type,hobj)static int DoDeleteObject(int type,HGDIOBJ hobj)#endif{ int success=1; GdiContext* objPtr;#ifdef CKGRAPH_DEBUG if(is_stockobject(type,hobj)){ dprintf("fatal try to delete the stockobject 0x%x in %s %d\n",hobj,file,line); return 0; }#endif //walk through the list of dc's and look if the object is still selected in a dc for (objPtr = devHead ;objPtr;objPtr=objPtr->next){ if(objPtr->hobjs[type]==hobj){ //yupp ,it does#ifdef CKGRAPH_DEBUG if (tkWinGdi_verbose>1){ GdiObj* hdcobj=CkGraphFindObject(objPtr->type, (ClientData)objPtr->hdc); dprintf( "CkDeleteObject:%s 0x%x from %s %d still selected in 0x%x %s %d\n", obj_type(type),(int)hobj,file,line, (int)objPtr->hdc,hdcobj?hdcobj->file:"??",hdcobj?hdcobj->line:0); }#endif //repair with deselecting the object switch(type){ case CKOBJ_PEN:CHECKSEL(SelectObject(objPtr->hdc,objPtr->hobjs[type]=stock_NULL_PEN));break; case CKOBJ_BRUSH:CHECKSEL(SelectObject(objPtr->hdc,objPtr->hobjs[type]=stock_NULL_BRUSH));break; case CKOBJ_FONT:CHECKSEL(SelectObject(objPtr->hdc,objPtr->hobjs[type]=stock_SYSTEM_FONT));break; case CKOBJ_REGION:CHECKSEL(SelectClipRgn(objPtr->hdc,objPtr->hobjs[type]=(HGDIOBJ)NULL));break; case CKOBJ_PAL:CHECKSEL(SelectPalette(objPtr->hdc,objPtr->hobjs[type]=stock_DEFAULT_PALETTE,TRUE));break; case CKOBJ_BITMAP:CHECKSEL(SelectObject(objPtr->hdc,objPtr->hobjs[type]=objPtr->defaultbitmap));break; default: dprintf("have no success select for 0x%x\n"); success=0; } } } return success;}#ifdef CKGRAPH_DEBUGstatic int DoRealDelete(int type,HGDIOBJ hobj,char* file,int line){ int result=DeleteObject(hobj); if(!result) dprintf("CkDeleteObject 0x%x failed in %s %d\n",(int)hobj,file,line); CkGraphDeleteObject(type,(ClientData)hobj,file,line); return result;}#else#define DoRealDelete(type,hobj,file,line) DeleteObject(hobj)#endif#ifdef CKGRAPH_DEBUGint CkGraph_DeleteObject(HGDIOBJ hobj,char* file,int line)#elseint CkGraph_DeleteObject(HGDIOBJ hobj)#endif{ int success=1; int type; //GetObjectType only runs well under NT and Win95 not Win32s //use the CkGraph_Deletexx functions instead if(Wtk_test_win32s()){ dprintf("CkDeleteObject called under win32s"#ifdef CKGRAPH_DEBUG " in %s %d\n",file,line#endif ); } type=convert_gdiobjtype(GetObjectType(hobj)); if(type>=0 && type <MAXGDIOBJ){ success=DODELETEOBJECT(type,hobj,file,line); }#ifdef CKGRAPH_DEBUG tkWinGdi_DeleteObject++; GTRACE(("%d:DeleteObject(0x%x) return %d in %s %d\n",tkWinGdi_DeleteObject,hobj,success,file,line);)#endif return success?DoRealDelete(type,hobj,file,line):FALSE;}#ifdef CKGRAPH_DEBUGint CkGraph_DeleteBrush(HBRUSH hobj,char* file,int line)#elseint CkGraph_DeleteBrush(HBRUSH hobj)#endif{ int success=DODELETEOBJECT(CKOBJ_BRUSH,hobj,file,line);#ifdef CKGRAPH_DEBUG tkWinGdi_DeleteBrush++; GTRACE(("%d:DeleteBrush(0x%x) return %d in %s %d\n",tkWinGdi_DeleteBrush,hobj,success,file,line);)#endif return success?DoRealDelete(CKOBJ_BRUSH,hobj,file,line):FALSE;}#ifdef CKGRAPH_DEBUGint CkGraph_DeletePen(HPEN hobj,char* file,int line)#elseint CkGraph_DeletePen(HPEN hobj)#endif{ int success=DODELETEOBJECT(CKOBJ_PEN,hobj,file,line);#ifdef CKGRAPH_DEBUG tkWinGdi_DeletePen++; GTRACE(("%d:DeletePen(0x%x) return %d in %s %d\n",tkWinGdi_DeletePen,hobj,success,file,line);)#endif return success?DoRealDelete(CKOBJ_PEN,hobj,file,line):FALSE;}#ifdef CKGRAPH_DEBUGint CkGraph_DeleteFont(HFONT hobj,char* file,int line)#elseint CkGraph_DeleteFont(HFONT hobj)#endif{ int success=DODELETEOBJECT(CKOBJ_FONT,hobj,file,line);#ifdef CKGRAPH_DEBUG tkWinGdi_DeleteFont++; GTRACE(("%d:DeleteFont(0x%x) return %d in %s %d\n",tkWinGdi_DeleteFont,hobj,success,file,line);)#endif return success?DoRealDelete(CKOBJ_FONT,hobj,file,line):FALSE;}#ifdef CKGRAPH_DEBUGint CkGraph_DeleteBitmap(HBITMAP hobj,char* file,int line)#elseint CkGraph_DeleteBitmap(HBITMAP hobj)#endif{ int success=DODELETEOBJECT(CKOBJ_BITMAP,hobj,file,line);#ifdef CKGRAPH_DEBUG tkWinGdi_DeleteBitmap++; GTRACE(("%d:DeleteBitmap(0x%x) return %d in %s %d\n",tkWinGdi_DeleteBitmap,hobj,success,file,line);)#endif return success?DoRealDelete(CKOBJ_BITMAP,hobj,file,line):FALSE;}#ifdef CKGRAPH_DEBUGint CkGraph_DeletePalette(HPALETTE hobj,char* file,int line)#elseint CkGraph_DeletePalette(HPALETTE hobj)#endif{ int success=DODELETEOBJECT(CKOBJ_PAL,hobj,file,line); /*now it's a good point to try freeing the freePals if there were previous*/ if(freePals) { TryFreePalettes(&freePals); }#ifdef CKGRAPH_DEBUG tkWinGdi_DeletePalette++; GTRACE(("%d:DeletePalette(0x%x) return %d in %s %d\n",tkWinGdi_DeletePalette,hobj,success,file,line);)#endif if(DoRealDelete(CKOBJ_PAL,hobj,file,line)==FALSE) { /*Oops, the deletion failed , so try it later*/#ifdef CKGRAPH_DEBUG CkGraphCreateObject(CKOBJ_PAL,(ClientData)hobj,file,line);#endif /*promise the caller it were ok*/ success=TRUE; AddPalObj(&freePals,(HPALETTE)hobj); } RemovePalObj(&allocPals,(HPALETTE)hobj); return success;}/* this bloody function tries to free all objects allocated here it walks trough the list of DC's and tries to wipe out all objects, afterwards all DC's are freed*/void CkGraph_FreeObjects(void){ GdiContext *devPtr,*objPtr2,*nextPtr; int i; int gdiobjs[5]={CKOBJ_BRUSH,CKOBJ_PEN,CKOBJ_FONT,CKOBJ_BITMAP,CKOBJ_PAL}; currdc=(GdiContext*)0; for (devPtr = devHead ;devPtr;){ nextPtr = devPtr->next; /*look for all selected objects in gdiobjs*/ for (i=0;i<sizeof(gdiobjs)/sizeof(gdiobjs[0]);i++){ int objtype=gdiobjs[i]; HGDIOBJ hgdiobj=devPtr->hobjs[objtype]; /*don't delete StockObjects */ if (hgdiobj!=0 && !is_stockobject(objtype,hgdiobj)){ for(objPtr2=devPtr;objPtr2;objPtr2=objPtr2->next) DODELETEOBJECT(objtype,hgdiobj,__FILE__,__LINE__); DoRealDelete(objtype,hgdiobj,__FILE__,__LINE__); } } /*now deleting this dc*/ if (devPtr->type==CKOBJ_MEMDC){ DeleteDC(devPtr->hdc); }#ifdef CKGRAPH_DEBUG CkGraphDeleteObject(devPtr->type,(ClientData)devPtr->hdc,__FILE__,__LINE__);#endif ckfree((char *)devPtr); devPtr=nextPtr; devHead=nextPtr; } devHead=(GdiContext*)0; /*now last try to remove the palettes*/ TryFreePalettes(&freePals); TryFreePalettes(&allocPals);}#endif /*CKGRAPH_IMP*/#ifdef PROFILE_INFO/*the following funcs are only called if PROFILE_INFO is on, it's stron
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -