6013{
6014
6015
6016
6017
6018
6019
6021 SURFOBJ *SurfObj, *SourceGlyphSurf;
6026 LONGLONG X64, Y64, RealXStart64, RealYStart64, DeltaX64, DeltaY64;
6028 RECTL DestRect, MaskRect;
6039 BOOL use_kerning, bResult, DoBreak;
6044
6045
6047 {
6050 }
6051
6053 {
6055 XStart, YStart,
6056 fuOptions,
6059 Dx);
6060 }
6061
6063
6064 if (!
dc->dclevel.pSurface)
6065 {
6066
6069 }
6070
6071 pdcattr =
dc->pdcattr;
6073 {
6076 }
6077 else
6078 {
6081 }
6082
6086
6089
6090 psurf =
dc->dclevel.pSurface;
6092
6095 else
6097
6100
6102 {
6108 }
6109
6111 {
6115 &
dc->eboBackground.BrushObject);
6116 fuOptions &= ~ETO_OPAQUE;
6117 }
6118 else
6119 {
6121 {
6123 }
6124 }
6125
6127 if (TextObj ==
NULL)
6128 {
6131 }
6132
6133 FontObj = TextObj->
Font;
6137
6140
6146
6149 else
6151
6153 {
6157 }
6158
6159
6162 else
6164
6165
6169
6170
6171 bNoTransform = ((
mat.xy == 0) && (
mat.yx == 0) &&
6172 (
mat.xx == (1 << 16)) && (
mat.yy == (1 << 16)));
6173
6174
6176 vecAscent64.
y = (FontGDI->
tmAscent << 6);
6181
6182
6183#define VALIGN_MASK (TA_TOP | TA_BASELINE | TA_BOTTOM)
6185 {
6187 }
6189 {
6190 RealXStart64 -= vecDescent64.
x;
6191 RealYStart64 += vecDescent64.
y;
6192 }
6193 else
6194 {
6195 RealXStart64 -= vecAscent64.
x;
6196 RealYStart64 += vecAscent64.
y;
6197 }
6198#undef VALIGN_MASK
6199
6201
6202
6204 {
6206 fuOptions, bNoTransform))
6207 {
6211 }
6212
6213
6215 {
6216 RealXStart64 -= DeltaX64 / 2;
6217 RealYStart64 -= DeltaY64 / 2;
6218 }
6220 {
6221 RealXStart64 -= DeltaX64;
6222 RealYStart64 -= DeltaY64;
6223 }
6224
6225
6227 {
6228 INT X0 = (RealXStart64 + vecAscent64.
x + 32) >> 6;
6229 INT Y0 = (RealYStart64 - vecAscent64.
y + 32) >> 6;
6230 INT DX = (DeltaX64 >> 6);
6231 if (
Cache.Hashed.matTransform.xy == 0 &&
Cache.Hashed.matTransform.yx == 0)
6232 {
6233 INT CY = (vecAscent64.
y - vecDescent64.
y + 32) >> 6;
6235 }
6236 else
6237 {
6238 INT DY = (DeltaY64 >> 6);
6239 INT X1 = ((RealXStart64 + vecDescent64.
x + 32) >> 6);
6240 INT Y1 = ((RealYStart64 - vecDescent64.
y + 32) >> 6);
6242 {
6243 { X0, Y0 },
6244 { X0 +
DX, Y0 + DY },
6245 { X1 +
DX, Y1 + DY },
6246 { X1, Y1 },
6247 };
6249 }
6250 }
6251 }
6252
6255
6258
6259
6260
6261
6262 X64 = RealXStart64;
6263 Y64 = RealYStart64;
6264 previous = 0;
6268 {
6271 {
6274 break;
6275
6279 }
6280
6282 Cache.Hashed.GlyphIndex = glyph_index;
6283
6285 if (!realglyph)
6286 {
6288 break;
6289 }
6290
6291
6292 if (use_kerning && previous && glyph_index &&
NULL == Dx)
6293 {
6297 }
6298
6299 DPRINT(
"X64, Y64: %I64d, %I64d\n", X64, Y64);
6301
6304
6307
6308 DestRect.
left = ((X64 + 32) >> 6) + realglyph->
left;
6310 DestRect.
top = ((Y64 + 32) >> 6) - realglyph->
top;
6312
6313
6314 if ((bitSize.
cx != 0) && (bitSize.
cy != 0))
6315 {
6316
6317
6318
6319
6320
6324 if (!HSourceGlyph)
6325 {
6326 DPRINT1(
"WARNING: EngCreateBitmap() failed!\n");
6328 break;
6329 }
6330
6332 if (!SourceGlyphSurf)
6333 {
6335 DPRINT1(
"WARNING: EngLockSurface() failed!\n");
6337 break;
6338 }
6339
6340
6341
6342
6343
6345 {
6346
6347
6348
6350 {
6353 }
6354
6356 {
6358 }
6359 }
6360
6362 SourceGlyphSurf,
6366 &DestRect,
6368 &
dc->eboText.BrushObject,
6370 {
6371 DPRINT1(
"Failed to MaskBlt a glyph!\n");
6372 }
6373
6376 }
6377
6378 if (DoBreak)
6379 break;
6380
6382 {
6385 }
6387 {
6388 vec.
x = (Dx[2 *
i + 0] << 6);
6389 vec.
y = (Dx[2 *
i + 1] << 6);
6390 if (!bNoTransform)
6394 }
6395 else
6396 {
6397 vec.
x = (Dx[
i] << 6);
6399 if (!bNoTransform)
6403 }
6404
6405 DPRINT(
"New X64, New Y64: %I64d, %I64d\n", X64, Y64);
6406
6407 previous = glyph_index;
6408 }
6409
6412
6414 {
6415
6418
6419 DeltaX64 = X64 - RealXStart64;
6420 DeltaY64 = Y64 - RealYStart64;
6421
6422 if (!
face->units_per_EM)
6423 {
6425 thickness = 1;
6426 }
6427 else
6428 {
6430 face->underline_position *
face->size->metrics.y_ppem /
face->units_per_EM;
6431 thickness =
6432 face->underline_thickness *
face->size->metrics.y_ppem /
face->units_per_EM;
6433 if (thickness <= 0)
6434 thickness = 1;
6435 }
6436
6438 {
6442 vecB64.
y = vecA64.
y + (thickness << 6);
6445 {
6446 INT X0 = (RealXStart64 - vecA64.
x + 32) >> 6;
6447 INT Y0 = (RealYStart64 + vecA64.
y + 32) >> 6;
6448 INT DX = (DeltaX64 >> 6);
6449 if (
Cache.Hashed.matTransform.xy == 0 &&
Cache.Hashed.matTransform.yx == 0)
6450 {
6451 INT CY = (vecB64.
y - vecA64.
y + 32) >> 6;
6453 }
6454 else
6455 {
6456 INT DY = (DeltaY64 >> 6);
6457 INT X1 = X0 + ((vecA64.
x - vecB64.
x + 32) >> 6);
6458 INT Y1 = Y0 + ((vecB64.
y - vecA64.
y + 32) >> 6);
6460 {
6461 { X0, Y0 },
6462 { X0 +
DX, Y0 + DY },
6463 { X1 +
DX, Y1 + DY },
6464 { X1, Y1 },
6465 };
6467 }
6468 }
6469 }
6470
6472 {
6474 vecA64.
y = -(FontGDI->
tmAscent << 6) / 3;
6476 vecB64.
y = vecA64.
y + (thickness << 6);
6479 {
6480 INT X0 = (RealXStart64 - vecA64.
x + 32) >> 6;
6481 INT Y0 = (RealYStart64 + vecA64.
y + 32) >> 6;
6482 INT DX = (DeltaX64 >> 6);
6483 if (
Cache.Hashed.matTransform.xy == 0 &&
Cache.Hashed.matTransform.yx == 0)
6484 {
6485 INT CY = (vecB64.
y - vecA64.
y + 32) >> 6;
6487 }
6488 else
6489 {
6490 INT DY = (DeltaY64 >> 6);
6491 INT X1 = X0 + ((vecA64.
x - vecB64.
x + 32) >> 6);
6492 INT Y1 = Y0 + ((vecB64.
y - vecA64.
y + 32) >> 6);
6494 {
6495 { X0, Y0 },
6496 { X0 +
DX, Y0 + DY },
6497 { X1 +
DX, Y1 + DY },
6498 { X1, Y1 },
6499 };
6501 }
6502 }
6503 }
6504 }
6505
6507
6510
6513
6514 if (TextObj !=
NULL)
6516
6517 return bResult;
6518}
FORCEINLINE PMATRIX DC_pmxWorldToDevice(PDC pdc)
static BOOLEAN IntLPtoDP(DC *pdc, PPOINTL ppt, UINT count)
VOID FASTCALL DC_vPrepareDCsForBlit(PDC pdcDest, const RECT *rcDest, PDC pdcSrc, const RECT *rcSrc)
VOID FASTCALL DC_vFinishBlit(PDC pdc1, PDC pdc2)
#define ERROR_INVALID_PARAMETER
static const WCHAR Cleanup[]
#define ObjToGDI(ClipObj, Type)
BOOL FASTCALL TextIntUpdateSize(PDC dc, PTEXTOBJ TextObj, PFONTGDI FontGDI, BOOL bDoLock)
VOID APIENTRY IntEngFillPolygon(IN OUT PDC dc, IN POINTL *pPoints, IN UINT cPoints, IN BRUSHOBJ *BrushObj)
#define IS_HIGH_SURROGATE(ch0)
static DWORD Utf32FromSurrogatePair(DWORD ch0, DWORD ch1)
#define IS_LOW_SURROGATE(ch1)
#define IntUnLockFreeType()
static VOID FASTCALL IntMatrixFromMx(FT_Matrix *pmat, const MATRIX *pmx)
static VOID FASTCALL IntEscapeMatrix(FT_Matrix *pmat, LONG lfEscapement)
static FT_UInt FASTCALL get_glyph_index_flagged(FT_Face face, FT_ULong code, DWORD indexed_flag, DWORD flags)
#define IntLockFreeType()
static BOOL IntGetTextDisposition(OUT LONGLONG *pX64, OUT LONGLONG *pY64, IN LPCWSTR String, IN INT Count, IN OPTIONAL LPINT Dx, IN OUT PFONT_CACHE_ENTRY Cache, IN UINT fuOptions, IN BOOL bNoTransform)
#define EMUBOLD_NEEDED(original, request)
static const FT_Matrix identityMat
static FT_BitmapGlyph IntGetRealGlyph(IN OUT PFONT_CACHE_ENTRY Cache)
BOOL FASTCALL IntIsFontRenderingEnabled(VOID)
#define gmxWorldToDeviceDefault
FT_Render_Mode FASTCALL IntGetFontRenderMode(LOGFONTW *logfont)
VOID FASTCALL IntEngFillBox(IN OUT PDC dc, IN INT X, IN INT Y, IN INT Width, IN INT Height, IN BRUSHOBJ *BrushObj)
FT_Set_Transform(FT_Face face, FT_Matrix *matrix, FT_Vector *delta)
FT_Vector_Transform(FT_Vector *vec, const FT_Matrix *matrix)
#define FT_IS_SCALABLE(face)
FT_Get_Kerning(FT_Face face, FT_UInt left_glyph, FT_UInt right_glyph, FT_UInt kern_mode, FT_Vector *akerning)
#define FT_HAS_KERNING(face)
FT_Matrix_Multiply(const FT_Matrix *a, FT_Matrix *b)
GLenum GLuint GLint GLenum face
#define PATH_IsPathOpen(dclevel)
struct _PALETTE *const ppal
ENUMLOGFONTEXW elfEnumLogfontEx
T1_FIELD_DICT_FONTDICT T1_FIELD_DICT_FONTDICT T1_FIELD_DICT_FONTDICT underline_position
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
BOOL APIENTRY IntEngMaskBlt(_Inout_ SURFOBJ *psoDest, _In_ SURFOBJ *psoMask, _In_ CLIPOBJ *pco, _In_ XLATEOBJ *pxloDest, _In_ XLATEOBJ *pxloSource, _In_ RECTL *prclDest, _In_ POINTL *pptlMask, _In_ BRUSHOBJ *pbo, _In_ POINTL *pptlBrushOrg)
PTEXTOBJ FASTCALL RealizeFontInit(HFONT hFont)
BOOL FASTCALL PATH_ExtTextOut(PDC dc, INT x, INT y, UINT flags, const RECTL *lprc, LPCWSTR str, UINT count, const INT *dx)
FORCEINLINE VOID TEXTOBJ_UnlockText(PLFONT plfnt)
ENGAPI BOOL APIENTRY EngDeleteSurface(_In_ _Post_ptr_invalid_ HSURF hsurf)
ENGAPI SURFOBJ *APIENTRY EngLockSurface(_In_ HSURF hsurf)
ENGAPI HBITMAP APIENTRY EngCreateBitmap(_In_ SIZEL sizl, _In_ LONG lWidth, _In_ ULONG iFormat, _In_ FLONG fl, _In_opt_ PVOID pvBits)
typedef HSURF(APIENTRY FN_DrvEnableSurface)(_In_ DHPDEV dhpdev)
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
ENGAPI VOID APIENTRY EngUnlockSurface(_In_ _Post_ptr_invalid_ SURFOBJ *pso)
VOID NTAPI EXLATEOBJ_vInitialize(_Out_ PEXLATEOBJ pexlo, _In_opt_ PALETTE *ppalSrc, _In_opt_ PALETTE *ppalDst, _In_ COLORREF crSrcBackColor, _In_ COLORREF crDstBackColor, _In_ COLORREF crDstForeColor)
VOID NTAPI EXLATEOBJ_vCleanup(_Inout_ PEXLATEOBJ pexlo)