[GDI32] Integrate LpkGetTextExtentExPoint(). (#1362) 1362/head
authorBaruch Rutman <peterooch@gmail.com>
Fri, 15 Feb 2019 01:57:35 +0000 (03:57 +0200)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sat, 23 Mar 2019 22:34:09 +0000 (23:34 +0100)
- Assume that GetTextExtentExPointWPri() uses the same kind of
  arguments as GetTextExtentExPointW().

- Add GetTextExtentExPointWPri() declaration to undocgdi.h.

sdk/include/reactos/undocgdi.h
win32ss/gdi/gdi32/include/gdi32p.h
win32ss/gdi/gdi32/objects/text.c
win32ss/gdi/gdi32/objects/utils.c

index 4a0ea8f..9abdbef 100644 (file)
@@ -30,4 +30,15 @@ BOOL
 WINAPI
 GdiDrawStream(HDC dc, ULONG l, PGDI_DRAW_STREAM pDS);
 
+BOOL
+WINAPI
+GetTextExtentExPointWPri(
+    HDC hdc,
+    LPCWSTR lpwsz, 
+    INT cwc,
+    INT dxMax, 
+    LPINT pcCh, 
+    LPINT pdxOut, 
+    LPSIZE psize);
+
 #endif
\ No newline at end of file
index 03ce3af..3574850 100644 (file)
@@ -51,9 +51,23 @@ typedef DWORD
     DWORD dwUnused
 );
 
+typedef BOOL
+(WINAPI* LPKGTEP)(
+    HDC hdc,
+    LPCWSTR lpString,
+    INT cString,
+    INT nMaxExtent,
+    LPINT lpnFit,
+    LPINT lpnDx,
+    LPSIZE lpSize,
+    DWORD dwUnused,
+    int unknown
+);
+
 extern HINSTANCE hLpk;
 extern LPKETO LpkExtTextOut;
 extern LPKGCP LpkGetCharacterPlacement;
+extern LPKGTEP LpkGetTextExtentExPoint;
 
 /* DEFINES *******************************************************************/
 
@@ -67,6 +81,7 @@ extern LPKGCP LpkGetCharacterPlacement;
 #define LPK_INIT 1
 #define LPK_ETO  2
 #define LPK_GCP  3
+#define LPK_GTEP 4
 
 /* MACRO ********************************************************************/
 
index 9ff4fde..e35c7c9 100644 (file)
@@ -296,6 +296,9 @@ GetTextExtentExPointW(
         DPRINT("nMaxExtent is invalid: %d\n", nMaxExtent);
     }
 
+    if (LoadLPK(LPK_GTEP))
+        return LpkGetTextExtentExPoint(hdc, lpszString, cchString, nMaxExtent, lpnFit, lpnDx, lpSize, 0, 0);
+
     return NtGdiGetTextExtentExW (
                hdc, (LPWSTR)lpszString, cchString, nMaxExtent, (PULONG)lpnFit, (PULONG)lpnDx, lpSize, 0 );
 }
@@ -308,14 +311,14 @@ BOOL
 WINAPI
 GetTextExtentExPointWPri(
     _In_ HDC hdc,
-    _In_reads_(cwc) LPWSTR lpwsz,
-    _In_ ULONG cwc,
-    _In_ ULONG dxMax,
-    _Out_opt_ ULONG *pcCh,
-    _Out_writes_to_opt_(cwc, *pcCh) PULONG pdxOut,
+    _In_reads_(cwc) LPCWSTR lpwsz,
+    _In_ INT cwc,
+    _In_ INT dxMax,
+    _Out_opt_ LPINT pcCh,
+    _Out_writes_to_opt_(cwc, *pcCh) LPINT pdxOut,
     _In_ LPSIZE psize)
 {
-    return NtGdiGetTextExtentExW(hdc, lpwsz, cwc, dxMax, pcCh, pdxOut, psize, 0);
+    return NtGdiGetTextExtentExW(hdc, (LPWSTR)lpwsz, cwc, dxMax, (PULONG)pcCh, (PULONG)pdxOut, psize, 0);
 }
 
 /*
index d594b46..93491d9 100644 (file)
@@ -4,6 +4,7 @@
 HINSTANCE hLpk = NULL;
 LPKETO LpkExtTextOut = NULL;
 LPKGCP LpkGetCharacterPlacement = NULL;
+LPKGTEP LpkGetTextExtentExPoint = NULL;
 
 /**
  * @name CalculateColorTableSize
@@ -417,7 +418,7 @@ EnumLogFontExW2A( LPENUMLOGFONTEXA fontA, CONST ENUMLOGFONTEXW *fontW )
 * LPK.DLL loader function
 * 
 * Returns TRUE if a valid parameter was passed and loading was successful,
-* retruns FALSE otherwise.
+* returns FALSE otherwise.
 */
 BOOL WINAPI LoadLPK(INT LpkFunctionID)
 {   
@@ -455,6 +456,18 @@ BOOL WINAPI LoadLPK(INT LpkFunctionID)
 
                 return TRUE;
 
+            case LPK_GTEP:
+                if (!LpkGetTextExtentExPoint) // Check if the function is already loaded
+                    LpkGetTextExtentExPoint = (LPKGTEP) GetProcAddress(hLpk, "LpkGetTextExtentExPoint");
+
+                if (!LpkGetTextExtentExPoint)
+                {
+                    FreeLibrary(hLpk);
+                    return FALSE;
+                }
+
+                return TRUE;
+
             default: 
                 FreeLibrary(hLpk);
                 return FALSE;