< prev index next >
src/java.desktop/share/classes/sun/awt/SunToolkit.java
Print this page
*** 35,45 ****
import java.awt.image.ImageObserver;
import java.awt.image.ImageProducer;
import java.awt.image.Raster;
import java.awt.peer.FramePeer;
import java.awt.peer.KeyboardFocusManagerPeer;
- import java.awt.peer.MouseInfoPeer;
import java.awt.peer.SystemTrayPeer;
import java.awt.peer.TrayIconPeer;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
--- 35,44 ----
*** 67,78 ****
--- 66,80 ----
import sun.font.FontDesignMetrics;
import sun.net.util.URLUtil;
import sun.security.action.GetBooleanAction;
import sun.security.action.GetPropertyAction;
import sun.util.logging.PlatformLogger;
+ import java.util.List;
+ import sun.awt.image.MultiResolutionToolkitImage.ResolutionVariantItem;
import static java.awt.RenderingHints.*;
+ import java.util.LinkedList;
public abstract class SunToolkit extends Toolkit
implements ComponentFactory, InputMethodSupport, KeyboardFocusManagerPeerProvider {
// 8014718: logging has been removed from SunToolkit
*** 687,733 ****
}
}
@Override
public Image getImage(String filename) {
! return getImageFromHash(this, filename);
}
@Override
public Image getImage(URL url) {
return getImageFromHash(this, url);
}
! protected Image getImageWithResolutionVariant(String fileName,
! String resolutionVariantName) {
synchronized (fileImgCache) {
! Image image = getImageFromHash(this, fileName);
! if (image instanceof MultiResolutionImage) {
! return image;
}
- Image resolutionVariant = getImageFromHash(this, resolutionVariantName);
- image = createImageWithResolutionVariant(image, resolutionVariant);
- fileImgCache.put(fileName, image);
- return image;
}
}
- protected Image getImageWithResolutionVariant(URL url,
- URL resolutionVariantURL) {
synchronized (urlImgCache) {
! Image image = getImageFromHash(this, url);
! if (image instanceof MultiResolutionImage) {
! return image;
}
! Image resolutionVariant = getImageFromHash(this, resolutionVariantURL);
! image = createImageWithResolutionVariant(image, resolutionVariant);
! String key = url.toString();
! urlImgCache.put(key, image);
! return image;
}
}
@Override
public Image createImage(String filename) {
checkPermissions(filename);
return createImage(new FileImageSource(filename));
--- 689,855 ----
}
}
@Override
public Image getImage(String filename) {
! return getImageUsingNamingSchemes(filename, getNamingSchemes());
}
+
@Override
public Image getImage(URL url) {
+ return getImageUsingNamingSchemes(url, getNamingSchemes());
+ }
+
+ public Image getResolutionVariant(String filename) {
+ return getImageFromHash(this, filename);
+ }
+
+ public Image getResolutionVariant(URL url) {
return getImageFromHash(this, url);
}
! public static Image getImageUsingNamingSchemes(Toolkit toolkit, String fileName,
! MediaResolutionNamingScheme... namingSchemes) {
!
! SunToolkit sunToolkit = null;
! if(toolkit instanceof SunToolkit){
! sunToolkit = (SunToolkit) toolkit;
! }
!
synchronized (fileImgCache) {
! Image baseImage = sunToolkit == null
! ? toolkit.getImage(fileName)
! : sunToolkit.getResolutionVariant(fileName);
!
! if (fileName == null || namingSchemes.length == 0
! || (baseImage instanceof MultiResolutionImage)) {
! return baseImage;
! }
!
! LinkedList<ResolutionVariantItem> rvItems = new LinkedList<>();
! String[] rvNames = getRVNames(fileName, namingSchemes);
!
! for (int i = 0; i < namingSchemes.length; i++) {
! String rvName = rvNames[i];
! if (imageExists(rvName)) {
! Image rvImage = sunToolkit == null
! ? toolkit.getImage(rvName)
! : sunToolkit.getResolutionVariant(rvName);
! float scale = namingSchemes[i].getScale();
! rvItems.add(new ResolutionVariantItem(rvImage, scale, scale));
! }
! }
!
! if (rvItems.isEmpty()) {
! return baseImage;
! }
!
! rvItems.addFirst(new ResolutionVariantItem(baseImage, 1, 1));
! Image mrImage = new MultiResolutionToolkitImage(baseImage, rvItems);
!
! fileImgCache.put(fileName, mrImage);
! return mrImage;
}
}
+
+ public static Image getImageUsingNamingSchemes(Toolkit toolkit, URL url,
+ MediaResolutionNamingScheme... namingSchemes) {
+
+ SunToolkit sunToolkit = null;
+ if(toolkit instanceof SunToolkit){
+ sunToolkit = (SunToolkit) toolkit;
}
synchronized (urlImgCache) {
! Image baseImage = sunToolkit == null
! ? toolkit.getImage(url)
! : sunToolkit.getResolutionVariant(url);
!
! if (url == null || namingSchemes.length == 0
! || (baseImage instanceof MultiResolutionImage)) {
! return baseImage;
}
!
! LinkedList<ResolutionVariantItem> rvItems = new LinkedList<>();
! String[] rvNames = getRVNames(url.getPath(), namingSchemes);
!
! for (int i = 0; i < namingSchemes.length; i++) {
! String rvName = rvNames[i];
! URL rvURL;
! try {
! rvURL = new URL(url.getProtocol(), url.getHost(),
! url.getPort(), rvName);
! } catch (Exception e) {
! continue;
! }
! if (imageExists(rvURL)) {
! Image rvImage = sunToolkit == null
! ? toolkit.getImage(rvURL)
! : sunToolkit.getResolutionVariant(rvURL);
! float scale = namingSchemes[i].getScale();
! rvItems.add(new ResolutionVariantItem(rvImage, scale, scale));
! }
! }
!
! if (rvItems.isEmpty()) {
! return baseImage;
! }
!
! rvItems.addFirst(new ResolutionVariantItem(baseImage, 1, 1));
! Image mrImage = new MultiResolutionToolkitImage(baseImage, rvItems);
!
! urlImgCache.put(url.toString(), mrImage);
!
! return mrImage;
! }
! }
!
! private static String[] getRVNames(String fileName,
! MediaResolutionNamingScheme... namingSchemes) {
!
! if (!isValidPath(fileName)) {
! return null;
! }
!
! int slash = fileName.lastIndexOf('/');
! String name = (slash < 0) ? fileName : fileName.substring(slash + 1);
!
! int dot = name.lastIndexOf('.');
! String ext = (dot < 0) ? "" : name.substring(dot);
! name = (dot < 0) ? name : name.substring(0, dot);
! String prefix = (slash < 0) ? name : fileName.substring(0, slash + 1) + name;
!
! String[] rvNames = new String[namingSchemes.length];
!
! for (int i = 0; i < namingSchemes.length; i++) {
! rvNames[i] = prefix + namingSchemes[i].getQualifier() + ext;
! }
!
! return rvNames;
}
+
+ private static boolean isValidPath(String path) {
+ return path != null
+ && !path.isEmpty()
+ && !path.endsWith("/")
+ && !path.endsWith(".");
}
+ private static MediaResolutionNamingScheme[] DEFAULT_NAMING_SCHEME = {
+ new MediaResolutionNamingScheme("@125pct", 1.25f),
+ new MediaResolutionNamingScheme("@150pct", 1.5f),
+ new MediaResolutionNamingScheme("@2x", 2f),
+ new MediaResolutionNamingScheme("@200pct", 2f),
+ new MediaResolutionNamingScheme("@250pct", 2.5f),
+ new MediaResolutionNamingScheme("@3x", 3f),
+ new MediaResolutionNamingScheme("@300pct", 3f)
+ };
+
+ protected MediaResolutionNamingScheme[] getNamingSchemes() {
+ return DEFAULT_NAMING_SCHEME;
+ }
@Override
public Image createImage(String filename) {
checkPermissions(filename);
return createImage(new FileImageSource(filename));
*** 747,761 ****
@Override
public Image createImage(ImageProducer producer) {
return new ToolkitImage(producer);
}
- public static Image createImageWithResolutionVariant(Image image,
- Image resolutionVariant) {
- return new MultiResolutionToolkitImage(image, resolutionVariant);
- }
-
@Override
public int checkImage(Image img, int w, int h, ImageObserver o) {
if (!(img instanceof ToolkitImage)) {
return ImageObserver.ALLBITS;
}
--- 869,878 ----
*** 765,775 ****
if (w == 0 || h == 0) {
repbits = ImageObserver.ALLBITS;
} else {
repbits = tkimg.getImageRep().check(o);
}
! return (tkimg.check(o) | repbits) & checkResolutionVariant(img, w, h, o);
}
@Override
public boolean prepareImage(Image img, int w, int h, ImageObserver o) {
if (w == 0 || h == 0) {
--- 882,892 ----
if (w == 0 || h == 0) {
repbits = ImageObserver.ALLBITS;
} else {
repbits = tkimg.getImageRep().check(o);
}
! return (tkimg.check(o) | repbits) & checkResolutionVariants(img, w, h, o);
}
@Override
public boolean prepareImage(Image img, int w, int h, ImageObserver o) {
if (w == 0 || h == 0) {
*** 788,837 ****
-1, -1, -1, -1);
}
return false;
}
ImageRepresentation ir = tkimg.getImageRep();
! return ir.prepare(o) & prepareResolutionVariant(img, w, h, o);
}
! private int checkResolutionVariant(Image img, int w, int h, ImageObserver o) {
! ToolkitImage rvImage = getResolutionVariant(img);
! int rvw = getRVSize(w);
! int rvh = getRVSize(h);
! // Ignore the resolution variant in case of error
! return (rvImage == null || rvImage.hasError()) ? 0xFFFF :
! checkImage(rvImage, rvw, rvh, MultiResolutionToolkitImage.
! getResolutionVariantObserver(
! img, o, w, h, rvw, rvh, true));
}
! private boolean prepareResolutionVariant(Image img, int w, int h,
! ImageObserver o) {
! ToolkitImage rvImage = getResolutionVariant(img);
! int rvw = getRVSize(w);
! int rvh = getRVSize(h);
! // Ignore the resolution variant in case of error
! return rvImage == null || rvImage.hasError() || prepareImage(
! rvImage, rvw, rvh,
MultiResolutionToolkitImage.getResolutionVariantObserver(
! img, o, w, h, rvw, rvh, true));
}
! private static int getRVSize(int size){
! return size == -1 ? -1 : 2 * size;
! }
! private static ToolkitImage getResolutionVariant(Image image) {
! if (image instanceof MultiResolutionToolkitImage) {
! Image resolutionVariant = ((MultiResolutionToolkitImage) image).
! getResolutionVariant();
! if (resolutionVariant instanceof ToolkitImage) {
! return (ToolkitImage) resolutionVariant;
}
}
! return null;
}
protected static boolean imageCached(String fileName) {
return fileImgCache.containsKey(fileName);
}
--- 905,961 ----
-1, -1, -1, -1);
}
return false;
}
ImageRepresentation ir = tkimg.getImageRep();
! return ir.prepare(o) & prepareResolutionVariants(img, w, h, o);
}
! private int checkResolutionVariants(Image img, int w, int h, ImageObserver o) {
! if (!(img instanceof MultiResolutionToolkitImage)) {
! return 0xFFFF;
}
! List<ResolutionVariantItem> rvItems
! = ((MultiResolutionToolkitImage) img).getResolutionVariantItems();
! return rvItems.stream().map(rvItem -> {
! double scaleX = rvItem.getScaleX();
! double scaleY = rvItem.getScaleY();
! return checkImage(
! rvItem.getImage(),
! getRVSize(w, scaleX),
! getRVSize(h, scaleY),
MultiResolutionToolkitImage.getResolutionVariantObserver(
! img, o, scaleX, scaleY, true));
! }).reduce(0xFFFF , (a, b) -> a & b);
}
! private boolean prepareResolutionVariants(Image img, int w, int h,
! ImageObserver o) {
! if (!(img instanceof MultiResolutionToolkitImage)) {
! return true;
}
+
+ List<ResolutionVariantItem> rvItems
+ = ((MultiResolutionToolkitImage) img).getResolutionVariantItems();
+
+ return rvItems.stream().map(rvItem -> {
+ double scaleX = rvItem.getScaleX();
+ double scaleY = rvItem.getScaleY();
+ return prepareImage(
+ rvItem.getImage(),
+ getRVSize(w, scaleX),
+ getRVSize(h, scaleY),
+ MultiResolutionToolkitImage.getResolutionVariantObserver(
+ img, o, scaleX, scaleY, true));
+ }).reduce(true, (a, b) -> a && b);
}
!
! private static int getRVSize(int size, double scale) {
! return (scale == 1 || size == -1) ? size : (int) Math.ceil(scale * size);
}
protected static boolean imageCached(String fileName) {
return fileImgCache.containsKey(fileName);
}
< prev index next >