Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygengdi32p.h
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS System Libraries 00004 * FILE: lib/gdi32/include/gdi32p.h 00005 * PURPOSE: User-Mode Win32 GDI Library Private Header 00006 * PROGRAMMER: Alex Ionescu (alex@relsoft.net) 00007 */ 00008 00009 00010 /* DATA **********************************************************************/ 00011 00012 extern PGDI_TABLE_ENTRY GdiHandleTable; 00013 extern PGDI_SHARED_HANDLE_TABLE GdiSharedHandleTable; 00014 extern HANDLE hProcessHeap; 00015 extern HANDLE CurrentProcessId; 00016 extern DWORD GDI_BatchLimit; 00017 extern PDEVCAPS GdiDevCaps; 00018 extern BOOL gbLpk; // Global bool LanguagePack 00019 extern HANDLE ghSpooler; 00020 extern RTL_CRITICAL_SECTION semLocal; 00021 00022 typedef INT 00023 (CALLBACK* EMFPLAYPROC)( 00024 HDC hdc, 00025 INT iFunction, 00026 HANDLE hPageQuery 00027 ); 00028 00029 /* DEFINES *******************************************************************/ 00030 00031 #define HANDLE_LIST_INC 20 00032 00033 #define METAFILE_MEMORY 1 00034 #define METAFILE_DISK 2 00035 00036 #define SAPCALLBACKDELAY 244 00037 00038 /* MACRO ********************************************************************/ 00039 00040 #define ROP_USES_SOURCE(Rop) (((Rop) << 2 ^ Rop) & 0xCC0000) 00041 00042 /* TYPES *********************************************************************/ 00043 00044 // Based on wmfapi.h and Wine. 00045 typedef struct tagMETAFILEDC 00046 { 00047 PVOID pvMetaBuffer; 00048 HANDLE hFile; 00049 DWORD Size; 00050 DWORD dwWritten; 00051 METAHEADER mh; 00052 WORD reserved; 00053 HLOCAL MFObjList; 00054 HPEN hPen; 00055 HBRUSH hBrush; 00056 HDC hDc; 00057 HGDIOBJ hMetaDc; 00058 HPALETTE hPalette; 00059 HFONT hFont; 00060 HBITMAP hBitmap; 00061 HRGN hRegion; 00062 HGDIOBJ hMetafile; 00063 HGDIOBJ hMemDc; 00064 HPEN hExtPen; 00065 HGDIOBJ hEnhMetaDc; 00066 HGDIOBJ hEnhMetaFile; 00067 HCOLORSPACE hColorSpace; 00068 WCHAR Filename[MAX_PATH+2]; 00069 } METAFILEDC,*PMETAFILEDC; 00070 00071 // Metafile Entry handle 00072 typedef struct tagMF_ENTRY 00073 { 00074 LIST_ENTRY List; 00075 HGDIOBJ hmDC; // Handle return from NtGdiCreateClientObj. 00076 PMETAFILEDC pmfDC; 00077 } MF_ENTRY, *PMF_ENTRY; 00078 00079 typedef struct tagENHMETAFILE 00080 { 00081 PVOID pvMetaBuffer; 00082 HANDLE hFile; /* Handle for disk based MetaFile */ 00083 DWORD Size; 00084 INT iType; 00085 PENHMETAHEADER emf; 00086 UINT handles_size, cur_handles; 00087 HGDIOBJ *handles; 00088 INT horzres, vertres; 00089 INT horzsize, vertsize; 00090 INT logpixelsx, logpixelsy; 00091 INT bitspixel; 00092 INT textcaps; 00093 INT rastercaps; 00094 INT technology; 00095 INT planes; 00096 } ENHMETAFILE,*PENHMETAFILE; 00097 00098 00099 #define PDEV_UMPD_ID 0xFEDCBA98 00100 // UMPDEV flags 00101 #define UMPDEV_NO_ESCAPE 0x0002 00102 #define UMPDEV_SUPPORT_ESCAPE 0x0004 00103 typedef struct _UMPDEV 00104 { 00105 DWORD Sig; // Init with PDEV_UMPD_ID 00106 struct _UMPDEV *pumpdNext; 00107 PDRIVER_INFO_5W pdi5Info; 00108 HMODULE hModule; 00109 DWORD dwFlags; 00110 DWORD dwDriverAttributes; 00111 DWORD dwConfigVersion; // Number of times the configuration 00112 // file for this driver has been upgraded 00113 // or downgraded since the last spooler restart. 00114 DWORD dwDriverCount; // After init should be 2 00115 DWORD WOW64_UMPDev; 00116 DWORD WOW64_hMod; 00117 DWORD Unknown; 00118 PVOID apfn[INDEX_LAST]; // Print Driver pfn 00119 } UMPDEV, *PUMPDEV; 00120 00121 #define LOCALFONT_COUNT 10 00122 typedef struct _LOCALFONT 00123 { 00124 FONT_ATTR lfa[LOCALFONT_COUNT]; 00125 } LOCALFONT, *PLOCALFONT; 00126 00127 // sdk/winspool.h 00128 typedef BOOL (WINAPI *ABORTPRINTER) (HANDLE); 00129 typedef BOOL (WINAPI *CLOSEPRINTER) (HANDLE); 00130 typedef BOOL (WINAPI *CLOSESPOOLFILEHANDLE) (HANDLE, HANDLE); // W2k8 00131 typedef HANDLE (WINAPI *COMMITSPOOLDATA) (HANDLE,HANDLE,DWORD); // W2k8 00132 typedef LONG (WINAPI *DOCUMENTPROPERTIESW) (HWND,HANDLE,LPWSTR,PDEVMODEW,PDEVMODEW,DWORD); 00133 typedef BOOL (WINAPI *ENDDOCPRINTER) (HANDLE); 00134 typedef BOOL (WINAPI *ENDPAGEPRINTER) (HANDLE); 00135 typedef BOOL (WINAPI *GETPRINTERW) (HANDLE,DWORD,LPBYTE,DWORD,LPDWORD); 00136 typedef BOOL (WINAPI *GETPRINTERDRIVERW) (HANDLE,LPWSTR,DWORD,LPBYTE,DWORD,LPDWORD); 00137 typedef HANDLE (WINAPI *GETSPOOLFILEHANDLE) (HANDLE); // W2k8 00138 typedef BOOL (WINAPI *ISVALIDDEVMODEW) (PDEVMODEW,size_t); 00139 typedef BOOL (WINAPI *OPENPRINTERW) (LPWSTR,PHANDLE,LPPRINTER_DEFAULTSW); 00140 typedef BOOL (WINAPI *READPRINTER) (HANDLE,PVOID,DWORD,PDWORD); 00141 typedef BOOL (WINAPI *RESETPRINTERW) (HANDLE,LPPRINTER_DEFAULTSW); 00142 typedef LPWSTR (WINAPI *STARTDOCDLGW) (HANDLE,DOCINFOW *); 00143 typedef DWORD (WINAPI *STARTDOCPRINTERW) (HANDLE,DWORD,PBYTE); 00144 typedef BOOL (WINAPI *STARTPAGEPRINTER) (HANDLE); 00145 // ddk/winsplp.h 00146 typedef BOOL (WINAPI *SEEKPRINTER) (HANDLE,LARGE_INTEGER,PLARGE_INTEGER,DWORD,BOOL); 00147 typedef BOOL (WINAPI *SPLREADPRINTER) (HANDLE,LPBYTE *,DWORD); 00148 // Same as ddk/winsplp.h DriverUnloadComplete? 00149 typedef BOOL (WINAPI *SPLDRIVERUNLOADCOMPLETE) (LPWSTR); 00150 // Driver support: 00151 // DrvDocumentEvent api/winddiui.h not W2k8 DocumentEventAW 00152 typedef INT (WINAPI *DOCUMENTEVENT) (HANDLE,HDC,INT,ULONG,PVOID,ULONG,PVOID); 00153 // DrvQueryColorProfile 00154 typedef BOOL (WINAPI *QUERYCOLORPROFILE) (HANDLE,PDEVMODEW,ULONG,VOID*,ULONG,FLONG); 00155 // Unknown: 00156 typedef DWORD (WINAPI *QUERYSPOOLMODE) (HANDLE,DWORD,DWORD); 00157 typedef DWORD (WINAPI *QUERYREMOTEFONTS) (DWORD,DWORD,DWORD); 00158 00159 extern CLOSEPRINTER fpClosePrinter; 00160 extern OPENPRINTERW fpOpenPrinterW; 00161 00162 /* FUNCTIONS *****************************************************************/ 00163 00164 PVOID 00165 HEAP_alloc(DWORD len); 00166 00167 NTSTATUS 00168 HEAP_strdupA2W( 00169 LPWSTR* ppszW, 00170 LPCSTR lpszA 00171 ); 00172 00173 VOID 00174 HEAP_free(LPVOID memory); 00175 00176 VOID 00177 FASTCALL 00178 FONT_TextMetricWToA( 00179 const TEXTMETRICW *ptmW, 00180 LPTEXTMETRICA ptmA 00181 ); 00182 00183 VOID 00184 FASTCALL 00185 NewTextMetricW2A( 00186 NEWTEXTMETRICA *tma, 00187 NEWTEXTMETRICW *tmw 00188 ); 00189 00190 VOID 00191 FASTCALL 00192 NewTextMetricExW2A( 00193 NEWTEXTMETRICEXA *tma, 00194 NEWTEXTMETRICEXW *tmw 00195 ); 00196 00197 BOOL 00198 FASTCALL 00199 DeleteRegion( HRGN ); 00200 00201 BOOL 00202 GdiIsHandleValid(HGDIOBJ hGdiObj); 00203 00204 BOOL 00205 GdiGetHandleUserData( 00206 HGDIOBJ hGdiObj, 00207 DWORD ObjectType, 00208 PVOID *UserData 00209 ); 00210 00211 PLDC 00212 FASTCALL 00213 GdiGetLDC(HDC hDC); 00214 00215 HGDIOBJ 00216 WINAPI 00217 GdiFixUpHandle(HGDIOBJ hGO); 00218 00219 BOOL 00220 WINAPI 00221 CalculateColorTableSize( 00222 CONST BITMAPINFOHEADER *BitmapInfoHeader, 00223 UINT *ColorSpec, 00224 UINT *ColorTableSize 00225 ); 00226 00227 LPBITMAPINFO 00228 WINAPI 00229 ConvertBitmapInfo( 00230 CONST BITMAPINFO *BitmapInfo, 00231 UINT ColorSpec, 00232 UINT *BitmapInfoSize, 00233 BOOL FollowedByData 00234 ); 00235 00236 DWORD 00237 WINAPI 00238 GetAndSetDCDWord( HDC, INT, DWORD, DWORD, DWORD, DWORD ); 00239 00240 DWORD 00241 WINAPI 00242 GetDCDWord( HDC, INT, DWORD); 00243 00244 HGDIOBJ 00245 WINAPI 00246 GetDCObject( HDC, INT); 00247 00248 VOID 00249 NTAPI 00250 LogFontA2W( 00251 LPLOGFONTW pW, 00252 CONST LOGFONTA *pA 00253 ); 00254 00255 VOID 00256 NTAPI 00257 LogFontW2A( 00258 LPLOGFONTA pA, 00259 CONST LOGFONTW *pW 00260 ); 00261 00262 VOID 00263 WINAPI 00264 EnumLogFontExW2A( 00265 LPENUMLOGFONTEXA fontA, 00266 CONST ENUMLOGFONTEXW *fontW ); 00267 00268 /* FIXME: Put in some public header */ 00269 UINT 00270 WINAPI 00271 UserRealizePalette(HDC hDC); 00272 00273 int 00274 WINAPI 00275 GdiAddFontResourceW(LPCWSTR lpszFilename,FLONG fl,DESIGNVECTOR *pdv); 00276 00277 VOID 00278 WINAPI 00279 GdiSetLastError( DWORD dwErrCode ); 00280 00281 DWORD WINAPI GdiGetCodePage(HDC); 00282 00283 int 00284 WINAPI 00285 GdiGetBitmapBitsSize(BITMAPINFO *lpbmi); 00286 00287 VOID GdiSAPCallback(PLDC pldc); 00288 HGDIOBJ FASTCALL hGetPEBHandle(HANDLECACHETYPE,COLORREF); 00289 00290 int FASTCALL DocumentEventEx(PVOID,HANDLE,HDC,int,ULONG,PVOID,ULONG,PVOID); 00291 BOOL FASTCALL EndPagePrinterEx(PVOID,HANDLE); 00292 BOOL FASTCALL LoadTheSpoolerDrv(VOID); 00293 00294 FORCEINLINE 00295 PVOID 00296 GdiAllocBatchCommand( 00297 HDC hdc, 00298 USHORT Cmd) 00299 { 00300 PTEB pTeb; 00301 USHORT cjSize; 00302 PGDIBATCHHDR pHdr; 00303 00304 /* Get a pointer to the TEB */ 00305 pTeb = NtCurrentTeb(); 00306 00307 /* Check if we have a valid environment */ 00308 if (!pTeb || !pTeb->Win32ThreadInfo) return NULL; 00309 00310 /* Do we use a DC? */ 00311 if (hdc) 00312 { 00313 /* If the batch DC is NULL, we set this one as the new one */ 00314 if (!pTeb->GdiTebBatch.HDC) pTeb->GdiTebBatch.HDC = hdc; 00315 00316 /* If not, check if the batch DC equal to our DC */ 00317 else if (pTeb->GdiTebBatch.HDC != hdc) return NULL; 00318 } 00319 00320 /* Get the size of the entry */ 00321 if (Cmd == GdiBCPatBlt) cjSize = 0; 00322 else if (Cmd == GdiBCPolyPatBlt) cjSize = 0; 00323 else if (Cmd == GdiBCTextOut) cjSize = 0; 00324 else if (Cmd == GdiBCExtTextOut) cjSize = 0; 00325 else if (Cmd == GdiBCSetBrushOrg) cjSize = 0; 00326 else if (Cmd == GdiBCExtSelClipRgn) cjSize = 0; 00327 else if (Cmd == GdiBCSelObj) cjSize = sizeof(GDIBSOBJECT); 00328 else if (Cmd == GdiBCDelRgn) cjSize = sizeof(GDIBSOBJECT); 00329 else if (Cmd == GdiBCDelObj) cjSize = sizeof(GDIBSOBJECT); 00330 else cjSize = 0; 00331 00332 /* Unsupported operation */ 00333 if (cjSize == 0) return NULL; 00334 00335 /* Check if the buffer is full */ 00336 if ((pTeb->GdiBatchCount >= GDI_BatchLimit) || 00337 ((pTeb->GdiTebBatch.Offset + cjSize) > GDIBATCHBUFSIZE)) 00338 { 00339 /* Call win32k, the kernel will call NtGdiFlushUserBatch to flush 00340 the current batch */ 00341 NtGdiFlush(); 00342 } 00343 00344 /* Get the head of the entry */ 00345 pHdr = (PVOID)((PUCHAR)pTeb->GdiTebBatch.Buffer + pTeb->GdiTebBatch.Offset); 00346 00347 /* Update Offset and batch count */ 00348 pTeb->GdiTebBatch.Offset += cjSize; 00349 pTeb->GdiBatchCount++; 00350 00351 /* Fill in the core fields */ 00352 pHdr->Cmd = Cmd; 00353 pHdr->Size = cjSize; 00354 00355 return pHdr; 00356 } 00357 00358 FORCEINLINE 00359 PDC_ATTR 00360 GdiGetDcAttr(HDC hdc) 00361 { 00362 PDC_ATTR pdcattr; 00363 00364 if (!GdiGetHandleUserData((HGDIOBJ)hdc, GDI_OBJECT_TYPE_DC, (PVOID*)&pdcattr)) return NULL; 00365 return pdcattr; 00366 } 00367 00368 #ifdef _M_IX86 00369 FLOATL FASTCALL EFtoF(EFLOAT_S * efp); 00370 #define FOtoF(pfo) EFtoF((EFLOAT_S*)pfo) 00371 #else 00372 #define FOtoF(pfo) (*(pfo)) 00373 #endif 00374 00375 /* This is an inlined version of lrintf. */ 00376 FORCEINLINE 00377 int 00378 _lrintf(float f) 00379 { 00380 #if defined(_M_IX86) && defined(__GNUC__) 00381 int result; 00382 __asm__ __volatile__ ("fistpl %0" : "=m" (result) : "t" (f) : "st"); 00383 return result; 00384 #elif defined(_M_IX86) && defined(_MSC_VER) 00385 int result; 00386 __asm 00387 { 00388 fld f; 00389 fistp result; 00390 } 00391 #else 00392 /* slow, but portable */ 00393 return (int)(f >= 0 ? f+0.5 : f-0.5); 00394 #endif 00395 } 00396 00397 /* EOF */ Generated on Sat May 26 2012 04:37:09 for ReactOS by
1.7.6.1
|