[GDI32] Fix issue after a Flush
[reactos.git] / win32ss / gdi / gdi32 / include / gdi32p.h
index 8dc3499..03ce3af 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS System Libraries
- * FILE:            lib/gdi32/include/gdi32p.h
+ * FILE:            win32ss/gdi/gdi32/include/gdi32p.h
  * PURPOSE:         User-Mode Win32 GDI Library Private Header
  * PROGRAMMER:      Alex Ionescu (alex@relsoft.net)
  */
@@ -27,6 +27,34 @@ typedef INT
     HANDLE hPageQuery
 );
 
+typedef BOOL
+(WINAPI* LPKETO)(
+    HDC hdc,
+    int x,
+    int y,
+    UINT fuOptions,
+    const RECT *lprc,
+    LPCWSTR lpString,
+    UINT uCount,
+    const INT *lpDx,
+    INT unknown
+);
+
+typedef DWORD
+(WINAPI* LPKGCP)(
+    HDC hdc,
+    LPCWSTR lpString,
+    INT uCount,
+    INT nMaxExtent, 
+    LPGCP_RESULTSW lpResults,
+    DWORD dwFlags,
+    DWORD dwUnused
+);
+
+extern HINSTANCE hLpk;
+extern LPKETO LpkExtTextOut;
+extern LPKGCP LpkGetCharacterPlacement;
+
 /* DEFINES *******************************************************************/
 
 #define HANDLE_LIST_INC 20
@@ -36,9 +64,15 @@ typedef INT
 
 #define SAPCALLBACKDELAY 244
 
+#define LPK_INIT 1
+#define LPK_ETO  2
+#define LPK_GCP  3
+
 /* MACRO ********************************************************************/
 
 #define ROP_USES_SOURCE(Rop)   (((Rop) << 2 ^ Rop) & 0xCC0000)
+#define RCAST(_Type, _Value)   (*((_Type*)&_Value))
+
 
 /* TYPES *********************************************************************/
 
@@ -103,7 +137,7 @@ typedef struct tagENHMETAFILE
 #define UMPDEV_SUPPORT_ESCAPE 0x0004
 typedef struct _UMPDEV
 {
-    DWORD           Sig;            // Init with PDEV_UMPD_ID
+    DWORD_PTR       Sig;            // Init with PDEV_UMPD_ID
     struct _UMPDEV *pumpdNext;
     PDRIVER_INFO_5W pdi5Info;
     HMODULE         hModule;
@@ -200,7 +234,8 @@ FASTCALL
 DeleteRegion( HRGN );
 
 BOOL
-GdiIsHandleValid(HGDIOBJ hGdiObj);
+WINAPI
+GdiValidateHandle(HGDIOBJ);
 
 BOOL
 GdiGetHandleUserData(
@@ -213,6 +248,10 @@ PLDC
 FASTCALL
 GdiGetLDC(HDC hDC);
 
+BOOL
+FASTCALL
+GdiSetLDC(HDC hdc, PVOID pvLDC);
+
 HGDIOBJ
 WINAPI
 GdiFixUpHandle(HGDIOBJ hGO);
@@ -236,11 +275,20 @@ ConvertBitmapInfo(
 
 DWORD
 WINAPI
-GetAndSetDCDWord( HDC, INT, DWORD, DWORD, DWORD, DWORD );
+GetAndSetDCDWord(
+    _In_ HDC hdc,
+    _In_ UINT u,
+    _In_ DWORD dwIn,
+    _In_ ULONG ulMFId,
+    _In_ USHORT usMF16Id,
+    _In_ DWORD dwError);
 
 DWORD
 WINAPI
-GetDCDWord( HDC, INT, DWORD);
+GetDCDWord(
+    _In_ HDC hdc,
+    _In_ UINT u,
+    _In_ DWORD dwError);
 
 HGDIOBJ
 WINAPI
@@ -266,6 +314,27 @@ EnumLogFontExW2A(
     LPENUMLOGFONTEXA fontA,
     CONST ENUMLOGFONTEXW *fontW );
 
+BOOL
+WINAPI
+LoadLPK(
+    INT LpkFunctionID
+);
+
+VOID
+WINAPI
+GdiInitializeLanguagePack(
+    _In_ DWORD InitParam);
+
+VOID
+WINAPI
+InitializeLpkHooks(
+    _In_ FARPROC *hookfuncs);
+
+BOOL
+WINAPI
+GetETM(HDC hdc,
+       EXTTEXTMETRIC *petm);
+
 /* FIXME: Put in some public header */
 UINT
 WINAPI
@@ -319,10 +388,10 @@ GdiAllocBatchCommand(
     }
 
     /* Get the size of the entry */
-    if      (Cmd == GdiBCPatBlt) cjSize = 0;
-    else if (Cmd == GdiBCPolyPatBlt) cjSize = 0;
-    else if (Cmd == GdiBCTextOut) cjSize = 0;
-    else if (Cmd == GdiBCExtTextOut) cjSize = 0;
+    if      (Cmd == GdiBCPatBlt) cjSize = sizeof(GDIBSPATBLT);
+    else if (Cmd == GdiBCPolyPatBlt) cjSize = sizeof(GDIBSPPATBLT);
+    else if (Cmd == GdiBCTextOut) cjSize = sizeof(GDIBSTEXTOUT);
+    else if (Cmd == GdiBCExtTextOut) cjSize = sizeof(GDIBSEXTTEXTOUT);
     else if (Cmd == GdiBCSetBrushOrg) cjSize = sizeof(GDIBSSETBRHORG);
     else if (Cmd == GdiBCExtSelClipRgn) cjSize = 0;
     else if (Cmd == GdiBCSelObj) cjSize = sizeof(GDIBSOBJECT);
@@ -340,6 +409,12 @@ GdiAllocBatchCommand(
         /* Call win32k, the kernel will call NtGdiFlushUserBatch to flush
            the current batch */
         NtGdiFlush();
+
+        // If Flushed, lose the hDC for this batch job! See CORE-15839.
+        if (hdc)
+        {
+            if (!pTeb->GdiTebBatch.HDC) pTeb->GdiTebBatch.HDC = hdc;
+        }
     }
 
     /* Get the head of the entry */
@@ -360,12 +435,41 @@ FORCEINLINE
 PDC_ATTR
 GdiGetDcAttr(HDC hdc)
 {
+    GDILOOBJTYPE eDcObjType;
     PDC_ATTR pdcattr;
 
-    if (!GdiGetHandleUserData((HGDIOBJ)hdc, GDI_OBJECT_TYPE_DC, (PVOID*)&pdcattr)) return NULL;
+    /* Check DC object type */
+    eDcObjType = GDI_HANDLE_GET_TYPE(hdc);
+    if ((eDcObjType != GDILoObjType_LO_DC_TYPE) &&
+        (eDcObjType != GDILoObjType_LO_ALTDC_TYPE))
+    {
+        return NULL;
+    }
+
+    /* Get the DC attribute */
+    if (!GdiGetHandleUserData((HGDIOBJ)hdc, eDcObjType, (PVOID*)&pdcattr))
+    {
+        return NULL;
+    }
+
     return pdcattr;
 }
 
+FORCEINLINE
+PRGN_ATTR
+GdiGetRgnAttr(HRGN hrgn)
+{
+    PRGN_ATTR prgnattr;
+
+    /* Get the region attribute */
+    if (!GdiGetHandleUserData(hrgn, GDILoObjType_LO_REGION_TYPE, (PVOID*)&prgnattr))
+    {
+        return NULL;
+    }
+
+    return prgnattr;
+}
+
 #ifdef _M_IX86
 FLOATL FASTCALL EFtoF(EFLOAT_S * efp);
 #define FOtoF(pfo) EFtoF((EFLOAT_S*)pfo)
@@ -395,4 +499,230 @@ _lrintf(float f)
 #endif
 }
 
+HBRUSH
+WINAPI
+GdiSelectBrush(
+    _In_ HDC hdc,
+    _In_ HBRUSH hbr);
+
+HPEN
+WINAPI
+GdiSelectPen(
+    _In_ HDC hdc,
+    _In_ HPEN hpen);
+
+HFONT
+WINAPI
+GdiSelectFont(
+    _In_ HDC hdc,
+    _In_ HFONT hfont);
+
+HGDIOBJ
+WINAPI
+GdiCreateClientObj(
+    _In_ PVOID pvObject,
+    _In_ GDILOOBJTYPE eObjType);
+
+PVOID
+WINAPI
+GdiDeleteClientObj(
+    _In_ HGDIOBJ hobj);
+
+BOOL
+WINAPI
+GdiCreateClientObjLink(
+    _In_ HGDIOBJ hobj,
+    _In_ PVOID pvObject);
+
+PVOID
+WINAPI
+GdiGetClientObjLink(
+    _In_ HGDIOBJ hobj);
+
+PVOID
+WINAPI
+GdiRemoveClientObjLink(
+    _In_ HGDIOBJ hobj);
+
+extern ULONG gcClientObj;
+
+VOID
+WINAPI
+METADC_DeleteObject(HGDIOBJ hobj);
+
+BOOL
+WINAPI
+METADC_DeleteDC(
+    _In_ HDC hdc);
+
+INT
+WINAPI
+METADC16_Escape(
+    _In_ HDC hdc,
+    _In_ INT nEscape,
+    _In_ INT cbInput,
+    _In_ LPCSTR lpvInData,
+    _Out_ LPVOID lpvOutData);
+
+BOOL
+WINAPI
+METADC_ExtTextOutW(
+    HDC hdc,
+    INT x,
+    INT y,
+    UINT fuOptions,
+    const RECT *lprc,
+    LPCWSTR lpString,
+    UINT cchString,
+    const INT *lpDx);
+
+BOOL
+WINAPI
+METADC_PatBlt(
+    _In_ HDC hdc,
+    _In_ INT xLeft,
+    _In_ INT yTop,
+    _In_ INT nWidth,
+    _In_ INT nHeight,
+    _In_ DWORD dwRop);
+
+
+/* The following METADC_* functions follow this pattern: */
+#define HANDLE_METADC0P(_RetType, _Func, dwError, hdc, ...) \
+    if (GDI_HANDLE_GET_TYPE(hdc) != GDILoObjType_LO_DC_TYPE) \
+    { \
+        DWORD_PTR dwResult; \
+        if (METADC_Dispatch(DCFUNC_##_Func, &dwResult, (DWORD_PTR)dwError, hdc)) \
+        { \
+            return (_RetType)dwResult; \
+        } \
+    }
+
+#define HANDLE_METADC(_RetType, _Func, dwError, hdc, ...) \
+    if (GDI_HANDLE_GET_TYPE(hdc) != GDILoObjType_LO_DC_TYPE) \
+    { \
+        DWORD_PTR dwResult = 1; \
+        if (METADC_Dispatch(DCFUNC_##_Func, &dwResult, (DWORD_PTR)dwError, hdc, __VA_ARGS__)) \
+        { \
+            return (_RetType)dwResult; \
+        } \
+    }
+
+
+typedef enum _DCFUNC
+{
+    //DCFUNC_AbortDoc,
+    DCFUNC_AbortPath,
+    DCFUNC_AlphaBlend, // UNIMPLEMENTED
+    DCFUNC_AngleArc, // UNIMPLEMENTED
+    DCFUNC_Arc,
+    DCFUNC_ArcTo, // UNIMPLEMENTED
+    DCFUNC_BeginPath,
+    //DCFUNC_BitBlt,
+    DCFUNC_Chord,
+    DCFUNC_CloseFigure,
+    DCFUNC_Ellipse,
+    DCFUNC_EndPath,
+    DCFUNC_ExcludeClipRect,
+    DCFUNC_ExtEscape,
+    DCFUNC_ExtFloodFill,
+    DCFUNC_ExtSelectClipRgn,
+    DCFUNC_ExtTextOut,
+    DCFUNC_FillPath,
+    DCFUNC_FillRgn,
+    DCFUNC_FlattenPath,
+    DCFUNC_FrameRgn,
+    DCFUNC_GetDeviceCaps,
+    DCFUNC_GdiComment,
+    DCFUNC_GradientFill, // UNIMPLEMENTED
+    DCFUNC_IntersectClipRect,
+    DCFUNC_InvertRgn,
+    DCFUNC_LineTo,
+    DCFUNC_MaskBlt, // UNIMPLEMENTED
+    DCFUNC_ModifyWorldTransform,
+    DCFUNC_MoveTo,
+    DCFUNC_OffsetClipRgn,
+    DCFUNC_OffsetViewportOrgEx,
+    DCFUNC_OffsetWindowOrgEx,
+    DCFUNC_PathToRegion, // UNIMPLEMENTED
+    DCFUNC_PatBlt,
+    DCFUNC_Pie,
+    DCFUNC_PlgBlt, // UNIMPLEMENTED
+    DCFUNC_PolyBezier,
+    DCFUNC_PolyBezierTo,
+    DCFUNC_PolyDraw,
+    DCFUNC_Polygon,
+    DCFUNC_Polyline,
+    DCFUNC_PolylineTo,
+    DCFUNC_PolyPolygon,
+    DCFUNC_PolyPolyline,
+    DCFUNC_RealizePalette,
+    DCFUNC_Rectangle,
+    DCFUNC_RestoreDC,
+    DCFUNC_RoundRect,
+    DCFUNC_SaveDC,
+    DCFUNC_ScaleViewportExtEx,
+    DCFUNC_ScaleWindowExtEx,
+    DCFUNC_SelectBrush,
+    DCFUNC_SelectClipPath,
+    DCFUNC_SelectFont,
+    DCFUNC_SelectPalette,
+    DCFUNC_SelectPen,
+    DCFUNC_SetDCBrushColor,
+    DCFUNC_SetDCPenColor,
+    DCFUNC_SetDIBitsToDevice,
+    DCFUNC_SetBkColor,
+    DCFUNC_SetBkMode,
+    DCFUNC_SetLayout,
+    //DCFUNC_SetMapMode,
+    DCFUNC_SetPixel,
+    DCFUNC_SetPolyFillMode,
+    DCFUNC_SetROP2,
+    DCFUNC_SetStretchBltMode,
+    DCFUNC_SetTextAlign,
+    DCFUNC_SetTextCharacterExtra,
+    DCFUNC_SetTextColor,
+    DCFUNC_SetTextJustification,
+    DCFUNC_SetViewportExtEx,
+    DCFUNC_SetViewportOrgEx,
+    DCFUNC_SetWindowExtEx,
+    DCFUNC_SetWindowOrgEx,
+    DCFUNC_SetWorldTransform,
+    DCFUNC_StretchBlt,
+    DCFUNC_StrokeAndFillPath,
+    DCFUNC_StrokePath,
+    DCFUNC_TransparentBlt, // UNIMPLEMENTED
+    DCFUNC_WidenPath,
+
+} DCFUNC;
+
+BOOL
+METADC_Dispatch(
+    _In_ DCFUNC eFunction,
+    _Out_ PDWORD_PTR pdwResult,
+    _In_ DWORD_PTR dwError,
+    _In_ HDC hdc,
+    ...);
+
+#define HANDLE_METADC2(_RetType, _Func, hdc, ...) \
+    if (GDI_HANDLE_GET_TYPE(hdc) != GDILoObjType_LO_DC_TYPE) \
+    { \
+        _RetType result; \
+        if (METADC_##_Func(&result, hdc, __VA_ARGS__)) \
+        { \
+            return result; \
+        } \
+    }
+
+BOOL
+WINAPI
+METADC_GetAndSetDCDWord(
+    _Out_ PDWORD pdwResult,
+    _In_ HDC hdc,
+    _In_ UINT u,
+    _In_ DWORD dwIn,
+    _In_ ULONG ulMFId,
+    _In_ USHORT usMF16Id,
+    _In_ DWORD dwError);
+
 /* EOF */