Use Tree Navigation
public class

GeneralCompositePipe

extends Object
implements CompositePipe
/*
 * Copyright (c) 1997, 2002, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */


package sun.java2d.pipe;

import java.awt.AlphaComposite;
import java.awt.CompositeContext;
import java.awt.PaintContext;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.RenderingHints;
import java.awt.image.ColorModel;
import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
import sun.awt.image.BufImgSurfaceData;
import sun.java2d.SunGraphics2D;
import sun.java2d.SurfaceData;
import sun.java2d.loops.Blit;
import sun.java2d.loops.MaskBlit;
import sun.java2d.loops.CompositeType;

public class GeneralCompositePipe implements CompositePipe {
   
class TileContext {
       
SunGraphics2D sunG2D;
       
PaintContext paintCtxt;
       
CompositeContext compCtxt;
       
ColorModel compModel;
       
Object pipeState;

       
public TileContext(SunGraphics2D sg, PaintContext pCtx,
                           
CompositeContext cCtx, ColorModel cModel) {
            sunG2D
= sg;
            paintCtxt
= pCtx;
            compCtxt
= cCtx;
            compModel
= cModel;
       
}
   
}

   
public Object startSequence(SunGraphics2D sg, Shape s, Rectangle devR,
                               
int[] abox) {
       
RenderingHints hints = sg.getRenderingHints();
       
ColorModel model = sg.getDeviceColorModel();
       
PaintContext paintContext =
            sg
.paint.createContext(model, devR, s.getBounds2D(),
                                   sg
.cloneTransform(),
                                   hints
);
       
CompositeContext compositeContext =
            sg
.composite.createContext(paintContext.getColorModel(), model,
                                       hints
);
       
return new TileContext(sg, paintContext, compositeContext, model);
   
}

   
public boolean needTile(Object ctx, int x, int y, int w, int h) {
       
return true;
   
}

   
/**
    * GeneralCompositePipe.renderPathTile works with custom composite operator
    * provided by an application
    */

   
public void renderPathTile(Object ctx,
                               
byte[] atile, int offset, int tilesize,
                               
int x, int y, int w, int h) {
       
TileContext context = (TileContext) ctx;
       
PaintContext paintCtxt = context.paintCtxt;
       
CompositeContext compCtxt = context.compCtxt;
       
SunGraphics2D sg = context.sunG2D;

       
Raster srcRaster = paintCtxt.getRaster(x, y, w, h);
       
ColorModel paintModel = paintCtxt.getColorModel();

       
Raster dstRaster;
       
Raster dstIn;
       
WritableRaster dstOut;

       
SurfaceData sd = sg.getSurfaceData();
        dstRaster
= sd.getRaster(x, y, w, h);
       
if (dstRaster instanceof WritableRaster && atile == null) {
            dstOut
= (WritableRaster) dstRaster;
            dstOut
= dstOut.createWritableChild(x, y, w, h, 0, 0, null);
            dstIn
= dstOut;
       
} else {
            dstIn
= dstRaster.createChild(x, y, w, h, 0, 0, null);
            dstOut
= dstIn.createCompatibleWritableRaster();
       
}

        compCtxt
.compose(srcRaster, dstIn, dstOut);

       
if (dstRaster != dstOut && dstOut.getParent() != dstRaster) {
           
if (dstRaster instanceof WritableRaster && atile == null) {
               
((WritableRaster) dstRaster).setDataElements(x, y, dstOut);
           
} else {
               
ColorModel cm = sg.getDeviceColorModel();
               
BufferedImage resImg =
                   
new BufferedImage(cm, dstOut,
                                      cm
.isAlphaPremultiplied(),
                                     
null);
               
SurfaceData resData = BufImgSurfaceData.createData(resImg);
               
if (atile == null) {
                   
Blit blit = Blit.getFromCache(resData.getSurfaceType(),
                                                 
CompositeType.SrcNoEa,
                                                  sd
.getSurfaceType());
                    blit
.Blit(resData, sd, AlphaComposite.Src, null,
                             
0, 0, x, y, w, h);
               
} else {
                   
MaskBlit blit = MaskBlit.getFromCache(resData.getSurfaceType(),
                                                         
CompositeType.SrcNoEa,
                                                          sd
.getSurfaceType());
                    blit
.MaskBlit(resData, sd, AlphaComposite.Src, null,
                                 
0, 0, x, y, w, h,
                                  atile
, offset, tilesize);
               
}
           
}
       
}
   
}

   
public void skipTile(Object ctx, int x, int y) {
       
return;
   
}

   
public void endSequence(Object ctx) {
       
TileContext context = (TileContext) ctx;
       
if (context.paintCtxt != null) {
            context
.paintCtxt.dispose();
       
}
       
if (context.compCtxt != null) {
            context
.compCtxt.dispose();
       
}
   
}

}