1 /* 2 * Copyright (c) 2007, 2008, 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.opengl; 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.opengl.OGLContext.OGLContextCaps.*; 39 40 class OGLBufImgOps extends BufferedBufImgOps { 41 42 /** 43 * This method is called from OGLDrawImage.transformImage() only. It 44 * validates the provided BufferedImageOp to determine whether the op 45 * is one that can be accelerated by the OGL 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 OGLSurfaceData) || 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 OGLSurfaceData)) { 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 OGLSurfaceData)) { 89 return false; 90 } 91 } 92 93 // Verify that the source surface is actually a texture and 94 // that the operation is supported 95 OGLSurfaceData oglSrc = (OGLSurfaceData)srcData; 96 OGLGraphicsConfig gc = oglSrc.getOGLGraphicsConfig(); 97 if (oglSrc.getType() != OGLSurfaceData.TEXTURE || 98 !gc.isCapPresent(CAPS_EXT_BIOP_SHADER)) 99 { 100 return false; 101 } 102 103 int sw = img.getWidth(); 104 int sh = img.getHeight(); 105 OGLBlitLoops.IsoBlit(srcData, dstData, 106 img, biop, 107 sg.composite, sg.getCompClip(), 108 sg.transform, sg.interpolationType, 109 0, 0, sw, sh, 110 x, y, x+sw, y+sh, 111 true); 112 113 return true; 114 } 115 }