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 GetTextExtentPoint32W = 0
21 GetTextExtentPointW = 1
47 SetLastWin32Error(ERROR_INVALID_HANDLE
);
51 pdcattr
= pdc
->pdcattr
;
53 TextObj
= RealizeFontInit(pdcattr
->hlfntNew
);
56 Result
= TextIntGetTextExtentPoint( pdc
,
64 TEXTOBJ_UnlockText(TextObj
);
76 GetTextExtentExPointW = 0 and everything else that uses this.
77 GetTextExtentExPointI = 1
96 if ( (!String
&& Count
) || !pSize
)
98 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
108 pdc
= DC_LockDc(hDC
);
111 SetLastWin32Error(ERROR_INVALID_HANDLE
);
114 pdcattr
= pdc
->pdcattr
;
116 TextObj
= RealizeFontInit(pdcattr
->hlfntNew
);
119 Result
= TextIntGetTextExtentPoint( pdc
,
127 TEXTOBJ_UnlockText(TextObj
);
138 NtGdiGetCharSet(HDC hDC
)
143 // If here, update everything!
147 SetLastWin32Error(ERROR_INVALID_HANDLE
);
150 cscp
= ftGdiGetTextCharsetInfo(Dc
,NULL
,0);
151 pdcattr
= Dc
->pdcattr
;
152 pdcattr
->iCS_CP
= cscp
;
153 pdcattr
->ulDirty_
&= ~DIRTY_CHARSET
;
160 NtGdiGetRasterizerCaps(
161 OUT LPRASTERIZER_STATUS praststat
,
164 NTSTATUS Status
= STATUS_SUCCESS
;
165 RASTERIZER_STATUS rsSafe
;
167 if (praststat
&& cjBytes
)
169 if ( cjBytes
>= sizeof(RASTERIZER_STATUS
) ) cjBytes
= sizeof(RASTERIZER_STATUS
);
170 if ( ftGdiGetRasterizerCaps(&rsSafe
))
174 ProbeForWrite( praststat
,
175 sizeof(RASTERIZER_STATUS
),
177 RtlCopyMemory(praststat
, &rsSafe
, cjBytes
);
179 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
181 Status
= _SEH2_GetExceptionCode();
185 if (!NT_SUCCESS(Status
))
187 SetLastNtError(Status
);
199 NtGdiGetTextCharsetInfo(
201 OUT OPTIONAL LPFONTSIGNATURE lpSig
,
206 FONTSIGNATURE fsSafe
;
207 PFONTSIGNATURE pfsSafe
= &fsSafe
;
208 NTSTATUS Status
= STATUS_SUCCESS
;
213 SetLastWin32Error(ERROR_INVALID_HANDLE
);
214 return DEFAULT_CHARSET
;
217 if (!lpSig
) pfsSafe
= NULL
;
219 Ret
= HIWORD(ftGdiGetTextCharsetInfo( Dc
, pfsSafe
, dwFlags
));
223 if (Ret
== DEFAULT_CHARSET
)
224 RtlZeroMemory(pfsSafe
, sizeof(FONTSIGNATURE
));
228 ProbeForWrite( lpSig
,
229 sizeof(FONTSIGNATURE
),
231 RtlCopyMemory(lpSig
, pfsSafe
, sizeof(FONTSIGNATURE
));
233 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
235 Status
= _SEH2_GetExceptionCode();
239 if (!NT_SUCCESS(Status
))
241 SetLastNtError(Status
);
242 return DEFAULT_CHARSET
;
252 GetTextExtentExPointW = 0 and everything else that uses this.
253 GetTextExtentExPointI = 1
258 NtGdiGetTextExtentExW(
260 IN OPTIONAL LPWSTR UnsafeString
,
263 OUT OPTIONAL PULONG UnsafeFit
,
264 OUT OPTIONAL PULONG UnsafeDx
,
265 OUT LPSIZE UnsafeSize
,
279 /* FIXME: Handle fl */
285 Status
= MmCopyToCaller(UnsafeSize
, &Size
, sizeof(SIZE
));
286 if (! NT_SUCCESS(Status
))
288 SetLastNtError(Status
);
294 String
= ExAllocatePoolWithTag(PagedPool
, Count
* sizeof(WCHAR
), TAG_GDITEXT
);
297 SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY
);
301 if (NULL
!= UnsafeDx
)
303 Dx
= ExAllocatePoolWithTag(PagedPool
, Count
* sizeof(INT
), TAG_GDITEXT
);
306 ExFreePoolWithTag(String
, TAG_GDITEXT
);
307 SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY
);
316 Status
= MmCopyFromCaller(String
, UnsafeString
, Count
* sizeof(WCHAR
));
317 if (! NT_SUCCESS(Status
))
321 ExFreePoolWithTag(Dx
, TAG_GDITEXT
);
323 ExFreePoolWithTag(String
, TAG_GDITEXT
);
324 SetLastNtError(Status
);
333 ExFreePoolWithTag(Dx
, TAG_GDITEXT
);
335 ExFreePoolWithTag(String
, TAG_GDITEXT
);
336 SetLastWin32Error(ERROR_INVALID_HANDLE
);
339 pdcattr
= dc
->pdcattr
;
340 TextObj
= RealizeFontInit(pdcattr
->hlfntNew
);
343 Result
= TextIntGetTextExtentPoint( dc
,
348 NULL
== UnsafeFit
? NULL
: &Fit
,
351 TEXTOBJ_UnlockText(TextObj
);
357 ExFreePoolWithTag(String
, TAG_GDITEXT
);
362 ExFreePoolWithTag(Dx
, TAG_GDITEXT
);
367 if (NULL
!= UnsafeFit
)
369 Status
= MmCopyToCaller(UnsafeFit
, &Fit
, sizeof(INT
));
370 if (! NT_SUCCESS(Status
))
374 ExFreePoolWithTag(Dx
, TAG_GDITEXT
);
376 SetLastNtError(Status
);
381 if (NULL
!= UnsafeDx
)
383 Status
= MmCopyToCaller(UnsafeDx
, Dx
, Count
* sizeof(INT
));
384 if (! NT_SUCCESS(Status
))
388 ExFreePoolWithTag(Dx
, TAG_GDITEXT
);
390 SetLastNtError(Status
);
396 ExFreePoolWithTag(Dx
,TAG_GDITEXT
);
399 Status
= MmCopyToCaller(UnsafeSize
, &Size
, sizeof(SIZE
));
400 if (! NT_SUCCESS(Status
))
402 SetLastNtError(Status
);
412 GetTextExtentPoint32W = 0
413 GetTextExtentPointW = 1
417 NtGdiGetTextExtent(HDC hdc
,
423 return NtGdiGetTextExtentExW(hdc
, lpwsz
, cwc
, 0, NULL
, NULL
, psize
, 0);
428 NtGdiSetTextJustification(HDC hDC
,
435 pDc
= DC_LockDc(hDC
);
438 SetLastWin32Error(ERROR_INVALID_HANDLE
);
442 pdcattr
= pDc
->pdcattr
;
444 pdcattr
->lBreakExtra
= BreakExtra
;
445 pdcattr
->cBreak
= BreakCount
;
458 OUT OPTIONAL LPWSTR FaceName
,
469 /* FIXME: Handle bAliasName */
474 SetLastWin32Error(ERROR_INVALID_HANDLE
);
477 pdcattr
= Dc
->pdcattr
;
478 hFont
= pdcattr
->hlfntNew
;
481 TextObj
= RealizeFontInit(hFont
);
482 ASSERT(TextObj
!= NULL
);
483 fLen
= wcslen(TextObj
->logfont
.elfEnumLogfontEx
.elfLogFont
.lfFaceName
) + 1;
485 if (FaceName
!= NULL
)
487 Count
= min(Count
, fLen
);
488 Status
= MmCopyToCaller(FaceName
, TextObj
->logfont
.elfEnumLogfontEx
.elfLogFont
.lfFaceName
, Count
* sizeof(WCHAR
));
489 if (!NT_SUCCESS(Status
))
491 TEXTOBJ_UnlockText(TextObj
);
492 SetLastNtError(Status
);
495 /* Terminate if we copied only part of the font name */
496 if (Count
> 0 && Count
< fLen
)
498 FaceName
[Count
- 1] = '\0';
507 TEXTOBJ_UnlockText(TextObj
);
514 NtGdiGetTextMetricsW(
516 OUT TMW_INTERNAL
* pUnsafeTmwi
,
521 NTSTATUS Status
= STATUS_SUCCESS
;
523 if ( cj
<= sizeof(TMW_INTERNAL
) )
525 if (ftGdiGetTextMetricsW(hDC
,&Tmwi
))
529 ProbeForWrite(pUnsafeTmwi
, cj
, 1);
530 RtlCopyMemory(pUnsafeTmwi
,&Tmwi
,cj
);
532 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
534 Status
= _SEH2_GetExceptionCode();
538 if (!NT_SUCCESS(Status
))
540 SetLastNtError(Status
);