6041{
6042
6043
6044
6045
6046
6047
6049 SURFOBJ *SurfObj, *SourceGlyphSurf;
6054 LONGLONG X64, Y64, RealXStart64, RealYStart64, DeltaX64, DeltaY64;
6056 RECTL DestRect, MaskRect;
6065 FT_Vector delta, vecAscent64, vecDescent64;
6067 BOOL use_kerning, bResult, DoBreak;
6070
6071
6073 {
6076 }
6077
6079 {
6081 XStart, YStart,
6082 fuOptions,
6085 Dx);
6086 }
6087
6089
6090 if (!
dc->dclevel.pSurface)
6091 {
6092
6095 }
6096
6097 pdcattr =
dc->pdcattr;
6099 {
6102 }
6103 else
6104 {
6107 }
6108
6112
6115
6116 psurf =
dc->dclevel.pSurface;
6118
6121 else
6123
6126
6128 {
6134 }
6135
6137 {
6141 &
dc->eboBackground.BrushObject);
6142 fuOptions &= ~ETO_OPAQUE;
6143 }
6144 else
6145 {
6147 {
6149 }
6150 }
6151
6153 if (TextObj ==
NULL)
6154 {
6157 }
6158
6159 FontObj = TextObj->
Font;
6163
6166
6172
6175 else
6177
6179 {
6183 }
6184
6185
6188 else
6190
6191
6195
6196
6198 vecAscent64.
y = (FontGDI->
tmAscent << 6);
6203
6204
6205#define VALIGN_MASK (TA_TOP | TA_BASELINE | TA_BOTTOM)
6207 {
6209 }
6211 {
6212 RealXStart64 -= vecDescent64.
x;
6213 RealYStart64 += vecDescent64.
y;
6214 }
6215 else
6216 {
6217 RealXStart64 -= vecAscent64.
x;
6218 RealYStart64 += vecAscent64.
y;
6219 }
6220#undef VALIGN_MASK
6221
6223
6224
6226 {
6228 {
6232 }
6233
6234
6236 {
6237 RealXStart64 -= DeltaX64 / 2;
6238 RealYStart64 -= DeltaY64 / 2;
6239 }
6241 {
6242 RealXStart64 -= DeltaX64;
6243 RealYStart64 -= DeltaY64;
6244 }
6245
6246
6248 {
6249 INT X0 = (RealXStart64 + vecAscent64.
x + 32) >> 6;
6250 INT Y0 = (RealYStart64 - vecAscent64.
y + 32) >> 6;
6251 INT DX = (DeltaX64 >> 6);
6252 if (
Cache.Hashed.matTransform.xy == 0 &&
Cache.Hashed.matTransform.yx == 0)
6253 {
6254 INT CY = (vecAscent64.
y - vecDescent64.
y + 32) >> 6;
6256 }
6257 else
6258 {
6259 INT DY = (DeltaY64 >> 6);
6260 INT X1 = ((RealXStart64 + vecDescent64.
x + 32) >> 6);
6261 INT Y1 = ((RealYStart64 - vecDescent64.
y + 32) >> 6);
6263 {
6264 { X0, Y0 },
6265 { X0 +
DX, Y0 + DY },
6266 { X1 +
DX, Y1 + DY },
6267 { X1, Y1 },
6268 };
6270 }
6271 }
6272 }
6273
6276
6277
6279
6282
6283
6284
6285
6286 X64 = RealXStart64;
6287 Y64 = RealYStart64;
6288 previous = 0;
6291 {
6293 Cache.Hashed.GlyphIndex = glyph_index;
6294
6296 if (!realglyph)
6297 {
6299 break;
6300 }
6301
6302
6303 if (use_kerning && previous && glyph_index &&
NULL == Dx)
6304 {
6308 }
6309
6310 DPRINT(
"X64, Y64: %I64d, %I64d\n", X64, Y64);
6312
6315
6318
6319 DestRect.
left = ((X64 + 32) >> 6) + realglyph->
left;
6321 DestRect.
top = ((Y64 + 32) >> 6) - realglyph->
top;
6323
6324
6325 if ((bitSize.
cx != 0) && (bitSize.
cy != 0))
6326 {
6327
6328
6329
6330
6331
6335 if (!HSourceGlyph)
6336 {
6337 DPRINT1(
"WARNING: EngCreateBitmap() failed!\n");
6339 if (
Cache.Hashed.Aspect.EmuBoldItalic)
6341 break;
6342 }
6343
6345 if (!SourceGlyphSurf)
6346 {
6348 DPRINT1(
"WARNING: EngLockSurface() failed!\n");
6350 if (
Cache.Hashed.Aspect.EmuBoldItalic)
6352 break;
6353 }
6354
6355
6356
6357
6358
6360 {
6361
6362
6363
6365 {
6368 }
6369
6371 {
6373 }
6374 }
6375
6377 SourceGlyphSurf,
6381 &DestRect,
6383 &
dc->eboText.BrushObject,
6385 {
6386 DPRINT1(
"Failed to MaskBlt a glyph!\n");
6387 }
6388
6391 }
6392
6393 if (DoBreak)
6394 {
6395 if (
Cache.Hashed.Aspect.EmuBoldItalic)
6397 break;
6398 }
6399
6401 {
6404 }
6406 {
6411 }
6412 else
6413 {
6418 }
6419
6420 DPRINT(
"New X64, New Y64: %I64d, %I64d\n", X64, Y64);
6421
6422 previous = glyph_index;
6423
6424 if (
Cache.Hashed.Aspect.EmuBoldItalic)
6425 {
6427 }
6428 }
6429
6432
6434 {
6435
6438
6439 DeltaX64 = X64 - RealXStart64;
6440 DeltaY64 = Y64 - RealYStart64;
6441
6442 if (!
face->units_per_EM)
6443 {
6445 thickness = 1;
6446 }
6447 else
6448 {
6450 face->underline_position *
face->size->metrics.y_ppem /
face->units_per_EM;
6451 thickness =
6452 face->underline_thickness *
face->size->metrics.y_ppem /
face->units_per_EM;
6453 if (thickness <= 0)
6454 thickness = 1;
6455 }
6456
6458 {
6462 vecB64.
y = vecA64.
y + (thickness << 6);
6465 {
6466 INT X0 = (RealXStart64 - vecA64.
x + 32) >> 6;
6467 INT Y0 = (RealYStart64 + vecA64.
y + 32) >> 6;
6468 INT DX = (DeltaX64 >> 6);
6469 if (
Cache.Hashed.matTransform.xy == 0 &&
Cache.Hashed.matTransform.yx == 0)
6470 {
6471 INT CY = (vecB64.
y - vecA64.
y + 32) >> 6;
6473 }
6474 else
6475 {
6476 INT DY = (DeltaY64 >> 6);
6477 INT X1 = X0 + ((vecA64.
x - vecB64.
x + 32) >> 6);
6478 INT Y1 = Y0 + ((vecB64.
y - vecA64.
y + 32) >> 6);
6480 {
6481 { X0, Y0 },
6482 { X0 +
DX, Y0 + DY },
6483 { X1 +
DX, Y1 + DY },
6484 { X1, Y1 },
6485 };
6487 }
6488 }
6489 }
6490
6492 {
6494 vecA64.
y = -(FontGDI->
tmAscent << 6) / 3;
6496 vecB64.
y = vecA64.
y + (thickness << 6);
6499 {
6500 INT X0 = (RealXStart64 - vecA64.
x + 32) >> 6;
6501 INT Y0 = (RealYStart64 + vecA64.
y + 32) >> 6;
6502 INT DX = (DeltaX64 >> 6);
6503 if (
Cache.Hashed.matTransform.xy == 0 &&
Cache.Hashed.matTransform.yx == 0)
6504 {
6505 INT CY = (vecB64.
y - vecA64.
y + 32) >> 6;
6507 }
6508 else
6509 {
6510 INT DY = (DeltaY64 >> 6);
6511 INT X1 = X0 + ((vecA64.
x - vecB64.
x + 32) >> 6);
6512 INT Y1 = Y0 + ((vecB64.
y - vecA64.
y + 32) >> 6);
6514 {
6515 { X0, Y0 },
6516 { X0 +
DX, Y0 + DY },
6517 { X1 +
DX, Y1 + DY },
6518 { X1, Y1 },
6519 };
6521 }
6522 }
6523 }
6524 }
6525
6527
6530
6533
6534 if (TextObj !=
NULL)
6536
6537 return bResult;
6538}
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)