6851{
6852
6853
6854
6855
6856
6857
6864 LONGLONG X64, Y64, RealXStart64, RealYStart64, DeltaX64, DeltaY64;
6866 RECTL DestRect, MaskRect;
6877 BOOL use_kerning, bResult, DoBreak;
6882 const DWORD del = 0x7f, nbsp = 0xa0;
6885
6886
6888 {
6891 }
6892
6894 {
6896 XStart, YStart,
6897 fuOptions,
6900 Dx);
6901 }
6902
6904
6905 if (!
dc->dclevel.pSurface)
6906 {
6907
6910 }
6911
6912 pdcattr =
dc->pdcattr;
6914 {
6917 }
6918 else
6919 {
6922 }
6923
6927
6930
6931 psurf =
dc->dclevel.pSurface;
6933
6936 else
6938
6941
6943 {
6949 }
6950
6952 {
6956 &
dc->eboBackground.BrushObject);
6957 fuOptions &= ~ETO_OPAQUE;
6958 }
6959 else
6960 {
6962 {
6964 }
6965 }
6966
6968 if (TextObj ==
NULL)
6969 {
6972 }
6973
6974 FontObj = TextObj->
Font;
6978
6981
6987
6990 else
6992
6994 {
6998 }
6999
7001
7002
7005 else
7007
7008
7012
7013
7014 bNoTransform = ((
mat.xy == 0) && (
mat.yx == 0) &&
7015 (
mat.xx == (1 << 16)) && (
mat.yy == (1 << 16)));
7016
7017
7019 vecAscent64.
y = (FontGDI->
tmAscent << 6);
7024
7025
7026#define VALIGN_MASK (TA_TOP | TA_BASELINE | TA_BOTTOM)
7028 {
7030 }
7032 {
7033 RealXStart64 -= vecDescent64.
x;
7034 RealYStart64 += vecDescent64.
y;
7035 }
7036 else
7037 {
7038 RealXStart64 -= vecAscent64.
x;
7039 RealYStart64 += vecAscent64.
y;
7040 }
7041#undef VALIGN_MASK
7042
7044
7045
7047 {
7049 fuOptions, bNoTransform, &Chain))
7050 {
7055 }
7056
7057
7059 {
7060 RealXStart64 -= DeltaX64 / 2;
7061 RealYStart64 -= DeltaY64 / 2;
7062 }
7064 {
7065 RealXStart64 -= DeltaX64;
7066 RealYStart64 -= DeltaY64;
7067 }
7068
7069
7071 {
7072 INT X0 = (RealXStart64 + vecAscent64.
x + 32) >> 6;
7073 INT Y0 = (RealYStart64 - vecAscent64.
y + 32) >> 6;
7074 INT DX = (DeltaX64 >> 6);
7075 if (
Cache.Hashed.matTransform.xy == 0 &&
Cache.Hashed.matTransform.yx == 0)
7076 {
7077 INT CY = (vecAscent64.
y - vecDescent64.
y + 32) >> 6;
7079 }
7080 else
7081 {
7082 INT DY = (DeltaY64 >> 6);
7083 INT X1 = ((RealXStart64 + vecDescent64.
x + 32) >> 6);
7084 INT Y1 = ((RealYStart64 - vecDescent64.
y + 32) >> 6);
7086 {
7087 { X0, Y0 },
7088 { X0 +
DX, Y0 + DY },
7089 { X1 +
DX, Y1 + DY },
7090 { X1, Y1 },
7091 };
7093 }
7094 }
7095 }
7096
7099
7102
7103
7104
7105
7106 X64 = RealXStart64;
7107 Y64 = RealYStart64;
7108 previous = 0;
7112 {
7115 {
7118 break;
7119
7123 }
7124
7126 (fuOptions & ETO_GLYPH_INDEX));
7127 Cache.Hashed.GlyphIndex = glyph_index;
7128
7130 if (!realglyph)
7131 {
7133 break;
7134 }
7135
7136
7137 if (use_kerning && previous && glyph_index &&
NULL == Dx)
7138 {
7142 }
7143
7144 DPRINT(
"X64, Y64: %I64d, %I64d\n", X64, Y64);
7146
7149
7150
7151 if (ch0 >
L' ' && ch0 !=
del && ch0 != nbsp && glyphSize.
cx == 0)
7152 DPRINT1(
"WARNING: WChar 0x%04x has a glyphSize.cx of zero\n", ch0);
7153
7154
7155
7157 (ch0 ==
L' ' || ch0 == nbsp))
7158 {
7160
7163 glyphSize.
cx = spaceWidth.
cx;
7164 realglyph->
left = 0;
7165 }
7166
7169
7170 DestRect.
left = ((X64 + 32) >> 6) + realglyph->
left;
7172 DestRect.
top = ((Y64 + 32) >> 6) - realglyph->
top;
7174
7175
7176 if ((glyphSize.
cx != 0) && (glyphSize.
cy != 0))
7177 {
7178
7179
7180
7181
7182
7186 if (!hbmGlyph)
7187 {
7188 DPRINT1(
"WARNING: EngCreateBitmap() failed!\n");
7190 break;
7191 }
7192
7194 if (!psoGlyph)
7195 {
7197 DPRINT1(
"WARNING: EngLockSurface() failed!\n");
7199 break;
7200 }
7201
7202
7203
7204
7205
7207 {
7208
7209
7210
7212 {
7215 }
7216
7218 {
7220 }
7221 }
7222
7224 psoGlyph,
7228 &DestRect,
7230 &
dc->eboText.BrushObject,
7232 {
7233 DPRINT1(
"Failed to MaskBlt a glyph!\n");
7234 }
7235
7238 }
7239
7240 if (DoBreak)
7241 break;
7242
7244 {
7247 }
7249 {
7250 vec.
x = (Dx[2 *
i + 0] << 6);
7251 vec.
y = (Dx[2 *
i + 1] << 6);
7252 if (!bNoTransform)
7256 }
7257 else
7258 {
7259 vec.
x = (Dx[
i] << 6);
7261 if (!bNoTransform)
7265 }
7266
7267 DPRINT(
"New X64, New Y64: %I64d, %I64d\n", X64, Y64);
7268
7269 previous = glyph_index;
7270 }
7271
7274
7276 {
7277
7280
7281 DeltaX64 = X64 - RealXStart64;
7282 DeltaY64 = Y64 - RealYStart64;
7283
7284 if (!
face->units_per_EM)
7285 {
7287 thickness = 1;
7288 }
7289 else
7290 {
7292 face->underline_position *
face->size->metrics.y_ppem /
face->units_per_EM;
7293 thickness =
7294 face->underline_thickness *
face->size->metrics.y_ppem /
face->units_per_EM;
7295 if (thickness <= 0)
7296 thickness = 1;
7297 }
7298
7300 {
7304 vecB64.
y = vecA64.
y + (thickness << 6);
7307 {
7308 INT X0 = (RealXStart64 - vecA64.
x + 32) >> 6;
7309 INT Y0 = (RealYStart64 + vecA64.
y + 32) >> 6;
7310 INT DX = (DeltaX64 >> 6);
7311 if (
Cache.Hashed.matTransform.xy == 0 &&
Cache.Hashed.matTransform.yx == 0)
7312 {
7313 INT CY = (vecB64.
y - vecA64.
y + 32) >> 6;
7315 }
7316 else
7317 {
7318 INT DY = (DeltaY64 >> 6);
7319 INT X1 = X0 + ((vecA64.
x - vecB64.
x + 32) >> 6);
7320 INT Y1 = Y0 + ((vecB64.
y - vecA64.
y + 32) >> 6);
7322 {
7323 { X0, Y0 },
7324 { X0 +
DX, Y0 + DY },
7325 { X1 +
DX, Y1 + DY },
7326 { X1, Y1 },
7327 };
7329 }
7330 }
7331 }
7332
7334 {
7336 vecA64.
y = -(FontGDI->
tmAscent << 6) / 3;
7338 vecB64.
y = vecA64.
y + (thickness << 6);
7341 {
7342 INT X0 = (RealXStart64 - vecA64.
x + 32) >> 6;
7343 INT Y0 = (RealYStart64 + vecA64.
y + 32) >> 6;
7344 INT DX = (DeltaX64 >> 6);
7345 if (
Cache.Hashed.matTransform.xy == 0 &&
Cache.Hashed.matTransform.yx == 0)
7346 {
7347 INT CY = (vecB64.
y - vecA64.
y + 32) >> 6;
7349 }
7350 else
7351 {
7352 INT DY = (DeltaY64 >> 6);
7353 INT X1 = X0 + ((vecA64.
x - vecB64.
x + 32) >> 6);
7354 INT Y1 = Y0 + ((vecB64.
y - vecA64.
y + 32) >> 6);
7356 {
7357 { X0, Y0 },
7358 { X0 +
DX, Y0 + DY },
7359 { X1 +
DX, Y1 + DY },
7360 { X1, Y1 },
7361 };
7363 }
7364 }
7365 }
7366 }
7367
7369
7371
7374
7377
7378 if (TextObj !=
NULL)
7380
7381 return bResult;
7382}
static VOID del(LPHIST_ENTRY item)
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 UINT FontLink_Chain_FindGlyph(_Inout_ PFONTLINK_CHAIN pChain, _Out_ PFONT_CACHE_ENTRY pCache, _Inout_ FT_Face *pFace, _In_ UINT code, _In_ BOOL fCodeAsIndex)
#define IS_HIGH_SURROGATE(ch0)
BOOL FASTCALL TextIntGetTextExtentPoint(PDC dc, PTEXTOBJ TextObj, LPCWSTR String, INT Count, ULONG MaxExtent, LPINT Fit, LPINT Dx, LPSIZE Size, FLONG fl)
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)
#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
static VOID FontLink_Chain_Finish(_Inout_ PFONTLINK_CHAIN pChain)
static VOID FontLink_Chain_Init(_Out_ PFONTLINK_CHAIN pChain, _Inout_ PTEXTOBJ pTextObj, _In_ FT_Face face)
FT_Render_Mode FASTCALL IntGetFontRenderMode(LOGFONTW *logfont)
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, IN OUT PFONTLINK_CHAIN pChain)
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)
#define FT_IS_SCALABLE(face)
FT_Vector_Transform(FT_Vector *vector, const FT_Matrix *matrix)
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)