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 if (pFaceName
&& nCount
<= 0)
368 // GdiSetLastError(ERROR_INVALID_PARAMETER);
371 return NtGdiGetTextFaceW(hDC
, nCount
, pFaceName
, FALSE
);
380 GetTextFaceA( HDC hdc
, INT count
, LPSTR name
)
382 INT res
= GetTextFaceW(hdc
, 0, NULL
);
383 LPWSTR nameW
= HeapAlloc( GetProcessHeap(), 0, res
* 2 );
384 GetTextFaceW( hdc
, res
, nameW
);
388 if (count
&& !WideCharToMultiByte( CP_ACP
, 0, nameW
, -1, name
, count
, NULL
, NULL
))
393 res
= WideCharToMultiByte( CP_ACP
, 0, nameW
, -1, NULL
, 0, NULL
, NULL
);
394 HeapFree( GetProcessHeap(), 0, nameW
);
404 GetTextFaceAliasW(HDC hdc
,
408 if ( pszOut
&& !cChar
)
410 GdiSetLastError(ERROR_INVALID_PARAMETER
);
413 return NtGdiGetTextFaceW(hdc
,cChar
,pszOut
,TRUE
);
419 GetFontResourceInfoW(
427 UNICODE_STRING NtFileName
;
429 if (!lpFileName
|| !pdwBufSize
|| !lpBuffer
)
431 SetLastError(ERROR_INVALID_PARAMETER
);
435 if (!RtlDosPathNameToNtPathName_U(lpFileName
,
440 SetLastError(ERROR_PATH_NOT_FOUND
);
444 bRet
= NtGdiGetFontResourceInfoInternalW(
446 (NtFileName
.Length
/ sizeof(WCHAR
)) + 1,
453 RtlFreeHeap(RtlGetProcessHeap(), 0, NtFileName
.Buffer
);
469 SetTextCharacterExtra(
474 INT cExtra
= 0x80000000;
477 if (CharExtra
== cExtra
)
479 SetLastError(ERROR_INVALID_PARAMETER
);
483 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
485 return MFDRV_SetTextCharacterExtra( hDC
, CharExtra
); // Wine port.
488 if (!GdiGetHandleUserData((HGDIOBJ
) hDC
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return cExtra
;
490 if (NtCurrentTeb()->GdiTebBatch
.HDC
== hDC
)
492 if (Dc_Attr
->ulDirty_
& DC_FONTTEXT_DIRTY
)
494 NtGdiFlush(); // Sync up Dc_Attr from Kernel space.
495 Dc_Attr
->ulDirty_
&= ~(DC_MODE_DIRTY
|DC_FONTTEXT_DIRTY
);
498 cExtra
= Dc_Attr
->lTextExtra
;
499 Dc_Attr
->lTextExtra
= CharExtra
;
501 // return GetAndSetDCDWord( hDC, GdiGetSetTextCharExtra, CharExtra, 0, 0, 0 );
510 GetTextAlign(HDC hdc
)
513 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
514 return Dc_Attr
->lTextAlign
;
524 GetTextColor(HDC hdc
)
527 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
528 return Dc_Attr
->ulForegroundClr
;
538 SetTextAlign(HDC hdc
,
544 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
546 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
547 return MFDRV_SetTextAlign( hdc
, fMode
)
550 PLDC pLDC
= Dc_Attr
->pvLDC
;
553 SetLastError(ERROR_INVALID_HANDLE
);
556 if (pLDC
->iType
== LDC_EMFLDC
)
558 if return EMFDRV_SetTextAlign( hdc
, fMode
)
563 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return OldMode
;
565 OldMode
= Dc_Attr
->lTextAlign
;
566 Dc_Attr
->lTextAlign
= fMode
; // Raw
567 if (Dc_Attr
->dwLayout
& LAYOUT_RTL
)
569 if(!(fMode
& TA_CENTER
)) fMode
|= TA_RIGHT
;
571 Dc_Attr
->flTextAlign
= fMode
& (TA_BASELINE
|TA_UPDATECP
|TA_CENTER
);
588 COLORREF OldColor
= CLR_INVALID
;
590 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
592 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
593 return MFDRV_SetTextColor( hDC
, crColor
);
596 PLDC pLDC
= Dc_Attr
->pvLDC
;
599 SetLastError(ERROR_INVALID_HANDLE
);
602 if (pLDC
->iType
== LDC_EMFLDC
)
604 if return EMFDRV_SetTextColor( hDC
, crColor
);
609 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return OldColor
;
611 OldColor
= (COLORREF
) Dc_Attr
->ulForegroundClr
;
612 Dc_Attr
->ulForegroundClr
= (ULONG
) crColor
;
614 if ( Dc_Attr
->crForegroundClr
!= crColor
)
616 Dc_Attr
->ulDirty_
|= DIRTY_TEXT
;
617 Dc_Attr
->crForegroundClr
= crColor
;
627 SetTextJustification(
635 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
637 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
638 return MFDRV_SetTextJustification( hdc
, extra
, breaks
)
641 SetLastError(ERROR_INVALID_HANDLE
);
645 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return FALSE
;
647 if (NtCurrentTeb()->GdiTebBatch
.HDC
== hdc
)
649 if (Dc_Attr
->ulDirty_
& DC_FONTTEXT_DIRTY
)
651 NtGdiFlush(); // Sync up Dc_Attr from Kernel space.
652 Dc_Attr
->ulDirty_
&= ~(DC_MODE_DIRTY
|DC_FONTTEXT_DIRTY
);
655 Dc_Attr
->cBreak
= breaks
;
656 Dc_Attr
->lBreakExtra
= extra
;