jdk/src/windows/classes/sun/java2d/d3d/D3DBlitLoops.java
changeset 2 90ce3da70b43
child 887 0aab8d3fa11a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/windows/classes/sun/java2d/d3d/D3DBlitLoops.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,225 @@
+/*
+ * Copyright 2002-2005 Sun Microsystems, Inc.  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.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.d3d;
+
+import java.awt.Composite;
+import java.awt.Transparency;
+import java.awt.geom.AffineTransform;
+import java.awt.image.AffineTransformOp;
+import sun.java2d.loops.GraphicsPrimitive;
+import sun.java2d.loops.GraphicsPrimitiveMgr;
+import sun.java2d.loops.CompositeType;
+import sun.java2d.loops.SurfaceType;
+import sun.java2d.loops.Blit;
+import sun.java2d.loops.ScaledBlit;
+import sun.java2d.loops.TransformBlit;
+import sun.java2d.pipe.Region;
+import sun.java2d.SurfaceData;
+
+import static sun.java2d.d3d.D3DSurfaceData.*;
+
+/**
+ * This class contains accelerated blits/scales/transforms
+ * between textures and DD surfaces.
+ */
+public class D3DBlitLoops {
+
+    static void register()
+    {
+        GraphicsPrimitive[] primitives = {
+            new D3DTextureToSurfaceBlit(IntRgbD3D),
+            new D3DTextureToSurfaceBlit(Ushort565RgbD3D),
+            new D3DTextureToSurfaceBlit(IntRgbxD3D),
+            new D3DTextureToSurfaceBlit(Ushort555RgbD3D),
+            new D3DTextureToSurfaceBlit(ThreeByteBgrD3D),
+
+            new D3DTextureToSurfaceScale(IntRgbD3D),
+            new D3DTextureToSurfaceScale(Ushort565RgbD3D),
+            new D3DTextureToSurfaceScale(IntRgbxD3D),
+            new D3DTextureToSurfaceScale(Ushort555RgbD3D),
+            new D3DTextureToSurfaceScale(ThreeByteBgrD3D),
+
+            new D3DTextureToSurfaceTransform(D3DTexture, IntRgbD3D),
+            new D3DTextureToSurfaceTransform(D3DTexture, Ushort565RgbD3D),
+            new D3DTextureToSurfaceTransform(D3DTexture, IntRgbxD3D),
+            new D3DTextureToSurfaceTransform(D3DTexture, Ushort555RgbD3D),
+            new D3DTextureToSurfaceTransform(D3DTexture, ThreeByteBgrD3D),
+
+            new DelegateSwToTextureLoop(),
+
+        };
+        GraphicsPrimitiveMgr.register(primitives);
+    }
+    static native void doTransform(long pSrc, long pDst, long pCtx,
+                                   int hint,
+                                   int sx1, int sy1, int sx2, int sy2,
+                                   float dx1, float dy1,
+                                   float dx2, float dy2);
+
+    static long getContext(SurfaceData src, SurfaceData dst,
+                           Region clip, Composite comp, AffineTransform at)
+    {
+        int ctxFlags;
+        if (src.getTransparency() == Transparency.OPAQUE) {
+            ctxFlags = D3DContext.SRC_IS_OPAQUE;
+        } else {
+            ctxFlags = D3DContext.NO_CONTEXT_FLAGS;
+        }
+
+        return D3DContext.getContext(src, dst, clip, comp, at,
+                                     0xffffffff /* rgb */, ctxFlags);
+    }
+}
+
+class D3DTextureToSurfaceBlit extends Blit {
+    D3DTextureToSurfaceBlit(SurfaceType dstType) {
+        super(D3DTexture, CompositeType.AnyAlpha , dstType);
+    }
+
+    /**
+     * Blit
+     * This native method is where all of the work happens in the
+     * accelerated Blit.
+     */
+    @Override
+    public void Blit(SurfaceData src, SurfaceData dst,
+                     Composite comp, Region clip,
+                     int sx, int sy, int dx, int dy, int w, int h)
+    {
+        synchronized (D3DContext.LOCK) {
+            long pCtx = D3DBlitLoops.getContext(src, dst, clip, comp, null);
+            D3DBlitLoops.doTransform(src.getNativeOps(), dst.getNativeOps(),
+                                     pCtx,
+                                     AffineTransformOp.TYPE_NEAREST_NEIGHBOR,
+                                     sx, sy, sx+w, sy+h,
+                                     (float)dx, (float)dy,
+                                     (float)(dx+w), (float)(dy+h));
+        }
+    }
+}
+
+class D3DTextureToSurfaceTransform extends TransformBlit {
+
+    D3DTextureToSurfaceTransform(SurfaceType srcType,
+                                 SurfaceType dstType)
+    {
+        super(srcType, CompositeType.AnyAlpha, dstType);
+    }
+
+    @Override
+    public void Transform(SurfaceData src, SurfaceData dst,
+                          Composite comp, Region clip,
+                          AffineTransform at, int hint,
+                          int sx, int sy, int dx, int dy,
+                          int w, int h)
+    {
+        synchronized (D3DContext.LOCK) {
+            long pCtx = D3DBlitLoops.getContext(src, dst, clip, comp, at);
+            D3DBlitLoops.doTransform(src.getNativeOps(), dst.getNativeOps(),
+                                     pCtx, hint,
+                                     sx, sy, sx+w, sy+h,
+                                     (float)dx, (float)dy,
+                                     (float)(dx+w), (float)(dy+h));
+        }
+    }
+}
+
+class D3DTextureToSurfaceScale extends ScaledBlit {
+
+    D3DTextureToSurfaceScale(SurfaceType dstType) {
+        super(D3DTexture, CompositeType.AnyAlpha, dstType);
+    }
+
+    @Override
+    public void Scale(SurfaceData src, SurfaceData dst,
+                      Composite comp, Region clip,
+                      int sx1, int sy1,
+                      int sx2, int sy2,
+                      double dx1, double dy1,
+                      double dx2, double dy2)
+    {
+        synchronized (D3DContext.LOCK) {
+            long pCtx = D3DBlitLoops.getContext(src, dst, clip, comp, null);
+            D3DBlitLoops.doTransform(src.getNativeOps(), dst.getNativeOps(),
+                                     pCtx,
+                                     AffineTransformOp.TYPE_NEAREST_NEIGHBOR,
+                                     sx1, sy1, sx2, sy2,
+                                     (float)dx1, (float)dy1,
+                                     (float)dx2, (float)dy2);
+        }
+    }
+}
+
+class DelegateSwToTextureLoop extends Blit {
+
+    DelegateSwToTextureLoop() {
+        super(SurfaceType.Any, CompositeType.SrcNoEa, D3DTexture);
+    }
+
+    @Override
+    public void Blit(SurfaceData src, SurfaceData dst,
+                     Composite comp, Region clip,
+                     int sx, int sy, int dx, int dy, int w, int h)
+    {
+        Blit realBlit = null;
+        int pf = ((D3DSurfaceData)dst).getPixelFormat();
+        switch (pf) {
+        case PF_INT_ARGB:
+            realBlit = Blit.getFromCache(src.getSurfaceType(),
+                                         CompositeType.SrcNoEa,
+                                         SurfaceType.IntArgbPre);
+            break;
+        case PF_INT_RGB:
+            realBlit = Blit.getFromCache(src.getSurfaceType(),
+                                         CompositeType.SrcNoEa,
+                                         SurfaceType.IntRgb);
+            break;
+        case PF_USHORT_565_RGB:
+            realBlit = Blit.getFromCache(src.getSurfaceType(),
+                                         CompositeType.SrcNoEa,
+                                         SurfaceType.Ushort565Rgb);
+            break;
+        case PF_USHORT_555_RGB:
+            realBlit = Blit.getFromCache(src.getSurfaceType(),
+                                         CompositeType.SrcNoEa,
+                                         SurfaceType.Ushort555Rgb);
+            break;
+        case PF_USHORT_4444_ARGB:
+            // REMIND: this should really be premultiplied!
+            realBlit = Blit.getFromCache(src.getSurfaceType(),
+                                         CompositeType.SrcNoEa,
+                                         SurfaceType.Ushort4444Argb);
+            break;
+        default:
+             throw
+                 new InternalError("Can't yet handle dest pixel format: "+pf);
+        }
+
+        if (realBlit != null) {
+            realBlit.Blit(src, dst, comp, clip, sx, sy, dx, dy, w, h);
+        }
+    }
+}