提交 47aaa327 编写于 作者: S serb

7124525: [macosx] No animation on certain Swing components in Aqua LaF

Reviewed-by: alexsch, swingler
上级 c7e57502
/* /*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -37,7 +37,6 @@ import sun.awt.image.*; ...@@ -37,7 +37,6 @@ import sun.awt.image.*;
import sun.java2d.*; import sun.java2d.*;
import sun.print.*; import sun.print.*;
import apple.laf.*; import apple.laf.*;
import apple.laf.JRSUIConstants.Widget;
import apple.laf.JRSUIUtils.NineSliceMetricsProvider; import apple.laf.JRSUIUtils.NineSliceMetricsProvider;
abstract class AquaPainter <T extends JRSUIState> { abstract class AquaPainter <T extends JRSUIState> {
...@@ -63,7 +62,7 @@ abstract class AquaPainter <T extends JRSUIState> { ...@@ -63,7 +62,7 @@ abstract class AquaPainter <T extends JRSUIState> {
} }
static <T extends JRSUIState> AquaPainter<T> create(final T state, final NineSliceMetricsProvider metricsProvider) { static <T extends JRSUIState> AquaPainter<T> create(final T state, final NineSliceMetricsProvider metricsProvider) {
return new AquaNineSlicingImagePainter<T>(state, metricsProvider); return new AquaNineSlicingImagePainter<>(state, metricsProvider);
} }
abstract void paint(final Graphics2D g, final T stateToPaint, final Component c); abstract void paint(final Graphics2D g, final T stateToPaint, final Component c);
...@@ -71,7 +70,7 @@ abstract class AquaPainter <T extends JRSUIState> { ...@@ -71,7 +70,7 @@ abstract class AquaPainter <T extends JRSUIState> {
final Rectangle boundsRect = new Rectangle(); final Rectangle boundsRect = new Rectangle();
final JRSUIControl control; final JRSUIControl control;
T state; T state;
public AquaPainter(final JRSUIControl control, final T state) { AquaPainter(final JRSUIControl control, final T state) {
this.control = control; this.control = control;
this.state = state; this.state = state;
} }
...@@ -94,14 +93,14 @@ abstract class AquaPainter <T extends JRSUIState> { ...@@ -94,14 +93,14 @@ abstract class AquaPainter <T extends JRSUIState> {
protected final HashMap<T, RecyclableJRSUISlicedImageControl> slicedControlImages; protected final HashMap<T, RecyclableJRSUISlicedImageControl> slicedControlImages;
protected final NineSliceMetricsProvider metricsProvider; protected final NineSliceMetricsProvider metricsProvider;
public AquaNineSlicingImagePainter(final T state) { AquaNineSlicingImagePainter(final T state) {
this(state, null); this(state, null);
} }
public AquaNineSlicingImagePainter(final T state, final NineSliceMetricsProvider metricsProvider) { AquaNineSlicingImagePainter(final T state, final NineSliceMetricsProvider metricsProvider) {
super(new JRSUIControl(false), state); super(new JRSUIControl(false), state);
this.metricsProvider = metricsProvider; this.metricsProvider = metricsProvider;
slicedControlImages = new HashMap<T, RecyclableJRSUISlicedImageControl>(); slicedControlImages = new HashMap<>();
} }
@Override @Override
...@@ -127,7 +126,7 @@ abstract class AquaPainter <T extends JRSUIState> { ...@@ -127,7 +126,7 @@ abstract class AquaPainter <T extends JRSUIState> {
} }
static class AquaSingleImagePainter<T extends JRSUIState> extends AquaPainter<T> { static class AquaSingleImagePainter<T extends JRSUIState> extends AquaPainter<T> {
public AquaSingleImagePainter(final T state) { AquaSingleImagePainter(final T state) {
super(new JRSUIControl(false), state); super(new JRSUIControl(false), state);
} }
...@@ -137,12 +136,12 @@ abstract class AquaPainter <T extends JRSUIState> { ...@@ -137,12 +136,12 @@ abstract class AquaPainter <T extends JRSUIState> {
} }
static void paintFromSingleCachedImage(final Graphics2D g, final JRSUIControl control, final JRSUIState controlState, final Component c, final Rectangle boundsRect) { static void paintFromSingleCachedImage(final Graphics2D g, final JRSUIControl control, final JRSUIState controlState, final Component c, final Rectangle boundsRect) {
Rectangle clipRect = g.getClipBounds(); final Rectangle clipRect = g.getClipBounds();
Rectangle intersection = boundsRect.intersection(clipRect); final Rectangle intersection = boundsRect.intersection(clipRect);
if (intersection.width <= 0 || intersection.height <= 0) return; if (intersection.width <= 0 || intersection.height <= 0) return;
int imgX1 = intersection.x - boundsRect.x; final int imgX1 = intersection.x - boundsRect.x;
int imgY1 = intersection.y - boundsRect.y; final int imgY1 = intersection.y - boundsRect.y;
final GraphicsConfiguration config = g.getDeviceConfiguration(); final GraphicsConfiguration config = g.getDeviceConfiguration();
final ImageCache cache = ImageCache.getInstance(); final ImageCache cache = ImageCache.getInstance();
...@@ -150,19 +149,14 @@ abstract class AquaPainter <T extends JRSUIState> { ...@@ -150,19 +149,14 @@ abstract class AquaPainter <T extends JRSUIState> {
if (image == null) { if (image == null) {
image = new BufferedImage(boundsRect.width, boundsRect.height, BufferedImage.TYPE_INT_ARGB_PRE); image = new BufferedImage(boundsRect.width, boundsRect.height, BufferedImage.TYPE_INT_ARGB_PRE);
cache.setImage(image, config, boundsRect.width, boundsRect.height, controlState); cache.setImage(image, config, boundsRect.width, boundsRect.height, controlState);
} else { final WritableRaster raster = image.getRaster();
g.drawImage(image, intersection.x, intersection.y, intersection.x + intersection.width, intersection.y + intersection.height, final DataBufferInt buffer = (DataBufferInt)raster.getDataBuffer();
imgX1, imgY1, imgX1 + intersection.width, imgY1 + intersection.height, null);
return;
}
final WritableRaster raster = image.getRaster(); control.set(controlState);
final DataBufferInt buffer = (DataBufferInt)raster.getDataBuffer(); control.paint(SunWritableRaster.stealData(buffer, 0),
image.getWidth(), image.getHeight(), 0, 0, boundsRect.width, boundsRect.height);
control.set(controlState); SunWritableRaster.markDirty(buffer);
control.paint(SunWritableRaster.stealData(buffer, 0), }
image.getWidth(), image.getHeight(), 0, 0, boundsRect.width, boundsRect.height);
SunWritableRaster.markDirty(buffer);
g.drawImage(image, intersection.x, intersection.y, intersection.x + intersection.width, intersection.y + intersection.height, g.drawImage(image, intersection.x, intersection.y, intersection.x + intersection.width, intersection.y + intersection.height,
imgX1, imgY1, imgX1 + intersection.width, imgY1 + intersection.height, null); imgX1, imgY1, imgX1 + intersection.width, imgY1 + intersection.height, null);
...@@ -173,7 +167,7 @@ abstract class AquaPainter <T extends JRSUIState> { ...@@ -173,7 +167,7 @@ abstract class AquaPainter <T extends JRSUIState> {
final JRSUIControl control; final JRSUIControl control;
final JRSUIState state; final JRSUIState state;
public RecyclableJRSUISlicedImageControl(final JRSUIControl control, final JRSUIState state, final NineSliceMetrics metrics) { RecyclableJRSUISlicedImageControl(final JRSUIControl control, final JRSUIState state, final NineSliceMetrics metrics) {
super(metrics); super(metrics);
this.control = control; this.control = control;
this.state = state; this.state = state;
......
/* /*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -30,6 +30,7 @@ import java.lang.ref.*; ...@@ -30,6 +30,7 @@ import java.lang.ref.*;
import java.util.*; import java.util.*;
import java.util.concurrent.locks.*; import java.util.concurrent.locks.*;
import apple.laf.JRSUIConstants;
import apple.laf.JRSUIState; import apple.laf.JRSUIState;
import com.apple.laf.AquaUtils.RecyclableSingleton; import com.apple.laf.AquaUtils.RecyclableSingleton;
...@@ -38,9 +39,9 @@ import com.apple.laf.AquaUtils.RecyclableSingleton; ...@@ -38,9 +39,9 @@ import com.apple.laf.AquaUtils.RecyclableSingleton;
* SoftReferences so they will be dropped by the GC if heap memory gets tight. When our size hits max pixel count least * SoftReferences so they will be dropped by the GC if heap memory gets tight. When our size hits max pixel count least
* recently requested images are removed first. * recently requested images are removed first.
*/ */
class ImageCache { final class ImageCache {
// Ordered Map keyed by args hash, ordered by most recent accessed entry. // Ordered Map keyed by args hash, ordered by most recent accessed entry.
private final LinkedHashMap<Integer, PixelCountSoftReference> map = new LinkedHashMap<Integer, PixelCountSoftReference>(16, 0.75f, true); private final LinkedHashMap<Integer, PixelCountSoftReference> map = new LinkedHashMap<>(16, 0.75f, true);
// Maximum number of pixels to cache, this is used if maxCount // Maximum number of pixels to cache, this is used if maxCount
private final int maxPixelCount; private final int maxPixelCount;
...@@ -50,7 +51,7 @@ class ImageCache { ...@@ -50,7 +51,7 @@ class ImageCache {
// Lock for concurrent access to map // Lock for concurrent access to map
private final ReadWriteLock lock = new ReentrantReadWriteLock(); private final ReadWriteLock lock = new ReentrantReadWriteLock();
// Reference queue for tracking lost softreferences to images in the cache // Reference queue for tracking lost softreferences to images in the cache
private final ReferenceQueue<Image> referenceQueue = new ReferenceQueue<Image>(); private final ReferenceQueue<Image> referenceQueue = new ReferenceQueue<>();
// Singleton Instance // Singleton Instance
private static final RecyclableSingleton<ImageCache> instance = new RecyclableSingleton<ImageCache>() { private static final RecyclableSingleton<ImageCache> instance = new RecyclableSingleton<ImageCache>() {
...@@ -63,11 +64,11 @@ class ImageCache { ...@@ -63,11 +64,11 @@ class ImageCache {
return instance.get(); return instance.get();
} }
public ImageCache(final int maxPixelCount) { ImageCache(final int maxPixelCount) {
this.maxPixelCount = maxPixelCount; this.maxPixelCount = maxPixelCount;
} }
public ImageCache() { ImageCache() {
this((8 * 1024 * 1024) / 4); // 8Mb of pixels this((8 * 1024 * 1024) / 4); // 8Mb of pixels
} }
...@@ -99,10 +100,13 @@ class ImageCache { ...@@ -99,10 +100,13 @@ class ImageCache {
* @param config The graphics configuration, needed if cached image is a Volatile Image. Used as part of cache key * @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 w The image width, used as part of cache key
* @param h The image height, used as part of cache key * @param h The image height, used as part of cache key
* @param args Other arguments to use as part of the cache key * @return true if the image could be cached, false otherwise.
* @return true if the image could be cached or false if the image is too big
*/ */
public boolean setImage(final Image image, final GraphicsConfiguration config, final int w, final int h, final JRSUIState state) { 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); final int hash = hash(config, w, h, state);
lock.writeLock().lock(); lock.writeLock().lock();
...@@ -167,7 +171,7 @@ class ImageCache { ...@@ -167,7 +171,7 @@ class ImageCache {
private final int h; private final int h;
private final JRSUIState state; private final JRSUIState state;
public 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) { 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); super(referent, q);
this.pixelCount = pixelCount; this.pixelCount = pixelCount;
this.hash = hash; this.hash = hash;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册