18 UNICODE_STRING StringU
;
23 RtlInitAnsiString(&StringA
, (LPSTR
)lpString
);
24 RtlAnsiStringToUnicodeString(&StringU
, &StringA
, TRUE
);
26 StringU
.Buffer
= NULL
;
28 ret
= TextOutW(hdc
, nXStart
, nYStart
, StringU
.Buffer
, cbString
);
29 RtlFreeUnicodeString(&StringU
);
46 return NtGdiExtTextOutW(hdc
, nXStart
, nYStart
, 0, NULL
, (LPWSTR
)lpString
, cbString
, NULL
, 0);
55 GdiGetCodePage(HDC hdc
)
58 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
59 if (Dc_Attr
->ulDirty_
& DIRTY_CHARSET
) return LOWORD(NtGdiGetCharSet(hdc
));
60 return LOWORD(Dc_Attr
->iCS_CP
);
69 GetTextCharacterExtra(
75 if (!GdiGetHandleUserData((HGDIOBJ
) hDc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
76 return Dc_Attr
->lTextExtra
;
77 // return GetDCDWord( hDc, GdiGetTextCharExtra, 0);
86 GetTextCharset(HDC hdc
)
88 /* MSDN docs say this is equivalent */
89 return NtGdiGetTextCharsetInfo(hdc
,NULL
,0);
107 if (! NtGdiGetTextMetricsW(hdc
, &tmwi
, sizeof(TMW_INTERNAL
)))
112 return TextMetricW2A(lptm
, &tmwi
.TextMetric
);
128 if (! NtGdiGetTextMetricsW(hdc
, &tmwi
, sizeof(TMW_INTERNAL
)))
133 *lptm
= tmwi
.TextMetric
;
151 UNICODE_STRING StringU
;
154 RtlInitAnsiString(&StringA
, (LPSTR
)lpString
);
155 RtlAnsiStringToUnicodeString(&StringU
, &StringA
, TRUE
);
157 ret
= GetTextExtentPointW(hdc
, StringU
.Buffer
, cbString
, lpSize
);
159 RtlFreeUnicodeString(&StringU
);
177 return NtGdiGetTextExtent(hdc
, (LPWSTR
)lpString
, cbString
, lpSize
, 0);
186 GetTextExtentExPointW(
196 return NtGdiGetTextExtentExW (
197 hdc
, (LPWSTR
)lpszStr
, cchString
, nMaxExtent
, (PULONG
)lpnFit
, (PULONG
)alpDx
, lpSize
, 0 );
206 GetTextExtentExPointA(
220 Status
= HEAP_strdupA2W ( &lpszStrW
, lpszStr
);
221 if (!NT_SUCCESS (Status
))
222 SetLastError (RtlNtStatusToDosError(Status
));
225 rc
= NtGdiGetTextExtentExW (
226 hdc
, lpszStrW
, cchString
, nMaxExtent
, (PULONG
)lpnFit
, (PULONG
)alpDx
, lpSize
, 0 );
228 HEAP_free ( lpszStrW
);
240 GetTextExtentPoint32A(
248 UNICODE_STRING StringU
;
251 RtlInitAnsiString(&StringA
, (LPSTR
)lpString
);
252 RtlAnsiStringToUnicodeString(&StringU
, &StringA
, TRUE
);
254 ret
= GetTextExtentPoint32W(hdc
, StringU
.Buffer
, cbString
, lpSize
);
256 RtlFreeUnicodeString(&StringU
);
267 GetTextExtentPoint32W(
274 return NtGdiGetTextExtent(hdc
, (LPWSTR
)lpString
, cbString
, lpSize
, 0);
282 GetTextExtentExPointI(HDC hdc
,
290 return NtGdiGetTextExtentExW(hdc
,pgiIn
,cgi
,nMaxExtent
,(ULONG
*)lpnFit
, (PULONG
) alpDx
,lpSize
,1);
298 GetTextExtentPointI(HDC hdc
,
303 return NtGdiGetTextExtent(hdc
,pgiIn
,cgi
,lpSize
,2);
323 UNICODE_STRING StringU
;
326 RtlInitAnsiString(&StringA
, (LPSTR
)lpString
);
327 RtlAnsiStringToUnicodeString(&StringU
, &StringA
, TRUE
);
329 ret
= ExtTextOutW(hdc
, X
, Y
, fuOptions
, lprc
, StringU
.Buffer
, cbCount
, lpDx
);
331 RtlFreeUnicodeString(&StringU
);
353 return NtGdiExtTextOutW(hdc
, X
, Y
, fuOptions
, (LPRECT
)lprc
, (LPWSTR
)lpString
, cbCount
, (LPINT
)lpDx
, 0);
362 GetTextFaceW(HDC hDC
,
366 /* Validate parameters */
367 if (pFaceName
&& nCount
<= 0)
369 /* Set last error and return failure */
370 GdiSetLastError(ERROR_INVALID_PARAMETER
);
374 /* Forward to kernel */
375 return NtGdiGetTextFaceW(hDC
, nCount
, pFaceName
, FALSE
);
384 GetTextFaceA( HDC hdc
, INT count
, LPSTR name
)
386 INT res
= GetTextFaceW(hdc
, 0, NULL
);
387 LPWSTR nameW
= HeapAlloc( GetProcessHeap(), 0, res
* 2 );
388 GetTextFaceW( hdc
, res
, nameW
);
392 if (count
&& !WideCharToMultiByte( CP_ACP
, 0, nameW
, -1, name
, count
, NULL
, NULL
))
397 res
= WideCharToMultiByte( CP_ACP
, 0, nameW
, -1, NULL
, 0, NULL
, NULL
);
398 HeapFree( GetProcessHeap(), 0, nameW
);
408 GetTextFaceAliasW(HDC hdc
,
412 if ( pszOut
&& !cChar
)
414 GdiSetLastError(ERROR_INVALID_PARAMETER
);
417 return NtGdiGetTextFaceW(hdc
,cChar
,pszOut
,TRUE
);
423 GetFontResourceInfoW(
431 UNICODE_STRING NtFileName
;
433 if (!lpFileName
|| !pdwBufSize
|| !lpBuffer
)
435 SetLastError(ERROR_INVALID_PARAMETER
);
439 if (!RtlDosPathNameToNtPathName_U(lpFileName
,
444 SetLastError(ERROR_PATH_NOT_FOUND
);
448 bRet
= NtGdiGetFontResourceInfoInternalW(
450 (NtFileName
.Length
/ sizeof(WCHAR
)) + 1,
457 RtlFreeHeap(RtlGetProcessHeap(), 0, NtFileName
.Buffer
);
473 SetTextCharacterExtra(
478 INT cExtra
= 0x80000000;
481 if (CharExtra
== cExtra
)
483 SetLastError(ERROR_INVALID_PARAMETER
);
487 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
489 return MFDRV_SetTextCharacterExtra( hDC
, CharExtra
); // Wine port.
492 if (!GdiGetHandleUserData((HGDIOBJ
) hDC
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return cExtra
;
494 if (NtCurrentTeb()->GdiTebBatch
.HDC
== hDC
)
496 if (Dc_Attr
->ulDirty_
& DC_FONTTEXT_DIRTY
)
498 NtGdiFlush(); // Sync up Dc_Attr from Kernel space.
499 Dc_Attr
->ulDirty_
&= ~(DC_MODE_DIRTY
|DC_FONTTEXT_DIRTY
);
502 cExtra
= Dc_Attr
->lTextExtra
;
503 Dc_Attr
->lTextExtra
= CharExtra
;
505 // return GetAndSetDCDWord( hDC, GdiGetSetTextCharExtra, CharExtra, 0, 0, 0 );
514 GetTextAlign(HDC hdc
)
517 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
518 return Dc_Attr
->lTextAlign
;
528 GetTextColor(HDC hdc
)
531 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
532 return Dc_Attr
->ulForegroundClr
;
542 SetTextAlign(HDC hdc
,
548 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
550 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
551 return MFDRV_SetTextAlign( hdc
, fMode
)
554 PLDC pLDC
= Dc_Attr
->pvLDC
;
557 SetLastError(ERROR_INVALID_HANDLE
);
560 if (pLDC
->iType
== LDC_EMFLDC
)
562 if return EMFDRV_SetTextAlign( hdc
, fMode
)
567 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return OldMode
;
569 OldMode
= Dc_Attr
->lTextAlign
;
570 Dc_Attr
->lTextAlign
= fMode
; // Raw
571 if (Dc_Attr
->dwLayout
& LAYOUT_RTL
)
573 if(!(fMode
& TA_CENTER
)) fMode
|= TA_RIGHT
;
575 Dc_Attr
->flTextAlign
= fMode
& (TA_BASELINE
|TA_UPDATECP
|TA_CENTER
);
592 COLORREF OldColor
= CLR_INVALID
;
594 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
596 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
597 return MFDRV_SetTextColor( hDC
, crColor
);
600 PLDC pLDC
= Dc_Attr
->pvLDC
;
603 SetLastError(ERROR_INVALID_HANDLE
);
606 if (pLDC
->iType
== LDC_EMFLDC
)
608 if return EMFDRV_SetTextColor( hDC
, crColor
);
613 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return OldColor
;
615 OldColor
= (COLORREF
) Dc_Attr
->ulForegroundClr
;
616 Dc_Attr
->ulForegroundClr
= (ULONG
) crColor
;
618 if ( Dc_Attr
->crForegroundClr
!= crColor
)
620 Dc_Attr
->ulDirty_
|= DIRTY_TEXT
;
621 Dc_Attr
->crForegroundClr
= crColor
;
631 SetTextJustification(
639 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
641 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
642 return MFDRV_SetTextJustification( hdc
, extra
, breaks
)
645 SetLastError(ERROR_INVALID_HANDLE
);
649 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return FALSE
;
651 if (NtCurrentTeb()->GdiTebBatch
.HDC
== hdc
)
653 if (Dc_Attr
->ulDirty_
& DC_FONTTEXT_DIRTY
)
655 NtGdiFlush(); // Sync up Dc_Attr from Kernel space.
656 Dc_Attr
->ulDirty_
&= ~(DC_MODE_DIRTY
|DC_FONTTEXT_DIRTY
);
659 Dc_Attr
->cBreak
= breaks
;
660 Dc_Attr
->lBreakExtra
= extra
;