jdk/src/solaris/classes/sun/java2d/xr/XRUtils.java
author ceisserer
Tue, 13 Nov 2012 16:12:10 -0800
changeset 14495 358de9aebab7
parent 6374 e214162c907e
child 21234 e5d41ac9fb32
permissions -rw-r--r--
7105461: Large JTables are not rendered correctly with Xrender pipeline Reviewed-by: flar, prr

/*
 * 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.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);
    }
}