D3DMaskFill.java revision 0
0N/A/*
0N/A * Copyright 2005 Sun Microsystems, Inc. All Rights Reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
0N/A * published by the Free Software Foundation. Sun designates this
0N/A * particular file as subject to the "Classpath" exception as provided
0N/A * by Sun in the LICENSE file that accompanied this code.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
0N/A * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
0N/A * CA 95054 USA or visit www.sun.com if you need additional information or
0N/A * have any questions.
0N/A */
0N/A
0N/Apackage sun.java2d.d3d;
0N/A
0N/Aimport java.awt.AlphaComposite;
0N/Aimport java.awt.Composite;
0N/Aimport sun.java2d.SunGraphics2D;
0N/Aimport sun.java2d.SurfaceData;
0N/Aimport sun.java2d.loops.GraphicsPrimitive;
0N/Aimport sun.java2d.loops.GraphicsPrimitiveMgr;
0N/Aimport sun.java2d.loops.CompositeType;
0N/Aimport sun.java2d.loops.SurfaceType;
0N/Aimport sun.java2d.loops.MaskFill;
0N/Aimport static sun.java2d.d3d.D3DSurfaceData.*;
0N/A
0N/A/**
0N/A * The MaskFill operation is expressed as:
0N/A * dst = ((src <MODE> dst) * pathA) + (dst * (1 - pathA))
0N/A *
0N/A * The D3D implementation of the MaskFill operation differs from the above
0N/A * equation because it is not possible to perform such a complex operation in
0N/A * D3d (without the use of advanced techniques like fragment shaders and
0N/A * multitexturing). Therefore, the D3DMaskFill operation is expressed as:
0N/A * dst = (src * pathA) <SrcOver> dst
0N/A *
0N/A * This simplified formula is only equivalent to the "true" MaskFill equation
0N/A * in the following situations:
0N/A * - <MODE> is SrcOver
0N/A * - <MODE> is Src, extra alpha == 1.0, and the source color is opaque
0N/A *
0N/A * Therefore, we register D3DMaskFill primitives for only the SurfaceType and
0N/A * CompositeType restrictions mentioned above. In addition for the Src
0N/A * case, we must override the composite with a SrcOver (no extra alpha)
0N/A * instance, so that we set up the D3d blending mode to match the
0N/A * D3DMaskFill equation.
0N/A */
0N/Apublic class D3DMaskFill extends MaskFill {
0N/A
0N/A public static void register() {
0N/A GraphicsPrimitive[] primitives = {
0N/A new D3DMaskFill(SurfaceType.AnyColor,
0N/A CompositeType.SrcOver,
0N/A IntRgbD3D),
0N/A new D3DMaskFill(SurfaceType.OpaqueColor,
0N/A CompositeType.SrcNoEa,
0N/A IntRgbD3D),
0N/A
0N/A new D3DMaskFill(SurfaceType.AnyColor,
0N/A CompositeType.SrcOver,
0N/A Ushort565RgbD3D),
0N/A new D3DMaskFill(SurfaceType.OpaqueColor,
0N/A CompositeType.SrcNoEa,
0N/A Ushort565RgbD3D),
0N/A
0N/A new D3DMaskFill(SurfaceType.AnyColor,
0N/A CompositeType.SrcOver,
0N/A IntRgbxD3D),
0N/A new D3DMaskFill(SurfaceType.OpaqueColor,
0N/A CompositeType.SrcNoEa,
0N/A IntRgbxD3D),
0N/A
0N/A new D3DMaskFill(SurfaceType.AnyColor,
0N/A CompositeType.SrcOver,
0N/A Ushort555RgbD3D),
0N/A new D3DMaskFill(SurfaceType.OpaqueColor,
0N/A CompositeType.SrcNoEa,
0N/A Ushort555RgbD3D),
0N/A
0N/A new D3DMaskFill(SurfaceType.AnyColor,
0N/A CompositeType.SrcOver,
0N/A Ushort555RgbxD3D),
0N/A new D3DMaskFill(SurfaceType.OpaqueColor,
0N/A CompositeType.SrcNoEa,
0N/A Ushort555RgbxD3D),
0N/A
0N/A new D3DMaskFill(SurfaceType.AnyColor,
0N/A CompositeType.SrcOver,
0N/A ThreeByteBgrD3D),
0N/A new D3DMaskFill(SurfaceType.OpaqueColor,
0N/A CompositeType.SrcNoEa,
0N/A ThreeByteBgrD3D),
0N/A };
0N/A GraphicsPrimitiveMgr.register(primitives);
0N/A }
0N/A
0N/A D3DMaskFill(SurfaceType srcType, CompositeType compType,
0N/A SurfaceType dstType) {
0N/A super(srcType, compType, dstType);
0N/A }
0N/A
0N/A private native void MaskFill(long pData, long pCtx,
0N/A int x, int y, int w, int h,
0N/A byte[] mask, int maskoff, int maskscan);
0N/A
0N/A @Override
0N/A public void MaskFill(SunGraphics2D sg2d, SurfaceData sData,
0N/A Composite comp,
0N/A int x, int y, int w, int h,
0N/A byte[] mask, int maskoff, int maskscan)
0N/A {
0N/A AlphaComposite acomp = (AlphaComposite)comp;
0N/A if (acomp.getRule() != AlphaComposite.SRC_OVER) {
0N/A comp = AlphaComposite.SrcOver;
0N/A }
0N/A
0N/A synchronized (D3DContext.LOCK) {
0N/A long pCtx = D3DContext.getContext(sData, sData,
0N/A sg2d.getCompClip(), comp,
0N/A null, sg2d.eargb,
0N/A D3DContext.NO_CONTEXT_FLAGS);
0N/A
0N/A MaskFill(sData.getNativeOps(), pCtx, x, y, w, h,
0N/A mask, maskoff, maskscan);
0N/A }
0N/A }
0N/A}