/** * Gets (creates if necessary) disabled icon based on the passed one. * * @return <code>ImageIcon</code> constructed from disabled image of passed icon. */ @Nullable public static Icon getDisabledIcon(Icon icon) { if (icon instanceof LazyIcon) icon = ((LazyIcon) icon).getOrComputeIcon(); if (icon == null) return null; Icon disabledIcon = ourIcon2DisabledIcon.get(icon); if (disabledIcon == null) { if (!isGoodSize(icon)) { LOG.error(icon); // # 22481 return EMPTY_ICON; } final int scale = UIUtil.isRetina() ? 2 : 1; @SuppressWarnings("UndesirableClassUsage") BufferedImage image = new BufferedImage( scale * icon.getIconWidth(), scale * icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB); final Graphics2D graphics = image.createGraphics(); graphics.setColor(UIUtil.TRANSPARENT_COLOR); graphics.fillRect(0, 0, icon.getIconWidth(), icon.getIconHeight()); graphics.scale(scale, scale); icon.paintIcon(LabelHolder.ourFakeComponent, graphics, 0, 0); graphics.dispose(); Image img = ImageUtil.filter(image, UIUtil.getGrayFilter()); if (UIUtil.isRetina()) img = RetinaImage.createFrom(img, 2, ImageLoader.ourComponent); disabledIcon = new JBImageIcon(img); ourIcon2DisabledIcon.put(icon, disabledIcon); } return disabledIcon; }
public static void setupAntialiasing(final Graphics g) { if (DEFAULT_ALIASING) return; Graphics2D g2d = (Graphics2D) g; UISettings uiSettings = getInstance(); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); if (!isRemoteDesktopConnected() && UIUtil.isRetina()) { g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); } else { if (uiSettings == null || uiSettings.ANTIALIASING_IN_EDITOR) { Toolkit tk = Toolkit.getDefaultToolkit(); //noinspection HardCodedStringLiteral Map map = (Map) tk.getDesktopProperty("awt.font.desktophints"); if (map != null) { if (isRemoteDesktopConnected()) { g2d.setRenderingHint( RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT); } else { g2d.addRenderingHints(map); } } else { g2d.setRenderingHint( RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); } if (FORCE_USE_FRACTIONAL_METRICS) { g2d.setRenderingHint( RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); } } else { g2d.setRenderingHint( RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); } } }
private static ImageIcon makeColorIconForColor(final Color color) { final int size = UIUtil.isRetina() ? 8 : 16; final int halfSize = size / 2; final Image img = UIUtil.createImage(size, size, BufferedImage.TYPE_INT_RGB); final Graphics gfx = img.getGraphics(); try { if (color == null) { gfx.setColor(IdeaUtils.isDarkTheme() ? Color.darkGray : Color.white); gfx.fillRect(0, 0, size, size); gfx.setColor(IdeaUtils.isDarkTheme() ? Color.yellow : Color.black); gfx.drawRect(0, 0, size - 1, size - 1); gfx.drawLine(0, 0, size - 1, size - 1); } else if (color == DIFF_COLORS) { gfx.setColor(Color.red); gfx.fillRect(0, 0, halfSize, halfSize); gfx.setColor(Color.green); gfx.fillRect(halfSize, 0, halfSize, halfSize); gfx.setColor(Color.blue); gfx.fillRect(0, halfSize, halfSize, halfSize); gfx.setColor(Color.yellow); gfx.fillRect(halfSize, halfSize, halfSize, halfSize); } else { gfx.setColor(color); gfx.fillRect(0, 0, size, size); gfx.setColor(Color.black); gfx.drawRect(0, 0, size - 1, size - 1); } } finally { gfx.dispose(); } return new ImageIcon(img); }
public static List<Pair<String, Integer>> getFileNames(@NotNull String file) { final boolean dark = UIUtil.isUnderDarcula(); final boolean retina = UIUtil.isRetina(); if (retina || dark) { List<Pair<String, Integer>> answer = new ArrayList<Pair<String, Integer>>(4); final String name = FileUtil.getNameWithoutExtension(file); final String ext = FileUtilRt.getExtension(file); if (dark && retina) { answer.add(Pair.create(name + "@2x_dark." + ext, 2)); } if (dark) { answer.add(Pair.create(name + "_dark." + ext, 1)); } if (retina) { answer.add(Pair.create(name + "@2x." + ext, 2)); } answer.add(Pair.create(file, 1)); return answer; } return Collections.singletonList(Pair.create(file, 1)); }
public static Image loadFromStream(@NotNull final InputStream inputStream, final int scale) { if (scale <= 0) throw new IllegalArgumentException("Scale must 1 or more"); try { BufferExposingByteArrayOutputStream outputStream = new BufferExposingByteArrayOutputStream(); try { byte[] buffer = new byte[1024]; while (true) { final int n = inputStream.read(buffer); if (n < 0) break; outputStream.write(buffer, 0, n); } } finally { inputStream.close(); } Image image = Toolkit.getDefaultToolkit() .createImage(outputStream.getInternalBuffer(), 0, outputStream.size()); waitForImage(image); if (UIUtil.isRetina() && scale > 1) { image = RetinaImage.createFrom(image, scale, ourComponent); } return image; } catch (Exception ex) { LOG.error(ex); } return null; }
@Nullable public static Image loadFromResource(@NonNls @NotNull String path, @NotNull Class aClass) { return ImageDescList.create( path, aClass, UIUtil.isUnderDarcula(), UIUtil.isRetina() || JBUI.scale(1.0f) >= 1.5f, true) .load(ImageConverterChain.create().withRetina()); }
public static ImageDescList create( @NotNull String file, @Nullable Class cls, boolean dark, boolean retina, boolean allowFloatScaling) { ImageDescList vars = new ImageDescList(); if (retina || dark) { final String name = FileUtil.getNameWithoutExtension(file); final String ext = FileUtilRt.getExtension(file); float scale = calcScaleFactor(allowFloatScaling); // TODO: allow SVG images to freely scale on Retina if (Registry.is("ide.svg.icon") && dark) { vars.add( new ImageDesc( name + "_dark.svg", cls, UIUtil.isRetina() ? 2f : scale, ImageDesc.Type.SVG)); } if (Registry.is("ide.svg.icon")) { vars.add( new ImageDesc( name + ".svg", cls, UIUtil.isRetina() ? 2f : scale, ImageDesc.Type.SVG)); } if (dark && retina) { vars.add(new ImageDesc(name + "@2x_dark." + ext, cls, 2f, ImageDesc.Type.PNG)); } if (dark) { vars.add(new ImageDesc(name + "_dark." + ext, cls, 1f, ImageDesc.Type.PNG)); } if (retina) { vars.add(new ImageDesc(name + "@2x." + ext, cls, 2f, ImageDesc.Type.PNG)); } } vars.add(new ImageDesc(file, cls, 1f, ImageDesc.Type.PNG, true)); return vars; }
@Nullable public static Image loadFromUrl( @NotNull URL url, boolean allowFloatScaling, ImageFilter[] filters) { final float scaleFactor = calcScaleFactor(allowFloatScaling); // We can't check all 3rd party plugins and convince the authors to add @2x icons. // (scaleFactor > 1.0) != isRetina() => we should scale images manually. // Note we never scale images on Retina displays because scaling is handled by the system. final boolean scaleImages = (scaleFactor > 1.0f) && !UIUtil.isRetina(); // For any scale factor > 1.0, always prefer retina images, because downscaling // retina images provides a better result than upscaling non-retina images. final boolean loadRetinaImages = UIUtil.isRetina() || scaleImages; return ImageDescList.create( url.toString(), null, UIUtil.isUnderDarcula(), loadRetinaImages, allowFloatScaling) .load( ImageConverterChain.create() .withFilter(filters) .withRetina() .with( new ImageConverter() { public Image convert(Image source, ImageDesc desc) { if (source != null && scaleImages && desc.type != ImageDesc.Type.SVG) { if (desc.path.contains("@2x")) return scaleImage( source, scaleFactor / 2.0f); // divide by 2.0 as Retina images are 2x the // resolution. else return scaleImage(source, scaleFactor); } return source; } })); }
private static void updateImages(StringBuffer text, ClassLoader tipLoader) { final boolean dark = UIUtil.isUnderDarcula(); final boolean retina = UIUtil.isRetina(); // if (!dark && !retina) { // return; // } String suffix = ""; if (retina) suffix += "@2x"; if (dark) suffix += "_dark"; int index = text.indexOf("<img", 0); while (index != -1) { final int end = text.indexOf(">", index + 1); if (end == -1) return; final String img = text.substring(index, end + 1).replace('\r', ' ').replace('\n', ' '); final int srcIndex = img.indexOf("src="); final int endIndex = img.indexOf(".png", srcIndex); if (endIndex != -1) { String path = img.substring(srcIndex + 5, endIndex); if (!path.endsWith("_dark") && !path.endsWith("@2x")) { path += suffix + ".png"; URL url = ResourceUtil.getResource(tipLoader, "/tips/", path); if (url != null) { String newImgTag = "<img src=\"" + path + "\" "; if (retina) { try { final BufferedImage image = ImageIO.read(url.openStream()); final int w = image.getWidth() / 2; final int h = image.getHeight() / 2; newImgTag += "width=\"" + w + "\" height=\"" + h + "\""; } catch (Exception ignore) { newImgTag += "width=\"400\" height=\"200\""; } } newImgTag += "/>"; text.replace(index, end + 1, newImgTag); } } } index = text.indexOf("<img", index + 1); } }