| @@ -103,87 +103,108 @@ bool TextLayout::createNativeLayout (const AttributedString&) | |||||
| } | } | ||||
| //============================================================================== | //============================================================================== | ||||
| struct DefaultFontNames | |||||
| struct DefaultFontInfo | |||||
| { | { | ||||
| DefaultFontNames() | |||||
| : defaultSans (getDefaultSansSerifFontName()), | |||||
| defaultSerif (getDefaultSerifFontName()), | |||||
| defaultFixed (getDefaultMonospacedFontName()) | |||||
| struct Characteristics | |||||
| { | |||||
| String name, style; | |||||
| }; | |||||
| DefaultFontInfo() | |||||
| : defaultSans (getDefaultSansSerifFontCharacteristics()), | |||||
| defaultSerif (getDefaultSerifFontCharacteristics()), | |||||
| defaultFixed (getDefaultMonospacedFontCharacteristics()) | |||||
| { | { | ||||
| } | } | ||||
| String getRealFontName (const String& faceName) const | |||||
| Characteristics getRealFontCharacteristics (const String& faceName) const | |||||
| { | { | ||||
| if (faceName == Font::getDefaultSansSerifFontName()) return defaultSans; | if (faceName == Font::getDefaultSansSerifFontName()) return defaultSans; | ||||
| if (faceName == Font::getDefaultSerifFontName()) return defaultSerif; | if (faceName == Font::getDefaultSerifFontName()) return defaultSerif; | ||||
| if (faceName == Font::getDefaultMonospacedFontName()) return defaultFixed; | if (faceName == Font::getDefaultMonospacedFontName()) return defaultFixed; | ||||
| return faceName; | |||||
| return { faceName }; | |||||
| } | } | ||||
| String defaultSans, defaultSerif, defaultFixed; | |||||
| Characteristics defaultSans, defaultSerif, defaultFixed; | |||||
| private: | private: | ||||
| static String pickBestFont (const StringArray& names, const char* const* choicesArray) | |||||
| template <typename Range> | |||||
| static Characteristics pickBestFont (const StringArray& names, Range&& choicesArray) | |||||
| { | { | ||||
| const StringArray choices (choicesArray); | |||||
| for (auto& choice : choices) | |||||
| if (names.contains (choice, true)) | |||||
| for (auto& choice : choicesArray) | |||||
| if (names.contains (choice.name, true)) | |||||
| return choice; | return choice; | ||||
| for (auto& choice : choices) | |||||
| for (auto& choice : choicesArray) | |||||
| for (auto& name : names) | for (auto& name : names) | ||||
| if (name.startsWithIgnoreCase (choice)) | |||||
| return name; | |||||
| if (name.startsWithIgnoreCase (choice.name)) | |||||
| return { name, choice.style }; | |||||
| for (auto& choice : choices) | |||||
| for (auto& choice : choicesArray) | |||||
| for (auto& name : names) | for (auto& name : names) | ||||
| if (name.containsIgnoreCase (choice)) | |||||
| return name; | |||||
| if (name.containsIgnoreCase (choice.name)) | |||||
| return { name, choice.style }; | |||||
| return names[0]; | |||||
| return { *names.begin() }; | |||||
| } | } | ||||
| static String getDefaultSansSerifFontName() | |||||
| static Characteristics getDefaultSansSerifFontCharacteristics() | |||||
| { | { | ||||
| StringArray allFonts; | StringArray allFonts; | ||||
| FTTypefaceList::getInstance()->getSansSerifNames (allFonts); | FTTypefaceList::getInstance()->getSansSerifNames (allFonts); | ||||
| static const char* targets[] = { "Verdana", "Bitstream Vera Sans", "Luxi Sans", | |||||
| "Liberation Sans", "DejaVu Sans", "Sans", nullptr }; | |||||
| static const Characteristics targets[] { { "Verdana" }, | |||||
| { "Bitstream Vera Sans", "Roman" }, | |||||
| { "Luxi Sans" }, | |||||
| { "Liberation Sans" }, | |||||
| { "DejaVu Sans" }, | |||||
| { "Sans" } }; | |||||
| return pickBestFont (allFonts, targets); | return pickBestFont (allFonts, targets); | ||||
| } | } | ||||
| static String getDefaultSerifFontName() | |||||
| static Characteristics getDefaultSerifFontCharacteristics() | |||||
| { | { | ||||
| StringArray allFonts; | StringArray allFonts; | ||||
| FTTypefaceList::getInstance()->getSerifNames (allFonts); | FTTypefaceList::getInstance()->getSerifNames (allFonts); | ||||
| static const char* targets[] = { "Bitstream Vera Serif", "Times", "Nimbus Roman", | |||||
| "Liberation Serif", "DejaVu Serif", "Serif", nullptr }; | |||||
| static const Characteristics targets[] { { "Bitstream Vera Serif", "Roman" }, | |||||
| { "Times" }, | |||||
| { "Nimbus Roman" }, | |||||
| { "Liberation Serif" }, | |||||
| { "DejaVu Serif" }, | |||||
| { "Serif" } }; | |||||
| return pickBestFont (allFonts, targets); | return pickBestFont (allFonts, targets); | ||||
| } | } | ||||
| static String getDefaultMonospacedFontName() | |||||
| static Characteristics getDefaultMonospacedFontCharacteristics() | |||||
| { | { | ||||
| StringArray allFonts; | StringArray allFonts; | ||||
| FTTypefaceList::getInstance()->getMonospacedNames (allFonts); | FTTypefaceList::getInstance()->getMonospacedNames (allFonts); | ||||
| static const char* targets[] = { "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Sans Mono", | |||||
| "Liberation Mono", "Courier", "DejaVu Mono", "Mono", nullptr }; | |||||
| static const Characteristics targets[] { { "DejaVu Sans Mono" }, | |||||
| { "Bitstream Vera Sans Mono", "Roman" }, | |||||
| { "Sans Mono" }, | |||||
| { "Liberation Mono" }, | |||||
| { "Courier" }, | |||||
| { "DejaVu Mono" }, | |||||
| { "Mono" } }; | |||||
| return pickBestFont (allFonts, targets); | return pickBestFont (allFonts, targets); | ||||
| } | } | ||||
| JUCE_DECLARE_NON_COPYABLE (DefaultFontNames) | |||||
| JUCE_DECLARE_NON_COPYABLE (DefaultFontInfo) | |||||
| }; | }; | ||||
| Typeface::Ptr Font::getDefaultTypefaceForFont (const Font& font) | Typeface::Ptr Font::getDefaultTypefaceForFont (const Font& font) | ||||
| { | { | ||||
| static DefaultFontNames defaultNames; | |||||
| static const DefaultFontInfo defaultInfo; | |||||
| Font f (font); | Font f (font); | ||||
| f.setTypefaceName (defaultNames.getRealFontName (font.getTypefaceName())); | |||||
| const auto characteristics = defaultInfo.getRealFontCharacteristics (font.getTypefaceName()); | |||||
| f.setTypefaceName (characteristics.name); | |||||
| f.setTypefaceStyle (characteristics.style); | |||||
| return Typeface::createSystemTypefaceFor (f); | return Typeface::createSystemTypefaceFor (f); | ||||
| } | } | ||||