6783910: (dav) java.awt.Color.brighter()/darker() methods make color opaque
authordav
Tue, 30 Nov 2010 21:54:55 +0300
changeset 7244 876c9217bc41
parent 7243 4678eab93673
child 7245 a7b2b81bd8bc
child 7492 494fbd1859a1
6783910: (dav) java.awt.Color.brighter()/darker() methods make color opaque Reviewed-by: art, yan
jdk/src/share/classes/java/awt/Color.java
jdk/test/java/awt/Color/OpacityChange/OpacityChange.java
--- a/jdk/src/share/classes/java/awt/Color.java	Tue Nov 30 17:36:56 2010 +0300
+++ b/jdk/src/share/classes/java/awt/Color.java	Tue Nov 30 21:54:55 2010 +0300
@@ -611,12 +611,15 @@
      * <p>
      * This method applies an arbitrary scale factor to each of the three RGB
      * components of this <code>Color</code> to create a brighter version
-     * of this <code>Color</code>. Although <code>brighter</code> and
+     * of this <code>Color</code>.
+     * The {@code alpha} value is preserved.
+     * Although <code>brighter</code> and
      * <code>darker</code> are inverse operations, the results of a
      * series of invocations of these two methods might be inconsistent
      * because of rounding errors.
      * @return     a new <code>Color</code> object that is
-     *                 a brighter version of this <code>Color</code>.
+     *                 a brighter version of this <code>Color</code>
+     *                 with the same {@code alpha} value.
      * @see        java.awt.Color#darker
      * @since      JDK1.0
      */
@@ -624,6 +627,7 @@
         int r = getRed();
         int g = getGreen();
         int b = getBlue();
+        int alpha = getAlpha();
 
         /* From 2D group:
          * 1. black.brighter() should return grey
@@ -632,7 +636,7 @@
          */
         int i = (int)(1.0/(1.0-FACTOR));
         if ( r == 0 && g == 0 && b == 0) {
-           return new Color(i, i, i);
+            return new Color(i, i, i, alpha);
         }
         if ( r > 0 && r < i ) r = i;
         if ( g > 0 && g < i ) g = i;
@@ -640,7 +644,8 @@
 
         return new Color(Math.min((int)(r/FACTOR), 255),
                          Math.min((int)(g/FACTOR), 255),
-                         Math.min((int)(b/FACTOR), 255));
+                         Math.min((int)(b/FACTOR), 255),
+                         alpha);
     }
 
     /**
@@ -649,19 +654,23 @@
      * <p>
      * This method applies an arbitrary scale factor to each of the three RGB
      * components of this <code>Color</code> to create a darker version of
-     * this <code>Color</code>.  Although <code>brighter</code> and
+     * this <code>Color</code>.
+     * The {@code alpha} value is preserved.
+     * Although <code>brighter</code> and
      * <code>darker</code> are inverse operations, the results of a series
      * of invocations of these two methods might be inconsistent because
      * of rounding errors.
      * @return  a new <code>Color</code> object that is
-     *                    a darker version of this <code>Color</code>.
+     *                    a darker version of this <code>Color</code>
+     *                    with the same {@code alpha} value.
      * @see        java.awt.Color#brighter
      * @since      JDK1.0
      */
     public Color darker() {
         return new Color(Math.max((int)(getRed()  *FACTOR), 0),
                          Math.max((int)(getGreen()*FACTOR), 0),
-                         Math.max((int)(getBlue() *FACTOR), 0));
+                         Math.max((int)(getBlue() *FACTOR), 0),
+                         getAlpha());
     }
 
     /**
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Color/OpacityChange/OpacityChange.java	Tue Nov 30 21:54:55 2010 +0300
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2010, 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 6783910
+  @summary java.awt.Color.brighter()/darker() methods make color opaque
+  @author Andrei Dmitriev: area=awt-color
+  @run main OpacityChange
+*/
+
+import java.awt.*;
+
+public class OpacityChange {
+    private final static int INITIAL_ALPHA = 125;
+
+    public static void main(String argv[]) {
+        Color color = new Color(20, 20, 20, INITIAL_ALPHA);
+        System.out.println("Initial alpha: " + color.getAlpha());
+        Color colorBrighter = color.brighter();
+        System.out.println("New alpha (after brighter): " + colorBrighter.getAlpha());
+
+        Color colorDarker = color.darker();
+        System.out.println("New alpha (after darker): " + colorDarker.getAlpha());
+
+
+        if (INITIAL_ALPHA != colorBrighter.getAlpha()) {
+            throw new RuntimeException("Brighter color alpha has changed from : " +INITIAL_ALPHA + " to " + colorBrighter.getAlpha());
+        }
+        if (INITIAL_ALPHA != colorDarker.getAlpha()) {
+            throw new RuntimeException("Darker color alpha has changed from : " +INITIAL_ALPHA + " to " + colorDarker.getAlpha());
+        }
+    }
+}