6779{
6780
6781
6782
6783
6784
6785
6787 SURFOBJ *SurfObj, *SourceGlyphSurf;
6792 LONGLONG X64, Y64, RealXStart64, RealYStart64, DeltaX64, DeltaY64;
6794 RECTL DestRect, MaskRect;
6805 BOOL use_kerning, bResult, DoBreak;
6810 const DWORD del = 0x7f, nbsp = 0xa0;
6813
6814
6816 {
6819 }
6820
6822 {
6824 XStart, YStart,
6825 fuOptions,
6828 Dx);
6829 }
6830
6832
6833 if (!
dc->dclevel.pSurface)
6834 {
6835
6838 }
6839
6840 pdcattr =
dc->pdcattr;
6842 {
6845 }
6846 else
6847 {
6850 }
6851
6855
6858
6859 psurf =
dc->dclevel.pSurface;
6861
6864 else
6866
6869
6871 {
6877 }
6878
6880 {
6884 &
dc->eboBackground.BrushObject);
6885 fuOptions &= ~ETO_OPAQUE;
6886 }
6887 else
6888 {
6890 {
6892 }
6893 }
6894
6896 if (TextObj ==
NULL)
6897 {
6900 }
6901
6902 FontObj = TextObj->
Font;
6906
6909
6915
6918 else
6920
6922 {
6926 }
6927
6929
6930
6933 else
6935
6936
6940
6941
6942 bNoTransform = ((
mat.xy == 0) && (
mat.yx == 0) &&
6943 (
mat.xx == (1 << 16)) && (
mat.yy == (1 << 16)));
6944
6945
6947 vecAscent64.
y = (FontGDI->
tmAscent << 6);
6952
6953
6954#define VALIGN_MASK (TA_TOP | TA_BASELINE | TA_BOTTOM)
6956 {
6958 }
6960 {
6961 RealXStart64 -= vecDescent64.
x;
6962 RealYStart64 += vecDescent64.
y;
6963 }
6964 else
6965 {
6966 RealXStart64 -= vecAscent64.
x;
6967 RealYStart64 += vecAscent64.
y;
6968 }
6969#undef VALIGN_MASK
6970
6972
6973
6975 {
6977 fuOptions, bNoTransform, &Chain))
6978 {
6983 }
6984
6985
6987 {
6988 RealXStart64 -= DeltaX64 / 2;
6989 RealYStart64 -= DeltaY64 / 2;
6990 }
6992 {
6993 RealXStart64 -= DeltaX64;
6994 RealYStart64 -= DeltaY64;
6995 }
6996
6997
6999 {
7000 INT X0 = (RealXStart64 + vecAscent64.
x + 32) >> 6;
7001 INT Y0 = (RealYStart64 - vecAscent64.
y + 32) >> 6;
7002 INT DX = (DeltaX64 >> 6);
7003 if (
Cache.Hashed.matTransform.xy == 0 &&
Cache.Hashed.matTransform.yx == 0)
7004 {
7005 INT CY = (vecAscent64.
y - vecDescent64.
y + 32) >> 6;
7007 }
7008 else
7009 {
7010 INT DY = (DeltaY64 >> 6);
7011 INT X1 = ((RealXStart64 + vecDescent64.
x + 32) >> 6);
7012 INT Y1 = ((RealYStart64 - vecDescent64.
y + 32) >> 6);
7014 {
7015 { X0, Y0 },
7016 { X0 +
DX, Y0 + DY },
7017 { X1 +
DX, Y1 + DY },
7018 { X1, Y1 },
7019 };
7021 }
7022 }
7023 }
7024
7027
7030
7031
7032
7033
7034 X64 = RealXStart64;
7035 Y64 = RealYStart64;
7036 previous = 0;
7040 {
7043 {
7046 break;
7047
7051 }
7052
7054 (fuOptions & ETO_GLYPH_INDEX));
7055 Cache.Hashed.GlyphIndex = glyph_index;
7056
7058 if (!realglyph)
7059 {
7061 break;
7062 }
7063
7064
7065 if (use_kerning && previous && glyph_index &&
NULL == Dx)
7066 {
7070 }
7071
7072 DPRINT(
"X64, Y64: %I64d, %I64d\n", X64, Y64);
7074
7077
7078
7079 if (ch0 >
L' ' && ch0 !=
del && ch0 != nbsp && bitSize.
cx == 0)
7080 DPRINT1(
"WARNING: WChar 0x%04x has a bitSize.cx of zero\n", ch0);
7081
7082
7083
7085 (ch0 ==
L' ' || ch0 == nbsp))
7086 {
7088
7091 bitSize.
cx = spaceWidth.
cx;
7092 realglyph->
left = 0;
7093 }
7094
7097
7098 DestRect.
left = ((X64 + 32) >> 6) + realglyph->
left;
7100 DestRect.
top = ((Y64 + 32) >> 6) - realglyph->
top;
7102
7103
7104 if ((bitSize.
cx != 0) && (bitSize.
cy != 0))
7105 {
7106
7107
7108
7109
7110
7114 if (!HSourceGlyph)
7115 {
7116 DPRINT1(
"WARNING: EngCreateBitmap() failed!\n");
7118 break;
7119 }
7120
7122 if (!SourceGlyphSurf)
7123 {
7125 DPRINT1(
"WARNING: EngLockSurface() failed!\n");
7127 break;
7128 }
7129
7130
7131
7132
7133
7135 {
7136
7137
7138
7140 {
7143 }
7144
7146 {
7148 }
7149 }
7150
7152 SourceGlyphSurf,
7156 &DestRect,
7158 &
dc->eboText.BrushObject,
7160 {
7161 DPRINT1(
"Failed to MaskBlt a glyph!\n");
7162 }
7163
7166 }
7167
7168 if (DoBreak)
7169 break;
7170
7172 {
7175 }
7177 {
7178 vec.
x = (Dx[2 *
i + 0] << 6);
7179 vec.
y = (Dx[2 *
i + 1] << 6);
7180 if (!bNoTransform)
7184 }
7185 else
7186 {
7187 vec.
x = (Dx[
i] << 6);
7189 if (!bNoTransform)
7193 }
7194
7195 DPRINT(
"New X64, New Y64: %I64d, %I64d\n", X64, Y64);
7196
7197 previous = glyph_index;
7198 }
7199
7202
7204 {
7205
7208
7209 DeltaX64 = X64 - RealXStart64;
7210 DeltaY64 = Y64 - RealYStart64;
7211
7212 if (!
face->units_per_EM)
7213 {
7215 thickness = 1;
7216 }
7217 else
7218 {
7220 face->underline_position *
face->size->metrics.y_ppem /
face->units_per_EM;
7221 thickness =
7222 face->underline_thickness *
face->size->metrics.y_ppem /
face->units_per_EM;
7223 if (thickness <= 0)
7224 thickness = 1;
7225 }
7226
7228 {
7232 vecB64.
y = vecA64.
y + (thickness << 6);
7235 {
7236 INT X0 = (RealXStart64 - vecA64.
x + 32) >> 6;
7237 INT Y0 = (RealYStart64 + vecA64.
y + 32) >> 6;
7238 INT DX = (DeltaX64 >> 6);
7239 if (
Cache.Hashed.matTransform.xy == 0 &&
Cache.Hashed.matTransform.yx == 0)
7240 {
7241 INT CY = (vecB64.
y - vecA64.
y + 32) >> 6;
7243 }
7244 else
7245 {
7246 INT DY = (DeltaY64 >> 6);
7247 INT X1 = X0 + ((vecA64.
x - vecB64.
x + 32) >> 6);
7248 INT Y1 = Y0 + ((vecB64.
y - vecA64.
y + 32) >> 6);
7250 {
7251 { X0, Y0 },
7252 { X0 +
DX, Y0 + DY },
7253 { X1 +
DX, Y1 + DY },
7254 { X1, Y1 },
7255 };
7257 }
7258 }
7259 }
7260
7262 {
7264 vecA64.
y = -(FontGDI->
tmAscent << 6) / 3;
7266 vecB64.
y = vecA64.
y + (thickness << 6);
7269 {
7270 INT X0 = (RealXStart64 - vecA64.
x + 32) >> 6;
7271 INT Y0 = (RealYStart64 + vecA64.
y + 32) >> 6;
7272 INT DX = (DeltaX64 >> 6);
7273 if (
Cache.Hashed.matTransform.xy == 0 &&
Cache.Hashed.matTransform.yx == 0)
7274 {
7275 INT CY = (vecB64.
y - vecA64.
y + 32) >> 6;
7277 }
7278 else
7279 {
7280 INT DY = (DeltaY64 >> 6);
7281 INT X1 = X0 + ((vecA64.
x - vecB64.
x + 32) >> 6);
7282 INT Y1 = Y0 + ((vecB64.
y - vecA64.
y + 32) >> 6);
7284 {
7285 { X0, Y0 },
7286 { X0 +
DX, Y0 + DY },
7287 { X1 +
DX, Y1 + DY },
7288 { X1, Y1 },
7289 };
7291 }
7292 }
7293 }
7294 }
7295
7297
7299
7302
7305
7306 if (TextObj !=
NULL)
7308
7309 return bResult;
7310}
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)
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)