replicant-frameworks_native/awt/java/awt/AlphaComposite.java
2009-03-03 19:31:44 -08:00

353 lines
11 KiB
Java

/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @author Igor V. Stolyarov
* @version $Revision$
*/
package java.awt;
import java.awt.Composite;
import java.awt.CompositeContext;
import java.awt.RenderingHints;
import java.awt.image.ColorModel;
import org.apache.harmony.awt.gl.ICompositeContext;
import org.apache.harmony.awt.internal.nls.Messages;
/**
* The AlphaComposite class defines a basic alpha compositing rules for
* combining source and destination colors to achieve blending and transparency
* effects with graphics and images.
*
* @since Android 1.0
*/
public final class AlphaComposite implements Composite {
/**
* The Constant CLEAR indicates that both the color and the alpha of the
* destination are cleared (Porter-Duff Clear rule).
*/
public static final int CLEAR = 1;
/**
* The Constant SRC indicates that the source is copied to the destination
* (Porter-Duff Source rule).
*/
public static final int SRC = 2;
/**
* The Constant DST indicates that the destination is left untouched
* (Porter-Duff Destination rule).
*/
public static final int DST = 9;
/**
* The Constant SRC_OVER indicates that the source is composited over the
* destination (Porter-Duff Source Over Destination rule).
*/
public static final int SRC_OVER = 3;
/**
* The Constant DST_OVER indicates that The destination is composited over
* the source and the result replaces the destination (Porter-Duff
* Destination Over Source rule).
*/
public static final int DST_OVER = 4;
/**
* The Constant SRC_IN indicates that the part of the source lying inside of
* the destination replaces the destination (Porter-Duff Source In
* Destination rule).
*/
public static final int SRC_IN = 5;
/**
* The Constant DST_IN indicates that the part of the destination lying
* inside of the source replaces the destination (Porter-Duff Destination In
* Source rule).
*/
public static final int DST_IN = 6;
/**
* The Constant SRC_OUT indicates that the part of the source lying outside
* of the destination replaces the destination (Porter-Duff Source Held Out
* By Destination rule).
*/
public static final int SRC_OUT = 7;
/**
* The Constant DST_OUT indicates that the part of the destination lying
* outside of the source replaces the destination (Porter-Duff Destination
* Held Out By Source rule).
*/
public static final int DST_OUT = 8;
/**
* The Constant SRC_ATOP indicates that the part of the source lying inside
* of the destination is composited onto the destination (Porter-Duff Source
* Atop Destination rule).
*/
public static final int SRC_ATOP = 10;
/**
* The Constant DST_ATOP indicates that the part of the destination lying
* inside of the source is composited over the source and replaces the
* destination (Porter-Duff Destination Atop Source rule).
*/
public static final int DST_ATOP = 11;
/**
* The Constant XOR indicates that the part of the source that lies outside
* of the destination is combined with the part of the destination that lies
* outside of the source (Porter-Duff Source Xor Destination rule).
*/
public static final int XOR = 12;
/**
* AlphaComposite object with the opaque CLEAR rule and an alpha of 1.0f.
*/
public static final AlphaComposite Clear = new AlphaComposite(CLEAR);
/**
* AlphaComposite object with the opaque SRC rule and an alpha of 1.0f.
*/
public static final AlphaComposite Src = new AlphaComposite(SRC);
/**
* AlphaComposite object with the opaque DST rule and an alpha of 1.0f.
*/
public static final AlphaComposite Dst = new AlphaComposite(DST);
/**
* AlphaComposite object with the opaque SRC_OVER rule and an alpha of 1.0f.
*/
public static final AlphaComposite SrcOver = new AlphaComposite(SRC_OVER);
/**
* AlphaComposite object with the opaque DST_OVER rule and an alpha of 1.0f.
*/
public static final AlphaComposite DstOver = new AlphaComposite(DST_OVER);
/**
* AlphaComposite object with the opaque SRC_IN rule and an alpha of 1.0f.
*/
public static final AlphaComposite SrcIn = new AlphaComposite(SRC_IN);
/**
* AlphaComposite object with the opaque DST_IN rule and an alpha of 1.0f.
*/
public static final AlphaComposite DstIn = new AlphaComposite(DST_IN);
/**
* AlphaComposite object with the opaque SRC_OUT rule and an alpha of 1.0f.
*/
public static final AlphaComposite SrcOut = new AlphaComposite(SRC_OUT);
/**
* AlphaComposite object with the opaque DST_OUT rule and an alpha of 1.0f.
*/
public static final AlphaComposite DstOut = new AlphaComposite(DST_OUT);
/**
* AlphaComposite object with the opaque SRC_ATOP rule and an alpha of 1.0f.
*/
public static final AlphaComposite SrcAtop = new AlphaComposite(SRC_ATOP);
/**
* AlphaComposite object with the opaque DST_ATOP rule and an alpha of 1.0f.
*/
public static final AlphaComposite DstAtop = new AlphaComposite(DST_ATOP);
/**
* AlphaComposite object with the opaque XOR rule and an alpha of 1.0f.
*/
public static final AlphaComposite Xor = new AlphaComposite(XOR);
/**
* The rule.
*/
private int rule;
/**
* The alpha.
*/
private float alpha;
/**
* Instantiates a new alpha composite. Creates a context for the compositing
* operation. The context contains state that is used in performing the
* compositing operation.
*
* @param rule
* the rule.
* @param alpha
* the alpha.
*/
private AlphaComposite(int rule, float alpha) {
if (rule < CLEAR || rule > XOR) {
// awt.11D=Unknown rule
throw new IllegalArgumentException(Messages.getString("awt.11D")); //$NON-NLS-1$
}
if (alpha < 0.0f || alpha > 1.0f) {
// awt.11E=Wrong alpha value
throw new IllegalArgumentException(Messages.getString("awt.11E")); //$NON-NLS-1$
}
this.rule = rule;
this.alpha = alpha;
}
/**
* Instantiates a new alpha composite.
*
* @param rule
* the rule.
*/
private AlphaComposite(int rule) {
this(rule, 1.0f);
}
/**
* Creates a CompositeContext object with the specified source ColorModel,
* destination ColorModel and RenderingHints parameters for a composing
* operation.
*
* @param srcColorModel
* the source's ColorModel.
* @param dstColorModel
* the destination's ColorModel.
* @param hints
* the RenderingHints object.
* @return the CompositeContext object.
* @see java.awt.Composite#createContext(java.awt.image.ColorModel,
* java.awt.image.ColorModel, java.awt.RenderingHints)
*/
public CompositeContext createContext(ColorModel srcColorModel, ColorModel dstColorModel,
RenderingHints hints) {
return new ICompositeContext(this, srcColorModel, dstColorModel);
}
/**
* Compares the AlphaComposite object with the specified object.
*
* @param obj
* the Object to be compared.
* @return true, if the AlphaComposite object is equal to the specified
* object.
*/
@Override
public boolean equals(Object obj) {
if (!(obj instanceof AlphaComposite)) {
return false;
}
AlphaComposite other = (AlphaComposite)obj;
return (this.rule == other.getRule() && this.alpha == other.getAlpha());
}
/**
* Returns the hash code of the AlphaComposite object.
*
* @return the hash code of the AlphaComposite object.
*/
@Override
public int hashCode() {
int hash = Float.floatToIntBits(alpha);
int tmp = hash >>> 24;
hash <<= 8;
hash |= tmp;
hash ^= rule;
return hash;
}
/**
* Gets the compositing rule of this AlphaComposite object.
*
* @return the compositing rule of this AlphaComposite object.
*/
public int getRule() {
return rule;
}
/**
* Gets the alpha value of this AlphaComposite object; returns 1.0 if this
* AlphaComposite object doesn't have alpha value.
*
* @return the alpha value of this AlphaComposite object or 1.0 if this
* AlphaComposite object doesn't have alpha value.
*/
public float getAlpha() {
return alpha;
}
/**
* Gets the AlphaComposite instance with the specified rule and alpha value.
*
* @param rule
* the compositing rule.
* @param alpha
* the alpha value.
* @return the AlphaComposite instance.
*/
public static AlphaComposite getInstance(int rule, float alpha) {
if (alpha == 1.0f) {
return getInstance(rule);
}
return new AlphaComposite(rule, alpha);
}
/**
* Gets the AlphaComposite instance with the specified rule.
*
* @param rule
* the compositing rule.
* @return the AlphaComposite instance.
*/
public static AlphaComposite getInstance(int rule) {
switch (rule) {
case CLEAR:
return Clear;
case SRC:
return Src;
case DST:
return Dst;
case SRC_OVER:
return SrcOver;
case DST_OVER:
return DstOver;
case SRC_IN:
return SrcIn;
case DST_IN:
return DstIn;
case SRC_OUT:
return SrcOut;
case DST_OUT:
return DstOut;
case SRC_ATOP:
return SrcAtop;
case DST_ATOP:
return DstAtop;
case XOR:
return Xor;
default:
// awt.11D=Unknown rule
throw new IllegalArgumentException(Messages.getString("awt.11D")); //$NON-NLS-1$
}
}
}