/* * Copyright 2000-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.intellij.util.ui; import com.intellij.util.ImageLoader; import com.intellij.util.JBHiDPIScaledImage; import org.jetbrains.annotations.NotNull; import java.awt.*; import java.awt.image.*; /** * @author Konstantin Bulenkov */ public class ImageUtil { public static BufferedImage toBufferedImage(@NotNull Image image) { return toBufferedImage(image, false); } public static BufferedImage toBufferedImage(@NotNull Image image, boolean inUserSize) { if (image instanceof JBHiDPIScaledImage) { Image img = ((JBHiDPIScaledImage)image).getDelegate(); float scale = ((JBHiDPIScaledImage)image).getScale(); if (img != null) { image = img; if (inUserSize) { image = scaleImage(image, 1 / scale); } } } if (image instanceof BufferedImage) { return (BufferedImage)image; } final int width = image.getWidth(null); final int height = image.getHeight(null); if (width <= 0 || height <= 0) { // avoiding NPE return new BufferedImage(Math.max(width, 1), Math.max(height, 1), BufferedImage.TYPE_INT_ARGB) { @Override public int getWidth() { return Math.max(width, 0); } @Override public int getHeight() { return Math.max(height, 0); } @Override public int getWidth(ImageObserver observer) { return Math.max(width, 0); } @Override public int getHeight(ImageObserver observer) { return Math.max(height, 0); } }; } @SuppressWarnings("UndesirableClassUsage") BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); Graphics2D g = bufferedImage.createGraphics(); g.drawImage(image, 0, 0, null); g.dispose(); return bufferedImage; } public static int getRealWidth(@NotNull Image image) { if (image instanceof JBHiDPIScaledImage) { Image img = ((JBHiDPIScaledImage)image).getDelegate(); if (img != null) image = img; } return image.getWidth(null); } public static int getRealHeight(@NotNull Image image) { if (image instanceof JBHiDPIScaledImage) { Image img = ((JBHiDPIScaledImage)image).getDelegate(); if (img != null) image = img; } return image.getHeight(null); } public static int getUserWidth(@NotNull Image image) { if (image instanceof JBHiDPIScaledImage) { return ((JBHiDPIScaledImage)image).getUserWidth(null); } return image.getWidth(null); } public static int getUserHeight(@NotNull Image image) { if (image instanceof JBHiDPIScaledImage) { return ((JBHiDPIScaledImage)image).getUserHeight(null); } return image.getHeight(null); } public static Image filter(Image image, ImageFilter filter) { if (image == null || filter == null) return image; return Toolkit.getDefaultToolkit().createImage( new FilteredImageSource(toBufferedImage(image).getSource(), filter)); } /** * Scales the image taking into account its HiDPI awareness. */ public static Image scaleImage(Image image, float scale) { return ImageLoader.scaleImage(image, scale); } }