2 * PROJECT: ReactOS win32 kernel mode subsystem
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: subsystems/win32/win32k/objects/text.c
9 /** Includes ******************************************************************/
16 /** Functions ******************************************************************/
20 NtGdiGetCharSet(HDC hDC
)
25 // If here, update everything!
29 SetLastWin32Error(ERROR_INVALID_HANDLE
);
32 cscp
= ftGdiGetTextCharsetInfo(Dc
,NULL
,0);
33 Dc_Attr
= Dc
->pDc_Attr
;
34 if (!Dc_Attr
) Dc_Attr
= &Dc
->Dc_Attr
;
35 Dc_Attr
->iCS_CP
= cscp
;
36 Dc_Attr
->ulDirty_
&= ~DIRTY_CHARSET
;
43 NtGdiGetRasterizerCaps(
44 OUT LPRASTERIZER_STATUS praststat
,
47 NTSTATUS Status
= STATUS_SUCCESS
;
48 RASTERIZER_STATUS rsSafe
;
50 if (praststat
&& cjBytes
)
52 if ( cjBytes
>= sizeof(RASTERIZER_STATUS
) ) cjBytes
= sizeof(RASTERIZER_STATUS
);
53 if ( ftGdiGetRasterizerCaps(&rsSafe
))
57 ProbeForWrite( praststat
,
58 sizeof(RASTERIZER_STATUS
),
60 RtlCopyMemory(praststat
, &rsSafe
, cjBytes
);
62 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
64 Status
= _SEH2_GetExceptionCode();
68 if (!NT_SUCCESS(Status
))
70 SetLastNtError(Status
);
80 NtGdiGetTextCharsetInfo(
82 OUT OPTIONAL LPFONTSIGNATURE lpSig
,
88 PFONTSIGNATURE pfsSafe
= &fsSafe
;
89 NTSTATUS Status
= STATUS_SUCCESS
;
94 SetLastWin32Error(ERROR_INVALID_HANDLE
);
95 return DEFAULT_CHARSET
;
98 if (!lpSig
) pfsSafe
= NULL
;
100 Ret
= HIWORD(ftGdiGetTextCharsetInfo( Dc
, pfsSafe
, dwFlags
));
104 if (Ret
== DEFAULT_CHARSET
)
105 RtlZeroMemory(pfsSafe
, sizeof(FONTSIGNATURE
));
109 ProbeForWrite( lpSig
,
110 sizeof(FONTSIGNATURE
),
112 RtlCopyMemory(lpSig
, pfsSafe
, sizeof(FONTSIGNATURE
));
114 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
116 Status
= _SEH2_GetExceptionCode();
120 if (!NT_SUCCESS(Status
))
122 SetLastNtError(Status
);
123 return DEFAULT_CHARSET
;
133 NtGdiGetTextExtentExW(
135 IN OPTIONAL LPWSTR UnsafeString
,
138 OUT OPTIONAL PULONG UnsafeFit
,
139 OUT OPTIONAL PULONG UnsafeDx
,
140 OUT LPSIZE UnsafeSize
,
154 /* FIXME: Handle fl */
160 Status
= MmCopyToCaller(UnsafeSize
, &Size
, sizeof(SIZE
));
161 if (! NT_SUCCESS(Status
))
163 SetLastNtError(Status
);
169 String
= ExAllocatePoolWithTag(PagedPool
, Count
* sizeof(WCHAR
), TAG_GDITEXT
);
172 SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY
);
176 if (NULL
!= UnsafeDx
)
178 Dx
= ExAllocatePoolWithTag(PagedPool
, Count
* sizeof(INT
), TAG_GDITEXT
);
181 ExFreePoolWithTag(String
, TAG_GDITEXT
);
182 SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY
);
191 Status
= MmCopyFromCaller(String
, UnsafeString
, Count
* sizeof(WCHAR
));
192 if (! NT_SUCCESS(Status
))
196 ExFreePoolWithTag(Dx
, TAG_GDITEXT
);
198 ExFreePoolWithTag(String
, TAG_GDITEXT
);
199 SetLastNtError(Status
);
208 ExFreePoolWithTag(Dx
, TAG_GDITEXT
);
210 ExFreePoolWithTag(String
, TAG_GDITEXT
);
211 SetLastWin32Error(ERROR_INVALID_HANDLE
);
214 Dc_Attr
= dc
->pDc_Attr
;
215 if(!Dc_Attr
) Dc_Attr
= &dc
->Dc_Attr
;
216 TextObj
= RealizeFontInit(Dc_Attr
->hlfntNew
);
219 Result
= TextIntGetTextExtentPoint(dc
, TextObj
, String
, Count
, MaxExtent
,
220 NULL
== UnsafeFit
? NULL
: &Fit
, Dx
, &Size
);
221 TEXTOBJ_UnlockText(TextObj
);
227 ExFreePoolWithTag(String
, TAG_GDITEXT
);
232 ExFreePoolWithTag(Dx
, TAG_GDITEXT
);
237 if (NULL
!= UnsafeFit
)
239 Status
= MmCopyToCaller(UnsafeFit
, &Fit
, sizeof(INT
));
240 if (! NT_SUCCESS(Status
))
244 ExFreePoolWithTag(Dx
, TAG_GDITEXT
);
246 SetLastNtError(Status
);
251 if (NULL
!= UnsafeDx
)
253 Status
= MmCopyToCaller(UnsafeDx
, Dx
, Count
* sizeof(INT
));
254 if (! NT_SUCCESS(Status
))
258 ExFreePoolWithTag(Dx
, TAG_GDITEXT
);
260 SetLastNtError(Status
);
266 ExFreePoolWithTag(Dx
,TAG_GDITEXT
);
269 Status
= MmCopyToCaller(UnsafeSize
, &Size
, sizeof(SIZE
));
270 if (! NT_SUCCESS(Status
))
272 SetLastNtError(Status
);
281 NtGdiGetTextExtent(HDC hdc
,
287 return NtGdiGetTextExtentExW(hdc
, lpwsz
, cwc
, 0, NULL
, NULL
, psize
, 0);
292 NtGdiSetTextJustification(HDC hDC
,
299 pDc
= DC_LockDc(hDC
);
302 SetLastWin32Error(ERROR_INVALID_HANDLE
);
306 pDc_Attr
= pDc
->pDc_Attr
;
307 if(!pDc_Attr
) pDc_Attr
= &pDc
->Dc_Attr
;
309 pDc_Attr
->lBreakExtra
= BreakExtra
;
310 pDc_Attr
->cBreak
= BreakCount
;
323 OUT OPTIONAL LPWSTR FaceName
,
333 /* FIXME: Handle bAliasName */
338 SetLastWin32Error(ERROR_INVALID_HANDLE
);
341 Dc_Attr
= Dc
->pDc_Attr
;
342 if(!Dc_Attr
) Dc_Attr
= &Dc
->Dc_Attr
;
343 hFont
= Dc_Attr
->hlfntNew
;
346 TextObj
= RealizeFontInit(hFont
);
347 ASSERT(TextObj
!= NULL
);
348 Count
= min(Count
, wcslen(TextObj
->logfont
.elfEnumLogfontEx
.elfLogFont
.lfFaceName
));
349 Status
= MmCopyToCaller(FaceName
, TextObj
->logfont
.elfEnumLogfontEx
.elfLogFont
.lfFaceName
, Count
* sizeof(WCHAR
));
350 TEXTOBJ_UnlockText(TextObj
);
351 if (!NT_SUCCESS(Status
))
353 SetLastNtError(Status
);
363 NtGdiGetTextMetricsW(
365 OUT TMW_INTERNAL
* pUnsafeTmwi
,
370 NTSTATUS Status
= STATUS_SUCCESS
;
372 if ( cj
<= sizeof(TMW_INTERNAL
) )
374 if (ftGdiGetTextMetricsW(hDC
,&Tmwi
))
378 ProbeForWrite(pUnsafeTmwi
, cj
, 1);
379 RtlCopyMemory(pUnsafeTmwi
,&Tmwi
,cj
);
381 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
383 Status
= _SEH2_GetExceptionCode();
387 if (!NT_SUCCESS(Status
))
389 SetLastNtError(Status
);