Signed-off-by: Byeongsik Jeon bsjeon@hanmail.net --- Each helper function can be further refactored, but at this point, it has kept the existing code. In my personal git branch, I am modifying other issues, and these structural change seems appropriate.
I will send patches that actually fix metric problems separately.
dlls/gdi32/freetype.c | 234 ++++++++++++++++++++++-------------------- 1 file changed, 125 insertions(+), 109 deletions(-)
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c index c38108eece..a522bcaba6 100644 --- a/dlls/gdi32/freetype.c +++ b/dlls/gdi32/freetype.c @@ -6588,6 +6588,129 @@ static inline FT_Vector normalize_vector(FT_Vector *vec) return out; }
+static BOOL get_transform_matrix( GdiFont *font, BOOL tategaki, const MAT2 *lpmat, + FT_Matrix *transMat, FT_Matrix *transMatTategaki, + FT_Matrix *transMatUnrotated ) +{ + double widthRatio; + BOOL needsTransform = FALSE; + + /* Scaling factor */ + if (font->aveWidth) + { + TEXTMETRICW tm; + get_text_metrics( font, &tm ); + + widthRatio = (double)font->aveWidth; + widthRatio /= (double)font->potm->otmTextMetrics.tmAveCharWidth; + } + else + widthRatio = font->scale_y; + + /* Scaling transform */ + if (widthRatio != 1.0 || font->scale_y != 1.0) + { + FT_Matrix scaleMat; + scaleMat.xx = FT_FixedFromFloat( widthRatio ); + scaleMat.xy = 0; + scaleMat.yx = 0; + scaleMat.yy = FT_FixedFromFloat( font->scale_y ); + + pFT_Matrix_Multiply( &scaleMat, transMat ); + needsTransform = TRUE; + } + + /* Slant transform */ + if (font->fake_italic) + { + FT_Matrix slantMat; + slantMat.xx = (1 << 16); + slantMat.xy = (1 << 16) >> 2; + slantMat.yx = 0; + slantMat.yy = (1 << 16); + + pFT_Matrix_Multiply( &slantMat, transMat ); + needsTransform = TRUE; + } + + /* Rotation transform */ + *transMatUnrotated = *transMat; + *transMatTategaki = *transMat; + if (font->orientation || tategaki) + { + FT_Matrix rotationMat; + FT_Matrix taterotationMat; + FT_Vector vecAngle; + FT_Angle angle; + + double orient = font->orientation / 10.0; + double tate_orient = 0.f; + + if (tategaki) + tate_orient = ((font->orientation + 900) % 3600) / 10.0; + else + tate_orient = font->orientation / 10.0; + + if (orient) + { + angle = FT_FixedFromFloat( orient ); + pFT_Vector_Unit( &vecAngle, angle ); + rotationMat.xx = vecAngle.x; + rotationMat.xy = -vecAngle.y; + rotationMat.yx = -rotationMat.xy; + rotationMat.yy = rotationMat.xx; + + pFT_Matrix_Multiply( &rotationMat, transMat ); + } + + if (tate_orient) + { + angle = FT_FixedFromFloat( tate_orient ); + pFT_Vector_Unit( &vecAngle, angle ); + taterotationMat.xx = vecAngle.x; + taterotationMat.xy = -vecAngle.y; + taterotationMat.yx = -taterotationMat.xy; + taterotationMat.yy = taterotationMat.xx; + + pFT_Matrix_Multiply( &taterotationMat, transMatTategaki ); + } + + needsTransform = TRUE; + } + + /* World transform */ + if (!is_identity_FMAT2( &font->font_desc.matrix )) + { + FT_Matrix worldMat; + worldMat.xx = FT_FixedFromFloat( font->font_desc.matrix.eM11 ); + worldMat.xy = -FT_FixedFromFloat( font->font_desc.matrix.eM21 ); + worldMat.yx = -FT_FixedFromFloat( font->font_desc.matrix.eM12 ); + worldMat.yy = FT_FixedFromFloat( font->font_desc.matrix.eM22 ); + + pFT_Matrix_Multiply( &worldMat, transMat ); + pFT_Matrix_Multiply( &worldMat, transMatUnrotated ); + pFT_Matrix_Multiply( &worldMat, transMatTategaki ); + needsTransform = TRUE; + } + + /* Extra transformation specified by caller */ + if (!is_identity_MAT2( lpmat )) + { + FT_Matrix extraMat; + extraMat.xx = FT_FixedFromFIXED( lpmat->eM11 ); + extraMat.xy = FT_FixedFromFIXED( lpmat->eM21 ); + extraMat.yx = FT_FixedFromFIXED( lpmat->eM12 ); + extraMat.yy = FT_FixedFromFIXED( lpmat->eM22 ); + + pFT_Matrix_Multiply( &extraMat, transMat ); + pFT_Matrix_Multiply( &extraMat, transMatUnrotated ); + pFT_Matrix_Multiply( &extraMat, transMatTategaki ); + needsTransform = TRUE; + } + + return needsTransform; +} + static BOOL get_bold_glyph_outline(FT_GlyphSlot glyph, LONG ppem, FT_Glyph_Metrics *metrics) { FT_Error err; @@ -6946,9 +7069,7 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format, INT left, right, top = 0, bottom = 0; FT_Vector adv; INT origin_x = 0, origin_y = 0; - FT_Angle angle = 0; FT_Int load_flags = get_load_flags(format); - double widthRatio = 1.0; FT_Matrix transMat = identityMat; FT_Matrix transMatUnrotated; FT_Matrix transMatTategaki; @@ -7008,113 +7129,8 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format, if (!font->gm[original_index / GM_BLOCK_SIZE]) font->gm[original_index / GM_BLOCK_SIZE] = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, sizeof(GM) * GM_BLOCK_SIZE);
- /* Scaling factor */ - if (font->aveWidth) - { - TEXTMETRICW tm; - - get_text_metrics(font, &tm); - - widthRatio = (double)font->aveWidth; - widthRatio /= (double)font->potm->otmTextMetrics.tmAveCharWidth; - } - else - widthRatio = font->scale_y; - - /* Scaling transform */ - if (widthRatio != 1.0 || font->scale_y != 1.0) - { - FT_Matrix scaleMat; - scaleMat.xx = FT_FixedFromFloat(widthRatio); - scaleMat.xy = 0; - scaleMat.yx = 0; - scaleMat.yy = FT_FixedFromFloat(font->scale_y); - - pFT_Matrix_Multiply(&scaleMat, &transMat); - needsTransform = TRUE; - } - - /* Slant transform */ - if (font->fake_italic) { - FT_Matrix slantMat; - - slantMat.xx = (1 << 16); - slantMat.xy = ((1 << 16) >> 2); - slantMat.yx = 0; - slantMat.yy = (1 << 16); - pFT_Matrix_Multiply(&slantMat, &transMat); - needsTransform = TRUE; - } - - /* Rotation transform */ - transMatUnrotated = transMat; - transMatTategaki = transMat; - if(font->orientation || tategaki) { - FT_Matrix rotationMat; - FT_Matrix taterotationMat; - FT_Vector vecAngle; - - double orient = font->orientation / 10.0; - double tate_orient = 0.f; - - if (tategaki) - tate_orient = ((font->orientation+900)%3600)/10.0; - else - tate_orient = font->orientation/10.0; - - if (orient) - { - angle = FT_FixedFromFloat(orient); - pFT_Vector_Unit(&vecAngle, angle); - rotationMat.xx = vecAngle.x; - rotationMat.xy = -vecAngle.y; - rotationMat.yx = -rotationMat.xy; - rotationMat.yy = rotationMat.xx; - - pFT_Matrix_Multiply(&rotationMat, &transMat); - } - - if (tate_orient) - { - angle = FT_FixedFromFloat(tate_orient); - pFT_Vector_Unit(&vecAngle, angle); - taterotationMat.xx = vecAngle.x; - taterotationMat.xy = -vecAngle.y; - taterotationMat.yx = -taterotationMat.xy; - taterotationMat.yy = taterotationMat.xx; - pFT_Matrix_Multiply(&taterotationMat, &transMatTategaki); - } - - needsTransform = TRUE; - } - - /* World transform */ - if (!is_identity_FMAT2(&font->font_desc.matrix)) - { - FT_Matrix worldMat; - worldMat.xx = FT_FixedFromFloat(font->font_desc.matrix.eM11); - worldMat.xy = -FT_FixedFromFloat(font->font_desc.matrix.eM21); - worldMat.yx = -FT_FixedFromFloat(font->font_desc.matrix.eM12); - worldMat.yy = FT_FixedFromFloat(font->font_desc.matrix.eM22); - pFT_Matrix_Multiply(&worldMat, &transMat); - pFT_Matrix_Multiply(&worldMat, &transMatUnrotated); - pFT_Matrix_Multiply(&worldMat, &transMatTategaki); - needsTransform = TRUE; - } - - /* Extra transformation specified by caller */ - if (!is_identity_MAT2(lpmat)) - { - FT_Matrix extraMat; - extraMat.xx = FT_FixedFromFIXED(lpmat->eM11); - extraMat.xy = FT_FixedFromFIXED(lpmat->eM21); - extraMat.yx = FT_FixedFromFIXED(lpmat->eM12); - extraMat.yy = FT_FixedFromFIXED(lpmat->eM22); - pFT_Matrix_Multiply(&extraMat, &transMat); - pFT_Matrix_Multiply(&extraMat, &transMatUnrotated); - pFT_Matrix_Multiply(&extraMat, &transMatTategaki); - needsTransform = TRUE; - } + needsTransform = get_transform_matrix( font, tategaki, lpmat, + &transMat, &transMatTategaki, &transMatUnrotated );
vertical_metrics = (tategaki && FT_HAS_VERTICAL(ft_face)); /* there is a freetype bug where vertical metrics are only