353 lines
11 KiB
Java
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$
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|