6768{
6769
6770
6771
6772
6773
6774
6776 SURFOBJ *SurfObj, *SourceGlyphSurf;
6781 LONGLONG X64, Y64, RealXStart64, RealYStart64, DeltaX64, DeltaY64;
6783 RECTL DestRect, MaskRect;
6794 BOOL use_kerning, bResult, DoBreak;
6800
6801
6803 {
6806 }
6807
6809 {
6811 XStart, YStart,
6812 fuOptions,
6815 Dx);
6816 }
6817
6819
6820 if (!
dc->dclevel.pSurface)
6821 {
6822
6825 }
6826
6827 pdcattr =
dc->pdcattr;
6829 {
6832 }
6833 else
6834 {
6837 }
6838
6842
6845
6846 psurf =
dc->dclevel.pSurface;
6848
6851 else
6853
6856
6858 {
6864 }
6865
6867 {
6871 &
dc->eboBackground.BrushObject);
6872 fuOptions &= ~ETO_OPAQUE;
6873 }
6874 else
6875 {
6877 {
6879 }
6880 }
6881
6883 if (TextObj ==
NULL)
6884 {
6887 }
6888
6889 FontObj = TextObj->
Font;
6893
6896
6902
6905 else
6907
6909 {
6913 }
6914
6916
6917
6920 else
6922
6923
6927
6928
6929 bNoTransform = ((
mat.xy == 0) && (
mat.yx == 0) &&
6930 (
mat.xx == (1 << 16)) && (
mat.yy == (1 << 16)));
6931
6932
6934 vecAscent64.
y = (FontGDI->
tmAscent << 6);
6939
6940
6941#define VALIGN_MASK (TA_TOP | TA_BASELINE | TA_BOTTOM)
6943 {
6945 }
6947 {
6948 RealXStart64 -= vecDescent64.
x;
6949 RealYStart64 += vecDescent64.
y;
6950 }
6951 else
6952 {
6953 RealXStart64 -= vecAscent64.
x;
6954 RealYStart64 += vecAscent64.
y;
6955 }
6956#undef VALIGN_MASK
6957
6959
6960
6962 {
6964 fuOptions, bNoTransform, &Chain))
6965 {
6970 }
6971
6972
6974 {
6975 RealXStart64 -= DeltaX64 / 2;
6976 RealYStart64 -= DeltaY64 / 2;
6977 }
6979 {
6980 RealXStart64 -= DeltaX64;
6981 RealYStart64 -= DeltaY64;
6982 }
6983
6984
6986 {
6987 INT X0 = (RealXStart64 + vecAscent64.
x + 32) >> 6;
6988 INT Y0 = (RealYStart64 - vecAscent64.
y + 32) >> 6;
6989 INT DX = (DeltaX64 >> 6);
6990 if (
Cache.Hashed.matTransform.xy == 0 &&
Cache.Hashed.matTransform.yx == 0)
6991 {
6992 INT CY = (vecAscent64.
y - vecDescent64.
y + 32) >> 6;
6994 }
6995 else
6996 {
6997 INT DY = (DeltaY64 >> 6);
6998 INT X1 = ((RealXStart64 + vecDescent64.
x + 32) >> 6);
6999 INT Y1 = ((RealYStart64 - vecDescent64.
y + 32) >> 6);
7001 {
7002 { X0, Y0 },
7003 { X0 +
DX, Y0 + DY },
7004 { X1 +
DX, Y1 + DY },
7005 { X1, Y1 },
7006 };
7008 }
7009 }
7010 }
7011
7014
7017
7018
7019
7020
7021 X64 = RealXStart64;
7022 Y64 = RealYStart64;
7023 previous = 0;
7027 {
7030 {
7033 break;
7034
7038 }
7039
7041 (fuOptions & ETO_GLYPH_INDEX));
7042 Cache.Hashed.GlyphIndex = glyph_index;
7043
7045 if (!realglyph)
7046 {
7048 break;
7049 }
7050
7051
7052 if (use_kerning && previous && glyph_index &&
NULL == Dx)
7053 {
7057 }
7058
7059 DPRINT(
"X64, Y64: %I64d, %I64d\n", X64, Y64);
7061
7064
7067
7068 DestRect.
left = ((X64 + 32) >> 6) + realglyph->
left;
7070 DestRect.
top = ((Y64 + 32) >> 6) - realglyph->
top;
7072
7073
7074 if ((bitSize.
cx != 0) && (bitSize.
cy != 0))
7075 {
7076
7077
7078
7079
7080
7084 if (!HSourceGlyph)
7085 {
7086 DPRINT1(
"WARNING: EngCreateBitmap() failed!\n");
7088 break;
7089 }
7090
7092 if (!SourceGlyphSurf)
7093 {
7095 DPRINT1(
"WARNING: EngLockSurface() failed!\n");
7097 break;
7098 }
7099
7100
7101
7102
7103
7105 {
7106
7107
7108
7110 {
7113 }
7114
7116 {
7118 }
7119 }
7120
7122 SourceGlyphSurf,
7126 &DestRect,
7128 &
dc->eboText.BrushObject,
7130 {
7131 DPRINT1(
"Failed to MaskBlt a glyph!\n");
7132 }
7133
7136 }
7137
7138 if (DoBreak)
7139 break;
7140
7142 {
7145 }
7147 {
7148 vec.
x = (Dx[2 *
i + 0] << 6);
7149 vec.
y = (Dx[2 *
i + 1] << 6);
7150 if (!bNoTransform)
7154 }
7155 else
7156 {
7157 vec.
x = (Dx[
i] << 6);
7159 if (!bNoTransform)
7163 }
7164
7165 DPRINT(
"New X64, New Y64: %I64d, %I64d\n", X64, Y64);
7166
7167 previous = glyph_index;
7168 }
7169
7172
7174 {
7175
7178
7179 DeltaX64 = X64 - RealXStart64;
7180 DeltaY64 = Y64 - RealYStart64;
7181
7182 if (!
face->units_per_EM)
7183 {
7185 thickness = 1;
7186 }
7187 else
7188 {
7190 face->underline_position *
face->size->metrics.y_ppem /
face->units_per_EM;
7191 thickness =
7192 face->underline_thickness *
face->size->metrics.y_ppem /
face->units_per_EM;
7193 if (thickness <= 0)
7194 thickness = 1;
7195 }
7196
7198 {
7202 vecB64.
y = vecA64.
y + (thickness << 6);
7205 {
7206 INT X0 = (RealXStart64 - vecA64.
x + 32) >> 6;
7207 INT Y0 = (RealYStart64 + vecA64.
y + 32) >> 6;
7208 INT DX = (DeltaX64 >> 6);
7209 if (
Cache.Hashed.matTransform.xy == 0 &&
Cache.Hashed.matTransform.yx == 0)
7210 {
7211 INT CY = (vecB64.
y - vecA64.
y + 32) >> 6;
7213 }
7214 else
7215 {
7216 INT DY = (DeltaY64 >> 6);
7217 INT X1 = X0 + ((vecA64.
x - vecB64.
x + 32) >> 6);
7218 INT Y1 = Y0 + ((vecB64.
y - vecA64.
y + 32) >> 6);
7220 {
7221 { X0, Y0 },
7222 { X0 +
DX, Y0 + DY },
7223 { X1 +
DX, Y1 + DY },
7224 { X1, Y1 },
7225 };
7227 }
7228 }
7229 }
7230
7232 {
7234 vecA64.
y = -(FontGDI->
tmAscent << 6) / 3;
7236 vecB64.
y = vecA64.
y + (thickness << 6);
7239 {
7240 INT X0 = (RealXStart64 - vecA64.
x + 32) >> 6;
7241 INT Y0 = (RealYStart64 + vecA64.
y + 32) >> 6;
7242 INT DX = (DeltaX64 >> 6);
7243 if (
Cache.Hashed.matTransform.xy == 0 &&
Cache.Hashed.matTransform.yx == 0)
7244 {
7245 INT CY = (vecB64.
y - vecA64.
y + 32) >> 6;
7247 }
7248 else
7249 {
7250 INT DY = (DeltaY64 >> 6);
7251 INT X1 = X0 + ((vecA64.
x - vecB64.
x + 32) >> 6);
7252 INT Y1 = Y0 + ((vecB64.
y - vecA64.
y + 32) >> 6);
7254 {
7255 { X0, Y0 },
7256 { X0 +
DX, Y0 + DY },
7257 { X1 +
DX, Y1 + DY },
7258 { X1, Y1 },
7259 };
7261 }
7262 }
7263 }
7264 }
7265
7267
7269
7272
7275
7276 if (TextObj !=
NULL)
7278
7279 return bResult;
7280}
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)
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)