| /* | |
| * Copyright (c) 2010, 2013, 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.geom.Point2D; | |
| 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 final 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 fulfill 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 isDoubleInShortRange(double dbl) { | |
| return dbl <= Short.MAX_VALUE && dbl >= Short.MIN_VALUE; | |
| } | |
| public static boolean isPointCoordInShortRange(Point2D p) { | |
| return isDoubleInShortRange(p.getX()) && isDoubleInShortRange(p.getY()); | |
| } | |
| 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; | |
| } | |
| } |