jdk/src/share/classes/java/awt/AlphaComposite.java
changeset 2 90ce3da70b43
child 4955 e99245ecb5b2
equal deleted inserted replaced
0:fd16c54261b3 2:90ce3da70b43
       
     1 /*
       
     2  * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
       
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     4  *
       
     5  * This code is free software; you can redistribute it and/or modify it
       
     6  * under the terms of the GNU General Public License version 2 only, as
       
     7  * published by the Free Software Foundation.  Sun designates this
       
     8  * particular file as subject to the "Classpath" exception as provided
       
     9  * by Sun in the LICENSE file that accompanied this code.
       
    10  *
       
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    14  * version 2 for more details (a copy is included in the LICENSE file that
       
    15  * accompanied this code).
       
    16  *
       
    17  * You should have received a copy of the GNU General Public License version
       
    18  * 2 along with this work; if not, write to the Free Software Foundation,
       
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    20  *
       
    21  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
       
    22  * CA 95054 USA or visit www.sun.com if you need additional information or
       
    23  * have any questions.
       
    24  */
       
    25 
       
    26 package java.awt;
       
    27 
       
    28 import java.awt.image.ColorModel;
       
    29 import sun.java2d.SunCompositeContext;
       
    30 
       
    31 /**
       
    32  * The <code>AlphaComposite</code> class implements basic alpha
       
    33  * compositing rules for combining source and destination colors
       
    34  * to achieve blending and transparency effects with graphics and
       
    35  * images.
       
    36  * The specific rules implemented by this class are the basic set
       
    37  * of 12 rules described in
       
    38  * T. Porter and T. Duff, "Compositing Digital Images", SIGGRAPH 84,
       
    39  * 253-259.
       
    40  * The rest of this documentation assumes some familiarity with the
       
    41  * definitions and concepts outlined in that paper.
       
    42  *
       
    43  * <p>
       
    44  * This class extends the standard equations defined by Porter and
       
    45  * Duff to include one additional factor.
       
    46  * An instance of the <code>AlphaComposite</code> class can contain
       
    47  * an alpha value that is used to modify the opacity or coverage of
       
    48  * every source pixel before it is used in the blending equations.
       
    49  *
       
    50  * <p>
       
    51  * It is important to note that the equations defined by the Porter
       
    52  * and Duff paper are all defined to operate on color components
       
    53  * that are premultiplied by their corresponding alpha components.
       
    54  * Since the <code>ColorModel</code> and <code>Raster</code> classes
       
    55  * allow the storage of pixel data in either premultiplied or
       
    56  * non-premultiplied form, all input data must be normalized into
       
    57  * premultiplied form before applying the equations and all results
       
    58  * might need to be adjusted back to the form required by the destination
       
    59  * before the pixel values are stored.
       
    60  *
       
    61  * <p>
       
    62  * Also note that this class defines only the equations
       
    63  * for combining color and alpha values in a purely mathematical
       
    64  * sense. The accurate application of its equations depends
       
    65  * on the way the data is retrieved from its sources and stored
       
    66  * in its destinations.
       
    67  * See <a href="#caveats">Implementation Caveats</a>
       
    68  * for further information.
       
    69  *
       
    70  * <p>
       
    71  * The following factors are used in the description of the blending
       
    72  * equation in the Porter and Duff paper:
       
    73  *
       
    74  * <blockquote>
       
    75  * <table summary="layout">
       
    76  * <tr><th align=left>Factor&nbsp;&nbsp;<th align=left>Definition
       
    77  * <tr><td><em>A<sub>s</sub></em><td>the alpha component of the source pixel
       
    78  * <tr><td><em>C<sub>s</sub></em><td>a color component of the source pixel in premultiplied form
       
    79  * <tr><td><em>A<sub>d</sub></em><td>the alpha component of the destination pixel
       
    80  * <tr><td><em>C<sub>d</sub></em><td>a color component of the destination pixel in premultiplied form
       
    81  * <tr><td><em>F<sub>s</sub></em><td>the fraction of the source pixel that contributes to the output
       
    82  * <tr><td><em>F<sub>d</sub></em><td>the fraction of the destination pixel that contributes
       
    83  * to the output
       
    84  * <tr><td><em>A<sub>r</sub></em><td>the alpha component of the result
       
    85  * <tr><td><em>C<sub>r</sub></em><td>a color component of the result in premultiplied form
       
    86  * </table>
       
    87  * </blockquote>
       
    88  *
       
    89  * <p>
       
    90  * Using these factors, Porter and Duff define 12 ways of choosing
       
    91  * the blending factors <em>F<sub>s</sub></em> and <em>F<sub>d</sub></em> to
       
    92  * produce each of 12 desirable visual effects.
       
    93  * The equations for determining <em>F<sub>s</sub></em> and <em>F<sub>d</sub></em>
       
    94  * are given in the descriptions of the 12 static fields
       
    95  * that specify visual effects.
       
    96  * For example,
       
    97  * the description for
       
    98  * <a href="#SRC_OVER"><code>SRC_OVER</code></a>
       
    99  * specifies that <em>F<sub>s</sub></em> = 1 and <em>F<sub>d</sub></em> = (1-<em>A<sub>s</sub></em>).
       
   100  * Once a set of equations for determining the blending factors is
       
   101  * known they can then be applied to each pixel to produce a result
       
   102  * using the following set of equations:
       
   103  *
       
   104  * <pre>
       
   105  *      <em>F<sub>s</sub></em> = <em>f</em>(<em>A<sub>d</sub></em>)
       
   106  *      <em>F<sub>d</sub></em> = <em>f</em>(<em>A<sub>s</sub></em>)
       
   107  *      <em>A<sub>r</sub></em> = <em>A<sub>s</sub></em>*<em>F<sub>s</sub></em> + <em>A<sub>d</sub></em>*<em>F<sub>d</sub></em>
       
   108  *      <em>C<sub>r</sub></em> = <em>C<sub>s</sub></em>*<em>F<sub>s</sub></em> + <em>C<sub>d</sub></em>*<em>F<sub>d</sub></em></pre>
       
   109  *
       
   110  * <p>
       
   111  * The following factors will be used to discuss our extensions to
       
   112  * the blending equation in the Porter and Duff paper:
       
   113  *
       
   114  * <blockquote>
       
   115  * <table summary="layout">
       
   116  * <tr><th align=left>Factor&nbsp;&nbsp;<th align=left>Definition
       
   117  * <tr><td><em>C<sub>sr</sub></em> <td>one of the raw color components of the source pixel
       
   118  * <tr><td><em>C<sub>dr</sub></em> <td>one of the raw color components of the destination pixel
       
   119  * <tr><td><em>A<sub>ac</sub></em>  <td>the "extra" alpha component from the AlphaComposite instance
       
   120  * <tr><td><em>A<sub>sr</sub></em> <td>the raw alpha component of the source pixel
       
   121  * <tr><td><em>A<sub>dr</sub></em><td>the raw alpha component of the destination pixel
       
   122  * <tr><td><em>A<sub>df</sub></em> <td>the final alpha component stored in the destination
       
   123  * <tr><td><em>C<sub>df</sub></em> <td>the final raw color component stored in the destination
       
   124  * </table>
       
   125  *</blockquote>
       
   126  *
       
   127  * <h3>Preparing Inputs</h3>
       
   128  *
       
   129  * <p>
       
   130  * The <code>AlphaComposite</code> class defines an additional alpha
       
   131  * value that is applied to the source alpha.
       
   132  * This value is applied as if an implicit SRC_IN rule were first
       
   133  * applied to the source pixel against a pixel with the indicated
       
   134  * alpha by multiplying both the raw source alpha and the raw
       
   135  * source colors by the alpha in the <code>AlphaComposite</code>.
       
   136  * This leads to the following equation for producing the alpha
       
   137  * used in the Porter and Duff blending equation:
       
   138  *
       
   139  * <pre>
       
   140  *      <em>A<sub>s</sub></em> = <em>A<sub>sr</sub></em> * <em>A<sub>ac</sub></em> </pre>
       
   141  *
       
   142  * All of the raw source color components need to be multiplied
       
   143  * by the alpha in the <code>AlphaComposite</code> instance.
       
   144  * Additionally, if the source was not in premultiplied form
       
   145  * then the color components also need to be multiplied by the
       
   146  * source alpha.
       
   147  * Thus, the equation for producing the source color components
       
   148  * for the Porter and Duff equation depends on whether the source
       
   149  * pixels are premultiplied or not:
       
   150  *
       
   151  * <pre>
       
   152  *      <em>C<sub>s</sub></em> = <em>C<sub>sr</sub></em> * <em>A<sub>sr</sub></em> * <em>A<sub>ac</sub></em>     (if source is not premultiplied)
       
   153  *      <em>C<sub>s</sub></em> = <em>C<sub>sr</sub></em> * <em>A<sub>ac</sub></em>           (if source is premultiplied) </pre>
       
   154  *
       
   155  * No adjustment needs to be made to the destination alpha:
       
   156  *
       
   157  * <pre>
       
   158  *      <em>A<sub>d</sub></em> = <em>A<sub>dr</sub></em> </pre>
       
   159  *
       
   160  * <p>
       
   161  * The destination color components need to be adjusted only if
       
   162  * they are not in premultiplied form:
       
   163  *
       
   164  * <pre>
       
   165  *      <em>C<sub>d</sub></em> = <em>C<sub>dr</sub></em> * <em>A<sub>d</sub></em>    (if destination is not premultiplied)
       
   166  *      <em>C<sub>d</sub></em> = <em>C<sub>dr</sub></em>         (if destination is premultiplied) </pre>
       
   167  *
       
   168  * <h3>Applying the Blending Equation</h3>
       
   169  *
       
   170  * <p>
       
   171  * The adjusted <em>A<sub>s</sub></em>, <em>A<sub>d</sub></em>,
       
   172  * <em>C<sub>s</sub></em>, and <em>C<sub>d</sub></em> are used in the standard
       
   173  * Porter and Duff equations to calculate the blending factors
       
   174  * <em>F<sub>s</sub></em> and <em>F<sub>d</sub></em> and then the resulting
       
   175  * premultiplied components <em>A<sub>r</sub></em> and <em>C<sub>r</sub></em>.
       
   176  *
       
   177  * <p>
       
   178  * <h3>Preparing Results</h3>
       
   179  *
       
   180  * <p>
       
   181  * The results only need to be adjusted if they are to be stored
       
   182  * back into a destination buffer that holds data that is not
       
   183  * premultiplied, using the following equations:
       
   184  *
       
   185  * <pre>
       
   186  *      <em>A<sub>df</sub></em> = <em>A<sub>r</sub></em>
       
   187  *      <em>C<sub>df</sub></em> = <em>C<sub>r</sub></em>                 (if dest is premultiplied)
       
   188  *      <em>C<sub>df</sub></em> = <em>C<sub>r</sub></em> / <em>A<sub>r</sub></em>            (if dest is not premultiplied) </pre>
       
   189  *
       
   190  * Note that since the division is undefined if the resulting alpha
       
   191  * is zero, the division in that case is omitted to avoid the "divide
       
   192  * by zero" and the color components are left as
       
   193  * all zeros.
       
   194  *
       
   195  * <p>
       
   196  * <h3>Performance Considerations</h3>
       
   197  *
       
   198  * <p>
       
   199  * For performance reasons, it is preferrable that
       
   200  * <code>Raster</code> objects passed to the <code>compose</code>
       
   201  * method of a {@link CompositeContext} object created by the
       
   202  * <code>AlphaComposite</code> class have premultiplied data.
       
   203  * If either the source <code>Raster</code>
       
   204  * or the destination <code>Raster</code>
       
   205  * is not premultiplied, however,
       
   206  * appropriate conversions are performed before and after the compositing
       
   207  * operation.
       
   208  *
       
   209  * <h3><a name="caveats">Implementation Caveats</a></h3>
       
   210  *
       
   211  * <ul>
       
   212  * <li>
       
   213  * Many sources, such as some of the opaque image types listed
       
   214  * in the <code>BufferedImage</code> class, do not store alpha values
       
   215  * for their pixels.  Such sources supply an alpha of 1.0 for
       
   216  * all of their pixels.
       
   217  *
       
   218  * <p>
       
   219  * <li>
       
   220  * Many destinations also have no place to store the alpha values
       
   221  * that result from the blending calculations performed by this class.
       
   222  * Such destinations thus implicitly discard the resulting
       
   223  * alpha values that this class produces.
       
   224  * It is recommended that such destinations should treat their stored
       
   225  * color values as non-premultiplied and divide the resulting color
       
   226  * values by the resulting alpha value before storing the color
       
   227  * values and discarding the alpha value.
       
   228  *
       
   229  * <p>
       
   230  * <li>
       
   231  * The accuracy of the results depends on the manner in which pixels
       
   232  * are stored in the destination.
       
   233  * An image format that provides at least 8 bits of storage per color
       
   234  * and alpha component is at least adequate for use as a destination
       
   235  * for a sequence of a few to a dozen compositing operations.
       
   236  * An image format with fewer than 8 bits of storage per component
       
   237  * is of limited use for just one or two compositing operations
       
   238  * before the rounding errors dominate the results.
       
   239  * An image format
       
   240  * that does not separately store
       
   241  * color components is not a
       
   242  * good candidate for any type of translucent blending.
       
   243  * For example, <code>BufferedImage.TYPE_BYTE_INDEXED</code>
       
   244  * should not be used as a destination for a blending operation
       
   245  * because every operation
       
   246  * can introduce large errors, due to
       
   247  * the need to choose a pixel from a limited palette to match the
       
   248  * results of the blending equations.
       
   249  *
       
   250  * <p>
       
   251  * <li>
       
   252  * Nearly all formats store pixels as discrete integers rather than
       
   253  * the floating point values used in the reference equations above.
       
   254  * The implementation can either scale the integer pixel
       
   255  * values into floating point values in the range 0.0 to 1.0 or
       
   256  * use slightly modified versions of the equations
       
   257  * that operate entirely in the integer domain and yet produce
       
   258  * analogous results to the reference equations.
       
   259  *
       
   260  * <p>
       
   261  * Typically the integer values are related to the floating point
       
   262  * values in such a way that the integer 0 is equated
       
   263  * to the floating point value 0.0 and the integer
       
   264  * 2^<em>n</em>-1 (where <em>n</em> is the number of bits
       
   265  * in the representation) is equated to 1.0.
       
   266  * For 8-bit representations, this means that 0x00
       
   267  * represents 0.0 and 0xff represents
       
   268  * 1.0.
       
   269  *
       
   270  * <p>
       
   271  * <li>
       
   272  * The internal implementation can approximate some of the equations
       
   273  * and it can also eliminate some steps to avoid unnecessary operations.
       
   274  * For example, consider a discrete integer image with non-premultiplied
       
   275  * alpha values that uses 8 bits per component for storage.
       
   276  * The stored values for a
       
   277  * nearly transparent darkened red might be:
       
   278  *
       
   279  * <pre>
       
   280  *    (A, R, G, B) = (0x01, 0xb0, 0x00, 0x00)</pre>
       
   281  *
       
   282  * <p>
       
   283  * If integer math were being used and this value were being
       
   284  * composited in
       
   285  * <a href="#SRC"><code>SRC</code></a>
       
   286  * mode with no extra alpha, then the math would
       
   287  * indicate that the results were (in integer format):
       
   288  *
       
   289  * <pre>
       
   290  *    (A, R, G, B) = (0x01, 0x01, 0x00, 0x00)</pre>
       
   291  *
       
   292  * <p>
       
   293  * Note that the intermediate values, which are always in premultiplied
       
   294  * form, would only allow the integer red component to be either 0x00
       
   295  * or 0x01.  When we try to store this result back into a destination
       
   296  * that is not premultiplied, dividing out the alpha will give us
       
   297  * very few choices for the non-premultiplied red value.
       
   298  * In this case an implementation that performs the math in integer
       
   299  * space without shortcuts is likely to end up with the final pixel
       
   300  * values of:
       
   301  *
       
   302  * <pre>
       
   303  *    (A, R, G, B) = (0x01, 0xff, 0x00, 0x00)</pre>
       
   304  *
       
   305  * <p>
       
   306  * (Note that 0x01 divided by 0x01 gives you 1.0, which is equivalent
       
   307  * to the value 0xff in an 8-bit storage format.)
       
   308  *
       
   309  * <p>
       
   310  * Alternately, an implementation that uses floating point math
       
   311  * might produce more accurate results and end up returning to the
       
   312  * original pixel value with little, if any, roundoff error.
       
   313  * Or, an implementation using integer math might decide that since
       
   314  * the equations boil down to a virtual NOP on the color values
       
   315  * if performed in a floating point space, it can transfer the
       
   316  * pixel untouched to the destination and avoid all the math entirely.
       
   317  *
       
   318  * <p>
       
   319  * These implementations all attempt to honor the
       
   320  * same equations, but use different tradeoffs of integer and
       
   321  * floating point math and reduced or full equations.
       
   322  * To account for such differences, it is probably best to
       
   323  * expect only that the premultiplied form of the results to
       
   324  * match between implementations and image formats.  In this
       
   325  * case both answers, expressed in premultiplied form would
       
   326  * equate to:
       
   327  *
       
   328  * <pre>
       
   329  *    (A, R, G, B) = (0x01, 0x01, 0x00, 0x00)</pre>
       
   330  *
       
   331  * <p>
       
   332  * and thus they would all match.
       
   333  *
       
   334  * <p>
       
   335  * <li>
       
   336  * Because of the technique of simplifying the equations for
       
   337  * calculation efficiency, some implementations might perform
       
   338  * differently when encountering result alpha values of 0.0
       
   339  * on a non-premultiplied destination.
       
   340  * Note that the simplification of removing the divide by alpha
       
   341  * in the case of the SRC rule is technically not valid if the
       
   342  * denominator (alpha) is 0.
       
   343  * But, since the results should only be expected to be accurate
       
   344  * when viewed in premultiplied form, a resulting alpha of 0
       
   345  * essentially renders the resulting color components irrelevant
       
   346  * and so exact behavior in this case should not be expected.
       
   347  * </ul>
       
   348  * @see Composite
       
   349  * @see CompositeContext
       
   350  */
       
   351 
       
   352 public final class AlphaComposite implements Composite {
       
   353     /**
       
   354      * Both the color and the alpha of the destination are cleared
       
   355      * (Porter-Duff Clear rule).
       
   356      * Neither the source nor the destination is used as input.
       
   357      *<p>
       
   358      * <em>F<sub>s</sub></em> = 0 and <em>F<sub>d</sub></em> = 0, thus:
       
   359      *<pre>
       
   360      *  <em>A<sub>r</sub></em> = 0
       
   361      *  <em>C<sub>r</sub></em> = 0
       
   362      *</pre>
       
   363      */
       
   364     public static final int     CLEAR           = 1;
       
   365 
       
   366     /**
       
   367      * The source is copied to the destination
       
   368      * (Porter-Duff Source rule).
       
   369      * The destination is not used as input.
       
   370      *<p>
       
   371      * <em>F<sub>s</sub></em> = 1 and <em>F<sub>d</sub></em> = 0, thus:
       
   372      *<pre>
       
   373      *  <em>A<sub>r</sub></em> = <em>A<sub>s</sub></em>
       
   374      *  <em>C<sub>r</sub></em> = <em>C<sub>s</sub></em>
       
   375      *</pre>
       
   376      */
       
   377     public static final int     SRC             = 2;
       
   378 
       
   379     /**
       
   380      * The destination is left untouched
       
   381      * (Porter-Duff Destination rule).
       
   382      *<p>
       
   383      * <em>F<sub>s</sub></em> = 0 and <em>F<sub>d</sub></em> = 1, thus:
       
   384      *<pre>
       
   385      *  <em>A<sub>r</sub></em> = <em>A<sub>d</sub></em>
       
   386      *  <em>C<sub>r</sub></em> = <em>C<sub>d</sub></em>
       
   387      *</pre>
       
   388      * @since 1.4
       
   389      */
       
   390     public static final int     DST             = 9;
       
   391     // Note that DST was added in 1.4 so it is numbered out of order...
       
   392 
       
   393     /**
       
   394      * The source is composited over the destination
       
   395      * (Porter-Duff Source Over Destination rule).
       
   396      *<p>
       
   397      * <em>F<sub>s</sub></em> = 1 and <em>F<sub>d</sub></em> = (1-<em>A<sub>s</sub></em>), thus:
       
   398      *<pre>
       
   399      *  <em>A<sub>r</sub></em> = <em>A<sub>s</sub></em> + <em>A<sub>d</sub></em>*(1-<em>A<sub>s</sub></em>)
       
   400      *  <em>C<sub>r</sub></em> = <em>C<sub>s</sub></em> + <em>C<sub>d</sub></em>*(1-<em>A<sub>s</sub></em>)
       
   401      *</pre>
       
   402      */
       
   403     public static final int     SRC_OVER        = 3;
       
   404 
       
   405     /**
       
   406      * The destination is composited over the source and
       
   407      * the result replaces the destination
       
   408      * (Porter-Duff Destination Over Source rule).
       
   409      *<p>
       
   410      * <em>F<sub>s</sub></em> = (1-<em>A<sub>d</sub></em>) and <em>F<sub>d</sub></em> = 1, thus:
       
   411      *<pre>
       
   412      *  <em>A<sub>r</sub></em> = <em>A<sub>s</sub></em>*(1-<em>A<sub>d</sub></em>) + <em>A<sub>d</sub></em>
       
   413      *  <em>C<sub>r</sub></em> = <em>C<sub>s</sub></em>*(1-<em>A<sub>d</sub></em>) + <em>C<sub>d</sub></em>
       
   414      *</pre>
       
   415      */
       
   416     public static final int     DST_OVER        = 4;
       
   417 
       
   418     /**
       
   419      * The part of the source lying inside of the destination replaces
       
   420      * the destination
       
   421      * (Porter-Duff Source In Destination rule).
       
   422      *<p>
       
   423      * <em>F<sub>s</sub></em> = <em>A<sub>d</sub></em> and <em>F<sub>d</sub></em> = 0, thus:
       
   424      *<pre>
       
   425      *  <em>A<sub>r</sub></em> = <em>A<sub>s</sub></em>*<em>A<sub>d</sub></em>
       
   426      *  <em>C<sub>r</sub></em> = <em>C<sub>s</sub></em>*<em>A<sub>d</sub></em>
       
   427      *</pre>
       
   428      */
       
   429     public static final int     SRC_IN          = 5;
       
   430 
       
   431     /**
       
   432      * The part of the destination lying inside of the source
       
   433      * replaces the destination
       
   434      * (Porter-Duff Destination In Source rule).
       
   435      *<p>
       
   436      * <em>F<sub>s</sub></em> = 0 and <em>F<sub>d</sub></em> = <em>A<sub>s</sub></em>, thus:
       
   437      *<pre>
       
   438      *  <em>A<sub>r</sub></em> = <em>A<sub>d</sub></em>*<em>A<sub>s</sub></em>
       
   439      *  <em>C<sub>r</sub></em> = <em>C<sub>d</sub></em>*<em>A<sub>s</sub></em>
       
   440      *</pre>
       
   441      */
       
   442     public static final int     DST_IN          = 6;
       
   443 
       
   444     /**
       
   445      * The part of the source lying outside of the destination
       
   446      * replaces the destination
       
   447      * (Porter-Duff Source Held Out By Destination rule).
       
   448      *<p>
       
   449      * <em>F<sub>s</sub></em> = (1-<em>A<sub>d</sub></em>) and <em>F<sub>d</sub></em> = 0, thus:
       
   450      *<pre>
       
   451      *  <em>A<sub>r</sub></em> = <em>A<sub>s</sub></em>*(1-<em>A<sub>d</sub></em>)
       
   452      *  <em>C<sub>r</sub></em> = <em>C<sub>s</sub></em>*(1-<em>A<sub>d</sub></em>)
       
   453      *</pre>
       
   454      */
       
   455     public static final int     SRC_OUT         = 7;
       
   456 
       
   457     /**
       
   458      * The part of the destination lying outside of the source
       
   459      * replaces the destination
       
   460      * (Porter-Duff Destination Held Out By Source rule).
       
   461      *<p>
       
   462      * <em>F<sub>s</sub></em> = 0 and <em>F<sub>d</sub></em> = (1-<em>A<sub>s</sub></em>), thus:
       
   463      *<pre>
       
   464      *  <em>A<sub>r</sub></em> = <em>A<sub>d</sub></em>*(1-<em>A<sub>s</sub></em>)
       
   465      *  <em>C<sub>r</sub></em> = <em>C<sub>d</sub></em>*(1-<em>A<sub>s</sub></em>)
       
   466      *</pre>
       
   467      */
       
   468     public static final int     DST_OUT         = 8;
       
   469 
       
   470     // Rule 9 is DST which is defined above where it fits into the
       
   471     // list logically, rather than numerically
       
   472     //
       
   473     // public static final int  DST             = 9;
       
   474 
       
   475     /**
       
   476      * The part of the source lying inside of the destination
       
   477      * is composited onto the destination
       
   478      * (Porter-Duff Source Atop Destination rule).
       
   479      *<p>
       
   480      * <em>F<sub>s</sub></em> = <em>A<sub>d</sub></em> and <em>F<sub>d</sub></em> = (1-<em>A<sub>s</sub></em>), thus:
       
   481      *<pre>
       
   482      *  <em>A<sub>r</sub></em> = <em>A<sub>s</sub></em>*<em>A<sub>d</sub></em> + <em>A<sub>d</sub></em>*(1-<em>A<sub>s</sub></em>) = <em>A<sub>d</sub></em>
       
   483      *  <em>C<sub>r</sub></em> = <em>C<sub>s</sub></em>*<em>A<sub>d</sub></em> + <em>C<sub>d</sub></em>*(1-<em>A<sub>s</sub></em>)
       
   484      *</pre>
       
   485      * @since 1.4
       
   486      */
       
   487     public static final int     SRC_ATOP        = 10;
       
   488 
       
   489     /**
       
   490      * The part of the destination lying inside of the source
       
   491      * is composited over the source and replaces the destination
       
   492      * (Porter-Duff Destination Atop Source rule).
       
   493      *<p>
       
   494      * <em>F<sub>s</sub></em> = (1-<em>A<sub>d</sub></em>) and <em>F<sub>d</sub></em> = <em>A<sub>s</sub></em>, thus:
       
   495      *<pre>
       
   496      *  <em>A<sub>r</sub></em> = <em>A<sub>s</sub></em>*(1-<em>A<sub>d</sub></em>) + <em>A<sub>d</sub></em>*<em>A<sub>s</sub></em> = <em>A<sub>s</sub></em>
       
   497      *  <em>C<sub>r</sub></em> = <em>C<sub>s</sub></em>*(1-<em>A<sub>d</sub></em>) + <em>C<sub>d</sub></em>*<em>A<sub>s</sub></em>
       
   498      *</pre>
       
   499      * @since 1.4
       
   500      */
       
   501     public static final int     DST_ATOP        = 11;
       
   502 
       
   503     /**
       
   504      * The part of the source that lies outside of the destination
       
   505      * is combined with the part of the destination that lies outside
       
   506      * of the source
       
   507      * (Porter-Duff Source Xor Destination rule).
       
   508      *<p>
       
   509      * <em>F<sub>s</sub></em> = (1-<em>A<sub>d</sub></em>) and <em>F<sub>d</sub></em> = (1-<em>A<sub>s</sub></em>), thus:
       
   510      *<pre>
       
   511      *  <em>A<sub>r</sub></em> = <em>A<sub>s</sub></em>*(1-<em>A<sub>d</sub></em>) + <em>A<sub>d</sub></em>*(1-<em>A<sub>s</sub></em>)
       
   512      *  <em>C<sub>r</sub></em> = <em>C<sub>s</sub></em>*(1-<em>A<sub>d</sub></em>) + <em>C<sub>d</sub></em>*(1-<em>A<sub>s</sub></em>)
       
   513      *</pre>
       
   514      * @since 1.4
       
   515      */
       
   516     public static final int     XOR             = 12;
       
   517 
       
   518     /**
       
   519      * <code>AlphaComposite</code> object that implements the opaque CLEAR rule
       
   520      * with an alpha of 1.0f.
       
   521      * @see #CLEAR
       
   522      */
       
   523     public static final AlphaComposite Clear    = new AlphaComposite(CLEAR);
       
   524 
       
   525     /**
       
   526      * <code>AlphaComposite</code> object that implements the opaque SRC rule
       
   527      * with an alpha of 1.0f.
       
   528      * @see #SRC
       
   529      */
       
   530     public static final AlphaComposite Src      = new AlphaComposite(SRC);
       
   531 
       
   532     /**
       
   533      * <code>AlphaComposite</code> object that implements the opaque DST rule
       
   534      * with an alpha of 1.0f.
       
   535      * @see #DST
       
   536      * @since 1.4
       
   537      */
       
   538     public static final AlphaComposite Dst      = new AlphaComposite(DST);
       
   539 
       
   540     /**
       
   541      * <code>AlphaComposite</code> object that implements the opaque SRC_OVER rule
       
   542      * with an alpha of 1.0f.
       
   543      * @see #SRC_OVER
       
   544      */
       
   545     public static final AlphaComposite SrcOver  = new AlphaComposite(SRC_OVER);
       
   546 
       
   547     /**
       
   548      * <code>AlphaComposite</code> object that implements the opaque DST_OVER rule
       
   549      * with an alpha of 1.0f.
       
   550      * @see #DST_OVER
       
   551      */
       
   552     public static final AlphaComposite DstOver  = new AlphaComposite(DST_OVER);
       
   553 
       
   554     /**
       
   555      * <code>AlphaComposite</code> object that implements the opaque SRC_IN rule
       
   556      * with an alpha of 1.0f.
       
   557      * @see #SRC_IN
       
   558      */
       
   559     public static final AlphaComposite SrcIn    = new AlphaComposite(SRC_IN);
       
   560 
       
   561     /**
       
   562      * <code>AlphaComposite</code> object that implements the opaque DST_IN rule
       
   563      * with an alpha of 1.0f.
       
   564      * @see #DST_IN
       
   565      */
       
   566     public static final AlphaComposite DstIn    = new AlphaComposite(DST_IN);
       
   567 
       
   568     /**
       
   569      * <code>AlphaComposite</code> object that implements the opaque SRC_OUT rule
       
   570      * with an alpha of 1.0f.
       
   571      * @see #SRC_OUT
       
   572      */
       
   573     public static final AlphaComposite SrcOut   = new AlphaComposite(SRC_OUT);
       
   574 
       
   575     /**
       
   576      * <code>AlphaComposite</code> object that implements the opaque DST_OUT rule
       
   577      * with an alpha of 1.0f.
       
   578      * @see #DST_OUT
       
   579      */
       
   580     public static final AlphaComposite DstOut   = new AlphaComposite(DST_OUT);
       
   581 
       
   582     /**
       
   583      * <code>AlphaComposite</code> object that implements the opaque SRC_ATOP rule
       
   584      * with an alpha of 1.0f.
       
   585      * @see #SRC_ATOP
       
   586      * @since 1.4
       
   587      */
       
   588     public static final AlphaComposite SrcAtop  = new AlphaComposite(SRC_ATOP);
       
   589 
       
   590     /**
       
   591      * <code>AlphaComposite</code> object that implements the opaque DST_ATOP rule
       
   592      * with an alpha of 1.0f.
       
   593      * @see #DST_ATOP
       
   594      * @since 1.4
       
   595      */
       
   596     public static final AlphaComposite DstAtop  = new AlphaComposite(DST_ATOP);
       
   597 
       
   598     /**
       
   599      * <code>AlphaComposite</code> object that implements the opaque XOR rule
       
   600      * with an alpha of 1.0f.
       
   601      * @see #XOR
       
   602      * @since 1.4
       
   603      */
       
   604     public static final AlphaComposite Xor      = new AlphaComposite(XOR);
       
   605 
       
   606     private static final int MIN_RULE = CLEAR;
       
   607     private static final int MAX_RULE = XOR;
       
   608 
       
   609     float extraAlpha;
       
   610     int rule;
       
   611 
       
   612     private AlphaComposite(int rule) {
       
   613         this(rule, 1.0f);
       
   614     }
       
   615 
       
   616     private AlphaComposite(int rule, float alpha) {
       
   617         if (alpha < 0.0f || alpha > 1.0f) {
       
   618             throw new IllegalArgumentException("alpha value out of range");
       
   619         }
       
   620         if (rule < MIN_RULE || rule > MAX_RULE) {
       
   621             throw new IllegalArgumentException("unknown composite rule");
       
   622         }
       
   623         this.rule = rule;
       
   624         this.extraAlpha = alpha;
       
   625     }
       
   626 
       
   627     /**
       
   628      * Creates an <code>AlphaComposite</code> object with the specified rule.
       
   629      * @param rule the compositing rule
       
   630      * @throws IllegalArgumentException if <code>rule</code> is not one of
       
   631      *         the following:  {@link #CLEAR}, {@link #SRC}, {@link #DST},
       
   632      *         {@link #SRC_OVER}, {@link #DST_OVER}, {@link #SRC_IN},
       
   633      *         {@link #DST_IN}, {@link #SRC_OUT}, {@link #DST_OUT},
       
   634      *         {@link #SRC_ATOP}, {@link #DST_ATOP}, or {@link #XOR}
       
   635      */
       
   636     public static AlphaComposite getInstance(int rule) {
       
   637         switch (rule) {
       
   638         case CLEAR:
       
   639             return Clear;
       
   640         case SRC:
       
   641             return Src;
       
   642         case DST:
       
   643             return Dst;
       
   644         case SRC_OVER:
       
   645             return SrcOver;
       
   646         case DST_OVER:
       
   647             return DstOver;
       
   648         case SRC_IN:
       
   649             return SrcIn;
       
   650         case DST_IN:
       
   651             return DstIn;
       
   652         case SRC_OUT:
       
   653             return SrcOut;
       
   654         case DST_OUT:
       
   655             return DstOut;
       
   656         case SRC_ATOP:
       
   657             return SrcAtop;
       
   658         case DST_ATOP:
       
   659             return DstAtop;
       
   660         case XOR:
       
   661             return Xor;
       
   662         default:
       
   663             throw new IllegalArgumentException("unknown composite rule");
       
   664         }
       
   665     }
       
   666 
       
   667     /**
       
   668      * Creates an <code>AlphaComposite</code> object with the specified rule and
       
   669      * the constant alpha to multiply with the alpha of the source.
       
   670      * The source is multiplied with the specified alpha before being composited
       
   671      * with the destination.
       
   672      * @param rule the compositing rule
       
   673      * @param alpha the constant alpha to be multiplied with the alpha of
       
   674      * the source. <code>alpha</code> must be a floating point number in the
       
   675      * inclusive range [0.0,&nbsp;1.0].
       
   676      * @throws IllegalArgumentException if
       
   677      *         <code>alpha</code> is less than 0.0 or greater than 1.0, or if
       
   678      *         <code>rule</code> is not one of
       
   679      *         the following:  {@link #CLEAR}, {@link #SRC}, {@link #DST},
       
   680      *         {@link #SRC_OVER}, {@link #DST_OVER}, {@link #SRC_IN},
       
   681      *         {@link #DST_IN}, {@link #SRC_OUT}, {@link #DST_OUT},
       
   682      *         {@link #SRC_ATOP}, {@link #DST_ATOP}, or {@link #XOR}
       
   683      */
       
   684     public static AlphaComposite getInstance(int rule, float alpha) {
       
   685         if (alpha == 1.0f) {
       
   686             return getInstance(rule);
       
   687         }
       
   688         return new AlphaComposite(rule, alpha);
       
   689     }
       
   690 
       
   691     /**
       
   692      * Creates a context for the compositing operation.
       
   693      * The context contains state that is used in performing
       
   694      * the compositing operation.
       
   695      * @param srcColorModel  the {@link ColorModel} of the source
       
   696      * @param dstColorModel  the <code>ColorModel</code> of the destination
       
   697      * @return the <code>CompositeContext</code> object to be used to perform
       
   698      * compositing operations.
       
   699      */
       
   700     public CompositeContext createContext(ColorModel srcColorModel,
       
   701                                           ColorModel dstColorModel,
       
   702                                           RenderingHints hints) {
       
   703         return new SunCompositeContext(this, srcColorModel, dstColorModel);
       
   704     }
       
   705 
       
   706     /**
       
   707      * Returns the alpha value of this <code>AlphaComposite</code>.  If this
       
   708      * <code>AlphaComposite</code> does not have an alpha value, 1.0 is returned.
       
   709      * @return the alpha value of this <code>AlphaComposite</code>.
       
   710      */
       
   711     public float getAlpha() {
       
   712         return extraAlpha;
       
   713     }
       
   714 
       
   715     /**
       
   716      * Returns the compositing rule of this <code>AlphaComposite</code>.
       
   717      * @return the compositing rule of this <code>AlphaComposite</code>.
       
   718      */
       
   719     public int getRule() {
       
   720         return rule;
       
   721     }
       
   722 
       
   723     /**
       
   724      * Returns a similar <code>AlphaComposite</code> object that uses
       
   725      * the specified compositing rule.
       
   726      * If this object already uses the specified compositing rule,
       
   727      * this object is returned.
       
   728      * @return an <code>AlphaComposite</code> object derived from
       
   729      * this object that uses the specified compositing rule.
       
   730      * @param rule the compositing rule
       
   731      * @throws IllegalArgumentException if
       
   732      *         <code>rule</code> is not one of
       
   733      *         the following:  {@link #CLEAR}, {@link #SRC}, {@link #DST},
       
   734      *         {@link #SRC_OVER}, {@link #DST_OVER}, {@link #SRC_IN},
       
   735      *         {@link #DST_IN}, {@link #SRC_OUT}, {@link #DST_OUT},
       
   736      *         {@link #SRC_ATOP}, {@link #DST_ATOP}, or {@link #XOR}
       
   737      * @since 1.6
       
   738      */
       
   739     public AlphaComposite derive(int rule) {
       
   740         return (this.rule == rule)
       
   741             ? this
       
   742             : getInstance(rule, this.extraAlpha);
       
   743     }
       
   744 
       
   745     /**
       
   746      * Returns a similar <code>AlphaComposite</code> object that uses
       
   747      * the specified alpha value.
       
   748      * If this object already has the specified alpha value,
       
   749      * this object is returned.
       
   750      * @return an <code>AlphaComposite</code> object derived from
       
   751      * this object that uses the specified alpha value.
       
   752      * @param alpha the constant alpha to be multiplied with the alpha of
       
   753      * the source. <code>alpha</code> must be a floating point number in the
       
   754      * inclusive range [0.0,&nbsp;1.0].
       
   755      * @throws IllegalArgumentException if
       
   756      *         <code>alpha</code> is less than 0.0 or greater than 1.0
       
   757      * @since 1.6
       
   758      */
       
   759     public AlphaComposite derive(float alpha) {
       
   760         return (this.extraAlpha == alpha)
       
   761             ? this
       
   762             : getInstance(this.rule, alpha);
       
   763     }
       
   764 
       
   765     /**
       
   766      * Returns the hashcode for this composite.
       
   767      * @return      a hash code for this composite.
       
   768      */
       
   769     public int hashCode() {
       
   770         return (Float.floatToIntBits(extraAlpha) * 31 + rule);
       
   771     }
       
   772 
       
   773     /**
       
   774      * Determines whether the specified object is equal to this
       
   775      * <code>AlphaComposite</code>.
       
   776      * <p>
       
   777      * The result is <code>true</code> if and only if
       
   778      * the argument is not <code>null</code> and is an
       
   779      * <code>AlphaComposite</code> object that has the same
       
   780      * compositing rule and alpha value as this object.
       
   781      *
       
   782      * @param obj the <code>Object</code> to test for equality
       
   783      * @return <code>true</code> if <code>obj</code> equals this
       
   784      * <code>AlphaComposite</code>; <code>false</code> otherwise.
       
   785      */
       
   786     public boolean equals(Object obj) {
       
   787         if (!(obj instanceof AlphaComposite)) {
       
   788             return false;
       
   789         }
       
   790 
       
   791         AlphaComposite ac = (AlphaComposite) obj;
       
   792 
       
   793         if (rule != ac.rule) {
       
   794             return false;
       
   795         }
       
   796 
       
   797         if (extraAlpha != ac.extraAlpha) {
       
   798             return false;
       
   799         }
       
   800 
       
   801         return true;
       
   802     }
       
   803 
       
   804 }