<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">/*
 * @(#)AlphaCompositeContext.java	1.11 00/02/02
 *
 * Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved.
 * 
 * This software is the proprietary information of Sun Microsystems, Inc.  
 * Use is subject to license terms.
 * 
 */

package java.awt;

import java.awt.image.ColorModel;
import java.awt.image.IndexColorModel;
import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
import sun.awt.image.IntegerComponentRaster;


class AlphaCompositeContext implements CompositeContext {

    ColorModel srcCM;
    ColorModel dstCM;
    boolean srcNeedConvert;
    boolean dstNeedConvert;
    int rule;
    float extraAlpha;

    public AlphaCompositeContext(ColorModel s, ColorModel d, int rule,
                                 float extraAlpha) {

        srcCM = s;
        if (srcCM.equals(ColorModel.getRGBdefault())) {
            srcNeedConvert = false;
        } else {
            srcNeedConvert = true;
        }

        dstCM = d;
        if (dstCM.equals(ColorModel.getRGBdefault())) {
            dstNeedConvert = false;
        } else {
            dstNeedConvert = true;
        }
        
        this.rule = rule;
        this.extraAlpha = extraAlpha;
    }
    
    /*
     * Convert a given Raster to the desired data format.
     */
    WritableRaster convertRaster(Raster inRaster, ColorModel inCM, ColorModel outCM) {
        // Use a faster conversion if this is an IndexColorModel
        if (inCM instanceof IndexColorModel &amp;&amp;
            outCM.equals(ColorModel.getRGBdefault())) {
            IndexColorModel icm = (IndexColorModel) inCM;
            BufferedImage dbi = icm.convertToIntDiscrete(inRaster, false);
            return dbi.getRaster();
        }

        BufferedImage dbi =
            new BufferedImage(outCM,
                    outCM.createCompatibleWritableRaster(inRaster.getWidth(),
                              inRaster.getHeight()),
                              outCM.isAlphaPremultiplied(),
                              null);
        
//         ColorSpace[] cs = {inCM.getColorSpace(), outCM.getColorSpace()};
//         ColorConvertOp cOp = new ColorConvertOp(cs);
//         cOp.filter(sbi, dbi);
        // use this slow method to convert untill ColorConvertOp is available.
        // Does not take in to account quality dithering if applicable.
        
        for (int i = 0 ; i &lt; inRaster.getHeight() ; i++) {
            for (int j = 0 ; j &lt; inRaster.getWidth() ; j++) {
                dbi.setRGB(j, i,
                           inCM.getRGB(inRaster.getDataElements(j,i,null)));
            }
        }
        return dbi.getRaster();
    }

    /**
     * Release resources allocated for context.
     */
    public void dispose() {
    }

//     native void alphaComposite(Raster s, Raster d,
//                                int width, int height,
//                                int rule, float extraAlpha);
    
    /**
     * This method composes the two source tiles
     * and places the result in the destination tile. Note that
     * the destination can be the same object as either
     * the first or second source.
     * @param src1 The first source tile for the compositing operation.
     * @param src2 The second source tile for the compositing operation.
     * @param dst The tile where the result of the operation is stored.
     */
    public void compose(Raster src1, Raster src2, WritableRaster dst) {
        IntegerComponentRaster s;
        IntegerComponentRaster d;
        WritableRaster dstOrg = dst;
        int w;
        int h;
        
        if (srcNeedConvert) {
            src1 = convertRaster(src1, srcCM, ColorModel.getRGBdefault());
            src2 = convertRaster(src2, srcCM, ColorModel.getRGBdefault());
        }
        if (dstNeedConvert &amp;&amp; !(dst == src1 || dst == src2)) {
            dst = convertRaster(dst, dstCM, ColorModel.getRGBdefault());
        }

        if (dst == src1) {
            s = (IntegerComponentRaster)src2;
        } else if (dst == src2) {
            s = (IntegerComponentRaster)src1;
        } else {
            dst.setDataElements(0, 0, src2);
            s = (IntegerComponentRaster)src1;
        }
        d = (IntegerComponentRaster)dst;

        w = Math.min(s.getWidth(), d.getWidth());
        h = Math.min(s.getHeight(), d.getHeight());
        
        // REMIND: May need a wrapper in RasterOutputManager.c to avoid
        // reference to sun.awt.image package from here:
//         alphaComposite(s, d, w, h, rule, extraAlpha);
        
        sun.java2d.loops.RasterOutputManager.ARGBpaintARGB(s, false, d, rule,
                                                        extraAlpha, null,
                                                        0, 0, 0, 0, 0, 0,
                                                        w, h, 0);

        if (dstNeedConvert) {
            dst = convertRaster(dst, ColorModel.getRGBdefault(), dstCM);
            dstOrg.setDataElements(0, 0, dst);
        }
        
    }
}

</pre></body></html>