Save This Page
Home » openjdk-7 » java » awt » [javadoc | source]
    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   }

Save This Page
Home » openjdk-7 » java » awt » [javadoc | source]