/* * Copyright (c) 2010, Oracle and/or its affiliates. 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. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package sun.java2d.xr; import java.awt.*; import java.awt.MultipleGradientPaint.*; import java.awt.geom.AffineTransform; import java.awt.image.*; import sun.java2d.loops.*; import static java.awt.AlphaComposite.*; /** * XRender constants and utility methods. * * @author Clemens Eisserer */ public class XRUtils { public static final int None = 0; /* Composition Operators */ public static final byte PictOpClear = 0; public static final byte PictOpSrc = 1; public static final byte PictOpDst = 2; public static final byte PictOpOver = 3; public static final byte PictOpOverReverse = 4; public static final byte PictOpIn = 5; public static final byte PictOpInReverse = 6; public static final byte PictOpOut = 7; public static final byte PictOpOutReverse = 8; public static final byte PictOpAtop = 9; public static final byte PictOpAtopReverse = 10; public static final byte PictOpXor = 11; public static final byte PictOpAdd = 12; public static final byte PictOpSaturate = 13; /* Repeats */ public static final int RepeatNone = 0; public static final int RepeatNormal = 1; public static final int RepeatPad = 2; public static final int RepeatReflect = 3; /* Interpolation qualities */ public static final int FAST = 0; public static final int GOOD = 1; public static final int BEST = 2; public static final byte[] FAST_NAME = "fast".getBytes(); public static final byte[] GOOD_NAME = "good".getBytes(); public static final byte[] BEST_NAME = "best".getBytes(); /* PictFormats */ public static final int PictStandardARGB32 = 0; public static final int PictStandardRGB24 = 1; public static final int PictStandardA8 = 2; public static final int PictStandardA4 = 3; public static final int PictStandardA1 = 4; /** * Maps the specified affineTransformOp to the corresponding XRender image * filter. */ public static int ATransOpToXRQuality(int affineTranformOp) { switch (affineTranformOp) { case AffineTransformOp.TYPE_NEAREST_NEIGHBOR: return FAST; case AffineTransformOp.TYPE_BILINEAR: return GOOD; case AffineTransformOp.TYPE_BICUBIC: return BEST; } return -1; } /** * Maps the specified affineTransformOp to the corresponding XRender image * filter. */ public static byte[] ATransOpToXRQualityName(int affineTranformOp) { switch (affineTranformOp) { case AffineTransformOp.TYPE_NEAREST_NEIGHBOR: return FAST_NAME; case AffineTransformOp.TYPE_BILINEAR: return GOOD_NAME; case AffineTransformOp.TYPE_BICUBIC: return BEST_NAME; } return null; } public static byte[] getFilterName(int filterType) { switch (filterType) { case FAST: return FAST_NAME; case GOOD: return GOOD_NAME; case BEST: return BEST_NAME; } return null; } /** * Returns the XRender picture Format which is required to fullfill the * Java2D transparency requirement. */ public static int getPictureFormatForTransparency(int transparency) { switch (transparency) { case Transparency.OPAQUE: return PictStandardRGB24; case Transparency.BITMASK: case Transparency.TRANSLUCENT: return PictStandardARGB32; } return -1; } public static SurfaceType getXRSurfaceTypeForTransparency(int transparency) { if (transparency == Transparency.OPAQUE) { return SurfaceType.IntRgb; }else { return SurfaceType.IntArgbPre; } } /** * Maps Java2D CycleMethod to XRender's Repeat property. */ public static int getRepeatForCycleMethod(CycleMethod cycleMethod) { if (cycleMethod.equals(CycleMethod.NO_CYCLE)) { return RepeatPad; } else if (cycleMethod.equals(CycleMethod.REFLECT)) { return RepeatReflect; } else if (cycleMethod.equals(CycleMethod.REPEAT)) { return RepeatNormal; } return RepeatNone; } /** * Converts a double into an XFixed. */ public static int XDoubleToFixed(double dbl) { return (int) (dbl * 65536); } public static double XFixedToDouble(int fixed) { return ((double) fixed) / 65536; } public static int[] convertFloatsToFixed(float[] values) { int[] fixed = new int[values.length]; for (int i = 0; i < values.length; i++) { fixed[i] = XDoubleToFixed(values[i]); } return fixed; } public static long intToULong(int signed) { if (signed < 0) { return ((long) signed) + (((long) Integer.MAX_VALUE) - ((long) Integer.MIN_VALUE) + 1); } return signed; } /** * Maps the specified Java2D composition rule, to the corresponding XRender * composition rule. */ public static byte j2dAlphaCompToXR(int j2dRule) { switch (j2dRule) { case CLEAR: return PictOpClear; case SRC: return PictOpSrc; case DST: return PictOpDst; case SRC_OVER: return PictOpOver; case DST_OVER: return PictOpOverReverse; case SRC_IN: return PictOpIn; case DST_IN: return PictOpInReverse; case SRC_OUT: return PictOpOut; case DST_OUT: return PictOpOutReverse; case SRC_ATOP: return PictOpAtop; case DST_ATOP: return PictOpAtopReverse; case XOR: return PictOpXor; } throw new InternalError("No XRender equivalent available for requested java2d composition rule: "+j2dRule); } public static short clampToShort(int x) { return (short) (x > Short.MAX_VALUE ? Short.MAX_VALUE : (x < Short.MIN_VALUE ? Short.MIN_VALUE : x)); } public static int clampToUShort(int x) { return (x > 65535 ? 65535 : (x < 0) ? 0 : x); } public static boolean isTransformQuadrantRotated(AffineTransform tr) { return ((tr.getType() & (AffineTransform.TYPE_GENERAL_ROTATION | AffineTransform.TYPE_GENERAL_TRANSFORM)) == 0); } public static boolean isMaskEvaluated(byte xrCompRule) { switch (xrCompRule) { case PictOpOver: case PictOpOverReverse: case PictOpAtop: case PictOpXor: return true; } return false; } }