--- a/jdk/src/macosx/classes/com/apple/laf/AquaPainter.java Tue Apr 01 12:38:37 2014 -0700
+++ b/jdk/src/macosx/classes/com/apple/laf/AquaPainter.java Wed Apr 02 15:23:08 2014 +0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2014, 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
@@ -141,39 +141,59 @@
paintFromSingleCachedImage(g, control, stateToPaint, boundsRect);
}
+ /**
+ * Paints a native control, which identified by its size and a set of
+ * additional arguments using a cached image.
+ *
+ * @param g Graphics to draw the control
+ * @param control the reference to the native control
+ * @param controlState the state of the native control
+ * @param bounds the rectangle where the native part should be drawn.
+ * Note: the focus can/will be drawn outside of this bounds.
+ */
static void paintFromSingleCachedImage(final Graphics2D g,
- final JRSUIControl control, final JRSUIState controlState,
- final Rectangle bounds) {
+ final JRSUIControl control,
+ final JRSUIState controlState,
+ final Rectangle bounds) {
if (bounds.width <= 0 || bounds.height <= 0) {
return;
}
+ int focus = 0;
+ if (controlState.is(JRSUIConstants.Focused.YES)) {
+ focus = JRSUIConstants.FOCUS_SIZE;
+ }
+
+ final int imgX = bounds.x - focus;
+ final int imgY = bounds.y - focus;
+ final int imgW = bounds.width + (focus << 1);
+ final int imgH = bounds.height + (focus << 1);
final GraphicsConfiguration config = g.getDeviceConfiguration();
final ImageCache cache = ImageCache.getInstance();
- final int width = bounds.width;
- final int height = bounds.height;
- AquaPixelsKey key = new AquaPixelsKey(config,
- width, height, bounds, controlState);
- Image img = (BufferedImage) cache.getImage(key);
+ final AquaPixelsKey key = new AquaPixelsKey(config, imgW, imgH,
+ bounds, controlState);
+ Image img = cache.getImage(key);
if (img == null) {
- Image baseImage = createImage(width, height, bounds, control,
- controlState);
+ Image baseImage = createImage(imgX, imgY, imgW, imgH, bounds,
+ control, controlState);
img = new MultiResolutionBufferedImage(baseImage,
- (rvWidth, rvHeight) -> createImage(rvWidth, rvHeight,
- bounds, control, controlState));
+ (rvWidth, rvHeight) -> createImage(imgX, imgY,
+ rvWidth, rvHeight, bounds, control, controlState));
if (!controlState.is(JRSUIConstants.Animating.YES)) {
cache.setImage(key, img);
}
}
- g.drawImage(img, bounds.x, bounds.y, bounds.width, bounds.height, null);
+ g.drawImage(img, imgX, imgY, imgW, imgH, null);
}
- private static Image createImage(int imgW, int imgH, final Rectangle bounds,
- final JRSUIControl control, JRSUIState controlState) {
+ private static Image createImage(int imgX, int imgY, int imgW, int imgH,
+ final Rectangle bounds,
+ final JRSUIControl control,
+ JRSUIState controlState) {
BufferedImage img = new BufferedImage(imgW, imgH,
BufferedImage.TYPE_INT_ARGB_PRE);
@@ -181,8 +201,9 @@
final DataBufferInt buffer = (DataBufferInt) raster.getDataBuffer();
control.set(controlState);
- control.paint(SunWritableRaster.stealData(buffer, 0),
- imgW, imgH, 0, 0, bounds.width, bounds.height);
+ control.paint(SunWritableRaster.stealData(buffer, 0), imgW, imgH,
+ bounds.x - imgX, bounds.y - imgY, bounds.width,
+ bounds.height);
SunWritableRaster.markDirty(buffer);
return img;
}
@@ -212,6 +233,7 @@
this.hash = hash();
}
+ @Override
public int getPixelCount() {
return pixelCount;
}