2370N/A/*
2685N/A * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
2370N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
2370N/A *
2370N/A * This code is free software; you can redistribute it and/or modify it
2370N/A * under the terms of the GNU General Public License version 2 only, as
2685N/A * published by the Free Software Foundation. Oracle designates this
2370N/A * particular file as subject to the "Classpath" exception as provided
2685N/A * by Oracle in the LICENSE file that accompanied this code.
2370N/A *
2370N/A * This code is distributed in the hope that it will be useful, but WITHOUT
2370N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
2370N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
2370N/A * version 2 for more details (a copy is included in the LICENSE file that
2370N/A * accompanied this code).
2370N/A *
2370N/A * You should have received a copy of the GNU General Public License version
2370N/A * 2 along with this work; if not, write to the Free Software Foundation,
2370N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2370N/A *
2685N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2685N/A * or visit www.oracle.com if you need additional information or have any
2685N/A * questions.
2370N/A */
2370N/A
2370N/Apackage sun.java2d.xr;
2370N/A
2370N/Aimport java.awt.geom.*;
2370N/Aimport java.util.*;
2370N/A
2370N/Aimport sun.font.*;
2370N/Aimport sun.java2d.jules.*;
2370N/Aimport sun.java2d.pipe.*;
2370N/A
2370N/Aimport static sun.java2d.xr.XRUtils.XDoubleToFixed;
2370N/A
2370N/A/**
2370N/A * Native implementation of XRBackend.
2370N/A * Almost direct 1:1 binding to libX11.
2370N/A *
2370N/A * @author Clemens Eisserer
2370N/A */
2370N/A
2370N/Apublic class XRBackendNative implements XRBackend {
2370N/A
2370N/A static {
2370N/A initIDs();
2370N/A }
2370N/A
2370N/A private static long FMTPTR_A8;
2370N/A private static long FMTPTR_ARGB32;
2370N/A private static long MASK_XIMG;
2370N/A
2370N/A private static native void initIDs();
2370N/A
2370N/A public native long createGC(int drawable);
2370N/A
2370N/A public native void freeGC(long gc);
2370N/A
2370N/A public native int createPixmap(int drawable, int depth,
2370N/A int width, int height);
2370N/A
2370N/A private native int createPictureNative(int drawable, long formatID);
2370N/A
2370N/A public native void freePicture(int picture);
2370N/A
2370N/A public native void freePixmap(int pixmap);
2370N/A
2370N/A public native void setGCExposures(long gc, boolean exposure);
2370N/A
2370N/A public native void setGCForeground(long gc, int pixel);
2370N/A
2370N/A public native void setPictureRepeat(int picture, int repeat);
2370N/A
2370N/A public native void copyArea(int src, int dst, long gc,
2370N/A int srcx, int srcy, int width, int height,
2370N/A int dstx, int dsty);
2370N/A
2370N/A public native void setGCMode(long gc, boolean copy);
2370N/A
2370N/A private static native void GCRectanglesNative(int drawable, long gc,
2370N/A int[] rectArray, int rectCnt);
2370N/A
2370N/A public native void renderComposite(byte op, int src, int mask,
2370N/A int dst, int srcX, int srcY,
2370N/A int maskX, int maskY, int dstX, int dstY,
2370N/A int width, int height);
2370N/A
2370N/A private native void renderRectangle(int dst, byte op,
2370N/A short red, short green,
2370N/A short blue, short alpha,
2370N/A int x, int y, int width, int height);
2370N/A
2370N/A private static native void
2370N/A XRenderRectanglesNative(int dst, byte op,
2370N/A short red, short green,
2370N/A short blue, short alpha,
2370N/A int[] rects, int rectCnt);
2370N/A
2370N/A private native void XRSetTransformNative(int pic,
2370N/A int m00, int m01, int m02,
2370N/A int m10, int m11, int m12);
2370N/A
2370N/A private static native int
2370N/A XRCreateLinearGradientPaintNative(float[] fractionsArray,
2370N/A short[] pixelsArray,
2370N/A int x1, int y1, int x2, int y2,
2370N/A int numStops, int repeat,
2370N/A int m00, int m01, int m02,
2370N/A int m10, int m11, int m12);
2370N/A
2370N/A private native static int
2370N/A XRCreateRadialGradientPaintNative(float[] fractionsArray,
2370N/A short[] pixelsArray, int numStops,
2370N/A int innerRadius, int outerRadius,
2370N/A int repeat,
2370N/A int m00, int m01, int m02,
2370N/A int m10, int m11, int m12);
2370N/A
2370N/A public native void setFilter(int picture, int filter);
2370N/A
2370N/A private static native void XRSetClipNative(long dst,
2370N/A int x1, int y1, int x2, int y2,
2370N/A Region clip, boolean isGC);
2370N/A
2370N/A public void GCRectangles(int drawable, long gc, GrowableRectArray rects) {
2370N/A GCRectanglesNative(drawable, gc, rects.getArray(), rects.getSize());
2370N/A }
2370N/A
2370N/A public int createPicture(int drawable, int formatID) {
2370N/A return createPictureNative(drawable, getFormatPtr(formatID));
2370N/A }
2370N/A
2370N/A public void setPictureTransform(int picture, AffineTransform transform) {
2370N/A XRSetTransformNative(picture,
2370N/A XDoubleToFixed(transform.getScaleX()),
2370N/A XDoubleToFixed(transform.getShearX()),
2370N/A XDoubleToFixed(transform.getTranslateX()),
2370N/A XDoubleToFixed(transform.getShearY()),
2370N/A XDoubleToFixed(transform.getScaleY()),
2370N/A XDoubleToFixed(transform.getTranslateY()));
2370N/A }
2370N/A
2370N/A public void renderRectangle(int dst, byte op, XRColor color,
2370N/A int x, int y, int width, int height) {
2370N/A renderRectangle(dst, op, (short)color.red, (short)color.green,
2370N/A (short)color.blue, (short)color.alpha,
2370N/A x, y, width, height);
2370N/A }
2370N/A
2370N/A private short[] getRenderColors(int[] pixels) {
2370N/A short[] renderColors = new short[pixels.length * 4];
2370N/A
2370N/A XRColor c = new XRColor();
2370N/A for (int i = 0; i < pixels.length; i++) {
2370N/A c.setColorValues(pixels[i], true);
2370N/A renderColors[i * 4 + 0] = (short) c.alpha;
2370N/A renderColors[i * 4 + 1] = (short) c.red;
2370N/A renderColors[i * 4 + 2] = (short) c.green;
2370N/A renderColors[i * 4 + 3] = (short) c.blue;
2370N/A }
2370N/A
2370N/A return renderColors;
2370N/A }
2370N/A
2370N/A private static long getFormatPtr(int formatID) {
2370N/A switch (formatID) {
2370N/A case XRUtils.PictStandardA8:
2370N/A return FMTPTR_A8;
2370N/A case XRUtils.PictStandardARGB32:
2370N/A return FMTPTR_ARGB32;
2370N/A }
2370N/A
2370N/A return 0L;
2370N/A }
2370N/A
2370N/A public int createLinearGradient(Point2D p1, Point2D p2, float[] fractions,
2370N/A int[] pixels, int repeat, AffineTransform trx) {
2370N/A
2370N/A short[] colorValues = getRenderColors(pixels);
2370N/A int gradient =
2370N/A XRCreateLinearGradientPaintNative(fractions, colorValues,
2370N/A XDoubleToFixed(p1.getX()), XDoubleToFixed(p1.getY()),
2370N/A XDoubleToFixed(p2.getX()), XDoubleToFixed(p2.getY()),
2370N/A fractions.length, repeat,
2370N/A XDoubleToFixed(trx.getScaleX()),
2370N/A XDoubleToFixed(trx.getShearX()),
2370N/A XDoubleToFixed(trx.getTranslateX()),
2370N/A XDoubleToFixed(trx.getShearY()),
2370N/A XDoubleToFixed(trx.getScaleY()),
2370N/A XDoubleToFixed(trx.getTranslateY()));
2370N/A return gradient;
2370N/A }
2370N/A
2370N/A public int createRadialGradient(Point2D inner, Point2D outer,
2370N/A float innerRadius, float outerRadius,
2370N/A float[] fractions, int[] pixels, int repeat,
2370N/A AffineTransform trx) {
2370N/A
2370N/A short[] colorValues = getRenderColors(pixels);
2370N/A return XRCreateRadialGradientPaintNative
2370N/A (fractions, colorValues, fractions.length,
2370N/A XDoubleToFixed(innerRadius),
2370N/A XDoubleToFixed(outerRadius),
2370N/A repeat,
2370N/A XDoubleToFixed(trx.getScaleX()),
2370N/A XDoubleToFixed(trx.getShearX()),
2370N/A XDoubleToFixed(trx.getTranslateX()),
2370N/A XDoubleToFixed(trx.getShearY()),
2370N/A XDoubleToFixed(trx.getScaleY()),
2370N/A XDoubleToFixed(trx.getTranslateY()));
2370N/A }
2370N/A
2370N/A public void setGCClipRectangles(long gc, Region clip) {
2370N/A XRSetClipNative(gc, clip.getLoX(), clip.getLoY(),
2370N/A clip.getHiX(), clip.getHiY(),
2370N/A clip.isRectangular() ? null : clip, true);
2370N/A }
2370N/A
2370N/A public void setClipRectangles(int picture, Region clip) {
2370N/A if (clip != null) {
2370N/A XRSetClipNative(picture, clip.getLoX(), clip.getLoY(),
2370N/A clip.getHiX(), clip.getHiY(),
2370N/A clip.isRectangular() ? null : clip, false);
2370N/A } else {
2370N/A XRSetClipNative(picture, 0, 0, 32767, 32767, null, false);
2370N/A }
2370N/A }
2370N/A
2370N/A public void renderRectangles(int dst, byte op, XRColor color,
2370N/A GrowableRectArray rects) {
2370N/A XRenderRectanglesNative(dst, op,
2370N/A (short) color.red, (short) color.green,
2370N/A (short) color.blue, (short) color.alpha,
2370N/A rects.getArray(), rects
2370N/A .getSize());
2370N/A }
2370N/A
2370N/A private static long[] getGlyphInfoPtrs(List<XRGlyphCacheEntry> cacheEntries) {
2370N/A long[] glyphInfoPtrs = new long[cacheEntries.size()];
2370N/A for (int i = 0; i < cacheEntries.size(); i++) {
2370N/A glyphInfoPtrs[i] = cacheEntries.get(i).getGlyphInfoPtr();
2370N/A }
2370N/A return glyphInfoPtrs;
2370N/A }
2370N/A
2370N/A public void XRenderAddGlyphs(int glyphSet, GlyphList gl,
2370N/A List<XRGlyphCacheEntry> cacheEntries,
2370N/A byte[] pixelData) {
2370N/A long[] glyphInfoPtrs = getGlyphInfoPtrs(cacheEntries);
2370N/A XRAddGlyphsNative(glyphSet, glyphInfoPtrs,
2370N/A glyphInfoPtrs.length, pixelData, pixelData.length);
2370N/A }
2370N/A
2370N/A public void XRenderFreeGlyphs(int glyphSet, int[] gids) {
2370N/A XRFreeGlyphsNative(glyphSet, gids, gids.length);
2370N/A }
2370N/A
2370N/A private static native void XRAddGlyphsNative(int glyphSet,
2370N/A long[] glyphInfoPtrs,
2370N/A int glyphCnt,
2370N/A byte[] pixelData,
2370N/A int pixelDataLength);
2370N/A
2370N/A private static native void XRFreeGlyphsNative(int glyphSet,
2370N/A int[] gids, int idCnt);
2370N/A
2370N/A private static native void
2370N/A XRenderCompositeTextNative(int op, int src, int dst,
2370N/A long maskFormat, int[] eltArray,
2370N/A int[] glyphIDs, int eltCnt, int glyphCnt);
2370N/A
2370N/A public int XRenderCreateGlyphSet(int formatID) {
2370N/A return XRenderCreateGlyphSetNative(getFormatPtr(formatID));
2370N/A }
2370N/A
2370N/A private static native int XRenderCreateGlyphSetNative(long format);
2370N/A
2370N/A public void XRenderCompositeText(byte op, int src, int dst,
2370N/A int maskFormatID,
2370N/A int src2, int src3, int dst2, int dst3,
2370N/A int glyphset, GrowableEltArray elts) {
2370N/A
2370N/A GrowableIntArray glyphs = elts.getGlyphs();
2370N/A XRenderCompositeTextNative(op, src, dst, 0, elts.getArray(),
2370N/A glyphs.getArray(), elts.getSize(),
2370N/A glyphs.getSize());
2370N/A }
2370N/A
2370N/A public void putMaskImage(int drawable, long gc, byte[] imageData,
2370N/A int sx, int sy, int dx, int dy,
2370N/A int width, int height, int maskOff,
2370N/A int maskScan, float ea) {
2370N/A putMaskNative(drawable, gc, imageData, sx, sy, dx, dy,
2370N/A width, height, maskOff, maskScan, ea, MASK_XIMG);
2370N/A }
2370N/A
2370N/A private static native void putMaskNative(int drawable, long gc,
2370N/A byte[] imageData,
2370N/A int sx, int sy, int dx, int dy,
2370N/A int width, int height,
2370N/A int maskOff, int maskScan,
2370N/A float ea, long xImg);
2370N/A
2370N/A public void padBlit(byte op, int srcPict, int maskPict, int dstPict,
2370N/A AffineTransform maskTrx, int maskWidth, int maskHeight,
2370N/A int lastMaskWidth, int lastMaskHeight,
2370N/A int sx, int sy, int dx, int dy, int w, int h) {
2370N/A
2370N/A padBlitNative(op, srcPict, maskPict, dstPict,
2370N/A XDoubleToFixed(maskTrx.getScaleX()),
2370N/A XDoubleToFixed(maskTrx.getShearX()),
2370N/A XDoubleToFixed(maskTrx.getTranslateX()),
2370N/A XDoubleToFixed(maskTrx.getShearY()),
2370N/A XDoubleToFixed(maskTrx.getScaleY()),
2370N/A XDoubleToFixed(maskTrx.getTranslateY()),
2370N/A maskWidth, maskHeight, lastMaskWidth, lastMaskHeight,
2370N/A sx, sy, dx, dy, w, h);
2370N/A }
2370N/A
2370N/A private static native void padBlitNative(byte op, int srcPict,
2370N/A int maskPict, int dstPict,
2370N/A int m00, int m01, int m02,
2370N/A int m10, int m11, int m12,
2370N/A int maskWidth, int maskHeight,
2370N/A int lastMaskWidth,
2370N/A int lastMaskHeight,
2370N/A int sx, int sy, int dx, int dy,
2370N/A int w, int h);
2370N/A
2370N/A public void renderCompositeTrapezoids(byte op, int src, int maskFormat,
2370N/A int dst, int srcX, int srcY,
2370N/A TrapezoidList trapList) {
2370N/A renderCompositeTrapezoidsNative(op, src, getFormatPtr(maskFormat),
2370N/A dst, srcX, srcY,
2370N/A trapList.getTrapArray());
2370N/A }
2370N/A
2370N/A private static native void
2370N/A renderCompositeTrapezoidsNative(byte op, int src, long maskFormat,
2370N/A int dst, int srcX, int srcY,
2370N/A int[] trapezoids);
2370N/A}