[YAROTOWS] Reintegrate the branch. For a brighter future.
[reactos.git] / reactos / dll / win32 / gdi32 / include / gdi32p.h
index 31147d6..e8b5e63 100644 (file)
@@ -42,32 +42,42 @@ typedef INT
 /* TYPES *********************************************************************/
 
 // Based on wmfapi.h and Wine.
-typedef struct tagMETAFILEDC {
-  PVOID      pvMetaBuffer;
-  HANDLE     hFile;
-  DWORD      Size;
-  METAHEADER mh;
-  UINT       handles_size, cur_handles;
-  HGDIOBJ   *handles;
-
-  // more DC object stuff.
-  HGDIOBJ    Pen;
-  HGDIOBJ    Brush;
-  HGDIOBJ    Palette;
-  HGDIOBJ    Font;
-
-  WCHAR      Filename[MAX_PATH+2];
-  // Add more later.
+typedef struct tagMETAFILEDC
+{
+  PVOID       pvMetaBuffer;
+  HANDLE      hFile;
+  DWORD       Size;
+  DWORD       dwWritten;
+  METAHEADER  mh;
+  WORD        reserved;
+  HLOCAL      MFObjList;
+  HPEN        hPen;
+  HBRUSH      hBrush;
+  HDC         hDc;
+  HGDIOBJ     hMetaDc;
+  HPALETTE    hPalette;
+  HFONT       hFont;
+  HBITMAP     hBitmap;
+  HRGN        hRegion;
+  HGDIOBJ     hMetafile;
+  HGDIOBJ     hMemDc;
+  HPEN        hExtPen;
+  HGDIOBJ     hEnhMetaDc;
+  HGDIOBJ     hEnhMetaFile;
+  HCOLORSPACE hColorSpace;
+  WCHAR       Filename[MAX_PATH+2];
 } METAFILEDC,*PMETAFILEDC;
 
 // Metafile Entry handle
-typedef struct tagMF_ENTRY {
+typedef struct tagMF_ENTRY
+{
   LIST_ENTRY   List;
   HGDIOBJ      hmDC;             // Handle return from NtGdiCreateClientObj.
   PMETAFILEDC pmfDC;
 } MF_ENTRY, *PMF_ENTRY;
 
-typedef struct tagENHMETAFILE {
+typedef struct tagENHMETAFILE
+{
   PVOID      pvMetaBuffer;
   HANDLE     hFile;      /* Handle for disk based MetaFile */
   DWORD      Size;
@@ -115,38 +125,39 @@ typedef struct _LOCALFONT
 } LOCALFONT, *PLOCALFONT;
 
 // sdk/winspool.h
-typedef BOOL WINAPI (*ABORTPRINTER) (HANDLE);
-typedef BOOL WINAPI (*CLOSEPRINTER) (HANDLE);
-typedef BOOL WINAPI (*CLOSESPOOLFILEHANDLE) (HANDLE, HANDLE); // W2k8
-typedef HANDLE WINAPI (*COMMITSPOOLDATA) (HANDLE,HANDLE,DWORD); // W2k8
-typedef LONG WINAPI (*DOCUMENTPROPERTIESW) (HWND,HANDLE,LPWSTR,PDEVMODEW,PDEVMODEW,DWORD);
-typedef BOOL WINAPI (*ENDDOCPRINTER) (HANDLE);
-typedef BOOL WINAPI (*ENDPAGEPRINTER) (HANDLE);
-typedef BOOL WINAPI (*GETPRINTERW) (HANDLE,DWORD,LPBYTE,DWORD,LPDWORD);
-typedef BOOL WINAPI (*GETPRINTERDRIVERW) (HANDLE,LPWSTR,DWORD,LPBYTE,DWORD,LPDWORD);
-typedef HANDLE WINAPI (*GETSPOOLFILEHANDLE) (HANDLE); // W2k8
-typedef BOOL WINAPI (*ISVALIDDEVMODEW) (PDEVMODEW,size_t);
-typedef BOOL WINAPI (*OPENPRINTERW) (LPWSTR,PHANDLE,LPPRINTER_DEFAULTSW);
-typedef BOOL WINAPI (*READPRINTER) (HANDLE,PVOID,DWORD,PDWORD);
-typedef BOOL WINAPI (*RESETPRINTERW) (HANDLE,LPPRINTER_DEFAULTSW);
-typedef LPWSTR WINAPI (*STARTDOCDLGW) (HANDLE,DOCINFOW *);
-typedef DWORD WINAPI (*STARTDOCPRINTERW) (HANDLE,DWORD,PBYTE);
-typedef BOOL WINAPI (*STARTPAGEPRINTER) (HANDLE);
+typedef BOOL (WINAPI *ABORTPRINTER) (HANDLE);
+typedef BOOL (WINAPI *CLOSEPRINTER) (HANDLE);
+typedef BOOL (WINAPI *CLOSESPOOLFILEHANDLE) (HANDLE, HANDLE); // W2k8
+typedef HANDLE (WINAPI *COMMITSPOOLDATA) (HANDLE,HANDLE,DWORD); // W2k8
+typedef LONG (WINAPI *DOCUMENTPROPERTIESW) (HWND,HANDLE,LPWSTR,PDEVMODEW,PDEVMODEW,DWORD);
+typedef BOOL (WINAPI *ENDDOCPRINTER) (HANDLE);
+typedef BOOL (WINAPI *ENDPAGEPRINTER) (HANDLE);
+typedef BOOL (WINAPI *GETPRINTERW) (HANDLE,DWORD,LPBYTE,DWORD,LPDWORD);
+typedef BOOL (WINAPI *GETPRINTERDRIVERW) (HANDLE,LPWSTR,DWORD,LPBYTE,DWORD,LPDWORD);
+typedef HANDLE (WINAPI *GETSPOOLFILEHANDLE) (HANDLE); // W2k8
+typedef BOOL (WINAPI *ISVALIDDEVMODEW) (PDEVMODEW,size_t);
+typedef BOOL (WINAPI *OPENPRINTERW) (LPWSTR,PHANDLE,LPPRINTER_DEFAULTSW);
+typedef BOOL (WINAPI *READPRINTER) (HANDLE,PVOID,DWORD,PDWORD);
+typedef BOOL (WINAPI *RESETPRINTERW) (HANDLE,LPPRINTER_DEFAULTSW);
+typedef LPWSTR (WINAPI *STARTDOCDLGW) (HANDLE,DOCINFOW *);
+typedef DWORD (WINAPI *STARTDOCPRINTERW) (HANDLE,DWORD,PBYTE);
+typedef BOOL (WINAPI *STARTPAGEPRINTER) (HANDLE);
 // ddk/winsplp.h
-typedef BOOL WINAPI (*SEEKPRINTER) (HANDLE,LARGE_INTEGER,PLARGE_INTEGER,DWORD,BOOL);
-typedef BOOL WINAPI (*SPLREADPRINTER) (HANDLE,LPBYTE *,DWORD);
+typedef BOOL (WINAPI *SEEKPRINTER) (HANDLE,LARGE_INTEGER,PLARGE_INTEGER,DWORD,BOOL);
+typedef BOOL (WINAPI *SPLREADPRINTER) (HANDLE,LPBYTE *,DWORD);
 // Same as ddk/winsplp.h DriverUnloadComplete?
-typedef BOOL WINAPI (*SPLDRIVERUNLOADCOMPLETE) (LPWSTR); 
+typedef BOOL (WINAPI *SPLDRIVERUNLOADCOMPLETE) (LPWSTR);
 // Driver support:
 // DrvDocumentEvent api/winddiui.h not W2k8 DocumentEventAW
-typedef INT WINAPI (*DOCUMENTEVENT) (HANDLE,HDC,INT,ULONG,PVOID,ULONG,PVOID);
+typedef INT (WINAPI *DOCUMENTEVENT) (HANDLE,HDC,INT,ULONG,PVOID,ULONG,PVOID);
 // DrvQueryColorProfile
-typedef BOOL WINAPI (*QUERYCOLORPROFILE) (HANDLE,PDEVMODEW,ULONG,VOID*,ULONG,FLONG);
+typedef BOOL (WINAPI *QUERYCOLORPROFILE) (HANDLE,PDEVMODEW,ULONG,VOID*,ULONG,FLONG);
 // Unknown:
-typedef DWORD WINAPI (*QUERYSPOOLMODE) (HANDLE,DWORD,DWORD);
-typedef DWORD WINAPI (*QUERYREMOTEFONTS) (DWORD,DWORD,DWORD);
+typedef DWORD (WINAPI *QUERYSPOOLMODE) (HANDLE,DWORD,DWORD);
+typedef DWORD (WINAPI *QUERYREMOTEFONTS) (DWORD,DWORD,DWORD);
 
 extern CLOSEPRINTER fpClosePrinter;
+extern OPENPRINTERW fpOpenPrinterW;
 
 /* FUNCTIONS *****************************************************************/
 
@@ -162,21 +173,21 @@ HEAP_strdupA2W(
 VOID
 HEAP_free(LPVOID memory);
 
-BOOL
+VOID
 FASTCALL
-TextMetricW2A(
-    TEXTMETRICA *tma,
-    TEXTMETRICW *tmw
+FONT_TextMetricWToA(
+    const TEXTMETRICW *ptmW,
+    LPTEXTMETRICA ptmA
 );
 
-BOOL
+VOID
 FASTCALL
 NewTextMetricW2A(
     NEWTEXTMETRICA *tma,
     NEWTEXTMETRICW *tmw
 );
 
-BOOL
+VOID
 FASTCALL
 NewTextMetricExW2A(
     NEWTEXTMETRICEXA *tma,
@@ -222,10 +233,6 @@ ConvertBitmapInfo(
     BOOL FollowedByData
 );
 
-DEVMODEW *
-NTAPI
-GdiConvertToDevmodeW(DEVMODEA *dm);
-
 DWORD
 WINAPI
 GetAndSetDCDWord( HDC, INT, DWORD, DWORD, DWORD, DWORD );
@@ -272,16 +279,104 @@ WINAPI
 GdiSetLastError( DWORD dwErrCode );
 
 DWORD WINAPI GdiGetCodePage(HDC);
-UINT FASTCALL DIB_BitmapBitsSize( PBITMAPINFO );
+UINT FASTCALL DIB_BitmapBitsSize( CONST BITMAPINFO* );
 
 int
 WINAPI
 GdiGetBitmapBitsSize(BITMAPINFO *lpbmi);
 
 VOID GdiSAPCallback(PLDC pldc);
+HGDIOBJ FASTCALL hGetPEBHandle(HANDLECACHETYPE,COLORREF);
 
 int FASTCALL DocumentEventEx(PVOID,HANDLE,HDC,int,ULONG,PVOID,ULONG,PVOID);
 BOOL FASTCALL EndPagePrinterEx(PVOID,HANDLE);
 BOOL FASTCALL LoadTheSpoolerDrv(VOID);
 
+
+FORCEINLINE
+PVOID
+GdiAllocBatchCommand(
+    HDC hdc,
+    USHORT Cmd)
+{
+    PTEB pTeb;
+    ULONG ulSize;
+    PGDIBATCHHDR pHdr;
+
+    /* Get a pointer to the TEB */
+    pTeb = NtCurrentTeb();
+
+    /* Check if we have a valid environment */
+    if (!pTeb || !pTeb->Win32ThreadInfo) return NULL;
+
+    /* Do we use a DC? */
+    if (hdc)
+    {
+        /* If the batch DC is NULL, we set this one as the new one */
+        if (!pTeb->GdiTebBatch.HDC) pTeb->GdiTebBatch.HDC = hdc;
+
+        /* If not, check if the batch DC equal to our DC */
+        else if (pTeb->GdiTebBatch.HDC != hdc) return NULL;
+    }
+
+    /* Get the size of the entry */
+    switch(Cmd)
+    {
+        case GdiBCPatBlt:
+            ulSize = 0;
+            break;
+        case GdiBCPolyPatBlt:
+            ulSize = 0;
+            break;
+        case GdiBCTextOut:
+            ulSize = 0;
+            break;
+        case GdiBCExtTextOut:
+            ulSize = 0;
+            break;
+        case GdiBCSetBrushOrg:
+            ulSize = 0;
+            break;
+        case GdiBCExtSelClipRgn:
+            ulSize = 0;
+            break;
+        case GdiBCSelObj:
+            ulSize = sizeof(GDIBSOBJECT);
+            break;
+        case GdiBCDelRgn:
+            ulSize = sizeof(GDIBSOBJECT);
+            break;
+        case GdiBCDelObj:
+            ulSize = sizeof(GDIBSOBJECT);
+            break;
+        default:
+            return NULL;
+    }
+
+    /* Unsupported operation */
+    if (ulSize == 0) return NULL;
+
+    /* Check if the buffer is full */
+    if ((pTeb->GdiBatchCount >= GDI_BatchLimit) ||
+        ((pTeb->GdiTebBatch.Offset + ulSize) > GDIBATCHBUFSIZE))
+    {
+        /* Call win32k, the kernel will call NtGdiFlushUserBatch to flush
+           the current batch */
+        NtGdiFlush();
+    }
+
+    /* Get the head of the entry */
+    pHdr = (PVOID)((PUCHAR)pTeb->GdiTebBatch.Buffer + pTeb->GdiTebBatch.Offset);
+
+    /* Update Offset and batch count */
+    pTeb->GdiTebBatch.Offset += ulSize;
+    pTeb->GdiBatchCount++;
+
+    /* Fill in the core fields */
+    pHdr->Cmd = Cmd;
+    pHdr->Size = ulSize;
+
+    return pHdr;
+}
+
 /* EOF */