preserve sub-pixel antialiasing on non-focused completion popup
authorEgor.Ushakov <egor.ushakov@jetbrains.com>
Fri, 17 Jul 2015 10:18:52 +0000 (13:18 +0300)
committerEgor.Ushakov <egor.ushakov@jetbrains.com>
Fri, 17 Jul 2015 10:19:45 +0000 (13:19 +0300)
platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupCellRenderer.java

index 4b95cee009180a12373aa0e5782e63ece9793a7c..59934194f1eb743a4175006064c9cabf7ac1a8fc 100644 (file)
@@ -38,12 +38,14 @@ import com.intellij.util.containers.ContainerUtil;
 import com.intellij.util.containers.FList;
 import com.intellij.util.ui.EmptyIcon;
 import com.intellij.util.ui.GraphicsUtil;
+import com.intellij.util.ui.UIUtil;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import javax.swing.*;
 import javax.swing.border.EmptyBorder;
 import java.awt.*;
+import java.awt.image.BufferedImage;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
@@ -485,8 +487,17 @@ public class LookupCellRenderer implements ListCellRenderer {
     public void paint(Graphics g){
       if (!myLookup.isFocused() && myLookup.isCompletion()) {
         ((Graphics2D)g).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.6f));
+
+        // sub-pixel antialiasing does not work with alpha composite, so we workaround this by painting to RGB image first
+        BufferedImage image = UIUtil.createImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
+        Graphics2D imageGraphics = image.createGraphics();
+        super.paint(imageGraphics);
+        imageGraphics.dispose();
+        UIUtil.drawImage(g, image, 0, 0, null);
+      }
+      else {
+        super.paint(g);
       }
-      super.paint(g);
     }
   }
 }