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 *****************************************************************/
21 GetTextExtentPoint32W = 0
22 GetTextExtentPointW = 1
48 SetLastWin32Error(ERROR_INVALID_HANDLE
);
52 pdcattr
= pdc
->pdcattr
;
54 TextObj
= RealizeFontInit(pdcattr
->hlfntNew
);
57 Result
= TextIntGetTextExtentPoint( pdc
,
66 TEXTOBJ_UnlockText(TextObj
);
78 GetTextExtentExPointW = 0 and everything else that uses this.
79 GetTextExtentExPointI = 1
98 if ( (!String
&& Count
) || !pSize
)
100 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
110 pdc
= DC_LockDc(hDC
);
113 SetLastWin32Error(ERROR_INVALID_HANDLE
);
116 pdcattr
= pdc
->pdcattr
;
118 TextObj
= RealizeFontInit(pdcattr
->hlfntNew
);
121 Result
= TextIntGetTextExtentPoint( pdc
,
130 TEXTOBJ_UnlockText(TextObj
);
142 NtGdiGetCharSet(HDC hDC
)
147 // If here, update everything!
151 SetLastWin32Error(ERROR_INVALID_HANDLE
);
154 cscp
= ftGdiGetTextCharsetInfo(Dc
,NULL
,0);
155 pdcattr
= Dc
->pdcattr
;
156 pdcattr
->iCS_CP
= cscp
;
157 pdcattr
->ulDirty_
&= ~DIRTY_CHARSET
;
164 NtGdiGetRasterizerCaps(
165 OUT LPRASTERIZER_STATUS praststat
,
168 NTSTATUS Status
= STATUS_SUCCESS
;
169 RASTERIZER_STATUS rsSafe
;
171 if (praststat
&& cjBytes
)
173 if ( cjBytes
>= sizeof(RASTERIZER_STATUS
) ) cjBytes
= sizeof(RASTERIZER_STATUS
);
174 if ( ftGdiGetRasterizerCaps(&rsSafe
))
178 ProbeForWrite( praststat
,
179 sizeof(RASTERIZER_STATUS
),
181 RtlCopyMemory(praststat
, &rsSafe
, cjBytes
);
183 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
185 Status
= _SEH2_GetExceptionCode();
189 if (!NT_SUCCESS(Status
))
191 SetLastNtError(Status
);
203 NtGdiGetTextCharsetInfo(
205 OUT OPTIONAL LPFONTSIGNATURE lpSig
,
210 FONTSIGNATURE fsSafe
;
211 PFONTSIGNATURE pfsSafe
= &fsSafe
;
212 NTSTATUS Status
= STATUS_SUCCESS
;
217 SetLastWin32Error(ERROR_INVALID_HANDLE
);
218 return DEFAULT_CHARSET
;
221 if (!lpSig
) pfsSafe
= NULL
;
223 Ret
= HIWORD(ftGdiGetTextCharsetInfo( Dc
, pfsSafe
, dwFlags
));
227 if (Ret
== DEFAULT_CHARSET
)
228 RtlZeroMemory(pfsSafe
, sizeof(FONTSIGNATURE
));
232 ProbeForWrite( lpSig
,
233 sizeof(FONTSIGNATURE
),
235 RtlCopyMemory(lpSig
, pfsSafe
, sizeof(FONTSIGNATURE
));
237 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
239 Status
= _SEH2_GetExceptionCode();
243 if (!NT_SUCCESS(Status
))
245 SetLastNtError(Status
);
246 return DEFAULT_CHARSET
;
256 GetTextExtentExPointW = 0 and everything else that uses this.
257 GetTextExtentExPointI = 1
262 NtGdiGetTextExtentExW(
264 IN OPTIONAL LPWSTR UnsafeString
,
267 OUT OPTIONAL PULONG UnsafeFit
,
268 OUT OPTIONAL PULONG UnsafeDx
,
269 OUT LPSIZE UnsafeSize
,
283 /* FIXME: Handle fl */
289 Status
= MmCopyToCaller(UnsafeSize
, &Size
, sizeof(SIZE
));
290 if (! NT_SUCCESS(Status
))
292 SetLastNtError(Status
);
298 String
= ExAllocatePoolWithTag(PagedPool
, Count
* sizeof(WCHAR
), TAG_GDITEXT
);
301 SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY
);
305 if (NULL
!= UnsafeDx
)
307 Dx
= ExAllocatePoolWithTag(PagedPool
, Count
* sizeof(INT
), TAG_GDITEXT
);
310 ExFreePoolWithTag(String
, TAG_GDITEXT
);
311 SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY
);
320 Status
= MmCopyFromCaller(String
, UnsafeString
, Count
* sizeof(WCHAR
));
321 if (! NT_SUCCESS(Status
))
325 ExFreePoolWithTag(Dx
, TAG_GDITEXT
);
327 ExFreePoolWithTag(String
, TAG_GDITEXT
);
328 SetLastNtError(Status
);
337 ExFreePoolWithTag(Dx
, TAG_GDITEXT
);
339 ExFreePoolWithTag(String
, TAG_GDITEXT
);
340 SetLastWin32Error(ERROR_INVALID_HANDLE
);
343 pdcattr
= dc
->pdcattr
;
344 TextObj
= RealizeFontInit(pdcattr
->hlfntNew
);
347 Result
= TextIntGetTextExtentPoint( dc
,
352 NULL
== UnsafeFit
? NULL
: &Fit
,
356 TEXTOBJ_UnlockText(TextObj
);
362 ExFreePoolWithTag(String
, TAG_GDITEXT
);
367 ExFreePoolWithTag(Dx
, TAG_GDITEXT
);
372 if (NULL
!= UnsafeFit
)
374 Status
= MmCopyToCaller(UnsafeFit
, &Fit
, sizeof(INT
));
375 if (! NT_SUCCESS(Status
))
379 ExFreePoolWithTag(Dx
, TAG_GDITEXT
);
381 SetLastNtError(Status
);
386 if (NULL
!= UnsafeDx
)
388 Status
= MmCopyToCaller(UnsafeDx
, Dx
, Count
* sizeof(INT
));
389 if (! NT_SUCCESS(Status
))
393 ExFreePoolWithTag(Dx
, TAG_GDITEXT
);
395 SetLastNtError(Status
);
401 ExFreePoolWithTag(Dx
,TAG_GDITEXT
);
404 Status
= MmCopyToCaller(UnsafeSize
, &Size
, sizeof(SIZE
));
405 if (! NT_SUCCESS(Status
))
407 SetLastNtError(Status
);
417 GetTextExtentPoint32W = 0
418 GetTextExtentPointW = 1
422 NtGdiGetTextExtent(HDC hdc
,
428 return NtGdiGetTextExtentExW(hdc
, lpwsz
, cwc
, 0, NULL
, NULL
, psize
, flOpts
);
433 NtGdiSetTextJustification(HDC hDC
,
440 pDc
= DC_LockDc(hDC
);
443 SetLastWin32Error(ERROR_INVALID_HANDLE
);
447 pdcattr
= pDc
->pdcattr
;
449 pdcattr
->lBreakExtra
= BreakExtra
;
450 pdcattr
->cBreak
= BreakCount
;
463 OUT OPTIONAL LPWSTR FaceName
,
474 /* FIXME: Handle bAliasName */
479 SetLastWin32Error(ERROR_INVALID_HANDLE
);
482 pdcattr
= Dc
->pdcattr
;
483 hFont
= pdcattr
->hlfntNew
;
486 TextObj
= RealizeFontInit(hFont
);
487 ASSERT(TextObj
!= NULL
);
488 fLen
= wcslen(TextObj
->logfont
.elfEnumLogfontEx
.elfLogFont
.lfFaceName
) + 1;
490 if (FaceName
!= NULL
)
492 Count
= min(Count
, fLen
);
493 Status
= MmCopyToCaller(FaceName
, TextObj
->logfont
.elfEnumLogfontEx
.elfLogFont
.lfFaceName
, Count
* sizeof(WCHAR
));
494 if (!NT_SUCCESS(Status
))
496 TEXTOBJ_UnlockText(TextObj
);
497 SetLastNtError(Status
);
500 /* Terminate if we copied only part of the font name */
501 if (Count
> 0 && Count
< fLen
)
503 FaceName
[Count
- 1] = '\0';
512 TEXTOBJ_UnlockText(TextObj
);
519 NtGdiGetTextMetricsW(
521 OUT TMW_INTERNAL
* pUnsafeTmwi
,
526 NTSTATUS Status
= STATUS_SUCCESS
;
528 if ( cj
<= sizeof(TMW_INTERNAL
) )
530 if (ftGdiGetTextMetricsW(hDC
,&Tmwi
))
534 ProbeForWrite(pUnsafeTmwi
, cj
, 1);
535 RtlCopyMemory(pUnsafeTmwi
,&Tmwi
,cj
);
537 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
539 Status
= _SEH2_GetExceptionCode();
543 if (!NT_SUCCESS(Status
))
545 SetLastNtError(Status
);