6035{
6036
6037
6038
6039
6040
6041
6043 SURFOBJ *SurfObj, *SourceGlyphSurf;
6048 LONGLONG X64, Y64, RealXStart64, RealYStart64, DeltaX64, DeltaY64;
6050 RECTL DestRect, MaskRect;
6059 FT_Vector delta, vecAscent64, vecDescent64;
6061 BOOL use_kerning, bResult, DoBreak;
6064
6065
6067 {
6070 }
6071
6073 {
6075 XStart, YStart,
6076 fuOptions,
6079 Dx);
6080 }
6081
6083
6084 if (!
dc->dclevel.pSurface)
6085 {
6086
6089 }
6090
6091 pdcattr =
dc->pdcattr;
6093 {
6096 }
6097 else
6098 {
6101 }
6102
6106
6109
6110 psurf =
dc->dclevel.pSurface;
6112
6115 else
6117
6120
6122 {
6128 }
6129
6131 {
6135 &
dc->eboBackground.BrushObject);
6136 fuOptions &= ~ETO_OPAQUE;
6137 }
6138 else
6139 {
6141 {
6143 }
6144 }
6145
6147 if (TextObj ==
NULL)
6148 {
6151 }
6152
6153 FontObj = TextObj->
Font;
6157
6160
6166
6169 else
6171
6173 {
6177 }
6178
6179
6182 else
6184
6185
6189
6190
6192 vecAscent64.
y = (FontGDI->
tmAscent << 6);
6197
6198
6199#define VALIGN_MASK (TA_TOP | TA_BASELINE | TA_BOTTOM)
6201 {
6203 }
6205 {
6206 RealXStart64 -= vecDescent64.
x;
6207 RealYStart64 += vecDescent64.
y;
6208 }
6209 else
6210 {
6211 RealXStart64 -= vecAscent64.
x;
6212 RealYStart64 += vecAscent64.
y;
6213 }
6214#undef VALIGN_MASK
6215
6217
6218
6220 {
6222 {
6226 }
6227
6228
6230 {
6231 RealXStart64 -= DeltaX64 / 2;
6232 RealYStart64 -= DeltaY64 / 2;
6233 }
6235 {
6236 RealXStart64 -= DeltaX64;
6237 RealYStart64 -= DeltaY64;
6238 }
6239
6240
6242 {
6243 INT X0 = (RealXStart64 + vecAscent64.
x + 32) >> 6;
6244 INT Y0 = (RealYStart64 - vecAscent64.
y + 32) >> 6;
6245 INT DX = (DeltaX64 >> 6);
6246 if (
Cache.Hashed.matTransform.xy == 0 &&
Cache.Hashed.matTransform.yx == 0)
6247 {
6248 INT CY = (vecAscent64.
y - vecDescent64.
y + 32) >> 6;
6250 }
6251 else
6252 {
6253 INT DY = (DeltaY64 >> 6);
6254 INT X1 = ((RealXStart64 + vecDescent64.
x + 32) >> 6);
6255 INT Y1 = ((RealYStart64 - vecDescent64.
y + 32) >> 6);
6257 {
6258 { X0, Y0 },
6259 { X0 +
DX, Y0 + DY },
6260 { X1 +
DX, Y1 + DY },
6261 { X1, Y1 },
6262 };
6264 }
6265 }
6266 }
6267
6270
6271
6273
6276
6277
6278
6279
6280 X64 = RealXStart64;
6281 Y64 = RealYStart64;
6282 previous = 0;
6285 {
6287 Cache.Hashed.GlyphIndex = glyph_index;
6288
6290 if (!realglyph)
6291 {
6293 break;
6294 }
6295
6296
6297 if (use_kerning && previous && glyph_index &&
NULL == Dx)
6298 {
6302 }
6303
6304 DPRINT(
"X64, Y64: %I64d, %I64d\n", X64, Y64);
6306
6309
6312
6313 DestRect.
left = ((X64 + 32) >> 6) + realglyph->
left;
6315 DestRect.
top = ((Y64 + 32) >> 6) - realglyph->
top;
6317
6318
6319 if ((bitSize.
cx != 0) && (bitSize.
cy != 0))
6320 {
6321
6322
6323
6324
6325
6329 if (!HSourceGlyph)
6330 {
6331 DPRINT1(
"WARNING: EngCreateBitmap() failed!\n");
6333 if (
Cache.Hashed.Aspect.EmuBoldItalic)
6335 break;
6336 }
6337
6339 if (!SourceGlyphSurf)
6340 {
6342 DPRINT1(
"WARNING: EngLockSurface() failed!\n");
6344 if (
Cache.Hashed.Aspect.EmuBoldItalic)
6346 break;
6347 }
6348
6349
6350
6351
6352
6354 {
6355
6356
6357
6359 {
6362 }
6363
6365 {
6367 }
6368 }
6369
6371 SourceGlyphSurf,
6375 &DestRect,
6377 &
dc->eboText.BrushObject,
6379 {
6380 DPRINT1(
"Failed to MaskBlt a glyph!\n");
6381 }
6382
6385 }
6386
6387 if (DoBreak)
6388 {
6389 if (
Cache.Hashed.Aspect.EmuBoldItalic)
6391 break;
6392 }
6393
6395 {
6398 }
6400 {
6405 }
6406 else
6407 {
6412 }
6413
6414 DPRINT(
"New X64, New Y64: %I64d, %I64d\n", X64, Y64);
6415
6416 previous = glyph_index;
6417
6418 if (
Cache.Hashed.Aspect.EmuBoldItalic)
6419 {
6421 }
6422 }
6423
6426
6428 {
6429
6432
6433 DeltaX64 = X64 - RealXStart64;
6434 DeltaY64 = Y64 - RealYStart64;
6435
6436 if (!
face->units_per_EM)
6437 {
6439 thickness = 1;
6440 }
6441 else
6442 {
6444 face->underline_position *
face->size->metrics.y_ppem /
face->units_per_EM;
6445 thickness =
6446 face->underline_thickness *
face->size->metrics.y_ppem /
face->units_per_EM;
6447 if (thickness <= 0)
6448 thickness = 1;
6449 }
6450
6452 {
6456 vecB64.
y = vecA64.
y + (thickness << 6);
6459 {
6460 INT X0 = (RealXStart64 - vecA64.
x + 32) >> 6;
6461 INT Y0 = (RealYStart64 + vecA64.
y + 32) >> 6;
6462 INT DX = (DeltaX64 >> 6);
6463 if (
Cache.Hashed.matTransform.xy == 0 &&
Cache.Hashed.matTransform.yx == 0)
6464 {
6465 INT CY = (vecB64.
y - vecA64.
y + 32) >> 6;
6467 }
6468 else
6469 {
6470 INT DY = (DeltaY64 >> 6);
6471 INT X1 = X0 + ((vecA64.
x - vecB64.
x + 32) >> 6);
6472 INT Y1 = Y0 + ((vecB64.
y - vecA64.
y + 32) >> 6);
6474 {
6475 { X0, Y0 },
6476 { X0 +
DX, Y0 + DY },
6477 { X1 +
DX, Y1 + DY },
6478 { X1, Y1 },
6479 };
6481 }
6482 }
6483 }
6484
6486 {
6488 vecA64.
y = -(FontGDI->
tmAscent << 6) / 3;
6490 vecB64.
y = vecA64.
y + (thickness << 6);
6493 {
6494 INT X0 = (RealXStart64 - vecA64.
x + 32) >> 6;
6495 INT Y0 = (RealYStart64 + vecA64.
y + 32) >> 6;
6496 INT DX = (DeltaX64 >> 6);
6497 if (
Cache.Hashed.matTransform.xy == 0 &&
Cache.Hashed.matTransform.yx == 0)
6498 {
6499 INT CY = (vecB64.
y - vecA64.
y + 32) >> 6;
6501 }
6502 else
6503 {
6504 INT DY = (DeltaY64 >> 6);
6505 INT X1 = X0 + ((vecA64.
x - vecB64.
x + 32) >> 6);
6506 INT Y1 = Y0 + ((vecB64.
y - vecA64.
y + 32) >> 6);
6508 {
6509 { X0, Y0 },
6510 { X0 +
DX, Y0 + DY },
6511 { X1 +
DX, Y1 + DY },
6512 { X1, Y1 },
6513 };
6515 }
6516 }
6517 }
6518 }
6519
6521
6524
6527
6528 if (TextObj !=
NULL)
6530
6531 return bResult;
6532}
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)
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)
#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()
#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_Done_Glyph(FT_Glyph glyph)
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)