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
, cchString
);
29 RtlFreeUnicodeString(&StringU
);
46 return NtGdiExtTextOutW(hdc
, nXStart
, nYStart
, 0, NULL
, (LPWSTR
)lpString
, cchString
, 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
, cchString
, lpSize
);
159 RtlFreeUnicodeString(&StringU
);
177 return NtGdiGetTextExtent(hdc
, (LPWSTR
)lpString
, cchString
, 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
, cchString
, lpSize
);
256 RtlFreeUnicodeString(&StringU
);
267 GetTextExtentPoint32W(
274 return NtGdiGetTextExtent(hdc
, (LPWSTR
)lpString
, cchString
, 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
, cchString
, lpDx
);
331 RtlFreeUnicodeString(&StringU
);
353 return NtGdiExtTextOutW(hdc
, X
, Y
, fuOptions
, (LPRECT
)lprc
, (LPWSTR
)lpString
, cchString
, (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
)
389 /* Validate parameters */
390 if (name
&& count
<= 0)
392 /* Set last error and return failure */
393 GdiSetLastError(ERROR_INVALID_PARAMETER
);
397 res
= GetTextFaceW(hdc
, 0, NULL
);
398 nameW
= HeapAlloc( GetProcessHeap(), 0, res
* 2 );
399 GetTextFaceW( hdc
, res
, nameW
);
403 if (count
&& !WideCharToMultiByte( CP_ACP
, 0, nameW
, -1, name
, count
, NULL
, NULL
))
408 res
= WideCharToMultiByte( CP_ACP
, 0, nameW
, -1, NULL
, 0, NULL
, NULL
);
409 HeapFree( GetProcessHeap(), 0, nameW
);
419 GetTextFaceAliasW(HDC hdc
,
423 if ( pszOut
&& !cChar
)
425 GdiSetLastError(ERROR_INVALID_PARAMETER
);
428 return NtGdiGetTextFaceW(hdc
,cChar
,pszOut
,TRUE
);
434 GetFontResourceInfoW(
442 UNICODE_STRING NtFileName
;
444 if (!lpFileName
|| !pdwBufSize
|| !lpBuffer
)
446 SetLastError(ERROR_INVALID_PARAMETER
);
450 if (!RtlDosPathNameToNtPathName_U(lpFileName
,
455 SetLastError(ERROR_PATH_NOT_FOUND
);
459 bRet
= NtGdiGetFontResourceInfoInternalW(
461 (NtFileName
.Length
/ sizeof(WCHAR
)) + 1,
468 RtlFreeHeap(RtlGetProcessHeap(), 0, NtFileName
.Buffer
);
484 SetTextCharacterExtra(
489 INT cExtra
= 0x80000000;
492 if (CharExtra
== cExtra
)
494 SetLastError(ERROR_INVALID_PARAMETER
);
498 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
500 return MFDRV_SetTextCharacterExtra( hDC
, CharExtra
); // Wine port.
503 if (!GdiGetHandleUserData((HGDIOBJ
) hDC
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return cExtra
;
505 if (NtCurrentTeb()->GdiTebBatch
.HDC
== hDC
)
507 if (Dc_Attr
->ulDirty_
& DC_FONTTEXT_DIRTY
)
509 NtGdiFlush(); // Sync up Dc_Attr from Kernel space.
510 Dc_Attr
->ulDirty_
&= ~(DC_MODE_DIRTY
|DC_FONTTEXT_DIRTY
);
513 cExtra
= Dc_Attr
->lTextExtra
;
514 Dc_Attr
->lTextExtra
= CharExtra
;
516 // return GetAndSetDCDWord( hDC, GdiGetSetTextCharExtra, CharExtra, 0, 0, 0 );
525 GetTextAlign(HDC hdc
)
528 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
529 return Dc_Attr
->lTextAlign
;
539 GetTextColor(HDC hdc
)
542 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
543 return Dc_Attr
->ulForegroundClr
;
553 SetTextAlign(HDC hdc
,
559 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
561 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
562 return MFDRV_SetTextAlign( hdc
, fMode
)
565 PLDC pLDC
= Dc_Attr
->pvLDC
;
568 SetLastError(ERROR_INVALID_HANDLE
);
571 if (pLDC
->iType
== LDC_EMFLDC
)
573 if return EMFDRV_SetTextAlign( hdc
, fMode
)
578 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return OldMode
;
580 OldMode
= Dc_Attr
->lTextAlign
;
581 Dc_Attr
->lTextAlign
= fMode
; // Raw
582 if (Dc_Attr
->dwLayout
& LAYOUT_RTL
)
584 if(!(fMode
& TA_CENTER
)) fMode
|= TA_RIGHT
;
586 Dc_Attr
->flTextAlign
= fMode
& (TA_BASELINE
|TA_UPDATECP
|TA_CENTER
);
603 COLORREF OldColor
= CLR_INVALID
;
605 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
607 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
608 return MFDRV_SetTextColor( hDC
, crColor
);
611 PLDC pLDC
= Dc_Attr
->pvLDC
;
614 SetLastError(ERROR_INVALID_HANDLE
);
617 if (pLDC
->iType
== LDC_EMFLDC
)
619 if return EMFDRV_SetTextColor( hDC
, crColor
);
624 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return OldColor
;
626 OldColor
= (COLORREF
) Dc_Attr
->ulForegroundClr
;
627 Dc_Attr
->ulForegroundClr
= (ULONG
) crColor
;
629 if ( Dc_Attr
->crForegroundClr
!= crColor
)
631 Dc_Attr
->ulDirty_
|= (DIRTY_TEXT
|DIRTY_LINE
|DIRTY_FILL
);
632 Dc_Attr
->crForegroundClr
= crColor
;
642 SetTextJustification(
650 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
652 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
653 return MFDRV_SetTextJustification( hdc
, extra
, breaks
)
656 SetLastError(ERROR_INVALID_HANDLE
);
660 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return FALSE
;
662 if (NtCurrentTeb()->GdiTebBatch
.HDC
== hdc
)
664 if (Dc_Attr
->ulDirty_
& DC_FONTTEXT_DIRTY
)
666 NtGdiFlush(); // Sync up Dc_Attr from Kernel space.
667 Dc_Attr
->ulDirty_
&= ~(DC_MODE_DIRTY
|DC_FONTTEXT_DIRTY
);
670 Dc_Attr
->cBreak
= breaks
;
671 Dc_Attr
->lBreakExtra
= extra
;