1 /* 2 * Copyright (c) 2007, 2014, 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 26 package sun.java2d.d3d; 27 28 import java.awt.image.AffineTransformOp; 29 import java.awt.image.BufferedImage; 30 import java.awt.image.BufferedImageOp; 31 import java.awt.image.ConvolveOp; 32 import java.awt.image.LookupOp; 33 import java.awt.image.RescaleOp; 34 import sun.java2d.SunGraphics2D; 35 import sun.java2d.SurfaceData; 36 import sun.java2d.loops.CompositeType; 37 import sun.java2d.pipe.BufferedBufImgOps; 38 import static sun.java2d.d3d.D3DContext.D3DContextCaps.*; 39 40 class D3DBufImgOps extends BufferedBufImgOps { 41 42 /** 43 * This method is called from D3DDrawImage.transformImage() only. It 44 * validates the provided BufferedImageOp to determine whether the op 45 * is one that can be accelerated by the D3D pipeline. If the operation 46 * cannot be completed for any reason, this method returns false; 47 * otherwise, the given BufferedImage is rendered to the destination 48 * using the provided BufferedImageOp and this method returns true. 49 */ 50 static boolean renderImageWithOp(SunGraphics2D sg, BufferedImage img, 51 BufferedImageOp biop, int x, int y) 52 { 53 // Validate the provided BufferedImage (make sure it is one that 54 // is supported, and that its properties are acceleratable) 55 if (biop instanceof ConvolveOp) { 56 if (!isConvolveOpValid((ConvolveOp)biop)) { 57 return false; 58 } 59 } else if (biop instanceof RescaleOp) { 60 if (!isRescaleOpValid((RescaleOp)biop, img)) { 61 return false; 62 } 63 } else if (biop instanceof LookupOp) { 64 if (!isLookupOpValid((LookupOp)biop, img)) { 65 return false; 66 } 67 } else { 68 // No acceleration for other BufferedImageOps (yet) 69 return false; 70 } 71 72 SurfaceData dstData = sg.surfaceData; 73 if (!(dstData instanceof D3DSurfaceData) || 74 (sg.interpolationType == AffineTransformOp.TYPE_BICUBIC) || 75 (sg.compositeState > SunGraphics2D.COMP_ALPHA)) 76 { 77 return false; 78 } 79 80 SurfaceData srcData = 81 dstData.getSourceSurfaceData(img, SunGraphics2D.TRANSFORM_ISIDENT, 82 CompositeType.SrcOver, null); 83 if (!(srcData instanceof D3DSurfaceData)) { 84 // REMIND: this hack tries to ensure that we have a cached texture 85 srcData = 86 dstData.getSourceSurfaceData(img, SunGraphics2D.TRANSFORM_ISIDENT, 87 CompositeType.SrcOver, null); 88 if (!(srcData instanceof D3DSurfaceData)) { 89 return false; 90 } 91 } 92 93 // Verify that the source surface is actually a texture and that 94 // shaders are supported 95 D3DSurfaceData d3dSrc = (D3DSurfaceData)srcData; 96 D3DGraphicsDevice gd = 97 (D3DGraphicsDevice)d3dSrc.getDeviceConfiguration().getDevice(); 98 if (d3dSrc.getType() != D3DSurfaceData.TEXTURE || 99 !gd.isCapPresent(CAPS_LCD_SHADER)) 100 { 101 return false; 102 } 103 104 int sw = img.getWidth(); 105 int sh = img.getHeight(); 106 D3DBlitLoops.IsoBlit(srcData, dstData, 107 img, biop, 108 sg.composite, sg.getCompClip(), 109 sg.transform, sg.interpolationType, 110 0, 0, sw, sh, 111 x, y, x+sw, y+sh, 112 true); 113 114 return true; 115 } 116 }