1/* 2 * Copyright (c) 2000, 2007, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26package sun.java2d.x11; 27 28import sun.awt.SunToolkit; 29import sun.java2d.loops.GraphicsPrimitive; 30import sun.java2d.loops.GraphicsPrimitiveMgr; 31import sun.java2d.loops.GraphicsPrimitiveProxy; 32import sun.java2d.loops.CompositeType; 33import sun.java2d.loops.SurfaceType; 34import sun.java2d.loops.Blit; 35import sun.java2d.loops.MaskBlit; 36import sun.java2d.pipe.Region; 37import sun.java2d.SurfaceData; 38import java.awt.Composite; 39import java.awt.image.IndexColorModel; 40 41/** 42 * X11PMBlitLoops 43 * 44 * This class accelerates Blits between two surfaces of types *PM. Since 45 * the onscreen surface is of that type and some of the offscreen surfaces 46 * may be of that type (if they were created via X11OffScreenImage), then 47 * this type of Blit will accelerated double-buffer copies between those 48 * two surfaces. 49*/ 50public class X11PMBlitLoops extends Blit { 51 52 public static void register() 53 { 54 GraphicsPrimitive[] primitives = { 55 new X11PMBlitLoops(X11SurfaceData.IntBgrX11, 56 X11SurfaceData.IntBgrX11, false), 57 new X11PMBlitLoops(X11SurfaceData.IntRgbX11, 58 X11SurfaceData.IntRgbX11, false), 59 new X11PMBlitLoops(X11SurfaceData.ThreeByteBgrX11, 60 X11SurfaceData.ThreeByteBgrX11, false), 61 new X11PMBlitLoops(X11SurfaceData.ThreeByteRgbX11, 62 X11SurfaceData.ThreeByteRgbX11, false), 63 new X11PMBlitLoops(X11SurfaceData.ByteIndexedOpaqueX11, 64 X11SurfaceData.ByteIndexedOpaqueX11, false), 65 new X11PMBlitLoops(X11SurfaceData.ByteGrayX11, 66 X11SurfaceData.ByteGrayX11, false), 67 new X11PMBlitLoops(X11SurfaceData.Index8GrayX11, 68 X11SurfaceData.Index8GrayX11, false), 69 new X11PMBlitLoops(X11SurfaceData.UShort555RgbX11, 70 X11SurfaceData.UShort555RgbX11, false), 71 new X11PMBlitLoops(X11SurfaceData.UShort565RgbX11, 72 X11SurfaceData.UShort565RgbX11, false), 73 new X11PMBlitLoops(X11SurfaceData.UShortIndexedX11, 74 X11SurfaceData.UShortIndexedX11, false), 75 76 // 1-bit transparent to opaque loops 77 new X11PMBlitLoops(X11SurfaceData.IntBgrX11_BM, 78 X11SurfaceData.IntBgrX11, true), 79 new X11PMBlitLoops(X11SurfaceData.IntRgbX11_BM, 80 X11SurfaceData.IntRgbX11, true), 81 new X11PMBlitLoops(X11SurfaceData.ThreeByteBgrX11_BM, 82 X11SurfaceData.ThreeByteBgrX11, true), 83 new X11PMBlitLoops(X11SurfaceData.ThreeByteRgbX11_BM, 84 X11SurfaceData.ThreeByteRgbX11, true), 85 new X11PMBlitLoops(X11SurfaceData.ByteIndexedX11_BM, 86 X11SurfaceData.ByteIndexedOpaqueX11, true), 87 new X11PMBlitLoops(X11SurfaceData.ByteGrayX11_BM, 88 X11SurfaceData.ByteGrayX11, true), 89 new X11PMBlitLoops(X11SurfaceData.Index8GrayX11_BM, 90 X11SurfaceData.Index8GrayX11, true), 91 new X11PMBlitLoops(X11SurfaceData.UShort555RgbX11_BM, 92 X11SurfaceData.UShort555RgbX11, true), 93 new X11PMBlitLoops(X11SurfaceData.UShort565RgbX11_BM, 94 X11SurfaceData.UShort565RgbX11, true), 95 new X11PMBlitLoops(X11SurfaceData.UShortIndexedX11_BM, 96 X11SurfaceData.UShortIndexedX11, true), 97 98 new X11PMBlitLoops(X11SurfaceData.IntRgbX11, 99 X11SurfaceData.IntArgbPreX11, true), 100 new X11PMBlitLoops(X11SurfaceData.IntRgbX11, 101 X11SurfaceData.IntArgbPreX11, false), 102 new X11PMBlitLoops(X11SurfaceData.IntRgbX11_BM, 103 X11SurfaceData.IntArgbPreX11, true), 104 105 new X11PMBlitLoops(X11SurfaceData.IntBgrX11, 106 X11SurfaceData.FourByteAbgrPreX11, true), 107 new X11PMBlitLoops(X11SurfaceData.IntBgrX11, 108 X11SurfaceData.FourByteAbgrPreX11, false), 109 new X11PMBlitLoops(X11SurfaceData.IntBgrX11_BM, 110 X11SurfaceData.FourByteAbgrPreX11, true), 111 112 113 114 // delegate loops 115 new DelegateBlitLoop(X11SurfaceData.IntBgrX11_BM, 116 X11SurfaceData.IntBgrX11), 117 new DelegateBlitLoop(X11SurfaceData.IntRgbX11_BM, 118 X11SurfaceData.IntRgbX11), 119 new DelegateBlitLoop(X11SurfaceData.ThreeByteBgrX11_BM, 120 X11SurfaceData.ThreeByteBgrX11), 121 new DelegateBlitLoop(X11SurfaceData.ThreeByteRgbX11_BM, 122 X11SurfaceData.ThreeByteRgbX11), 123 new DelegateBlitLoop(X11SurfaceData.ByteIndexedX11_BM, 124 X11SurfaceData.ByteIndexedOpaqueX11), 125 new DelegateBlitLoop(X11SurfaceData.ByteGrayX11_BM, 126 X11SurfaceData.ByteGrayX11), 127 new DelegateBlitLoop(X11SurfaceData.Index8GrayX11_BM, 128 X11SurfaceData.Index8GrayX11), 129 new DelegateBlitLoop(X11SurfaceData.UShort555RgbX11_BM, 130 X11SurfaceData.UShort555RgbX11), 131 new DelegateBlitLoop(X11SurfaceData.UShort565RgbX11_BM, 132 X11SurfaceData.UShort565RgbX11), 133 new DelegateBlitLoop(X11SurfaceData.UShortIndexedX11_BM, 134 X11SurfaceData.UShortIndexedX11), 135 136 }; 137 GraphicsPrimitiveMgr.register(primitives); 138 } 139 140 public X11PMBlitLoops(SurfaceType srcType, SurfaceType dstType, 141 boolean over) { 142 super(srcType, 143 over ? CompositeType.SrcOverNoEa : CompositeType.SrcNoEa, 144 dstType); 145 } 146 147 public void Blit(SurfaceData src, SurfaceData dst, 148 Composite comp, Region clip, 149 int sx, int sy, 150 int dx, int dy, 151 int w, int h) 152 { 153 SunToolkit.awtLock(); 154 try { 155 X11SurfaceData x11sd = (X11SurfaceData)dst; 156 // pass null clip region here since we clip manually in native code 157 // also use false for needExposures since we clip to the pixmap 158 long xgc = x11sd.getBlitGC(null, false); 159 nativeBlit(src.getNativeOps(), dst.getNativeOps(), xgc, clip, 160 sx, sy, dx, dy, w, h); 161 } finally { 162 SunToolkit.awtUnlock(); 163 } 164 } 165 166 /** 167 * Blit 168 * This native method is where all of the work happens in the 169 * accelerated Blit. 170 */ 171 private native void nativeBlit(long srcData, long dstData, 172 long xgc, Region clip, 173 int sx, int sy, int dx, int dy, 174 int w, int h); 175 176 /** 177 * This loop is used to render from a BITMASK Sw surface data 178 * to the Hw cached copies managed by SurfaceDataProxies. 179 * It first uses a delegate opaque Blit to perform the copy of 180 * the pixel data and then updates the X11 clipping bitmask from 181 * the transparent pixels in the source. 182 */ 183 static class DelegateBlitLoop extends Blit { 184 SurfaceType dstType; 185 186 /** 187 * @param realDstType SurfaceType for which the loop should be 188 * registered 189 * @param delegateDstType SurfaceType which will be used 190 * for finding delegate loop 191 */ 192 public DelegateBlitLoop(SurfaceType realDstType, SurfaceType delegateDstType) { 193 super(SurfaceType.Any, CompositeType.SrcNoEa, realDstType); 194 this.dstType = delegateDstType; 195 } 196 197 public void Blit(SurfaceData src, SurfaceData dst, 198 Composite comp, Region clip, 199 int sx, int sy, int dx, int dy, int w, int h) 200 { 201 Blit blit = Blit.getFromCache(src.getSurfaceType(), 202 CompositeType.SrcNoEa, 203 dstType); 204 blit.Blit(src, dst, comp, clip, sx, sy, dx, dy, w, h); 205 updateBitmask(src, dst, 206 src.getColorModel() instanceof IndexColorModel); 207 } 208 } 209 210 private static native void updateBitmask(SurfaceData src, 211 SurfaceData dst, 212 boolean isICM); 213} 214