--- a/jdk/src/java.desktop/macosx/classes/sun/font/CFont.java Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/macosx/classes/sun/font/CFont.java Thu Feb 16 13:55:49 2017 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, 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
@@ -211,6 +211,10 @@
ArrayList<String> listOfString = new ArrayList<String>();
getCascadeList(nativeFontPtr, listOfString);
+ // add JRE "Lucida Sans Regular" to the cascade list to enable fallback
+ // to happen to this JRE font in case the intended glyph is missing in
+ // fonts provided in the CoreText provided cascaded list
+ listOfString.add("Lucida Sans Regular");
FontManager fm = FontManagerFactory.getInstance();
int numFonts = 1 + listOfString.size();
PhysicalFont[] fonts = new PhysicalFont[numFonts];
--- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformResponder.java Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformResponder.java Thu Feb 16 13:55:49 2017 -0800
@@ -265,9 +265,8 @@
static class DeltaAccumulator {
- static final double MIN_THRESHOLD = 0.1;
- static final double MAX_THRESHOLD = 0.5;
double accumulatedDelta;
+ boolean accumulate;
int getRoundedDelta(double delta, int scrollPhase) {
@@ -278,25 +277,23 @@
roundDelta = delta > 0 ? 1 : -1;
}
} else { // trackpad
- boolean begin = scrollPhase == NSEvent.SCROLL_PHASE_BEGAN;
- boolean end = scrollPhase == NSEvent.SCROLL_MASK_PHASE_ENDED
- || scrollPhase == NSEvent.SCROLL_MASK_PHASE_CANCELLED;
-
- if (begin) {
+ if (scrollPhase == NSEvent.SCROLL_PHASE_BEGAN) {
accumulatedDelta = 0;
+ accumulate = true;
}
-
- accumulatedDelta += delta;
+ else if (scrollPhase == NSEvent.SCROLL_PHASE_MOMENTUM_BEGAN) {
+ accumulate = true;
+ }
+ if (accumulate) {
- double absAccumulatedDelta = Math.abs(accumulatedDelta);
- if (absAccumulatedDelta > MAX_THRESHOLD) {
+ accumulatedDelta += delta;
+
roundDelta = (int) Math.round(accumulatedDelta);
+
accumulatedDelta -= roundDelta;
- }
- if (end) {
- if (roundDelta == 0 && absAccumulatedDelta > MIN_THRESHOLD) {
- roundDelta = accumulatedDelta > 0 ? 1 : -1;
+ if (scrollPhase == NSEvent.SCROLL_PHASE_ENDED) {
+ accumulate = false;
}
}
}
--- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/NSEvent.java Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/NSEvent.java Thu Feb 16 13:55:49 2017 -0800
@@ -36,8 +36,8 @@
static final int SCROLL_PHASE_UNSUPPORTED = 1;
static final int SCROLL_PHASE_BEGAN = 2;
static final int SCROLL_PHASE_CONTINUED = 3;
- static final int SCROLL_MASK_PHASE_CANCELLED = 4;
- static final int SCROLL_MASK_PHASE_ENDED = 5;
+ static final int SCROLL_PHASE_MOMENTUM_BEGAN = 4;
+ static final int SCROLL_PHASE_ENDED = 5;
private int type;
private int modifierFlags;
--- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTView.m Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTView.m Thu Feb 16 13:55:49 2017 -0800
@@ -381,6 +381,13 @@
} else {
clickCount = [event clickCount];
}
+
+ jdouble deltaX = [event deltaX];
+ jdouble deltaY = [event deltaY];
+ if ([AWTToolkit hasPreciseScrollingDeltas: event]) {
+ deltaX = [event scrollingDeltaX] * 0.1;
+ deltaY = [event scrollingDeltaY] * 0.1;
+ }
static JNF_CLASS_CACHE(jc_NSEvent, "sun/lwawt/macosx/NSEvent");
static JNF_CTOR_CACHE(jctor_NSEvent, jc_NSEvent, "(IIIIIIIIDDI)V");
@@ -391,8 +398,8 @@
[event buttonNumber],
(jint)localPoint.x, (jint)localPoint.y,
(jint)absP.x, (jint)absP.y,
- [event deltaY],
- [event deltaX],
+ deltaY,
+ deltaX,
[AWTToolkit scrollStateWithEvent: event]);
CHECK_NULL(jEvent);
--- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CTrayIcon.m Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CTrayIcon.m Thu Feb 16 13:55:49 2017 -0800
@@ -139,7 +139,14 @@
jint clickCount;
clickCount = [event clickCount];
-
+
+ jdouble deltaX = [event deltaX];
+ jdouble deltaY = [event deltaY];
+ if ([AWTToolkit hasPreciseScrollingDeltas: event]) {
+ deltaX = [event scrollingDeltaX] * 0.1;
+ deltaY = [event scrollingDeltaY] * 0.1;
+ }
+
static JNF_CLASS_CACHE(jc_NSEvent, "sun/lwawt/macosx/NSEvent");
static JNF_CTOR_CACHE(jctor_NSEvent, jc_NSEvent, "(IIIIIIIIDDI)V");
jobject jEvent = JNFNewObject(env, jctor_NSEvent,
@@ -149,8 +156,8 @@
[event buttonNumber],
(jint)localPoint.x, (jint)localPoint.y,
(jint)absP.x, (jint)absP.y,
- [event deltaY],
- [event deltaX],
+ deltaY,
+ deltaX,
[AWTToolkit scrollStateWithEvent: event]);
CHECK_NULL(jEvent);
--- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/LWCToolkit.h Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/LWCToolkit.h Thu Feb 16 13:55:49 2017 -0800
@@ -42,6 +42,7 @@
+ (long) getEventCount;
+ (void) eventCountPlusPlus;
+ (jint) scrollStateWithEvent: (NSEvent*) event;
++ (BOOL) hasPreciseScrollingDeltas: (NSEvent*) event;
@end
/*
--- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/LWCToolkit.m Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/LWCToolkit.m Thu Feb 16 13:55:49 2017 -0800
@@ -47,7 +47,7 @@
#define SCROLL_PHASE_UNSUPPORTED 1
#define SCROLL_PHASE_BEGAN 2
#define SCROLL_PHASE_CONTINUED 3
-#define SCROLL_PHASE_CANCELLED 4
+#define SCROLL_PHASE_MOMENTUM_BEGAN 4
#define SCROLL_PHASE_ENDED 5
int gNumberOfButtons;
@@ -85,16 +85,33 @@
return 0;
}
- NSEventPhase phase = [event phase];
- NSEventPhase momentumPhase = [event momentumPhase];
-
- if (!phase && !momentumPhase) return SCROLL_PHASE_UNSUPPORTED;
- switch (phase) {
- case NSEventPhaseBegan: return SCROLL_PHASE_BEGAN;
- case NSEventPhaseCancelled: return SCROLL_PHASE_CANCELLED;
- case NSEventPhaseEnded: return SCROLL_PHASE_ENDED;
- default: return SCROLL_PHASE_CONTINUED;
+ if ([event phase]) {
+ // process a phase of manual scrolling
+ switch ([event phase]) {
+ case NSEventPhaseBegan: return SCROLL_PHASE_BEGAN;
+ case NSEventPhaseCancelled: return SCROLL_PHASE_ENDED;
+ case NSEventPhaseEnded: return SCROLL_PHASE_ENDED;
+ default: return SCROLL_PHASE_CONTINUED;
+ }
}
+
+ if ([event momentumPhase]) {
+ // process a phase of automatic scrolling
+ switch ([event momentumPhase]) {
+ case NSEventPhaseBegan: return SCROLL_PHASE_MOMENTUM_BEGAN;
+ case NSEventPhaseCancelled: return SCROLL_PHASE_ENDED;
+ case NSEventPhaseEnded: return SCROLL_PHASE_ENDED;
+ default: return SCROLL_PHASE_CONTINUED;
+ }
+ }
+ // phase and momentum phase both are not set
+ return SCROLL_PHASE_UNSUPPORTED;
+}
+
++ (BOOL) hasPreciseScrollingDeltas: (NSEvent*) event {
+ return [event type] == NSScrollWheel
+ && [event respondsToSelector:@selector(hasPreciseScrollingDeltas)]
+ && [event hasPreciseScrollingDeltas];
}
@end
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/bmp/BMPImageReader.java Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/bmp/BMPImageReader.java Thu Feb 16 13:55:49 2017 -0800
@@ -1439,51 +1439,72 @@
decodeRLE8(imSize, padding, values, bdata);
}
+ private boolean copyRLE8ScanlineToDst(int lineNo,
+ byte[] val,
+ byte[] bdata) {
+ // Return value
+ boolean isSuccess = false;
+
+ // Reusing the code to copy 1 row of pixels or scanline to required
+ // destination buffer.
+ if (lineNo >= sourceRegion.y &&
+ lineNo < sourceRegion.y + sourceRegion.height) {
+ if (noTransform) {
+ int pos = lineNo * width;
+ for(int i = 0; i < width; i++)
+ bdata[pos++] = val[i];
+ processImageUpdate(bi, 0, lineNo,
+ destinationRegion.width, 1, 1, 1,
+ new int[]{0});
+ isSuccess = true;
+ } else if ((lineNo - sourceRegion.y) % scaleY == 0) {
+ int lineStride =
+ ((ComponentSampleModel)sampleModel).getScanlineStride();
+ int currentLine = (lineNo - sourceRegion.y) / scaleY +
+ destinationRegion.y;
+ int pos = currentLine * lineStride;
+ pos += destinationRegion.x;
+ for (int i = sourceRegion.x;
+ i < sourceRegion.x + sourceRegion.width;
+ i += scaleX)
+ bdata[pos++] = val[i];
+ processImageUpdate(bi, 0, currentLine,
+ destinationRegion.width, 1, 1, 1,
+ new int[]{0});
+ isSuccess = true;
+ }
+ // Ensure to reset the scanline buffer once the copy is complete.
+ for(int scIndex = 0; scIndex < width; scIndex++) {
+ val[scIndex] = 0;
+ }
+ }
+
+ return isSuccess;
+ }
+
private void decodeRLE8(int imSize,
int padding,
byte[] values,
byte[] bdata) throws IOException {
- byte val[] = new byte[width * height];
+ byte val[] = new byte[width];
int count = 0, l = 0;
int value;
boolean flag = false;
int lineNo = isBottomUp ? height - 1 : 0;
- int lineStride =
- ((ComponentSampleModel)sampleModel).getScanlineStride();
int finished = 0;
- while (count != imSize) {
+ // Ensure image source has sufficient data to decode
+ while ((count + 1) < imSize) {
value = values[count++] & 0xff;
if (value == 0) {
switch(values[count++] & 0xff) {
case 0:
// End-of-scanline marker
- if (lineNo >= sourceRegion.y &&
- lineNo < sourceRegion.y + sourceRegion.height) {
- if (noTransform) {
- int pos = lineNo * width;
- for(int i = 0; i < width; i++)
- bdata[pos++] = val[i];
- processImageUpdate(bi, 0, lineNo,
- destinationRegion.width, 1, 1, 1,
- new int[]{0});
- finished++;
- } else if ((lineNo - sourceRegion.y) % scaleY == 0) {
- int currentLine = (lineNo - sourceRegion.y) / scaleY +
- destinationRegion.y;
- int pos = currentLine * lineStride;
- pos += destinationRegion.x;
- for (int i = sourceRegion.x;
- i < sourceRegion.x + sourceRegion.width;
- i += scaleX)
- bdata[pos++] = val[i];
- processImageUpdate(bi, 0, currentLine,
- destinationRegion.width, 1, 1, 1,
- new int[]{0});
- finished++;
- }
+ // Copy the decoded scanline to destination
+ if (copyRLE8ScanlineToDst(lineNo, val, bdata)) {
+ finished++;
}
processImageProgress(100.0F * finished / destinationRegion.height);
lineNo += isBottomUp ? -1 : 1;
@@ -1492,26 +1513,62 @@
if (abortRequested()) {
flag = true;
}
-
break;
case 1:
// End-of-RLE marker
flag = true;
+
+ // Check if the last decoded scanline was copied to
+ // destination bitmap
+ if (l != 0) {
+ // Copy the decoded scanline to destination
+ if (copyRLE8ScanlineToDst(lineNo, val, bdata)) {
+ finished++;
+ }
+ processImageProgress(100.0F * finished / destinationRegion.height);
+ lineNo += isBottomUp ? -1 : 1;
+ l = 0;
+ }
break;
case 2:
// delta or vector marker
- int xoff = values[count++] & 0xff;
- int yoff = values[count] & 0xff;
- // Move to the position xoff, yoff down
- l += xoff + yoff*width;
+ if ((count+1) < imSize) {
+ int xoff = values[count++] & 0xff;
+ int yoff = values[count++] & 0xff;
+
+ // Check if the yOffset shifts the decoding to another
+ // row. In such cases, the decoded pixels in scanline
+ // buffer-val must be copied to the destination image.
+ if (yoff != 0) {
+ // Copy the decoded scanline to destination
+ if (copyRLE8ScanlineToDst(lineNo, val, bdata)) {
+ finished++;
+ }
+ processImageProgress(100.0F * finished
+ / destinationRegion.height);
+ lineNo += isBottomUp ? -yoff : yoff;
+ }
+
+ // Move to the position xoff, yoff down
+ l += xoff + yoff*width;
+ l %= width;
+ }
break;
default:
int end = values[count-1] & 0xff;
- for (int i=0; i<end; i++) {
- val[l++] = (byte)(values[count++] & 0xff);
+ byte readByte = 0;
+ // Ensure to check if the source index-count, does not
+ // exceed the source image size
+ for (int i=0; (i < end) && (count < imSize); i++) {
+ readByte = (byte)(values[count++] & 0xff);
+ // Ensure to check if scanline index-l, does not
+ // exceed the scanline buffer size (width of image)
+ if (l < width) {
+ val[l++] = readByte;
+ }
}
// Whenever end pixels can fit into odd number of bytes,
@@ -1519,10 +1576,16 @@
if ((end & 1) == 1) {
count++;
}
+ break;
}
} else {
- for (int i=0; i<value; i++) {
- val[l++] = (byte)(values[count] & 0xff);
+ // Encoded mode
+ // Ensure to check if the source index-count, does not
+ // exceed the source image size
+ if (count < imSize) {
+ for (int i=0; (i < value) && (l < width); i++) {
+ val[l++] = (byte)(values[count] & 0xff);
+ }
}
count++;
--- a/jdk/src/java.desktop/share/classes/java/awt/Desktop.java Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/java/awt/Desktop.java Thu Feb 16 13:55:49 2017 -0800
@@ -335,7 +335,7 @@
* most of the platforms support the {@link Desktop.Action#OPEN}
* action. But for a specific file, there may not be an
* application registered to open it. In this case, {@link
- * #isSupported} may return {@code true}, but the corresponding
+ * #isSupported(Action)} may return {@code true}, but the corresponding
* action method will throw an {@link IOException}.
*
* @param action the specified {@link Action}
@@ -720,7 +720,7 @@
* default behavior.
*
* @param aboutHandler the handler to respond to the
- * {@link java.awt.desktop.AboutHandler#handleAbout} )} message
+ * {@link java.awt.desktop.AboutHandler#handleAbout(AboutEvent)} message
*
* @throws SecurityException if a security manager exists and it
* denies the
@@ -828,7 +828,7 @@
* open a URL.
*
* Setting the handler to {@code null} causes all
- * {@link OpenURIHandler#openURI(AppEvent.OpenURIEvent)} requests to be
+ * {@link OpenURIHandler#openURI(OpenURIEvent)} requests to be
* enqueued until another handler is set.
*
* @implNote Please note that for Mac OS, notifications
--- a/jdk/src/java.desktop/share/classes/java/awt/desktop/AppForegroundEvent.java Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/java/awt/desktop/AppForegroundEvent.java Thu Feb 16 13:55:49 2017 -0800
@@ -30,8 +30,8 @@
* Event sent when the application has become the foreground app, and when it is
* no longer the foreground app.
*
- * @see AppForegroundListener#appRaisedToForeground(AppEvent.AppForegroundEvent)
- * @see AppForegroundListener#appMovedToBackground(AppEvent.AppForegroundEvent)
+ * @see AppForegroundListener#appRaisedToForeground(AppForegroundEvent)
+ * @see AppForegroundListener#appMovedToBackground(AppForegroundEvent)
*
* @since 9
*/
--- a/jdk/src/java.desktop/share/classes/java/awt/desktop/AppHiddenEvent.java Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/java/awt/desktop/AppHiddenEvent.java Thu Feb 16 13:55:49 2017 -0800
@@ -29,8 +29,8 @@
/**
* Event sent when the application has been hidden or shown.
*
- * @see AppHiddenListener#appHidden(AppEvent.AppHiddenEvent)
- * @see AppHiddenListener#appUnhidden(AppEvent.AppHiddenEvent)
+ * @see AppHiddenListener#appHidden(AppHiddenEvent)
+ * @see AppHiddenListener#appUnhidden(AppHiddenEvent)
*
* @since 9
*/
--- a/jdk/src/java.desktop/share/classes/java/awt/desktop/AppReopenedEvent.java Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/java/awt/desktop/AppReopenedEvent.java Thu Feb 16 13:55:49 2017 -0800
@@ -29,7 +29,7 @@
/**
* Event sent when the application is asked to re-open itself.
*
- * @see AppReopenedListener#appReopened(AppEvent.AppReopenedEvent)
+ * @see AppReopenedListener#appReopened(AppReopenedEvent)
*
* @since 9
*/
--- a/jdk/src/java.desktop/share/classes/java/awt/desktop/OpenURIEvent.java Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/java/awt/desktop/OpenURIEvent.java Thu Feb 16 13:55:49 2017 -0800
@@ -31,7 +31,7 @@
/**
* Event sent when the app is asked to open a {@code URI}.
*
- * @see OpenURIHandler#openURI(AppEvent.OpenURIEvent)
+ * @see OpenURIHandler#openURI(OpenURIEvent)
*
* @since 9
*/
--- a/jdk/src/java.desktop/share/classes/java/awt/desktop/PrintFilesEvent.java Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/java/awt/desktop/PrintFilesEvent.java Thu Feb 16 13:55:49 2017 -0800
@@ -33,7 +33,7 @@
/**
* Event sent when the app is asked to print a list of files.
*
- * @see PrintFilesHandler#printFiles(AppEvent.PrintFilesEvent)
+ * @see PrintFilesHandler#printFiles(PrintFilesEvent)
* @since 9
*/
public final class PrintFilesEvent extends FilesEvent {
--- a/jdk/src/java.desktop/share/classes/java/awt/desktop/QuitEvent.java Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/java/awt/desktop/QuitEvent.java Thu Feb 16 13:55:49 2017 -0800
@@ -28,7 +28,7 @@
/**
* Event sent when the application is asked to quit.
*
- * @see QuitHandler#handleQuitRequestWith(AppEvent.QuitEvent, QuitResponse)
+ * @see QuitHandler#handleQuitRequestWith(QuitEvent, QuitResponse)
*
* @since 9
*/
--- a/jdk/src/java.desktop/share/classes/java/awt/desktop/ScreenSleepEvent.java Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/java/awt/desktop/ScreenSleepEvent.java Thu Feb 16 13:55:49 2017 -0800
@@ -28,8 +28,8 @@
* Event sent when the displays attached to the system enter and exit power save
* sleep.
*
- * @see ScreenSleepListener#screenAboutToSleep(AppEvent.ScreenSleepEvent)
- * @see ScreenSleepListener#screenAwoke(AppEvent.ScreenSleepEvent)
+ * @see ScreenSleepListener#screenAboutToSleep(ScreenSleepEvent)
+ * @see ScreenSleepListener#screenAwoke(ScreenSleepEvent)
*
* @since 9
*/
--- a/jdk/src/java.desktop/share/classes/java/awt/desktop/SystemSleepEvent.java Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/java/awt/desktop/SystemSleepEvent.java Thu Feb 16 13:55:49 2017 -0800
@@ -28,8 +28,8 @@
/**
* Event sent when the system enters and exits power save sleep.
*
- * @see SystemSleepListener#systemAboutToSleep(AppEvent.SystemSleepEvent)
- * @see SystemSleepListener#systemAwoke(AppEvent.SystemSleepEvent)
+ * @see SystemSleepListener#systemAboutToSleep(SystemSleepEvent)
+ * @see SystemSleepListener#systemAwoke(SystemSleepEvent)
*
* @since 9
*/
--- a/jdk/src/java.desktop/share/classes/java/awt/desktop/UserSessionEvent.java Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/java/awt/desktop/UserSessionEvent.java Thu Feb 16 13:55:49 2017 -0800
@@ -29,8 +29,8 @@
*
* Some systems may provide a reason of a user session change.
*
- * @see UserSessionListener#userSessionActivated(AppEvent.UserSessionEvent)
- * @see UserSessionListener#userSessionDeactivated(AppEvent.UserSessionEvent)
+ * @see UserSessionListener#userSessionActivated(UserSessionEvent)
+ * @see UserSessionListener#userSessionDeactivated(UserSessionEvent)
*
* @since 9
*/
--- a/jdk/src/java.desktop/share/classes/java/awt/image/ColorModel.java Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/java/awt/image/ColorModel.java Thu Feb 16 13:55:49 2017 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2017, 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
@@ -31,10 +31,10 @@
import sun.java2d.cmm.CMSManager;
import sun.java2d.cmm.ColorTransform;
import sun.java2d.cmm.PCMM;
-import java.awt.Toolkit;
import java.util.Collections;
import java.util.Map;
import java.util.WeakHashMap;
+import java.util.Arrays;
/**
* The {@code ColorModel} abstract class encapsulates the
@@ -362,7 +362,14 @@
this.transparency = transparency;
}
- nBits = bits.clone();
+ /*
+ * We need significant bits value only for the length
+ * of number of components, so we truncate remaining part.
+ * It also helps in hashCode calculation since bits[] can contain
+ * different values after the length of number of components between
+ * two ColorModels.
+ */
+ nBits = Arrays.copyOf(bits, numComponents);
this.pixel_bits = pixel_bits;
if (pixel_bits <= 0) {
throw new IllegalArgumentException("Number of pixel bits must "+
@@ -1441,69 +1448,53 @@
}
/**
- * Tests if the specified {@code Object} is an instance of
- * {@code ColorModel} and if it equals this
- * {@code ColorModel}.
- * @param obj the {@code Object} to test for equality
- * @return {@code true} if the specified {@code Object}
- * is an instance of {@code ColorModel} and equals this
- * {@code ColorModel}; {@code false} otherwise.
+ * This method simply delegates to the default implementation in {@code Object}
+ * which is identical to an {@code ==} test since this class cannot enforce the
+ * issues of a proper equality test among multiple independent subclass
+ * branches.
+ * Subclasses are encouraged to override this method and provide equality
+ * testing for their own properties in addition to equality tests for the
+ * following common base properties of {@code ColorModel}:
+ * <ul>
+ * <li>Support for alpha component.</li>
+ * <li>Is alpha premultiplied.</li>
+ * <li>Number of bits per pixel.</li>
+ * <li>Type of transparency like Opaque, Bitmask or Translucent.</li>
+ * <li>Number of components in a pixel.</li>
+ * <li>{@code ColorSpace} type.</li>
+ * <li>Type of the array used to represent pixel values.</li>
+ * <li>Number of significant bits per color and alpha component.</li>
+ * </ul>
+ * @param obj the reference object with which to compare.
+ * @return {@code true} if this object is the same as the obj
+ * argument; {@code false} otherwise.
*/
+ @Override
public boolean equals(Object obj) {
- if (!(obj instanceof ColorModel)) {
- return false;
- }
- ColorModel cm = (ColorModel) obj;
-
- if (this == cm) {
- return true;
- }
- if (supportsAlpha != cm.hasAlpha() ||
- isAlphaPremultiplied != cm.isAlphaPremultiplied() ||
- pixel_bits != cm.getPixelSize() ||
- transparency != cm.getTransparency() ||
- numComponents != cm.getNumComponents())
- {
- return false;
- }
-
- int[] nb = cm.getComponentSize();
-
- if ((nBits != null) && (nb != null)) {
- for (int i = 0; i < numComponents; i++) {
- if (nBits[i] != nb[i]) {
- return false;
- }
- }
- } else {
- return ((nBits == null) && (nb == null));
- }
-
- return true;
+ return super.equals(obj);
}
/**
- * Returns the hash code for this ColorModel.
- *
- * @return a hash code for this ColorModel.
+ * This method simply delegates to the default implementation in {@code Object}
+ * which returns the system ID for the class.
+ * Subclasses are encouraged to override this method and provide a hash
+ * for their own properties in addition to hashing the values of the
+ * following common base properties of {@code ColorModel}:
+ * <ul>
+ * <li>Support for alpha component.</li>
+ * <li>Is alpha premultiplied.</li>
+ * <li>Number of bits per pixel.</li>
+ * <li>Type of transparency like Opaque, Bitmask or Translucent.</li>
+ * <li>Number of components in a pixel.</li>
+ * <li>{@code ColorSpace} type.</li>
+ * <li>Type of the array used to represent pixel values.</li>
+ * <li>Number of significant bits per color and alpha component.</li>
+ * </ul>
+ * @return a hash code value for this object.
*/
+ @Override
public int hashCode() {
-
- int result = 0;
-
- result = (supportsAlpha ? 2 : 3) +
- (isAlphaPremultiplied ? 4 : 5) +
- pixel_bits * 6 +
- transparency * 7 +
- numComponents * 8;
-
- if (nBits != null) {
- for (int i = 0; i < numComponents; i++) {
- result = result + nBits[i] * (i + 9);
- }
- }
-
- return result;
+ return super.hashCode();
}
/**
@@ -1961,4 +1952,4 @@
return lg16Toog16LUT;
}
-}
+}
\ No newline at end of file
--- a/jdk/src/java.desktop/share/classes/java/awt/image/ComponentColorModel.java Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/java/awt/image/ComponentColorModel.java Thu Feb 16 13:55:49 2017 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, 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
@@ -27,6 +27,7 @@
import java.awt.color.ColorSpace;
import java.awt.color.ICC_ColorSpace;
+import java.util.Arrays;
/**
* A {@code ColorModel} class that works with pixel values that
@@ -200,6 +201,7 @@
private float[] diffMinMax;
private float[] compOffset;
private float[] compScale;
+ private volatile int hashCode;
/**
* Constructs a {@code ComponentColorModel} from the specified
@@ -2927,22 +2929,59 @@
}
/**
- * Compares this color model with another for equality.
- *
- * @param obj The object to compare with this color model.
- * @return {@code true} if the color model objects are equal,
- * {@code false} if they are not.
+ * Tests if the specified {@code Object} is an instance
+ * of {@code ComponentColorModel} and equals this
+ * {@code ComponentColorModel}.
+ * @param obj the {@code Object} to test for equality
+ * @return {@code true} if the specified {@code Object}
+ * is an instance of {@code ComponentColorModel} and equals this
+ * {@code ComponentColorModel}; {@code false} otherwise.
*/
+ @Override
public boolean equals(Object obj) {
- if (!super.equals(obj)) {
+ if (!(obj instanceof ComponentColorModel)) {
return false;
}
- if (obj.getClass() != getClass()) {
+ ComponentColorModel cm = (ComponentColorModel) obj;
+ if (supportsAlpha != cm.hasAlpha() ||
+ isAlphaPremultiplied != cm.isAlphaPremultiplied() ||
+ pixel_bits != cm.getPixelSize() ||
+ transparency != cm.getTransparency() ||
+ numComponents != cm.getNumComponents() ||
+ (!(colorSpace.equals(cm.colorSpace))) ||
+ transferType != cm.transferType)
+ {
+ return false;
+ }
+
+ if (!(Arrays.equals(nBits, cm.getComponentSize()))) {
return false;
}
return true;
}
-}
+ /**
+ * Returns the hash code for this ComponentColorModel.
+ *
+ * @return a hash code for this ComponentColorModel.
+ */
+ @Override
+ public int hashCode() {
+ int result = hashCode;
+ if (result == 0) {
+ result = 7;
+ result = 89 * result + this.pixel_bits;
+ result = 89 * result + Arrays.hashCode(this.nBits);
+ result = 89 * result + this.transparency;
+ result = 89 * result + (this.supportsAlpha ? 1 : 0);
+ result = 89 * result + (this.isAlphaPremultiplied ? 1 : 0);
+ result = 89 * result + this.numComponents;
+ result = 89 * result + this.colorSpace.hashCode();
+ result = 89 * result + this.transferType;
+ hashCode = result;
+ }
+ return result;
+ }
+}
\ No newline at end of file
--- a/jdk/src/java.desktop/share/classes/java/awt/image/IndexColorModel.java Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/java/awt/image/IndexColorModel.java Thu Feb 16 13:55:49 2017 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2017, 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
@@ -28,6 +28,7 @@
import java.awt.Transparency;
import java.awt.color.ColorSpace;
import java.math.BigInteger;
+import java.util.Arrays;
/**
* The {@code IndexColorModel} class is a {@code ColorModel}
@@ -129,6 +130,7 @@
private int transparent_index = -1;
private boolean allgrayopaque;
private BigInteger validBits;
+ private volatile int hashCode;
private sun.awt.image.BufImgSurfaceData.ICMColorData colorData = null;
@@ -1532,4 +1534,100 @@
+ " isAlphaPre = "+isAlphaPremultiplied
);
}
-}
+
+ /**
+ * Tests if the specified {@code Object} is an
+ * instance of {@code IndexColorModel}
+ * and if it equals this {@code IndexColorModel}
+ * @param obj the {@code Object} to test for equality
+ * @return {@code true} if the specified {@code Object}
+ * equals this {@code IndexColorModel}; {@code false} otherwise.
+ */
+ @Override
+ public boolean equals(Object obj) {
+
+ if (!(obj instanceof IndexColorModel)) {
+ return false;
+ }
+
+ IndexColorModel cm = (IndexColorModel) obj;
+ if (supportsAlpha != cm.hasAlpha() ||
+ isAlphaPremultiplied != cm.isAlphaPremultiplied() ||
+ pixel_bits != cm.getPixelSize() ||
+ transparency != cm.getTransparency() ||
+ numComponents != cm.getNumComponents() ||
+ (!(colorSpace.equals(cm.colorSpace))) ||
+ transferType != cm.transferType ||
+ map_size != cm.map_size ||
+ transparent_index != cm.transparent_index)
+ {
+ return false;
+ }
+
+ if (!(Arrays.equals(nBits, cm.getComponentSize()))) {
+ return false;
+ }
+
+ // verify whether we have to check equality of all bits in validBits
+ boolean testValidBits;
+ if (validBits == cm.validBits) {
+ testValidBits = false;
+ } else if (validBits == null || cm.validBits == null) {
+ return false;
+ } else if (validBits.equals(cm.validBits)) {
+ testValidBits = false;
+ } else {
+ testValidBits = true;
+ }
+
+ if (testValidBits) {
+ for (int i = 0; i < map_size; i++) {
+ if (rgb[i] != cm.rgb[i] ||
+ validBits.testBit(i) != cm.validBits.testBit(i))
+ {
+ return false;
+ }
+ }
+ } else {
+ for (int i = 0; i < map_size; i++) {
+ if (rgb[i] != cm.rgb[i]) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Returns the hash code for IndexColorModel.
+ *
+ * @return a hash code for IndexColorModel
+ */
+ @Override
+ public int hashCode() {
+ int result = hashCode;
+ if (result == 0) {
+ /*
+ * We are intentionally not calculating hashCode for validBits,
+ * because it is only used for 8-bit indexed screens and they
+ * are very rare. It is very unlikely for 2 IndexColorModels
+ * to have different valiBits and have same value for all
+ * other properties.
+ */
+ result = 7;
+ result = 89 * result + this.pixel_bits;
+ result = 89 * result + Arrays.hashCode(this.nBits);
+ result = 89 * result + this.transparency;
+ result = 89 * result + (this.supportsAlpha ? 1 : 0);
+ result = 89 * result + (this.isAlphaPremultiplied ? 1 : 0);
+ result = 89 * result + this.numComponents;
+ result = 89 * result + this.colorSpace.hashCode();
+ result = 89 * result + this.transferType;
+ result = 89 * result + Arrays.hashCode(this.rgb);
+ result = 89 * result + this.map_size;
+ result = 89 * result + this.transparent_index;
+ hashCode = result;
+ }
+ return result;
+ }
+}
\ No newline at end of file
--- a/jdk/src/java.desktop/share/classes/java/awt/image/PackedColorModel.java Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/java/awt/image/PackedColorModel.java Thu Feb 16 13:55:49 2017 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, 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
@@ -27,6 +27,7 @@
import java.awt.Transparency;
import java.awt.color.ColorSpace;
+import java.util.Arrays;
/**
* The {@code PackedColorModel} class is an abstract
@@ -88,6 +89,7 @@
int[] maskArray;
int[] maskOffsets;
float[] scaleFactors;
+ private volatile int hashCode;
/**
* Constructs a {@code PackedColorModel} from a color mask array,
@@ -393,25 +395,63 @@
* is an instance of {@code PackedColorModel} and equals this
* {@code PackedColorModel}; {@code false} otherwise.
*/
+ @Override
public boolean equals(Object obj) {
if (!(obj instanceof PackedColorModel)) {
return false;
}
- if (!super.equals(obj)) {
+ PackedColorModel cm = (PackedColorModel) obj;
+
+ if (supportsAlpha != cm.hasAlpha() ||
+ isAlphaPremultiplied != cm.isAlphaPremultiplied() ||
+ pixel_bits != cm.getPixelSize() ||
+ transparency != cm.getTransparency() ||
+ numComponents != cm.getNumComponents() ||
+ (!(colorSpace.equals(cm.colorSpace))) ||
+ transferType != cm.transferType)
+ {
return false;
}
- PackedColorModel cm = (PackedColorModel) obj;
int numC = cm.getNumComponents();
for(int i=0; i < numC; i++) {
if (maskArray[i] != cm.getMask(i)) {
return false;
}
}
+
+ if (!(Arrays.equals(nBits, cm.getComponentSize()))) {
+ return false;
+ }
+
return true;
}
+ /**
+ * Returns the hash code for this PackedColorModel.
+ *
+ * @return a hash code for this PackedColorModel.
+ */
+ @Override
+ public int hashCode() {
+ int result = hashCode;
+ if (result == 0) {
+ result = 7;
+ result = 89 * result + this.pixel_bits;
+ result = 89 * result + Arrays.hashCode(this.nBits);
+ result = 89 * result + this.transparency;
+ result = 89 * result + (this.supportsAlpha ? 1 : 0);
+ result = 89 * result + (this.isAlphaPremultiplied ? 1 : 0);
+ result = 89 * result + this.numComponents;
+ result = 89 * result + this.colorSpace.hashCode();
+ result = 89 * result + this.transferType;
+ result = 89 * result + Arrays.hashCode(this.maskArray);
+ hashCode = result;
+ }
+ return result;
+ }
+
private static final int[] createBitsArray(int[]colorMaskArray,
int alphaMask) {
int numColors = colorMaskArray.length;
@@ -480,4 +520,4 @@
return count;
}
-}
+}
\ No newline at end of file
--- a/jdk/src/java.desktop/share/classes/sun/font/CompositeFont.java Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/sun/font/CompositeFont.java Thu Feb 16 13:55:49 2017 -0800
@@ -93,20 +93,25 @@
* better that it is handled internally to the CompositeFont class.
*/
if (fm.getEUDCFont() != null) {
+ int msCnt = numMetricsSlots;
+ int fbCnt = numSlots - msCnt;
numSlots++;
if (componentNames != null) {
componentNames = new String[numSlots];
- System.arraycopy(compNames, 0, componentNames, 0, numSlots-1);
- componentNames[numSlots-1] =
- fm.getEUDCFont().getFontName(null);
+ System.arraycopy(compNames, 0, componentNames, 0, msCnt);
+ componentNames[msCnt] = fm.getEUDCFont().getFontName(null);
+ System.arraycopy(compNames, msCnt,
+ componentNames, msCnt+1, fbCnt);
}
if (componentFileNames != null) {
componentFileNames = new String[numSlots];
System.arraycopy(compFileNames, 0,
- componentFileNames, 0, numSlots-1);
+ componentFileNames, 0, msCnt);
+ System.arraycopy(compFileNames, msCnt,
+ componentFileNames, msCnt+1, fbCnt);
}
components = new PhysicalFont[numSlots];
- components[numSlots-1] = fm.getEUDCFont();
+ components[msCnt] = fm.getEUDCFont();
deferredInitialisation = new boolean[numSlots];
if (defer) {
for (int i=0; i<numSlots-1; i++) {
--- a/jdk/src/java.desktop/share/classes/sun/font/CompositeStrike.java Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/sun/font/CompositeStrike.java Thu Feb 16 13:55:49 2017 -0800
@@ -71,7 +71,9 @@
}
PhysicalStrike getStrikeForSlot(int slot) {
-
+ if (slot >= strikes.length) {
+ slot = 0;
+ }
PhysicalStrike strike = strikes[slot];
if (strike == null) {
strike =
--- a/jdk/src/java.desktop/share/classes/sun/font/ExtendedTextSourceLabel.java Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/sun/font/ExtendedTextSourceLabel.java Thu Feb 16 13:55:49 2017 -0800
@@ -626,7 +626,11 @@
glyphinfo = gv.getGlyphInfo();
}
catch (Exception e) {
- System.out.println(source);
+ if (DEBUG) {
+ System.err.println(source);
+ e.printStackTrace();
+ }
+ glyphinfo = new float[gv.getNumGlyphs() * numvals];
}
int numGlyphs = gv.getNumGlyphs();
@@ -775,7 +779,7 @@
if (gx == gxlimit) {
tgt = charInfo.length / numvals;
} else {
- tgt = indices[gx]-1;
+ tgt = indices[gx];
}
if (DEBUG) {
System.err.println("gx=" + gx + " gxlimit=" + gxlimit +
--- a/jdk/src/java.desktop/share/classes/sun/font/FontFamily.java Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/sun/font/FontFamily.java Thu Feb 16 13:55:49 2017 -0800
@@ -27,6 +27,7 @@
import java.io.File;
import java.awt.Font;
+import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;
@@ -132,6 +133,16 @@
FileFont newFont = (FileFont)font;
File newDir = (new File(newFont.platName)).getParentFile();
+ if (existDir != null) {
+ try {
+ existDir = existDir.getCanonicalFile();
+ } catch (IOException ignored) {}
+ }
+ if (newDir != null) {
+ try {
+ newDir = newDir.getCanonicalFile();
+ } catch (IOException ignored) {}
+ }
return java.util.Objects.equals(newDir, existDir);
}
--- a/jdk/src/java.desktop/share/native/libfontmanager/hb-jdk-font.cc Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/share/native/libfontmanager/hb-jdk-font.cc Thu Feb 16 13:55:49 2017 -0800
@@ -52,6 +52,9 @@
*glyph = (hb_codepoint_t)
env->CallIntMethod(font2D, sunFontIDs.f2dCharToGlyphMID, u);
+ if ((int)*glyph < 0) {
+ *glyph = 0;
+ }
return (*glyph != 0);
}
--- a/jdk/src/java.desktop/windows/classes/sun/awt/Win32GraphicsDevice.java Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/windows/classes/sun/awt/Win32GraphicsDevice.java Thu Feb 16 13:55:49 2017 -0800
@@ -523,9 +523,9 @@
dynamicColorModel = null;
defaultConfig = null;
configs = null;
+ initScaleFactors();
// pass on to all top-level windows on this display
topLevels.notifyListeners();
- initScaleFactors();
}
/**
--- a/jdk/src/java.desktop/windows/classes/sun/awt/windows/WWindowPeer.java Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/windows/classes/sun/awt/windows/WWindowPeer.java Thu Feb 16 13:55:49 2017 -0800
@@ -80,6 +80,8 @@
* WindowStateEvent is posted to the EventQueue.
*/
private WindowListener windowListener;
+ private float scaleX;
+ private float scaleY;
/**
* Initialize JNI field IDs
@@ -190,7 +192,10 @@
// Express our interest in display changes
GraphicsConfiguration gc = getGraphicsConfiguration();
- ((Win32GraphicsDevice)gc.getDevice()).addDisplayChangedListener(this);
+ Win32GraphicsDevice gd = (Win32GraphicsDevice) gc.getDevice();
+ gd.addDisplayChangedListener(this);
+ scaleX = gd.getDefaultScaleX();
+ scaleY = gd.getDefaultScaleY();
initActiveWindowsTracking((Window)target);
@@ -539,6 +544,22 @@
AWTAccessor.getComponentAccessor().
setGraphicsConfiguration((Component)target, winGraphicsConfig);
+
+ checkDPIChange(oldDev, newDev);
+ }
+
+ private void checkDPIChange(Win32GraphicsDevice oldDev,
+ Win32GraphicsDevice newDev) {
+ float newScaleX = newDev.getDefaultScaleX();
+ float newScaleY = newDev.getDefaultScaleY();
+
+ if (scaleX != newScaleX || scaleY != newScaleY) {
+ if (oldDev.getScreen() == newDev.getScreen()) {
+ windowDPIChange(scaleX, scaleY, newScaleX, newScaleY);
+ }
+ scaleX = newScaleX;
+ scaleY = newScaleY;
+ }
}
/**
@@ -781,6 +802,9 @@
}
}
+ native void windowDPIChange(float prevScaleX, float prevScaleY,
+ float newScaleX, float newScaleY);
+
/*
* The method maps the list of the active windows to the window's AppContext,
* then the method registers ActiveWindowListener, GuiDisposedListener listeners;
--- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_Component.cpp Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_Component.cpp Thu Feb 16 13:55:49 2017 -0800
@@ -950,8 +950,11 @@
return 1;
}
-
-void AwtComponent::Reshape(int x, int y, int w, int h)
+void AwtComponent::Reshape(int x, int y, int w, int h) {
+ ReshapeNoScale(ScaleUpX(x), ScaleUpY(y), ScaleUpX(w), ScaleUpY(h));
+}
+
+void AwtComponent::ReshapeNoScale(int x, int y, int w, int h)
{
#if defined(DEBUG)
RECT rc;
@@ -960,11 +963,6 @@
DTRACE_PRINTLN4("AwtComponent::Reshape from %d, %d, %d, %d", rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top);
#endif
- x = ScaleUpX(x);
- y = ScaleUpY(y);
- w = ScaleUpX(w);
- h = ScaleUpY(h);
-
AwtWindow* container = GetContainer();
AwtComponent* parent = GetParent();
if (container != NULL && container == parent) {
--- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_Component.h Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_Component.h Thu Feb 16 13:55:49 2017 -0800
@@ -275,6 +275,7 @@
virtual void Show();
virtual void Hide();
virtual void Reshape(int x, int y, int w, int h);
+ void ReshapeNoScale(int x, int y, int w, int h);
/*
* Fix for 4046446.
--- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_Window.cpp Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_Window.cpp Thu Feb 16 13:55:49 2017 -0800
@@ -153,6 +153,14 @@
jboolean isFSEMState;
};
+// struct for _WindowDPIChange() method
+struct ScaleStruct {
+ jobject window;
+ jfloat prevScaleX;
+ jfloat prevScaleY;
+ jfloat scaleX;
+ jfloat scaleY;
+};
/************************************************************************
* AwtWindow fields
@@ -1753,6 +1761,9 @@
(env)->SetIntField(peer, AwtWindow::sysYID, ScaleDownY(rect.top));
SendComponentEvent(java_awt_event_ComponentEvent_COMPONENT_MOVED);
+ prevX = rect.left;
+ prevY = rect.top;
+
env->DeleteLocalRef(target);
return AwtComponent::WmMove(x, y);
}
@@ -2053,6 +2064,8 @@
int curScrn = GetScreenImOn();
if (curScrn != m_screenNum) { // we've been moved
+ int prevScrn = m_screenNum;
+
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
jclass peerCls = env->GetObjectClass(m_peerObject);
@@ -2068,12 +2081,81 @@
}
env->CallVoidMethod(m_peerObject, draggedID);
+
m_screenNum = curScrn;
+ WindowDPIChange(prevScrn, curScrn);
env->DeleteLocalRef(peerCls);
}
}
+int Disposition(int x1, int x2, int x) {
+ return x < x1 ? -1 : (x > x2 ? 1 : 0);
+}
+
+void AwtWindow::WindowDPIChange(int prevScreen, int screen) {
+ Devices::InstanceAccess devices;
+ AwtWin32GraphicsDevice* prevDevice = devices->GetDevice(prevScreen);
+ AwtWin32GraphicsDevice* device = devices->GetDevice(screen);
+
+ if (prevDevice && device) {
+ RECT prevBounds;
+ RECT bounds;
+
+ if (MonitorBounds(prevDevice->GetMonitor(), &prevBounds)
+ && MonitorBounds(device->GetMonitor(), &bounds)) {
+ int x;
+ int y;
+ int dx;
+ int dy;
+ RECT rect;
+
+ ::GetWindowRect(GetHWnd(), &rect);
+ x = rect.left;
+ y = rect.top;
+ dx = x - prevX;
+ dy = y - prevY;
+
+ if (dx != 0 || dy != 0) {
+ int w = rect.right - rect.left;
+ int h = rect.bottom - rect.top;
+ int dispX = Disposition(prevBounds.left, prevBounds.right,
+ (bounds.left + bounds.right) / 2);
+ int dispY = Disposition(prevBounds.top, prevBounds.bottom,
+ (bounds.top + bounds.bottom) / 2);
+
+ w = w * device->GetScaleX() / prevDevice->GetScaleX();
+ h = h * device->GetScaleY() / prevDevice->GetScaleY();
+
+ prevX = x;
+ prevY = y;
+
+ if (dx != 0 && dispX != 0) {
+ x = dispX > 0 ? bounds.left : bounds.right - w;
+ y = min(y, bounds.top);
+ ReshapeNoScale(x, y, w, h);
+ } else if (dy != 0 && dispY != 0) {
+ x = max(x, bounds.left);
+ y = dispY > 0 ? bounds.top : bounds.bottom - h;
+ ReshapeNoScale(x, y, w, h);
+ }
+ }
+ }
+ }
+}
+
+void AwtWindow::WindowDPIChange(float prevScaleX, float prevScaleY, float scaleX, float scaleY) {
+ int w;
+ int h;
+ RECT rect;
+
+ ::GetWindowRect(GetHWnd(), &rect);
+
+ w = (rect.right - rect.left) * scaleX / prevScaleX;
+ h = (rect.bottom - rect.top) * scaleY / prevScaleY;
+ ReshapeNoScale(rect.left, rect.top, w, h);
+}
+
BOOL AwtWindow::IsFocusableWindow() {
/*
* For Window/Frame/Dialog to accept focus it should:
@@ -3102,6 +3184,29 @@
env->DeleteGlobalRef(self);
}
+
+void AwtWindow::_WindowDPIChange(void* param)
+{
+ JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
+
+ ScaleStruct *ss = (ScaleStruct *)param;
+ jobject self = ss->window;
+ jfloat prevScaleX = ss->prevScaleX;
+ jfloat prevScaleY = ss->prevScaleY;
+ jfloat scaleX = ss->scaleX;
+ jfloat scaleY = ss->scaleY;
+
+ PDATA pData;
+ JNI_CHECK_PEER_GOTO(self, ret);
+ AwtWindow *window = (AwtWindow *)pData;
+
+ window->WindowDPIChange(prevScaleX, prevScaleY, scaleX, scaleY);
+
+ret:
+ env->DeleteGlobalRef(self);
+ delete ss;
+}
+
extern "C" int getSystemMetricValue(int msgType);
extern "C" {
@@ -3800,4 +3905,27 @@
CATCH_BAD_ALLOC;
}
+/*
+* Class: sun_awt_windows_WWindowPeer
+* Method: windowDPIChange
+* Signature: (FFFF)V
+*/
+JNIEXPORT void JNICALL
+Java_sun_awt_windows_WWindowPeer_windowDPIChange(JNIEnv *env, jobject self,
+ jfloat prevScaleX, jfloat prevScaleY, jfloat scaleX, jfloat scaleY)
+{
+ TRY;
+
+ ScaleStruct *ss = new ScaleStruct;
+ ss->window = env->NewGlobalRef(self);
+ ss->prevScaleX = prevScaleX;
+ ss->prevScaleY = prevScaleY;
+ ss->scaleX = scaleX;
+ ss->scaleY = scaleY;
+
+ AwtToolkit::GetInstance().InvokeFunction(AwtWindow::_WindowDPIChange, ss);
+ // global refs and ss are deleted in _WindowDPIChange
+
+ CATCH_BAD_ALLOC;
+}
} /* extern "C" */
--- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_Window.h Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_Window.h Thu Feb 16 13:55:49 2017 -0800
@@ -242,6 +242,7 @@
static void _RepositionSecurityWarning(void* param);
static void _SetFullScreenExclusiveModeState(void* param);
static void _GetNativeWindowSize(void* param);
+ static void _WindowDPIChange(void* param);
inline static BOOL IsResizing() {
return sm_resizing;
@@ -383,8 +384,12 @@
private:
int m_screenNum;
+ int prevX;
+ int prevY;
void InitOwner(AwtWindow *owner);
+ void WindowDPIChange(int prevScreen, int newScreen);
+ void WindowDPIChange(float prevScaleX, float prevScaleY, float scaleX, float scaleY);
Type m_windowType;
void InitType(JNIEnv *env, jobject peer);
--- a/jdk/test/com/sun/java/swing/plaf/windows/WindowsRadioButtonUI/7089914/bug7089914.java Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/test/com/sun/java/swing/plaf/windows/WindowsRadioButtonUI/7089914/bug7089914.java Thu Feb 16 13:55:49 2017 -0800
@@ -26,9 +26,9 @@
*/
/* @test
- * @bug 7089914
+ * @bug 7089914 8174720
* @requires (os.family == "windows")
- * @modules java.desktop/com.sun.java.swing.plaf.windows
+ * @modules java.desktop/com.sun.java.swing.plaf.windows:open
* @summary Focus on image icons are not visible in javaws cache with high contrast mode
* @author Sean Chou
*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Window/WindowResizingOnDPIChanging/WindowResizingOnDPIChangingTest.java Thu Feb 16 13:55:49 2017 -0800
@@ -0,0 +1,278 @@
+/*
+ * Copyright (c) 2017, 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.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.Color;
+import java.awt.FlowLayout;
+import java.awt.Font;
+import java.awt.Frame;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.HeadlessException;
+import java.awt.Image;
+import java.awt.Insets;
+import java.awt.Panel;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.awt.geom.AffineTransform;
+import java.awt.image.AbstractMultiResolutionImage;
+import java.awt.image.BufferedImage;
+import java.awt.image.ImageObserver;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JTextArea;
+import javax.swing.SwingUtilities;
+
+/* @test
+ * @bug 8147440 8147016
+ * @summary HiDPI (Windows): Swing components have incorrect sizes after
+ * changing display resolution
+ * @run main/manual/othervm WindowResizingOnDPIChangingTest
+ */
+public class WindowResizingOnDPIChangingTest {
+
+ private static volatile boolean testResult = false;
+ private static volatile CountDownLatch countDownLatch;
+ private static TestFrame undecoratedFrame;
+ private static TestFrame decoratedFrame;
+ private static JFrame mainFrame;
+
+ private static final String INSTRUCTIONS = "INSTRUCTIONS:\n"
+ + "Verify that window is properly resized after the display DPI updating.\n"
+ + "\n"
+ + "The test is applicable for OSes that allows to change the display DPI\n"
+ + "without the system rebooting (like Windows 8.1 and higher). Press PASS for other\n"
+ + "systems. \n"
+ + "\n"
+ + "1. Set the display DPI size to 192 (DPI scale factor 200%)\n"
+ + "2. Press Show Frames button\n"
+ + "Two frames decorated and undecorated appear.\n"
+ + "3. Check that the string \"scale 2x\" is painted on the windows.\n"
+ + "4. Set the display DPI size to 96 (DPI scale factor 100%)\n"
+ + "5. Check that the string \"scale: 1x\" is painted on the windows.\n"
+ + "6. Check that the windows are properly resized in the same way as native applications\n"
+ + "7. Check that the windows are properly repainted and do not contain drawing artifacts\n"
+ + "If so, press PASS, else press FAIL.\n";
+
+ public static void main(String args[]) throws Exception {
+
+ countDownLatch = new CountDownLatch(1);
+ SwingUtilities.invokeLater(WindowResizingOnDPIChangingTest::createUI);
+ countDownLatch.await(15, TimeUnit.MINUTES);
+ if (!testResult) {
+ throw new RuntimeException("Test fails!");
+ }
+ }
+
+ private static void createUI() {
+
+ mainFrame = new JFrame("DPI change test");
+ GridBagLayout layout = new GridBagLayout();
+ JPanel mainControlPanel = new JPanel(layout);
+ JPanel resultButtonPanel = new JPanel(layout);
+
+ GridBagConstraints gbc = new GridBagConstraints();
+
+ JPanel testPanel = new JPanel(new FlowLayout());
+ JButton frameButton = new JButton("Show Frames");
+ frameButton.addActionListener((e) -> {
+ int x = 20;
+ int y = 10;
+ int w = 400;
+ int h = 300;
+
+ undecoratedFrame = new TestFrame(w, h, true);
+ undecoratedFrame.setLocation(x, y);
+ undecoratedFrame.setVisible(true);
+
+ decoratedFrame = new TestFrame(w, h, false);
+ decoratedFrame.setLocation(x + w + 10, y);
+ decoratedFrame.setVisible(true);
+
+ });
+ testPanel.add(frameButton);
+
+ gbc.gridx = 0;
+ gbc.gridy = 0;
+ gbc.fill = GridBagConstraints.HORIZONTAL;
+ mainControlPanel.add(testPanel, gbc);
+
+ JTextArea instructionTextArea = new JTextArea();
+ instructionTextArea.setText(INSTRUCTIONS);
+ instructionTextArea.setEditable(false);
+ instructionTextArea.setBackground(Color.white);
+
+ gbc.gridx = 0;
+ gbc.gridy = 1;
+ gbc.fill = GridBagConstraints.HORIZONTAL;
+ mainControlPanel.add(instructionTextArea, gbc);
+
+ JButton passButton = new JButton("Pass");
+ passButton.setActionCommand("Pass");
+ passButton.addActionListener((ActionEvent e) -> {
+ testResult = true;
+ disposeFrames();
+ countDownLatch.countDown();
+
+ });
+
+ JButton failButton = new JButton("Fail");
+ failButton.setActionCommand("Fail");
+ failButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ disposeFrames();
+ countDownLatch.countDown();
+ }
+ });
+
+ gbc.gridx = 0;
+ gbc.gridy = 0;
+ resultButtonPanel.add(passButton, gbc);
+
+ gbc.gridx = 1;
+ gbc.gridy = 0;
+ resultButtonPanel.add(failButton, gbc);
+
+ gbc.gridx = 0;
+ gbc.gridy = 2;
+ mainControlPanel.add(resultButtonPanel, gbc);
+
+ mainFrame.add(mainControlPanel);
+ mainFrame.pack();
+
+ mainFrame.addWindowListener(new WindowAdapter() {
+
+ @Override
+ public void windowClosing(WindowEvent e) {
+ disposeFrames();
+ countDownLatch.countDown();
+ }
+ });
+ mainFrame.setVisible(true);
+ }
+
+ private static void disposeFrames() {
+ if (decoratedFrame != null && decoratedFrame.isVisible()) {
+ decoratedFrame.dispose();
+ }
+ if (undecoratedFrame != null && undecoratedFrame.isVisible()) {
+ undecoratedFrame.dispose();
+ }
+ if (mainFrame != null && mainFrame.isVisible()) {
+ mainFrame.dispose();
+ }
+ }
+
+ static class TestFrame extends Frame {
+
+ private final TestMultiResolutionImage mrImage;
+
+ public TestFrame(int width, int height, boolean undecorated) throws HeadlessException {
+ super("Test Frame. Undecorated: " + undecorated);
+ setSize(width, height);
+ mrImage = new TestMultiResolutionImage(width, height);
+
+ setUndecorated(undecorated);
+ Panel panel = new Panel(new FlowLayout()) {
+ @Override
+ public void paint(Graphics g) {
+ super.paint(g);
+ AffineTransform tx = ((Graphics2D) g).getTransform();
+ mrImage.scaleX = tx.getScaleX();
+ mrImage.scaleY = tx.getScaleY();
+ Insets insets = getInsets();
+ g.drawImage(mrImage, insets.left, insets.bottom, null);
+ }
+ };
+ add(panel);
+ }
+ }
+
+ static class TestMultiResolutionImage extends AbstractMultiResolutionImage {
+
+ final int width;
+ final int height;
+ double scaleX;
+ double scaleY;
+
+ public TestMultiResolutionImage(int width, int height) {
+ this.width = width;
+ this.height = height;
+ }
+
+ @Override
+ public int getWidth(ImageObserver observer) {
+ return width;
+ }
+
+ @Override
+ public int getHeight(ImageObserver observer) {
+ return height;
+ }
+
+ @Override
+ protected Image getBaseImage() {
+ return getResolutionVariant(width, height);
+ }
+
+ @Override
+ public Image getResolutionVariant(double destImageWidth, double destImageHeight) {
+
+ int w = (int) destImageWidth;
+ int h = (int) destImageHeight;
+
+ BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
+ Graphics2D g = img.createGraphics();
+ g.scale(scaleX, scaleY);
+ int red = (int) (255 / scaleX);
+ int green = (int) (250 / scaleX);
+ int blue = (int) (20 / scaleX);
+ g.setColor(new Color(red, green, blue));
+ g.fillRect(0, 0, width, height);
+
+ g.setColor(Color.decode("#87CEFA"));
+ Font f = g.getFont();
+ g.setFont(new Font(f.getName(), Font.BOLD, 24));
+ g.drawString(String.format("scales: [%1.2fx, %1.2fx]", scaleX, scaleY),
+ width / 6, height / 2);
+
+ g.dispose();
+ return img;
+ }
+
+ @Override
+ public List<Image> getResolutionVariants() {
+ return Collections.unmodifiableList(Arrays.asList(getBaseImage()));
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Window/WindowResizingOnDPIChanging/WindowResizingOnMovingToAnotherDisplay.java Thu Feb 16 13:55:49 2017 -0800
@@ -0,0 +1,274 @@
+/*
+ * Copyright (c) 2017, 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.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.Color;
+import java.awt.FlowLayout;
+import java.awt.Font;
+import java.awt.Frame;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.HeadlessException;
+import java.awt.Image;
+import java.awt.Insets;
+import java.awt.Panel;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.awt.geom.AffineTransform;
+import java.awt.image.AbstractMultiResolutionImage;
+import java.awt.image.BufferedImage;
+import java.awt.image.ImageObserver;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JTextArea;
+import javax.swing.SwingUtilities;
+
+/* @test
+ * @bug 8147440 8147016
+ * @summary HiDPI (Windows): Swing components have incorrect sizes after
+ * changing display resolution
+ * @run main/manual/othervm WindowResizingOnMovingToAnotherDisplay
+ */
+public class WindowResizingOnMovingToAnotherDisplay {
+
+ private static volatile boolean testResult = false;
+ private static volatile CountDownLatch countDownLatch;
+ private static TestFrame frame;
+ private static JFrame mainFrame;
+
+ private static final String INSTRUCTIONS = "INSTRUCTIONS:\n"
+ + "Verify that a window is properly resized after moving to a display"
+ + " with different DPI.\n"
+ + "\n"
+ + "The test is applicable for a multi-monitor system where displays"
+ + " are configured to have different DPI\n"
+ + "\n"
+ + "1. Press Show Frame button\n"
+ + "The frame appear.\n"
+ + "2. Check that the string \"scales [ScaleX, ScaleY]\" is painted on the window"
+ + " where ScaleX and ScaleY are the scales for current display.\n"
+ + "The scales are calculated as DPI / 96 and are 1 for the DPI value 96"
+ + " and 2 for the DPI value 192.\n"
+ + "3. Move the frame to the second display.\n"
+ + "4. Check that the string \"scales [ScaleX, ScaleY]\" is updated"
+ + " to show the right display scales.\n"
+ + "5. Check that the window is properly resized.\n"
+ + "6. Check that the window is properly repainted and does not contain drawing artifacts\n"
+ + "Try different display positions (left, right, top, bottom).\n"
+ + "If all tests are passed, press PASS, else press FAIL.\n";
+
+ public static void main(String args[]) throws Exception {
+
+ countDownLatch = new CountDownLatch(1);
+ SwingUtilities.invokeLater(WindowResizingOnMovingToAnotherDisplay::createUI);
+ countDownLatch.await(15, TimeUnit.MINUTES);
+ if (!testResult) {
+ throw new RuntimeException("Test fails!");
+ }
+ }
+
+ private static void createUI() {
+
+ mainFrame = new JFrame("DPI change test");
+ GridBagLayout layout = new GridBagLayout();
+ JPanel mainControlPanel = new JPanel(layout);
+ JPanel resultButtonPanel = new JPanel(layout);
+
+ GridBagConstraints gbc = new GridBagConstraints();
+
+ JPanel testPanel = new JPanel(new FlowLayout());
+ JButton frameButton = new JButton("Show Frame");
+ frameButton.addActionListener((e) -> {
+ int x = 20;
+ int y = 10;
+ int w = 400;
+ int h = 300;
+
+ frame = new TestFrame(w, h);
+ frame.setLocation(x, y);
+ frame.setVisible(true);
+
+ });
+ testPanel.add(frameButton);
+
+ gbc.gridx = 0;
+ gbc.gridy = 0;
+ gbc.fill = GridBagConstraints.HORIZONTAL;
+ mainControlPanel.add(testPanel, gbc);
+
+ JTextArea instructionTextArea = new JTextArea();
+ instructionTextArea.setText(INSTRUCTIONS);
+ instructionTextArea.setEditable(false);
+ instructionTextArea.setBackground(Color.white);
+
+ gbc.gridx = 0;
+ gbc.gridy = 1;
+ gbc.fill = GridBagConstraints.HORIZONTAL;
+ mainControlPanel.add(instructionTextArea, gbc);
+
+ JButton passButton = new JButton("Pass");
+ passButton.setActionCommand("Pass");
+ passButton.addActionListener((ActionEvent e) -> {
+ testResult = true;
+ disposeFrames();
+ countDownLatch.countDown();
+
+ });
+
+ JButton failButton = new JButton("Fail");
+ failButton.setActionCommand("Fail");
+ failButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ disposeFrames();
+ countDownLatch.countDown();
+ }
+ });
+
+ gbc.gridx = 0;
+ gbc.gridy = 0;
+ resultButtonPanel.add(passButton, gbc);
+
+ gbc.gridx = 1;
+ gbc.gridy = 0;
+ resultButtonPanel.add(failButton, gbc);
+
+ gbc.gridx = 0;
+ gbc.gridy = 2;
+ mainControlPanel.add(resultButtonPanel, gbc);
+
+ mainFrame.add(mainControlPanel);
+ mainFrame.pack();
+
+ mainFrame.addWindowListener(new WindowAdapter() {
+
+ @Override
+ public void windowClosing(WindowEvent e) {
+ disposeFrames();
+ countDownLatch.countDown();
+ }
+ });
+ mainFrame.setVisible(true);
+ }
+
+ private static void disposeFrames() {
+ if (frame != null && frame.isVisible()) {
+ frame.dispose();
+ }
+
+ if (mainFrame != null && mainFrame.isVisible()) {
+ mainFrame.dispose();
+ }
+ }
+
+ static class TestFrame extends Frame {
+
+ private final TestMultiResolutionImage mrImage;
+
+ public TestFrame(int width, int height) throws HeadlessException {
+ super("Test Frame");
+ setSize(width, height);
+ mrImage = new TestMultiResolutionImage(width, height);
+
+ Panel panel = new Panel(new FlowLayout()) {
+ @Override
+ public void paint(Graphics g) {
+ super.paint(g);
+ AffineTransform tx = ((Graphics2D) g).getTransform();
+ mrImage.scaleX = tx.getScaleX();
+ mrImage.scaleY = tx.getScaleY();
+ Insets insets = getInsets();
+ g.drawImage(mrImage, insets.left, insets.bottom, null);
+ }
+ };
+ add(panel);
+ }
+ }
+
+ static class TestMultiResolutionImage extends AbstractMultiResolutionImage {
+
+ final int width;
+ final int height;
+ double scaleX;
+ double scaleY;
+
+ public TestMultiResolutionImage(int width, int height) {
+ this.width = width;
+ this.height = height;
+ }
+
+ @Override
+ public int getWidth(ImageObserver observer) {
+ return width;
+ }
+
+ @Override
+ public int getHeight(ImageObserver observer) {
+ return height;
+ }
+
+ @Override
+ protected Image getBaseImage() {
+ return getResolutionVariant(width, height);
+ }
+
+ @Override
+ public Image getResolutionVariant(double destImageWidth, double destImageHeight) {
+
+ int w = (int) destImageWidth;
+ int h = (int) destImageHeight;
+
+ BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
+ Graphics2D g = img.createGraphics();
+ g.scale(scaleX, scaleY);
+ int red = (int) (255 / scaleX);
+ int green = (int) (250 / scaleX);
+ int blue = (int) (20 / scaleX);
+ g.setColor(new Color(red, green, blue));
+ g.fillRect(0, 0, width, height);
+
+ g.setColor(Color.decode("#87CEFA"));
+ Font f = g.getFont();
+ g.setFont(new Font(f.getName(), Font.BOLD, 24));
+ g.drawString(String.format("scales: [%1.2fx, %1.2fx]", scaleX, scaleY),
+ width / 6, height / 2);
+
+ g.dispose();
+ return img;
+ }
+
+ @Override
+ public List<Image> getResolutionVariants() {
+ return Collections.unmodifiableList(Arrays.asList(getBaseImage()));
+ }
+ }
+}
--- a/jdk/test/java/awt/appletviewer/IOExceptionIfEncodedURLTest/IOExceptionIfEncodedURLTest.sh Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/test/java/awt/appletviewer/IOExceptionIfEncodedURLTest/IOExceptionIfEncodedURLTest.sh Thu Feb 16 13:55:49 2017 -0800
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2008, 2017, 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
@@ -24,7 +24,7 @@
#!/bin/ksh -p
#
# @test IOExceptionIfEncodedURLTest.sh
-# @bug 6193279 6619458
+# @bug 6193279 6619458 8137087
# @summary REGRESSION: AppletViewer throws IOException when path is encoded URL
# @author Dmitry Cherepanov: area=appletviewer
# @modules java.base/sun.net.www
@@ -56,7 +56,7 @@
#Call this to run the test with a file name
test()
{
- ${TESTJAVA}${FILESEP}bin${FILESEP}appletviewer -Xnosecurity ${URL} > err 2>&1 &
+ "${TESTJAVA}"${FILESEP}bin${FILESEP}appletviewer -Xnosecurity ${URL} > err 2>&1 &
APPLET_ID=$!
sleep 15
kill -9 $APPLET_ID
@@ -134,7 +134,9 @@
DEFAULT_JDK="/cygdrive/c/Program\ Files/Java/jdk1.8.0"
FILESEP="/"
PATHSEP=";"
- TMP=`cd "${SystemRoot}/Temp"; echo ${PWD}`
+ TMP=`cd "${SYSTEMROOT}/Temp"; echo ${PWD}`
+ x="cygpath -m $PWD"
+ PWD=$(eval $x)
;;
AIX )
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/font/Fallback/MissingGlyphTest.java Thu Feb 16 13:55:49 2017 -0800
@@ -0,0 +1,162 @@
+/*
+ * Copyright (c) 2017, 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.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+/*
+ * @test
+ * @bug 8147002
+ * @summary Verifies if Arabic character alef is rendered in osx
+ * @run main/manual MissingGlyphTest
+ */
+import java.awt.Font;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.FlowLayout;
+import java.awt.Graphics;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JTextArea;
+import javax.swing.JComponent;
+import javax.swing.SwingUtilities;
+import javax.swing.WindowConstants;
+
+public class MissingGlyphTest {
+ private static Thread mainThread;
+ private static boolean testPassed;
+ private static boolean testGeneratedInterrupt;
+ private static JFrame frame;
+
+ public static void main(String[] args) throws Exception {
+ if (!System.getProperty("os.name").startsWith("Mac")) {
+ return;
+ }
+ SwingUtilities.invokeAndWait(() -> {
+ doTest(MissingGlyphTest::glyphTest);
+ });
+ mainThread = Thread.currentThread();
+ try {
+ Thread.sleep(180000);
+ } catch (InterruptedException e) {
+ if (!testPassed && testGeneratedInterrupt) {
+ throw new RuntimeException("Alef character is not rendered");
+ }
+ }
+ if (!testGeneratedInterrupt) {
+ throw new RuntimeException("user has not executed the test");
+ }
+ }
+
+ private static void glyphTest() {
+ frame = new JFrame("Test");
+ frame.add(new MyComponent());
+ frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
+ frame.setSize(200, 200);
+ frame.setLocationRelativeTo(null);
+ frame.setVisible(true);
+ }
+
+ public static synchronized void pass() {
+ testPassed = true;
+ testGeneratedInterrupt = true;
+ mainThread.interrupt();
+ }
+
+ public static synchronized void fail() {
+ testPassed = false;
+ testGeneratedInterrupt = true;
+ mainThread.interrupt();
+ }
+
+ private static void doTest(Runnable action) {
+ String description
+ = " The test is supposed to display arabic alef character.\n"
+ + " If it resembles like the one shown in\n "
+ + " www.fileformat.info/info/unicode/char/0627/index.htm\n "
+ + " in Italic style ,press PASS.\n"
+ + " If the glyph is not shown or empty rectangle is shown, press FAIL";
+
+ final JDialog dialog = new JDialog();
+ dialog.setTitle("printBannerTest");
+ JTextArea textArea = new JTextArea(description);
+ textArea.setEditable(false);
+ final JButton testButton = new JButton("Start Test");
+ final JButton passButton = new JButton("PASS");
+ passButton.setEnabled(false);
+ passButton.addActionListener((e) -> {
+ dialog.dispose();
+ frame.dispose();
+ pass();
+ });
+ final JButton failButton = new JButton("FAIL");
+ failButton.setEnabled(false);
+ failButton.addActionListener((e) -> {
+ dialog.dispose();
+ frame.dispose();
+ fail();
+ });
+ testButton.addActionListener((e) -> {
+ testButton.setEnabled(false);
+ action.run();
+ passButton.setEnabled(true);
+ failButton.setEnabled(true);
+ });
+ JPanel mainPanel = new JPanel(new BorderLayout());
+ mainPanel.add(textArea, BorderLayout.CENTER);
+ JPanel buttonPanel = new JPanel(new FlowLayout());
+ buttonPanel.add(testButton);
+ buttonPanel.add(passButton);
+ buttonPanel.add(failButton);
+ mainPanel.add(buttonPanel, BorderLayout.SOUTH);
+ dialog.add(mainPanel);
+ dialog.pack();
+ dialog.setVisible(true);
+ dialog.addWindowListener(new WindowAdapter() {
+ @Override
+ public void windowClosing(WindowEvent e) {
+ System.out.println("main dialog closing");
+ testGeneratedInterrupt = false;
+ mainThread.interrupt();
+ }
+ });
+ }
+}
+
+class MyComponent extends JComponent {
+ private final Font font = new Font("Menlo", Font.ITALIC, 100);
+ private final String text = "\u0627"; // Arabic letter alef
+
+ @Override
+ protected void paintComponent(Graphics g) {
+ if (font.canDisplayUpTo(text) == -1) {
+ g.setColor(Color.black);
+ g.setFont(font);
+ g.drawString(text, 70, 110);
+ }
+ }
+}
+
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/font/TextLayout/HitTest.java Thu Feb 16 13:55:49 2017 -0800
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2017, 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.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+ * @summary verify Hit index with supplementary characters.
+ * @bug 8173028
+ */
+
+import java.awt.Font;
+import java.awt.font.FontRenderContext;
+import java.awt.font.TextHitInfo;
+import java.awt.font.TextLayout;
+
+public class HitTest {
+
+ public static void main(String args[]) {
+ String s = new String(new int[]{0x1d400, 0x61}, 0, 2);
+ Font font = new Font("Dialog", Font.PLAIN, 12);
+ FontRenderContext frc = new FontRenderContext(null, false, false);
+ TextLayout tl = new TextLayout(s, font, frc);
+ TextHitInfo currHit = TextHitInfo.beforeOffset(3);
+ TextHitInfo prevHit = tl.getNextLeftHit(currHit);
+ System.out.println("index=" + prevHit.getCharIndex()+
+ " leading edge=" + prevHit.isLeadingEdge());
+ if (prevHit.getCharIndex() != 2) {
+ throw new RuntimeException("Expected 2 for hit index");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/font/TextLayout/MissingCodePointLayoutTest.java Thu Feb 16 13:55:49 2017 -0800
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2017, 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.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ */
+
+/* @test
+ * @summary Verify no exception for unsupported code point.
+ * @bug 8172967
+ */
+import java.awt.Font;
+import java.awt.font.FontRenderContext;
+import java.awt.font.TextLayout;
+
+public class MissingCodePointLayoutTest {
+ public static void main(String[] args) {
+ Font font = new Font("Tahoma", Font.PLAIN, 12);
+ String text = "\ude00";
+ FontRenderContext frc = new FontRenderContext(null, false, false);
+ TextLayout layout = new TextLayout(text, font, frc);
+ layout.getCaretShapes(0);
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/image/ColorModel/EqualsTest.java Thu Feb 16 13:55:49 2017 -0800
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2017, 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.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 4524500 7107905
+ * @run main EqualsTest
+ * @summary Tests whether ColorModel.equals() succeeds using a
+ * user-implemented subclass of ColorModel which calls the ColorModel(int bits)
+ * constructor. The test fails if an exception is thrown when equals()
+ * is called or if equals() returns an incorrect value.
+ */
+
+import java.awt.image.ColorModel;
+
+public class EqualsTest {
+
+ public static void main(String[] args) {
+ SimpleColorModel scm1 = new SimpleColorModel(3);
+ SimpleColorModel scm2 = new SimpleColorModel(3);
+ SimpleColorModel scm3 = new SimpleColorModel(8);
+ ColorModel rgbcm = ColorModel.getRGBdefault();
+
+ try {
+ if (scm1.equals(scm2)) {
+ throw new RuntimeException("Test 1 failed: " +
+ "scm1 should not equal scm2");
+ }
+
+ if (scm1.equals(scm3)) {
+ throw new RuntimeException("Test 2 failed: " +
+ "scm1 should not equal scm3");
+ }
+
+ if (scm1.equals(rgbcm) || rgbcm.equals(scm1)) {
+ throw new RuntimeException("Test 3 failed: " +
+ "scm1 should not equal rgbcm");
+ }
+ } catch (Exception e) {
+ throw new RuntimeException("Test failed: " + e);
+ }
+ }
+
+ private static class SimpleColorModel extends ColorModel {
+
+ public SimpleColorModel(int bits) {
+ super(bits);
+ }
+
+ public int getRed(int pixel) {
+ return 0;
+ }
+
+ public int getGreen(int pixel) {
+ return 0;
+ }
+
+ public int getBlue(int pixel) {
+ return 0;
+ }
+
+ public int getAlpha(int pixel) {
+ return 0;
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/image/ComponentColorModel/ComponentColorModelEqualsTest.java Thu Feb 16 13:55:49 2017 -0800
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 2017, 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.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 7107905
+ * @summary Test verifies whether equals() and hashCode() methods in
+ * ComponentColorModel works properly.
+ * @run main ComponentColorModelEqualsTest
+ */
+
+import java.awt.Transparency;
+import java.awt.color.ColorSpace;
+import java.awt.image.ComponentColorModel;
+import java.awt.image.DataBuffer;
+
+public class ComponentColorModelEqualsTest {
+
+ private static void verifyEquals(ComponentColorModel m1,
+ ComponentColorModel m2) {
+ if (m1.equals(null)) {
+ throw new RuntimeException("equals(null) returns true");
+ }
+ if (!(m1.equals(m2))) {
+ throw new RuntimeException("equals() method is not working"
+ + " properly");
+ }
+ if (!(m2.equals(m1))) {
+ throw new RuntimeException("equals() method is not working"
+ + " properly");
+ }
+ if (m1.hashCode() != m2.hashCode()) {
+ throw new RuntimeException("HashCode is not same for same"
+ + " ComponentColorModels");
+ }
+ }
+
+ private static void testConstructor1() {
+ /*
+ * verify equality with constructor
+ * ComponentColorModel(ColorSpace colorSpace,
+ * int[] bits,
+ * boolean hasAlpha,
+ * boolean isAlphaPremultiplied,
+ * int transparency,
+ * int transferType)
+ */
+ ComponentColorModel model1 =
+ new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB),
+ new int[] {8, 8, 8},
+ false,
+ false,
+ Transparency.OPAQUE,
+ DataBuffer.TYPE_BYTE);
+ ComponentColorModel model2 =
+ new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB),
+ new int[] {8, 8, 8},
+ false,
+ false,
+ Transparency.OPAQUE,
+ DataBuffer.TYPE_BYTE);
+ verifyEquals(model1, model2);
+ }
+
+ private static void testConstructor2() {
+ /*
+ * verify equality with constructor
+ * ComponentColorModel(ColorSpace colorSpace,
+ * boolean hasAlpha,
+ * boolean isAlphaPremultiplied,
+ * int transparency,
+ * int transferType)
+ */
+ ComponentColorModel model1 =
+ new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB),
+ false,
+ false,
+ Transparency.OPAQUE,
+ DataBuffer.TYPE_BYTE);
+ ComponentColorModel model2 =
+ new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB),
+ false,
+ false,
+ Transparency.OPAQUE,
+ DataBuffer.TYPE_BYTE);
+ verifyEquals(model1, model2);
+ }
+
+ private static void testSameComponentColorModel() {
+ testConstructor1();
+ testConstructor2();
+ }
+ public static void main(String[] args) {
+ // verify ComponentColorModel equality using different constructors.
+ testSameComponentColorModel();
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/image/IndexColorModel/IndexColorModelEqualsTest.java Thu Feb 16 13:55:49 2017 -0800
@@ -0,0 +1,250 @@
+/*
+ * Copyright (c) 2017, 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.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 7107905
+ * @summary Test verifies whether equals() and hashCode() methods in
+ * IndexColorModel works properly for IndexColorModel unique
+ * properties.
+ * @run main IndexColorModelEqualsTest
+ */
+
+import java.awt.image.DataBuffer;
+import java.awt.image.IndexColorModel;
+import java.math.BigInteger;
+
+public class IndexColorModelEqualsTest {
+
+ private static void verifyEquals(IndexColorModel m1,
+ IndexColorModel m2) {
+ if (m1.equals(null)) {
+ throw new RuntimeException("equals(null) returns true");
+ }
+ if (!(m1.equals(m2))) {
+ throw new RuntimeException("equals() method is not working"
+ + " properly");
+ }
+ if (!(m2.equals(m1))) {
+ throw new RuntimeException("equals() method is not working"
+ + " properly");
+ }
+ if (m1.hashCode() != m2.hashCode()) {
+ throw new RuntimeException("HashCode is not same for same"
+ + " IndexColorModels");
+ }
+ }
+
+ private static void testColorMapEquality() {
+ // test with different cmap values.
+ IndexColorModel model1 = new IndexColorModel(8, 3, new int[] {1, 2, 3},
+ 0, true, -1, DataBuffer.TYPE_BYTE);
+ IndexColorModel model2 = new IndexColorModel(8, 3, new int[] {4, 5, 6},
+ 0, true, -1, DataBuffer.TYPE_BYTE);
+ if (model1.equals(model2)) {
+ throw new RuntimeException("equals() method is determining"
+ + " ColorMap equality improperly");
+ }
+ if (model2.equals(model1)) {
+ throw new RuntimeException("equals() method is determining"
+ + " ColorMap equality improperly");
+ }
+ }
+
+ private static void testSizeEquality() {
+ // test with different size for cmap.
+ IndexColorModel model1 = new IndexColorModel(8, 4,
+ new int[] {1, 2, 3, 4},
+ 0, true, -1, DataBuffer.TYPE_BYTE);
+ IndexColorModel model2 = new IndexColorModel(8, 3,
+ new int[] {1, 2, 3},
+ 0, true, -1, DataBuffer.TYPE_BYTE);
+ if (model1.equals(model2)) {
+ throw new RuntimeException("equals() method is determining"
+ + " Map size equality improperly");
+ }
+ if (model2.equals(model1)) {
+ throw new RuntimeException("equals() method is determining"
+ + " Map size equality improperly");
+ }
+ }
+
+ private static void testTransparentIndexEquality() {
+ // test with different values for transparent_index.
+ IndexColorModel model1 = new IndexColorModel(8, 3, new int[] {1, 2, 3},
+ 0, true, 1, DataBuffer.TYPE_BYTE);
+ IndexColorModel model2 = new IndexColorModel(8, 3, new int[] {1, 2, 3},
+ 0, true, 2, DataBuffer.TYPE_BYTE);
+ if (model1.equals(model2)) {
+ throw new RuntimeException("equals() method is determining"
+ + " TransparentIndex equality improperly");
+ }
+ if (model2.equals(model1)) {
+ throw new RuntimeException("equals() method is determining"
+ + " TransparentIndex equality improperly");
+ }
+ }
+
+ private static void testValidPixelsEquality() {
+ // test with different valid pixels.
+ /*
+ * In setRGBs() function of IndexColorModel we override
+ * transparent_index value to map to pixel value if alpha is 0x00
+ * so we should have atleast minimum alpha value to verify
+ * equality of validBits thats why we have color value as
+ * 16777216(2 ^ 24).
+ */
+ int color = 16777216;
+ IndexColorModel model1 = new IndexColorModel(8, 3, new int[] {color,
+ color, color}, 0, DataBuffer.TYPE_BYTE, new BigInteger("1"));
+ IndexColorModel model2 = new IndexColorModel(8, 3, new int[] {color,
+ color, color}, 0, DataBuffer.TYPE_BYTE, new BigInteger("2"));
+ if (model1.equals(model2)) {
+ throw new RuntimeException("equals() method is determining"
+ + " Valid pixels equality improperly");
+ }
+ if (model2.equals(model1)) {
+ throw new RuntimeException("equals() method is determining"
+ + " Valid pixels equality improperly");
+ }
+ }
+
+ private static void testConstructor1() {
+ /*
+ * verify equality with constructor
+ * IndexColorModel(int bits, int size, byte[] r, byte[] g, byte[] b)
+ */
+ IndexColorModel model1 = new IndexColorModel(8, 2,
+ new byte[] {1, 2}, new byte[] {1, 2}, new byte[] {1, 2});
+ IndexColorModel model2 = new IndexColorModel(8, 2,
+ new byte[] {1, 2}, new byte[] {1, 2}, new byte[] {1, 2});
+ verifyEquals(model1, model2);
+ }
+
+ private static void testConstructor2() {
+ /*
+ * verify equality with constructor
+ * IndexColorModel(int bits, int size, byte[] r, byte[] g, byte[] b,
+ * byte[] a)
+ */
+ IndexColorModel model1 = new IndexColorModel(8, 2, new byte[] {1, 2},
+ new byte[] {1, 2}, new byte[] {1, 2}, new byte[] {1, 2});
+ IndexColorModel model2 = new IndexColorModel(8, 2, new byte[] {1, 2},
+ new byte[] {1, 2}, new byte[] {1, 2}, new byte[] {1, 2});
+ verifyEquals(model1, model2);
+ }
+
+ private static void testConstructor3() {
+ /*
+ * verify equality with constructor
+ * IndexColorModel(int bits, int size, byte[] r, byte[] g, byte[] b,
+ * int trans)
+ */
+ IndexColorModel model1 = new IndexColorModel(8, 2, new byte[] {1, 2},
+ new byte[] {1, 2}, new byte[] {1, 2}, 1);
+ IndexColorModel model2 = new IndexColorModel(8, 2, new byte[] {1, 2},
+ new byte[] {1, 2}, new byte[] {1, 2}, 1);
+ verifyEquals(model1, model2);
+ }
+
+ private static void testConstructor4() {
+ /*
+ * verify equality with constructor
+ * IndexColorModel(int bits, int size, byte[] cmap, int start,
+ * boolean hasalpha)
+ */
+ IndexColorModel model1 = new IndexColorModel(8, 1,
+ new byte[] {1, 2, 3, 4}, 0, true);
+ IndexColorModel model2 = new IndexColorModel(8, 1,
+ new byte[] {1, 2, 3, 4}, 0, true);
+ verifyEquals(model1, model2);
+ }
+
+ private static void testConstructor5() {
+ /*
+ * verify equality with constructor
+ * IndexColorModel(int bits, int size, byte[] cmap, int start,
+ * boolean hasalpha, int trans)
+ */
+ IndexColorModel model1 = new IndexColorModel(8, 1,
+ new byte[] {1, 2, 3, 4}, 0, true, 0);
+ IndexColorModel model2 = new IndexColorModel(8, 1,
+ new byte[] {1, 2, 3, 4}, 0, true, 0);
+ verifyEquals(model1, model2);
+ }
+
+ private static void testConstructor6() {
+ /*
+ * verify equality with constructor
+ * IndexColorModel(int bits, int size, int[] cmap, int start,
+ * boolean hasalpha, int trans, int transferType)
+ */
+ IndexColorModel model1 = new IndexColorModel(8, 3, new int[] {1, 2, 3},
+ 0, true, -1, DataBuffer.TYPE_BYTE);
+ IndexColorModel model2 = new IndexColorModel(8, 3, new int[] {1, 2, 3},
+ 0, true, -1, DataBuffer.TYPE_BYTE);
+ verifyEquals(model1, model2);
+ }
+
+ private static void testConstructor7() {
+ /*
+ * verify equality with constructor
+ * IndexColorModel(int bits, int size, int[] cmap, int start,
+ * int transferType, BigInteger validBits)
+ */
+ /*
+ * In setRGBs() function of IndexColorModel we override
+ * transparent_index value to map to pixel value if alpha is 0x00
+ * so we should have atleast minimum alpha value to keep
+ * both model1 and model2 same.
+ */
+ int color = 16777216;
+ IndexColorModel model1 = new IndexColorModel(8, 3, new int[] {color,
+ color, color}, 0, DataBuffer.TYPE_BYTE, new BigInteger("1"));
+ IndexColorModel model2 = new IndexColorModel(8, 3, new int[] {color,
+ color, color}, 0, DataBuffer.TYPE_BYTE, new BigInteger("1"));
+ verifyEquals(model1, model2);
+ }
+
+ private static void testSameIndexColorModel() {
+ testConstructor1();
+ testConstructor2();
+ testConstructor3();
+ testConstructor4();
+ testConstructor5();
+ testConstructor6();
+ testConstructor7();
+ }
+ public static void main(String[] args) {
+ /* test whether equals() method works properly for parameters
+ * unique to IndexColorModel.
+ */
+ testColorMapEquality();
+ testSizeEquality();
+ testTransparentIndexEquality();
+ testValidPixelsEquality();
+ // verify same IndexColorModel equality using different constructors.
+ testSameIndexColorModel();
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/image/PackedColorModel/PackedColorModelEqualsTest.java Thu Feb 16 13:55:49 2017 -0800
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 2017, 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.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 7107905
+ * @summary Test verifies whether equals() and hashCode() methods in
+ * PackedColorModel works properly.
+ * @run main PackedColorModelEqualsTest
+ */
+
+import java.awt.color.ColorSpace;
+import java.awt.image.DataBuffer;
+import java.awt.image.DirectColorModel;
+
+public class PackedColorModelEqualsTest {
+
+ private static void verifyEquals(DirectColorModel m1,
+ DirectColorModel m2) {
+ if (m1.equals(null)) {
+ throw new RuntimeException("equals(null) returns true");
+ }
+ if (!(m1.equals(m2))) {
+ throw new RuntimeException("equals() method is not working"
+ + " properly");
+ }
+ if (!(m2.equals(m1))) {
+ throw new RuntimeException("equals() method is not working"
+ + " properly");
+ }
+ if (m1.hashCode() != m2.hashCode()) {
+ throw new RuntimeException("HashCode is not same for same"
+ + " PackedColorModels");
+ }
+ }
+
+ private static void testMaskArrayEquality() {
+ /*
+ * Test with different maskArray values, since PackedColorModel
+ * is abstract we use subclass DirectColorModel.
+ */
+ DirectColorModel model1 =
+ new DirectColorModel(24, 0x00FF0000, 0x0000FF00, 0x000000FF);
+ DirectColorModel model2 =
+ new DirectColorModel(24, 0x000000FF, 0x0000FF00, 0x00FF0000);
+ if (model1.equals(model2)) {
+ throw new RuntimeException("equals() method is determining"
+ + " ColorMap equality improperly");
+ }
+ if (model2.equals(model1)) {
+ throw new RuntimeException("equals() method is determining"
+ + " ColorMap equality improperly");
+ }
+ }
+
+ private static void testConstructor1() {
+ /*
+ * verify equality with constructor
+ * DirectColorModel(int bits, int rmask, int gmask, int bmask,
+ * int amask)
+ */
+ DirectColorModel model1 =
+ new DirectColorModel(32, 0xFF000000, 0x00FF0000,
+ 0x0000FF00, 0x000000FF);
+ DirectColorModel model2 =
+ new DirectColorModel(32, 0xFF000000, 0x00FF0000,
+ 0x0000FF00, 0x000000FF);
+ verifyEquals(model1, model2);
+ }
+
+ private static void testConstructor2() {
+ /*
+ * verify equality with constructor
+ * DirectColorModel(ColorSpace space, int bits, int rmask, int gmask,
+ * int bmask, int amask, boolean isAlphaPremultiplied, int transferType)
+ */
+ DirectColorModel model1 =
+ new DirectColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB),
+ 32, 0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF,
+ false, DataBuffer.TYPE_BYTE);
+ DirectColorModel model2 =
+ new DirectColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB),
+ 32, 0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF,
+ false, DataBuffer.TYPE_BYTE);
+ verifyEquals(model1, model2);
+ }
+
+ private static void testSamePackedColorModel() {
+ testConstructor1();
+ testConstructor2();
+ }
+ public static void main(String[] args) {
+ // test with different mask array.
+ testMaskArrayEquality();
+ // verify PackedColorModel equality using different constructors.
+ testSamePackedColorModel();
+ }
+}
+
--- a/jdk/test/javax/swing/plaf/basic/BasicScrollPaneUI/8166591/TooMuchWheelRotationEventsTest.java Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/test/javax/swing/plaf/basic/BasicScrollPaneUI/8166591/TooMuchWheelRotationEventsTest.java Thu Feb 16 13:55:49 2017 -0800
@@ -40,7 +40,7 @@
/*
* @test
- * @bug 8166591
+ * @bug 8166591 8173876
* @key headful
* @summary [macos 10.12] Trackpad scrolling of text on OS X 10.12 Sierra
* is very fast (Trackpad, Retina only)
--- a/jdk/test/javax/swing/text/html/StyleSheet/bug4936917.java Fri Feb 17 14:55:35 2017 +0100
+++ b/jdk/test/javax/swing/text/html/StyleSheet/bug4936917.java Thu Feb 16 13:55:49 2017 -0800
@@ -21,7 +21,7 @@
* questions.
*/
/* @test
- @bug 4936917 7190578
+ @bug 4936917 7190578 8174717
@summary Tests if background is correctly painted when <BODY> has css margins
@author Denis Sharypov
@library ../../../regtesthelpers
@@ -72,6 +72,7 @@
blockTillDisplayed(editorPane);
Robot robot = new Robot();
robot.waitForIdle();
+ robot.delay(300);
int x0 = p.x + 15 ;
int y = p.y + 15;