mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 18:15:11 +00:00
[NTGDI][FONT] Don't rely FT_FaceRec.style_name (#2064)
- Delete ItalicFromStyle and WeightFromStyle functions. - Don't use FT_FaceRec.style_name for font style but pOS2->fsSelection, pOS2->usWeightClass, WinFNT.italic and WinFNT.weight. - Don't use the bitmap glyph as possible if the glyph will be oblique'd. - Tahoma Italic is working! CORE-9614
This commit is contained in:
parent
79b030219f
commit
f8821421a4
1 changed files with 52 additions and 86 deletions
|
@ -1043,62 +1043,6 @@ IntLoadSystemFonts(VOID)
|
|||
}
|
||||
}
|
||||
|
||||
static BYTE
|
||||
ItalicFromStyle(const char *style_name)
|
||||
{
|
||||
if (style_name == NULL || style_name[0] == 0)
|
||||
return FALSE;
|
||||
if (strstr(style_name, "Italic") != NULL)
|
||||
return TRUE;
|
||||
if (strstr(style_name, "Oblique") != NULL)
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static LONG
|
||||
WeightFromStyle(const char *style_name)
|
||||
{
|
||||
if (style_name == NULL || style_name[0] == 0)
|
||||
return FW_NORMAL;
|
||||
if (strstr(style_name, "Regular") != NULL)
|
||||
return FW_REGULAR;
|
||||
if (strstr(style_name, "Normal") != NULL)
|
||||
return FW_NORMAL;
|
||||
if (strstr(style_name, "SemiBold") != NULL)
|
||||
return FW_SEMIBOLD;
|
||||
if (strstr(style_name, "UltraBold") != NULL)
|
||||
return FW_ULTRABOLD;
|
||||
if (strstr(style_name, "DemiBold") != NULL)
|
||||
return FW_DEMIBOLD;
|
||||
if (strstr(style_name, "ExtraBold") != NULL)
|
||||
return FW_EXTRABOLD;
|
||||
if (strstr(style_name, "Bold") != NULL)
|
||||
return FW_BOLD;
|
||||
if (strstr(style_name, "UltraLight") != NULL)
|
||||
return FW_ULTRALIGHT;
|
||||
if (strstr(style_name, "ExtraLight") != NULL)
|
||||
return FW_EXTRALIGHT;
|
||||
if (strstr(style_name, "Light") != NULL)
|
||||
return FW_LIGHT;
|
||||
if (strstr(style_name, "Hairline") != NULL)
|
||||
return 50;
|
||||
if (strstr(style_name, "Book") != NULL)
|
||||
return 350;
|
||||
if (strstr(style_name, "ExtraBlack") != NULL)
|
||||
return 950;
|
||||
if (strstr(style_name, "UltraBlack") != NULL)
|
||||
return 1000;
|
||||
if (strstr(style_name, "Black") != NULL)
|
||||
return FW_BLACK;
|
||||
if (strstr(style_name, "Medium") != NULL)
|
||||
return FW_MEDIUM;
|
||||
if (strstr(style_name, "Thin") != NULL)
|
||||
return FW_THIN;
|
||||
if (strstr(style_name, "Heavy") != NULL)
|
||||
return FW_HEAVY;
|
||||
return FW_NORMAL;
|
||||
}
|
||||
|
||||
static FT_Error
|
||||
IntRequestFontSize(PDC dc, PFONTGDI FontGDI, LONG lfWidth, LONG lfHeight);
|
||||
|
||||
|
@ -1279,11 +1223,32 @@ IntGdiLoadFontsFromMemory(PGDI_LOAD_FONT pLoadFont)
|
|||
/* Set face */
|
||||
FontGDI->SharedFace = SharedFace;
|
||||
FontGDI->CharSet = ANSI_CHARSET;
|
||||
FontGDI->OriginalItalic = ItalicFromStyle(Face->style_name);
|
||||
FontGDI->OriginalItalic = FALSE;
|
||||
FontGDI->RequestItalic = FALSE;
|
||||
FontGDI->OriginalWeight = WeightFromStyle(Face->style_name);
|
||||
FontGDI->OriginalWeight = FW_NORMAL;
|
||||
FontGDI->RequestWeight = FW_NORMAL;
|
||||
|
||||
IntLockFreeType();
|
||||
if (FT_IS_SFNT(Face))
|
||||
{
|
||||
pOS2 = (TT_OS2 *)FT_Get_Sfnt_Table(Face, FT_SFNT_OS2);
|
||||
if (pOS2)
|
||||
{
|
||||
FontGDI->OriginalItalic = !!(pOS2->fsSelection & 0x1);
|
||||
FontGDI->OriginalWeight = pOS2->usWeightClass;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Error = FT_Get_WinFNT_Header(Face, &WinFNT);
|
||||
if (!Error)
|
||||
{
|
||||
FontGDI->OriginalItalic = !!WinFNT.italic;
|
||||
FontGDI->OriginalWeight = WinFNT.weight;
|
||||
}
|
||||
}
|
||||
IntUnLockFreeType();
|
||||
|
||||
/* Entry->FaceName */
|
||||
RtlInitAnsiString(&AnsiString, Face->family_name);
|
||||
Status = RtlAnsiStringToUnicodeString(&Entry->FaceName, &AnsiString, TRUE);
|
||||
|
@ -4445,7 +4410,10 @@ TextIntGetTextExtentPoint(PDC dc,
|
|||
|
||||
if (EmuBold || EmuItalic || !realglyph)
|
||||
{
|
||||
error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT);
|
||||
if (EmuItalic)
|
||||
error = FT_Load_Glyph(face, glyph_index, FT_LOAD_NO_BITMAP);
|
||||
else
|
||||
error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT);
|
||||
if (error)
|
||||
{
|
||||
DPRINT1("WARNING: Failed to load and render glyph! [index: %d]\n", glyph_index);
|
||||
|
@ -5073,23 +5041,20 @@ GetFontPenalty(const LOGFONTW * LogFont,
|
|||
GOT_PENALTY("SizeSynth", 50);
|
||||
}
|
||||
|
||||
if (!!LogFont->lfItalic != !!TM->tmItalic)
|
||||
if (!LogFont->lfItalic && TM->tmItalic)
|
||||
{
|
||||
if (!LogFont->lfItalic && ItalicFromStyle(style_name))
|
||||
{
|
||||
/* Italic Penalty 4 */
|
||||
/* Requested font and candidate font do not agree on italic status,
|
||||
and the desired result cannot be simulated. */
|
||||
/* Adjusted to 40 to satisfy (Oblique Penalty > Book Penalty). */
|
||||
GOT_PENALTY("Italic", 40);
|
||||
}
|
||||
else if (LogFont->lfItalic && !ItalicFromStyle(style_name))
|
||||
{
|
||||
/* ItalicSim Penalty 1 */
|
||||
/* Requested italic font but the candidate is not italic,
|
||||
although italics can be simulated. */
|
||||
GOT_PENALTY("ItalicSim", 1);
|
||||
}
|
||||
/* Italic Penalty 4 */
|
||||
/* Requested font and candidate font do not agree on italic status,
|
||||
and the desired result cannot be simulated. */
|
||||
/* Adjusted to 40 to satisfy (Oblique Penalty > Book Penalty). */
|
||||
GOT_PENALTY("Italic", 40);
|
||||
}
|
||||
else if (LogFont->lfItalic && !TM->tmItalic)
|
||||
{
|
||||
/* ItalicSim Penalty 1 */
|
||||
/* Requested italic font but the candidate is not italic,
|
||||
although italics can be simulated. */
|
||||
GOT_PENALTY("ItalicSim", 1);
|
||||
}
|
||||
|
||||
if (LogFont->lfOutPrecision == OUT_TT_PRECIS)
|
||||
|
@ -5347,7 +5312,6 @@ TextIntRealizeFont(HFONT FontHandle, PTEXTOBJ pTextObj)
|
|||
ULONG MatchPenalty;
|
||||
LOGFONTW *pLogFont;
|
||||
LOGFONTW SubstitutedLogFont;
|
||||
FT_Face Face;
|
||||
|
||||
if (!pTextObj)
|
||||
{
|
||||
|
@ -5439,13 +5403,6 @@ TextIntRealizeFont(HFONT FontHandle, PTEXTOBJ pTextObj)
|
|||
else
|
||||
FontGdi->RequestWeight = FW_NORMAL;
|
||||
|
||||
Face = FontGdi->SharedFace->Face;
|
||||
|
||||
//FontGdi->OriginalWeight = WeightFromStyle(Face->style_name);
|
||||
|
||||
if (!FontGdi->OriginalItalic)
|
||||
FontGdi->OriginalItalic = ItalicFromStyle(Face->style_name);
|
||||
|
||||
TextObj->fl |= TEXTOBJECT_INIT;
|
||||
Status = STATUS_SUCCESS;
|
||||
}
|
||||
|
@ -6286,7 +6243,10 @@ IntExtTextOutW(
|
|||
RenderMode, pmxWorldToDevice);
|
||||
if (!realglyph)
|
||||
{
|
||||
error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT);
|
||||
if (EmuItalic)
|
||||
error = FT_Load_Glyph(face, glyph_index, FT_LOAD_NO_BITMAP);
|
||||
else
|
||||
error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT);
|
||||
if (error)
|
||||
{
|
||||
DPRINT1("WARNING: Failed to load and render glyph! [index: %d]\n", glyph_index);
|
||||
|
@ -6381,7 +6341,10 @@ IntExtTextOutW(
|
|||
{
|
||||
glyph_index = get_glyph_index_flagged(face, String[i], ETO_GLYPH_INDEX, fuOptions);
|
||||
|
||||
error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT);
|
||||
if (EmuItalic)
|
||||
error = FT_Load_Glyph(face, glyph_index, FT_LOAD_NO_BITMAP);
|
||||
else
|
||||
error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT);
|
||||
if (error)
|
||||
{
|
||||
DPRINT1("Failed to load and render glyph! [index: %d]\n", glyph_index);
|
||||
|
@ -6503,7 +6466,10 @@ IntExtTextOutW(
|
|||
RenderMode, pmxWorldToDevice);
|
||||
if (!realglyph)
|
||||
{
|
||||
error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT);
|
||||
if (EmuItalic)
|
||||
error = FT_Load_Glyph(face, glyph_index, FT_LOAD_NO_BITMAP);
|
||||
else
|
||||
error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT);
|
||||
if (error)
|
||||
{
|
||||
DPRINT1("Failed to load and render glyph! [index: %d]\n", glyph_index);
|
||||
|
|
Loading…
Reference in a new issue