Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygengdibatch.c
Go to the documentation of this file.
00001 00002 #include <win32k.h> 00003 00004 #define NDEBUG 00005 #include <debug.h> 00006 00007 00008 // 00009 // Gdi Batch Flush support functions. 00010 // 00011 00012 // 00013 // DoDeviceSync 00014 // 00015 // based on IntEngEnter from eng/engmisc.c 00016 // 00017 VOID 00018 FASTCALL 00019 DoDeviceSync( SURFOBJ *Surface, PRECTL Rect, FLONG fl) 00020 { 00021 PPDEVOBJ Device = (PDEVOBJ*)Surface->hdev; 00022 // No punting and "Handle to a surface, provided that the surface is device-managed. 00023 // Otherwise, dhsurf is zero". 00024 if (!(Device->flFlags & PDEV_DRIVER_PUNTED_CALL) && (Surface->dhsurf)) 00025 { 00026 if (Device->DriverFunctions.SynchronizeSurface) 00027 { 00028 Device->DriverFunctions.SynchronizeSurface(Surface, Rect, fl); 00029 } 00030 else 00031 { 00032 if (Device->DriverFunctions.Synchronize) 00033 { 00034 Device->DriverFunctions.Synchronize(Surface->dhpdev, Rect); 00035 } 00036 } 00037 } 00038 } 00039 00040 VOID 00041 FASTCALL 00042 SynchonizeDriver(FLONG Flags) 00043 { 00044 SURFOBJ *SurfObj; 00045 //PPDEVOBJ Device; 00046 00047 if (Flags & GCAPS2_SYNCFLUSH) 00048 Flags = DSS_FLUSH_EVENT; 00049 if (Flags & GCAPS2_SYNCTIMER) 00050 Flags = DSS_TIMER_EVENT; 00051 00052 //Device = IntEnumHDev(); 00053 // UNIMPLEMENTED; 00054 //ASSERT(FALSE); 00055 SurfObj = 0;// EngLockSurface( Device->pSurface ); 00056 if(!SurfObj) return; 00057 DoDeviceSync( SurfObj, NULL, Flags); 00058 EngUnlockSurface(SurfObj); 00059 return; 00060 } 00061 00062 // 00063 // Process the batch. 00064 // 00065 ULONG 00066 FASTCALL 00067 GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr) 00068 { 00069 BOOL Hit = FALSE; 00070 ULONG Cmd = 0, Size = 0; 00071 PDC_ATTR pdcattr = NULL; 00072 00073 if (dc) 00074 { 00075 pdcattr = dc->pdcattr; 00076 } 00077 00078 _SEH2_TRY 00079 { 00080 Cmd = pHdr->Cmd; 00081 Size = pHdr->Size; // Return the full size of the structure. 00082 } 00083 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) 00084 { 00085 Hit = TRUE; 00086 } 00087 _SEH2_END; 00088 00089 if (Hit) 00090 { 00091 DPRINT1("WARNING! GdiBatch Fault!\n"); 00092 return 0; 00093 } 00094 00095 // FYI! The thread is approaching the end of sunset. 00096 switch(Cmd) 00097 { 00098 case GdiBCPatBlt: // Highest pri first! 00099 break; 00100 case GdiBCPolyPatBlt: 00101 break; 00102 case GdiBCTextOut: 00103 break; 00104 case GdiBCExtTextOut: 00105 break; 00106 case GdiBCSetBrushOrg: 00107 { 00108 PGDIBSSETBRHORG pgSBO; 00109 if (!dc) break; 00110 pgSBO = (PGDIBSSETBRHORG) pHdr; 00111 pdcattr->ptlBrushOrigin = pgSBO->ptlBrushOrigin; 00112 DC_vSetBrushOrigin(dc, pgSBO->ptlBrushOrigin.x, pgSBO->ptlBrushOrigin.y); 00113 break; 00114 } 00115 case GdiBCExtSelClipRgn: 00116 break; 00117 case GdiBCSelObj: 00118 { 00119 PGDIBSOBJECT pgO; 00120 PTEXTOBJ pNewFnt = NULL; 00121 00122 if (!dc) break; 00123 pgO = (PGDIBSOBJECT) pHdr; 00124 00125 if (NT_SUCCESS(TextIntRealizeFont((HFONT)pgO->hgdiobj,NULL))) 00126 { 00127 /* LFONTOBJ use share and locking. */ 00128 pNewFnt = TEXTOBJ_LockText(pgO->hgdiobj); 00129 00130 dc->dclevel.plfnt = pNewFnt; 00131 dc->hlfntCur = pgO->hgdiobj; 00132 pdcattr->hlfntNew = pgO->hgdiobj; 00133 pdcattr->ulDirty_ |= DIRTY_CHARSET; 00134 pdcattr->ulDirty_ &= ~SLOW_WIDTHS; 00135 } 00136 if (pNewFnt) TEXTOBJ_UnlockText(pNewFnt); 00137 break; 00138 } 00139 case GdiBCDelRgn: 00140 DPRINT("Delete Region Object!\n"); 00141 case GdiBCDelObj: 00142 { 00143 PGDIBSOBJECT pgO = (PGDIBSOBJECT) pHdr; 00144 GreDeleteObject( pgO->hgdiobj ); 00145 break; 00146 } 00147 default: 00148 break; 00149 } 00150 00151 return Size; 00152 } 00153 00154 /* 00155 * NtGdiFlush 00156 * 00157 * Flushes the calling thread's current batch. 00158 */ 00159 VOID 00160 APIENTRY 00161 NtGdiFlush(VOID) 00162 { 00163 SynchonizeDriver(GCAPS2_SYNCFLUSH); 00164 } 00165 00166 /* 00167 * NtGdiFlushUserBatch 00168 * 00169 * Callback for thread batch flush routine. 00170 * 00171 * Think small & fast! 00172 */ 00173 NTSTATUS 00174 APIENTRY 00175 NtGdiFlushUserBatch(VOID) 00176 { 00177 PTEB pTeb = NtCurrentTeb(); 00178 ULONG GdiBatchCount = pTeb->GdiBatchCount; 00179 00180 if( (GdiBatchCount > 0) && (GdiBatchCount <= (GDIBATCHBUFSIZE/4))) 00181 { 00182 HDC hDC = (HDC) pTeb->GdiTebBatch.HDC; 00183 00184 /* If hDC is zero and the buffer fills up with delete objects we need 00185 to run anyway. 00186 */ 00187 if (hDC || GdiBatchCount) 00188 { 00189 PCHAR pHdr = (PCHAR)&pTeb->GdiTebBatch.Buffer[0]; 00190 PDC pDC = NULL; 00191 00192 if (GDI_HANDLE_GET_TYPE(hDC) == GDILoObjType_LO_DC_TYPE && GreIsHandleValid(hDC)) 00193 { 00194 pDC = DC_LockDc(hDC); 00195 } 00196 00197 // No need to init anything, just go! 00198 for (; GdiBatchCount > 0; GdiBatchCount--) 00199 { 00200 ULONG Size; 00201 // Process Gdi Batch! 00202 Size = GdiFlushUserBatch(pDC, (PGDIBATCHHDR) pHdr); 00203 if (!Size) break; 00204 pHdr += Size; 00205 } 00206 00207 if (pDC) 00208 { 00209 DC_UnlockDc(pDC); 00210 } 00211 00212 // Exit and clear out for the next round. 00213 pTeb->GdiTebBatch.Offset = 0; 00214 pTeb->GdiBatchCount = 0; 00215 pTeb->GdiTebBatch.HDC = 0; 00216 } 00217 } 00218 00219 // FIXME: On Windows XP the function returns &pTeb->RealClientId, maybe VOID? 00220 return STATUS_SUCCESS; 00221 } 00222 00223 Generated on Sat May 26 2012 04:37:14 for ReactOS by
1.7.6.1
|