From 57b59da58beb07ebcb41e881ffbcad4274b8501f Mon Sep 17 00:00:00 2001 From: Alexey Pegov Date: Wed, 28 Sep 2011 13:45:29 +0400 Subject: [PATCH] [mac] fix software italic fonts emulation for real italic font faces (apple java bug) --- .../impl/ComplementaryFontsRegistry.java | 49 +++++++++++++++---- .../openapi/editor/impl/EditorImpl.java | 2 +- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/ComplementaryFontsRegistry.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/ComplementaryFontsRegistry.java index 4779a17076b5..deaab11d67a2 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/ComplementaryFontsRegistry.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/ComplementaryFontsRegistry.java @@ -16,21 +16,23 @@ package com.intellij.openapi.editor.impl; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.SystemInfo; import gnu.trove.TIntHashSet; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import java.awt.*; -import java.util.ArrayList; -import java.util.Collection; -import java.util.LinkedHashMap; +import java.util.*; +import java.util.List; /** * @author max */ public class ComplementaryFontsRegistry { private static final Object lock = new String("common lock"); - private static final ArrayList ourFontNames; + private static final List ourFontNames; + private static final Set ourStyledFontNames; private static final LinkedHashMap ourUsedFonts; private static FontKey ourSharedKeyInstance = new FontKey("", 0, 0); private static FontInfo ourSharedDefaultFont; @@ -72,11 +74,22 @@ public class ComplementaryFontsRegistry { @NonNls private static final String ITALIC_SUFFIX = ".italic"; static { + ourStyledFontNames = new HashSet(); ourFontNames = new ArrayList(); if (ApplicationManager.getApplication().isUnitTestMode()) { ourFontNames.add("Monospaced"); } else { GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment(); + if (SystemInfo.isMac) { + Font[] allFonts = graphicsEnvironment.getAllFonts(); + for (Font font : allFonts) { + String name = font.getName(); + if (name.endsWith("-Italic") || name.endsWith("-Bold") || name.endsWith("-BoldItalic")) { + ourStyledFontNames.add(font.getName()); + } + } + } + String[] fontNames = graphicsEnvironment.getAvailableFontFamilyNames(); for (final String fontName : fontNames) { if (!fontName.endsWith(BOLD_SUFFIX) && !fontName.endsWith(ITALIC_SUFFIX)) { @@ -87,12 +100,30 @@ public class ComplementaryFontsRegistry { ourUsedFonts = new LinkedHashMap(); } + private static Pair fontFamily(String familyName, int style) { + if (!SystemInfo.isMac || style == 0) return Pair.create(familyName, style); + + StringBuilder st = new StringBuilder(familyName).append('-'); + if ((style & Font.BOLD) == Font.BOLD) { + st.append("Bold"); + } + + if ((style & Font.ITALIC) == Font.ITALIC) { + st.append("Italic"); + } + + String styledFamilyName = st.toString(); + boolean found = ourStyledFontNames.contains(styledFamilyName); + return Pair.create(found ? styledFamilyName : familyName, found ? Font.PLAIN : style); + } + public static FontInfo getFontAbleToDisplay(char c, int size, int style, @NotNull String defaultFontFamily) { synchronized (lock) { + Pair p = fontFamily(defaultFontFamily, style); if (ourSharedKeyInstance.mySize == size && - ourSharedKeyInstance.myStyle == style && + ourSharedKeyInstance.myStyle == p.getSecond() && ourSharedKeyInstance.myFamilyName != null && - ourSharedKeyInstance.myFamilyName.equals(defaultFontFamily) && + ourSharedKeyInstance.myFamilyName.equals(p.getFirst()) && ourSharedDefaultFont != null && ( c < 128 || ourSharedDefaultFont.canDisplay(c) @@ -101,13 +132,13 @@ public class ComplementaryFontsRegistry { return ourSharedDefaultFont; } - ourSharedKeyInstance.myFamilyName = defaultFontFamily; + ourSharedKeyInstance.myFamilyName = p.getFirst(); ourSharedKeyInstance.mySize = size; - ourSharedKeyInstance.myStyle = style; + ourSharedKeyInstance.myStyle = p.getSecond(); FontInfo defaultFont = ourUsedFonts.get(ourSharedKeyInstance); if (defaultFont == null) { - defaultFont = new FontInfo(defaultFontFamily, size, style); + defaultFont = new FontInfo(p.getFirst(), size, p.getSecond()); ourUsedFonts.put(ourSharedKeyInstance, defaultFont); ourSharedKeyInstance = new FontKey("", 0, 0); } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java index dade4f28f702..93d205122d2e 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java @@ -131,7 +131,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi private final EditorGutterComponentImpl myGutterComponent; static { - ComplementaryFontsRegistry.getFontAbleToDisplay(' ', 0,0,""); // load costly font info + ComplementaryFontsRegistry.getFontAbleToDisplay(' ', 0,0, UIManager.getFont("Label.font").getFamily()); // load costly font info } private final CommandProcessor myCommandProcessor;