17 UNICODE_STRING StringU
;
22 RtlInitAnsiString(&StringA
, (LPSTR
)lpString
);
23 RtlAnsiStringToUnicodeString(&StringU
, &StringA
, TRUE
);
25 StringU
.Buffer
= NULL
;
27 ret
= TextOutW(hdc
, nXStart
, nYStart
, StringU
.Buffer
, cchString
);
28 RtlFreeUnicodeString(&StringU
);
45 return NtGdiExtTextOutW(hdc
, nXStart
, nYStart
, 0, NULL
, (LPWSTR
)lpString
, cchString
, NULL
, 0);
54 GdiGetCodePage(HDC hdc
)
57 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
58 if (Dc_Attr
->ulDirty_
& DIRTY_CHARSET
) return LOWORD(NtGdiGetCharSet(hdc
));
59 return LOWORD(Dc_Attr
->iCS_CP
);
68 GetTextCharacterExtra(
74 if (!GdiGetHandleUserData((HGDIOBJ
) hDc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
75 return Dc_Attr
->lTextExtra
;
76 // return GetDCDWord( hDc, GdiGetTextCharExtra, 0);
85 GetTextCharset(HDC hdc
)
87 /* MSDN docs say this is equivalent */
88 return NtGdiGetTextCharsetInfo(hdc
,NULL
,0);
105 if (! NtGdiGetTextMetricsW(hdc
, &tmwi
, sizeof(TMW_INTERNAL
)))
110 FONT_TextMetricWToA(&tmwi
.TextMetric
, lptm
);
127 if (! NtGdiGetTextMetricsW(hdc
, &tmwi
, sizeof(TMW_INTERNAL
)))
132 *lptm
= tmwi
.TextMetric
;
150 UNICODE_STRING StringU
;
153 RtlInitAnsiString(&StringA
, (LPSTR
)lpString
);
154 RtlAnsiStringToUnicodeString(&StringU
, &StringA
, TRUE
);
156 ret
= GetTextExtentPointW(hdc
, StringU
.Buffer
, cchString
, lpSize
);
158 RtlFreeUnicodeString(&StringU
);
176 return NtGdiGetTextExtent(hdc
, (LPWSTR
)lpString
, cchString
, lpSize
, 1);
185 GetTextExtentExPointW(
195 return NtGdiGetTextExtentExW (
196 hdc
, (LPWSTR
)lpszStr
, cchString
, nMaxExtent
, (PULONG
)lpnFit
, (PULONG
)alpDx
, lpSize
, 0 );
205 GetTextExtentExPointA(
219 Status
= HEAP_strdupA2W ( &lpszStrW
, lpszStr
);
220 if (!NT_SUCCESS (Status
))
221 SetLastError (RtlNtStatusToDosError(Status
));
224 rc
= NtGdiGetTextExtentExW (
225 hdc
, lpszStrW
, cchString
, nMaxExtent
, (PULONG
)lpnFit
, (PULONG
)alpDx
, lpSize
, 0 );
227 HEAP_free ( lpszStrW
);
239 GetTextExtentPoint32A(
247 UNICODE_STRING StringU
;
250 RtlInitAnsiString(&StringA
, (LPSTR
)lpString
);
251 RtlAnsiStringToUnicodeString(&StringU
, &StringA
, TRUE
);
253 ret
= GetTextExtentPoint32W(hdc
, StringU
.Buffer
, cchString
, lpSize
);
255 RtlFreeUnicodeString(&StringU
);
266 GetTextExtentPoint32W(
273 return NtGdiGetTextExtent(hdc
, (LPWSTR
)lpString
, cchString
, lpSize
, 0);
281 GetTextExtentExPointI(HDC hdc
,
289 return NtGdiGetTextExtentExW(hdc
,pgiIn
,cgi
,nMaxExtent
,(ULONG
*)lpnFit
, (PULONG
) alpDx
,lpSize
,1);
297 GetTextExtentPointI(HDC hdc
,
302 return NtGdiGetTextExtent(hdc
,pgiIn
,cgi
,lpSize
,2);
322 UNICODE_STRING StringU
;
325 RtlInitAnsiString(&StringA
, (LPSTR
)lpString
);
326 RtlAnsiStringToUnicodeString(&StringU
, &StringA
, TRUE
);
328 ret
= ExtTextOutW(hdc
, X
, Y
, fuOptions
, lprc
, StringU
.Buffer
, cchString
, lpDx
);
330 RtlFreeUnicodeString(&StringU
);
352 return NtGdiExtTextOutW(hdc
, X
, Y
, fuOptions
, (LPRECT
)lprc
, (LPWSTR
)lpString
, cchString
, (LPINT
)lpDx
, 0);
361 GetTextFaceW(HDC hDC
,
365 /* Validate parameters */
366 if (pFaceName
&& nCount
<= 0)
368 /* Set last error and return failure */
369 GdiSetLastError(ERROR_INVALID_PARAMETER
);
373 /* Forward to kernel */
374 return NtGdiGetTextFaceW(hDC
, nCount
, pFaceName
, FALSE
);
383 GetTextFaceA( HDC hdc
, INT count
, LPSTR name
)
388 /* Validate parameters */
389 if (name
&& count
<= 0)
391 /* Set last error and return failure */
392 GdiSetLastError(ERROR_INVALID_PARAMETER
);
396 res
= GetTextFaceW(hdc
, 0, NULL
);
397 nameW
= HeapAlloc( GetProcessHeap(), 0, res
* 2 );
402 GetTextFaceW( hdc
, res
, nameW
);
406 if (count
&& !WideCharToMultiByte( CP_ACP
, 0, nameW
, -1, name
, count
, NULL
, NULL
))
411 res
= WideCharToMultiByte( CP_ACP
, 0, nameW
, -1, NULL
, 0, NULL
, NULL
);
412 HeapFree( GetProcessHeap(), 0, nameW
);
422 GetTextFaceAliasW(HDC hdc
,
426 if ( pszOut
&& !cChar
)
428 GdiSetLastError(ERROR_INVALID_PARAMETER
);
431 return NtGdiGetTextFaceW(hdc
,cChar
,pszOut
,TRUE
);
437 GetFontResourceInfoW(
445 UNICODE_STRING NtFileName
;
447 if (!lpFileName
|| !pdwBufSize
|| !lpBuffer
)
449 SetLastError(ERROR_INVALID_PARAMETER
);
453 if (!RtlDosPathNameToNtPathName_U(lpFileName
,
458 SetLastError(ERROR_PATH_NOT_FOUND
);
462 bRet
= NtGdiGetFontResourceInfoInternalW(
464 (NtFileName
.Length
/ sizeof(WCHAR
)) + 1,
471 RtlFreeHeap(RtlGetProcessHeap(), 0, NtFileName
.Buffer
);
487 SetTextCharacterExtra(
492 INT cExtra
= 0x80000000;
495 if (CharExtra
== cExtra
)
497 SetLastError(ERROR_INVALID_PARAMETER
);
501 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
503 return MFDRV_SetTextCharacterExtra( hDC
, CharExtra
); // Wine port.
506 if (!GdiGetHandleUserData((HGDIOBJ
) hDC
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return cExtra
;
508 if (NtCurrentTeb()->GdiTebBatch
.HDC
== hDC
)
510 if (Dc_Attr
->ulDirty_
& DC_FONTTEXT_DIRTY
)
512 NtGdiFlush(); // Sync up Dc_Attr from Kernel space.
513 Dc_Attr
->ulDirty_
&= ~(DC_MODE_DIRTY
|DC_FONTTEXT_DIRTY
);
516 cExtra
= Dc_Attr
->lTextExtra
;
517 Dc_Attr
->lTextExtra
= CharExtra
;
519 // return GetAndSetDCDWord( hDC, GdiGetSetTextCharExtra, CharExtra, 0, 0, 0 );
528 GetTextAlign(HDC hdc
)
531 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
532 return Dc_Attr
->lTextAlign
;
542 GetTextColor(HDC hdc
)
545 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
546 return Dc_Attr
->ulForegroundClr
;
556 SetTextAlign(HDC hdc
,
562 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
564 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
565 return MFDRV_SetTextAlign( hdc
, fMode
)
568 PLDC pLDC
= Dc_Attr
->pvLDC
;
571 SetLastError(ERROR_INVALID_HANDLE
);
574 if (pLDC
->iType
== LDC_EMFLDC
)
576 if return EMFDRV_SetTextAlign( hdc
, fMode
)
581 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return OldMode
;
583 OldMode
= Dc_Attr
->lTextAlign
;
584 Dc_Attr
->lTextAlign
= fMode
; // Raw
585 if (Dc_Attr
->dwLayout
& LAYOUT_RTL
)
587 if(!(fMode
& TA_CENTER
)) fMode
|= TA_RIGHT
;
589 Dc_Attr
->flTextAlign
= fMode
& (TA_BASELINE
|TA_UPDATECP
|TA_CENTER
);
606 COLORREF OldColor
= CLR_INVALID
;
608 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
610 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
611 return MFDRV_SetTextColor( hDC
, crColor
);
614 PLDC pLDC
= Dc_Attr
->pvLDC
;
617 SetLastError(ERROR_INVALID_HANDLE
);
620 if (pLDC
->iType
== LDC_EMFLDC
)
622 if return EMFDRV_SetTextColor( hDC
, crColor
);
627 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return OldColor
;
629 OldColor
= (COLORREF
) Dc_Attr
->ulForegroundClr
;
630 Dc_Attr
->ulForegroundClr
= (ULONG
) crColor
;
632 if ( Dc_Attr
->crForegroundClr
!= crColor
)
634 Dc_Attr
->ulDirty_
|= (DIRTY_TEXT
|DIRTY_LINE
|DIRTY_FILL
);
635 Dc_Attr
->crForegroundClr
= crColor
;
645 SetTextJustification(
653 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
655 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
656 return MFDRV_SetTextJustification( hdc
, extra
, breaks
)
659 SetLastError(ERROR_INVALID_HANDLE
);
663 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return FALSE
;
665 if (NtCurrentTeb()->GdiTebBatch
.HDC
== hdc
)
667 if (Dc_Attr
->ulDirty_
& DC_FONTTEXT_DIRTY
)
669 NtGdiFlush(); // Sync up Dc_Attr from Kernel space.
670 Dc_Attr
->ulDirty_
&= ~(DC_MODE_DIRTY
|DC_FONTTEXT_DIRTY
);
673 Dc_Attr
->cBreak
= breaks
;
674 Dc_Attr
->lBreakExtra
= extra
;