/* special font names */
static const UNICODE_STRING MarlettW = RTL_CONSTANT_STRING(L"Marlett");
-static const UNICODE_STRING SystemW = RTL_CONSTANT_STRING(L"System");
-static const UNICODE_STRING FixedSysW = RTL_CONSTANT_STRING(L"FixedSys");
/* registry */
static UNICODE_STRING FontRegPath =
return FindFaceNameInInfo(FaceName, Info, InfoEntries) < 0;
}
+static BOOL FASTCALL
+FontFamilyFound(PFONTFAMILYINFO InfoEntry,
+ PFONTFAMILYINFO Info, DWORD InfoCount)
+{
+ LPLOGFONTW plf1 = &InfoEntry->EnumLogFontEx.elfLogFont;
+ LPWSTR pFullName1 = InfoEntry->EnumLogFontEx.elfFullName;
+ LPWSTR pFullName2;
+ DWORD i;
+
+ for (i = 0; i < InfoCount; ++i)
+ {
+ LPLOGFONTW plf2 = &Info[i].EnumLogFontEx.elfLogFont;
+ if (plf1->lfCharSet != plf2->lfCharSet)
+ continue;
+
+ pFullName2 = Info[i].EnumLogFontEx.elfFullName;
+ if (_wcsicmp(pFullName1, pFullName2) != 0)
+ continue;
+
+ return TRUE;
+ }
+ return FALSE;
+}
+
static BOOLEAN FASTCALL
GetFontFamilyInfoForList(LPLOGFONTW LogFont,
PFONTFAMILYINFO Info,
- DWORD *Count,
- DWORD Size,
+ DWORD *pCount,
+ DWORD MaxCount,
PLIST_ENTRY Head)
{
PLIST_ENTRY Entry;
PFONT_ENTRY CurrentEntry;
- ANSI_STRING EntryFaceNameA;
- UNICODE_STRING EntryFaceNameW;
FONTGDI *FontGDI;
- NTSTATUS status;
+ FONTFAMILYINFO InfoEntry;
+ DWORD Count = *pCount;
- Entry = Head->Flink;
- while (Entry != Head)
+ for (Entry = Head->Flink; Entry != Head; Entry = Entry->Flink)
{
- CurrentEntry = (PFONT_ENTRY) CONTAINING_RECORD(Entry, FONT_ENTRY, ListEntry);
-
+ CurrentEntry = CONTAINING_RECORD(Entry, FONT_ENTRY, ListEntry);
FontGDI = CurrentEntry->Font;
ASSERT(FontGDI);
- RtlInitAnsiString(&EntryFaceNameA, FontGDI->SharedFace->Face->family_name);
- status = RtlAnsiStringToUnicodeString(&EntryFaceNameW, &EntryFaceNameA, TRUE);
- if (!NT_SUCCESS(status))
+ if (LogFont->lfCharSet != DEFAULT_CHARSET &&
+ LogFont->lfCharSet != FontGDI->CharSet)
{
- return FALSE;
+ continue;
}
- if ((LF_FACESIZE - 1) * sizeof(WCHAR) < EntryFaceNameW.Length)
+ if (LogFont->lfFaceName[0] == UNICODE_NULL)
{
- EntryFaceNameW.Length = (LF_FACESIZE - 1) * sizeof(WCHAR);
- EntryFaceNameW.Buffer[LF_FACESIZE - 1] = L'\0';
+ if (Count < MaxCount)
+ {
+ FontFamilyFillInfo(&Info[Count], NULL, NULL, FontGDI);
+ }
+ Count++;
+ continue;
+ }
+
+ FontFamilyFillInfo(&InfoEntry, NULL, NULL, FontGDI);
+
+ if (_wcsicmp(LogFont->lfFaceName, InfoEntry.EnumLogFontEx.elfLogFont.lfFaceName) != 0 &&
+ _wcsicmp(LogFont->lfFaceName, InfoEntry.EnumLogFontEx.elfFullName) != 0)
+ {
+ continue;
}
- if (FontFamilyInclude(LogFont, &EntryFaceNameW, Info, min(*Count, Size)))
+ if (!FontFamilyFound(&InfoEntry, Info, min(Count, MaxCount)))
{
- if (*Count < Size)
+ if (Count < MaxCount)
{
- FontFamilyFillInfo(Info + *Count, EntryFaceNameW.Buffer,
- NULL, FontGDI);
+ RtlCopyMemory(&Info[Count], &InfoEntry, sizeof(InfoEntry));
}
- (*Count)++;
+ Count++;
}
- RtlFreeUnicodeString(&EntryFaceNameW);
- Entry = Entry->Flink;
}
+ *pCount = Count;
+
return TRUE;
}
ULONG Penalty = 0;
BYTE Byte;
LONG Long;
- BOOL fFixedSys = FALSE, fNeedScaling = FALSE;
+ BOOL fNeedScaling = FALSE;
const BYTE UserCharSet = CharSetFromLangID(gusLanguageID);
const TEXTMETRICW * TM = &Otm->otmTextMetrics;
WCHAR* ActualNameW;
/* FIXME: SmallPenalty Penalty 1 */
/* FIXME: FaceNameSubst Penalty 500 */
- if (_wcsicmp(LogFont->lfFaceName, L"System") == 0)
+ Byte = LogFont->lfCharSet;
+ if (Byte == DEFAULT_CHARSET)
{
- /* "System" font */
- if (TM->tmCharSet != UserCharSet)
+ if (_wcsicmp(LogFont->lfFaceName, L"Marlett") == 0)
{
- /* CharSet Penalty 65000 */
- /* Requested charset does not match the candidate's. */
- Penalty += 65000;
+ if (Byte == ANSI_CHARSET)
+ {
+ DPRINT("Warning: FIXME: It's Marlett but ANSI_CHARSET.\n");
+ }
+ /* We assume SYMBOL_CHARSET for "Marlett" font */
+ Byte = SYMBOL_CHARSET;
}
}
- else if (_wcsicmp(LogFont->lfFaceName, L"FixedSys") == 0)
+
+ if (Byte != TM->tmCharSet)
{
- /* "FixedSys" font */
- if (TM->tmCharSet != UserCharSet)
+ if (Byte != DEFAULT_CHARSET && Byte != ANSI_CHARSET)
{
/* CharSet Penalty 65000 */
/* Requested charset does not match the candidate's. */
Penalty += 65000;
}
- fFixedSys = TRUE;
- }
- else /* Request is non-"System" font */
- {
- Byte = LogFont->lfCharSet;
- if (Byte == DEFAULT_CHARSET)
- {
- if (_wcsicmp(LogFont->lfFaceName, L"Marlett") == 0)
- {
- if (Byte == ANSI_CHARSET)
- {
- DPRINT("Warning: FIXME: It's Marlett but ANSI_CHARSET.\n");
- }
- /* We assume SYMBOL_CHARSET for "Marlett" font */
- Byte = SYMBOL_CHARSET;
- }
- }
-
- if (Byte != TM->tmCharSet)
+ else
{
- if (Byte != DEFAULT_CHARSET && Byte != ANSI_CHARSET)
- {
- /* CharSet Penalty 65000 */
- /* Requested charset does not match the candidate's. */
- Penalty += 65000;
- }
- else
+ if (UserCharSet != TM->tmCharSet)
{
- if (UserCharSet != TM->tmCharSet)
+ /* UNDOCUMENTED */
+ Penalty += 100;
+ if (ANSI_CHARSET != TM->tmCharSet)
{
/* UNDOCUMENTED */
Penalty += 100;
- if (ANSI_CHARSET != TM->tmCharSet)
- {
- /* UNDOCUMENTED */
- Penalty += 100;
- }
}
}
}
Byte = (LogFont->lfPitchAndFamily & 0x0F);
if (Byte == DEFAULT_PITCH)
Byte = VARIABLE_PITCH;
- if (fFixedSys)
- {
- /* "FixedSys" font should be fixed-pitch */
- Byte = FIXED_PITCH;
- }
if (Byte == FIXED_PITCH)
{
if (TM->tmPitchAndFamily & _TMPF_VARIABLE_PITCH)
}
static BOOL
-EqualFamilyInfo(FONTFAMILYINFO *pInfo1, FONTFAMILYINFO *pInfo2)
+EqualFamilyInfo(const FONTFAMILYINFO *pInfo1, const FONTFAMILYINFO *pInfo2)
{
- UNICODE_STRING Str1, Str2;
- ENUMLOGFONTEXW *pLog1 = &pInfo1->EnumLogFontEx;
- ENUMLOGFONTEXW *pLog2 = &pInfo2->EnumLogFontEx;
- RtlInitUnicodeString(&Str1, pLog1->elfLogFont.lfFaceName);
- RtlInitUnicodeString(&Str2, pLog2->elfLogFont.lfFaceName);
- if (!RtlEqualUnicodeString(&Str1, &Str2, TRUE))
+ const ENUMLOGFONTEXW *pLog1 = &pInfo1->EnumLogFontEx;
+ const ENUMLOGFONTEXW *pLog2 = &pInfo2->EnumLogFontEx;
+ const LOGFONTW *plf1 = &pLog1->elfLogFont;
+ const LOGFONTW *plf2 = &pLog2->elfLogFont;
+
+ if (_wcsicmp(plf1->lfFaceName, plf2->lfFaceName) != 0)
{
return FALSE;
}
- if ((pLog1->elfStyle != NULL) != (pLog2->elfStyle != NULL))
- return FALSE;
- if (pLog1->elfStyle != NULL)
+
+ if (_wcsicmp(pLog1->elfStyle, pLog2->elfStyle) != 0)
{
- RtlInitUnicodeString(&Str1, pLog1->elfStyle);
- RtlInitUnicodeString(&Str2, pLog2->elfStyle);
- if (!RtlEqualUnicodeString(&Str1, &Str2, TRUE))
- {
- return FALSE;
- }
+ return FALSE;
}
+
return TRUE;
}
&psurf->SurfObj,
NULL,
NULL,
- &dc->co.ClipObj,
+ (CLIPOBJ *)&dc->co,
NULL,
&DestRect,
&SourcePoint,
&psurf->SurfObj,
NULL,
NULL,
- &dc->co.ClipObj,
+ (CLIPOBJ *)&dc->co,
NULL,
&DestRect,
&SourcePoint,
&psurf->SurfObj,
NULL,
NULL,
- &dc->co.ClipObj,
+ (CLIPOBJ *)&dc->co,
NULL,
&DestRect,
&SourcePoint,
if (!IntEngMaskBlt(
SurfObj,
SourceGlyphSurf,
- &dc->co.ClipObj,
+ (CLIPOBJ *)&dc->co,
&exloRGB2Dst.xlo,
&exloDst2RGB.xlo,
&DestRect,
for (i = -thickness / 2; i < -thickness / 2 + thickness; ++i)
{
EngLineTo(SurfObj,
- &dc->co.ClipObj,
+ (CLIPOBJ *)&dc->co,
&dc->eboText.BrushObject,
(TextLeft >> 6),
TextTop + yoff - position + i,
for (i = -thickness / 2; i < -thickness / 2 + thickness; ++i)
{
EngLineTo(SurfObj,
- &dc->co.ClipObj,
+ (CLIPOBJ *)&dc->co,
&dc->eboText.BrushObject,
(TextLeft >> 6),
TextTop + yoff - (fixAscender >> 6) / 3 + i,