src/macosx/classes/com/apple/laf/ImageCache.java

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this --- 1,7 ---- /* ! * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this
*** 79,115 **** } finally { lock.writeLock().unlock(); } } ! public Image getImage(final GraphicsConfiguration config, final int w, final int h, final JRSUIState state) { lock.readLock().lock(); try { ! final PixelCountSoftReference ref = map.get(hash(config, w, h, state)); ! // check reference has not been lost and the key truly matches, in case of false positive hash match ! if (ref != null && ref.equals(config, w, h, state)) return ref.get(); ! return null; } finally { lock.readLock().unlock(); } } /** * Sets the cached image for the specified constraints. * * @param image The image to store in cache * @param config The graphics configuration, needed if cached image is a Volatile Image. Used as part of cache key * @param w The image width, used as part of cache key * @param h The image height, used as part of cache key * @return true if the image could be cached, false otherwise. */ ! public boolean setImage(final Image image, final GraphicsConfiguration config, final int w, final int h, final JRSUIState state) { if (state.is(JRSUIConstants.Animating.YES)) { return false; } ! final int hash = hash(config, w, h, state); lock.writeLock().lock(); try { PixelCountSoftReference ref = map.get(hash); // check if currently in map --- 79,125 ---- } finally { lock.writeLock().unlock(); } } ! public Image getImage(final GraphicsConfiguration config, final int w, ! final int h, final int scale, ! final JRSUIState state) { ! final int hash = hash(config, w, h, scale, state); ! final PixelCountSoftReference ref; lock.readLock().lock(); try { ! ref = map.get(hash); } finally { lock.readLock().unlock(); } + // check reference has not been lost and the key truly matches, + // in case of false positive hash match + if (ref != null && ref.equals(config, w, h, scale, state)) { + return ref.get(); + } + return null; } /** * Sets the cached image for the specified constraints. * * @param image The image to store in cache * @param config The graphics configuration, needed if cached image is a Volatile Image. Used as part of cache key * @param w The image width, used as part of cache key * @param h The image height, used as part of cache key + * @param scale The image scale factor, used as part of cache key * @return true if the image could be cached, false otherwise. */ ! public boolean setImage(final Image image, ! final GraphicsConfiguration config, final int w, final int h, ! final int scale, final JRSUIState state) { if (state.is(JRSUIConstants.Animating.YES)) { return false; } ! final int hash = hash(config, w, h, scale, state); lock.writeLock().lock(); try { PixelCountSoftReference ref = map.get(hash); // check if currently in map
*** 143,190 **** if (img != null) img.flush(); currentPixelCount -= entry.getValue().pixelCount; } } // finally put new in map ! map.put(hash, new PixelCountSoftReference(image, referenceQueue, newPixelCount, hash, config, w, h, state)); return true; } finally { lock.writeLock().unlock(); } } ! private int hash(final GraphicsConfiguration config, final int w, final int h, final JRSUIState state) { ! int hash = (config != null ? config.hashCode() : 0); hash = 31 * hash + w; hash = 31 * hash + h; hash = 31 * hash + state.hashCode(); return hash; } ! /** Extended SoftReference that stores the pixel count even after the image is lost */ private static class PixelCountSoftReference extends SoftReference<Image> { ! private final int pixelCount; ! private final int hash; // key parts private final GraphicsConfiguration config; private final int w; private final int h; private final JRSUIState state; ! PixelCountSoftReference(final Image referent, final ReferenceQueue<? super Image> q, final int pixelCount, final int hash, final GraphicsConfiguration config, final int w, final int h, final JRSUIState state) { super(referent, q); this.pixelCount = pixelCount; this.hash = hash; this.config = config; this.w = w; this.h = h; this.state = state; } ! public boolean equals(final GraphicsConfiguration config, final int w, final int h, final JRSUIState state) { ! return config == this.config && w == this.w && h == this.h && state.equals(this.state); } } // /** Gets the rendered image for this painter at the requested size, either from cache or create a new one */ // private VolatileImage getImage(GraphicsConfiguration config, JComponent c, int w, int h, Object[] extendedCacheKeys) { --- 153,216 ---- if (img != null) img.flush(); currentPixelCount -= entry.getValue().pixelCount; } } // finally put new in map ! map.put(hash, new PixelCountSoftReference(image, referenceQueue, newPixelCount, hash, config, w, h, scale, state)); return true; } finally { lock.writeLock().unlock(); } } ! private static int hash(final GraphicsConfiguration config, final int w, ! final int h, final int scale, ! final JRSUIState state) { ! int hash = config != null ? config.hashCode() : 0; hash = 31 * hash + w; hash = 31 * hash + h; + hash = 31 * hash + scale; hash = 31 * hash + state.hashCode(); return hash; } ! /** ! * Extended SoftReference that stores the pixel count even after the image ! * is lost. ! */ private static class PixelCountSoftReference extends SoftReference<Image> { ! ! // default access, because access to these fields shouldn't be emulated ! // by a synthetic accessor. ! final int pixelCount; ! final int hash; // key parts private final GraphicsConfiguration config; private final int w; private final int h; + private final int scale; private final JRSUIState state; ! PixelCountSoftReference(final Image referent, ! final ReferenceQueue<? super Image> q, final int pixelCount, ! final int hash, final GraphicsConfiguration config, final int w, ! final int h, final int scale, final JRSUIState state) { super(referent, q); this.pixelCount = pixelCount; this.hash = hash; this.config = config; this.w = w; this.h = h; + this.scale = scale; this.state = state; } ! boolean equals(final GraphicsConfiguration config, final int w, ! final int h, final int scale, final JRSUIState state) { ! return config == this.config && w == this.w && h == this.h ! && scale == this.scale && state.equals(this.state); } } // /** Gets the rendered image for this painter at the requested size, either from cache or create a new one */ // private VolatileImage getImage(GraphicsConfiguration config, JComponent c, int w, int h, Object[] extendedCacheKeys) {