提交 61d38058 编写于 作者: C ceisserer

8023483: sun/java2d/DirectX/TransformedPaintTest/TransformedPaintTest.java...

8023483: sun/java2d/DirectX/TransformedPaintTest/TransformedPaintTest.java failed with jdk8 on linux platforms
Reviewed-by: prr, bae
上级 73a760b2
...@@ -100,14 +100,13 @@ public interface XRBackend { ...@@ -100,14 +100,13 @@ public interface XRBackend {
int xSrc, int ySrc, int xDst, int yDst, int xSrc, int ySrc, int xDst, int yDst,
int glyphset, GrowableEltArray elts); int glyphset, GrowableEltArray elts);
public int createRadialGradient(Point2D inner, Point2D outer, public int createRadialGradient(float centerX, float centerY,
float innerRadius, float outerRadius, float innerRadius, float outerRadius,
float[] fractions, int[] pixels, float[] fractions, int[] pixels,
int repeat, AffineTransform transform); int repeat);
public int createLinearGradient(Point2D p1, Point2D p2, float[] fractions, public int createLinearGradient(Point2D p1, Point2D p2, float[] fractions,
int[] pixels, int repeat, int[] pixels, int repeat);
AffineTransform transform);
public void setGCMode(long gc, boolean copy); public void setGCMode(long gc, boolean copy);
......
...@@ -105,17 +105,14 @@ public class XRBackendNative implements XRBackend { ...@@ -105,17 +105,14 @@ public class XRBackendNative implements XRBackend {
XRCreateLinearGradientPaintNative(float[] fractionsArray, XRCreateLinearGradientPaintNative(float[] fractionsArray,
short[] pixelsArray, short[] pixelsArray,
int x1, int y1, int x2, int y2, int x1, int y1, int x2, int y2,
int numStops, int repeat, int numStops, int repeat);
int m00, int m01, int m02,
int m10, int m11, int m12);
private native static int private native static int
XRCreateRadialGradientPaintNative(float[] fractionsArray, XRCreateRadialGradientPaintNative(float[] fractionsArray,
short[] pixelsArray, int numStops, short[] pixelsArray, int numStops,
int centerX, int centerY,
int innerRadius, int outerRadius, int innerRadius, int outerRadius,
int repeat, int repeat);
int m00, int m01, int m02,
int m10, int m11, int m12);
public native void setFilter(int picture, int filter); public native void setFilter(int picture, int filter);
...@@ -175,40 +172,29 @@ public class XRBackendNative implements XRBackend { ...@@ -175,40 +172,29 @@ public class XRBackendNative implements XRBackend {
} }
public int createLinearGradient(Point2D p1, Point2D p2, float[] fractions, public int createLinearGradient(Point2D p1, Point2D p2, float[] fractions,
int[] pixels, int repeat, AffineTransform trx) { int[] pixels, int repeat) {
short[] colorValues = getRenderColors(pixels); short[] colorValues = getRenderColors(pixels);
int gradient = int gradient =
XRCreateLinearGradientPaintNative(fractions, colorValues, XRCreateLinearGradientPaintNative(fractions, colorValues,
XDoubleToFixed(p1.getX()), XDoubleToFixed(p1.getY()), XDoubleToFixed(p1.getX()), XDoubleToFixed(p1.getY()),
XDoubleToFixed(p2.getX()), XDoubleToFixed(p2.getY()), XDoubleToFixed(p2.getX()), XDoubleToFixed(p2.getY()),
fractions.length, repeat, fractions.length, repeat);
XDoubleToFixed(trx.getScaleX()),
XDoubleToFixed(trx.getShearX()),
XDoubleToFixed(trx.getTranslateX()),
XDoubleToFixed(trx.getShearY()),
XDoubleToFixed(trx.getScaleY()),
XDoubleToFixed(trx.getTranslateY()));
return gradient; return gradient;
} }
public int createRadialGradient(Point2D inner, Point2D outer, public int createRadialGradient(float centerX, float centerY,
float innerRadius, float outerRadius, float innerRadius, float outerRadius,
float[] fractions, int[] pixels, int repeat, float[] fractions, int[] pixels, int repeat) {
AffineTransform trx) {
short[] colorValues = getRenderColors(pixels); short[] colorValues = getRenderColors(pixels);
return XRCreateRadialGradientPaintNative return XRCreateRadialGradientPaintNative
(fractions, colorValues, fractions.length, (fractions, colorValues, fractions.length,
XDoubleToFixed(centerX),
XDoubleToFixed(centerY),
XDoubleToFixed(innerRadius), XDoubleToFixed(innerRadius),
XDoubleToFixed(outerRadius), XDoubleToFixed(outerRadius),
repeat, repeat);
XDoubleToFixed(trx.getScaleX()),
XDoubleToFixed(trx.getShearX()),
XDoubleToFixed(trx.getTranslateX()),
XDoubleToFixed(trx.getShearY()),
XDoubleToFixed(trx.getScaleY()),
XDoubleToFixed(trx.getTranslateY()));
} }
public void setGCClipRectangles(long gc, Region clip) { public void setGCClipRectangles(long gc, Region clip) {
......
...@@ -116,7 +116,7 @@ public class XRCompositeManager { ...@@ -116,7 +116,7 @@ public class XRCompositeManager {
con.renderRectangle(solidSrcPictXID, XRUtils.PictOpSrc, con.renderRectangle(solidSrcPictXID, XRUtils.PictOpSrc,
XRColor.FULL_ALPHA, 0, 0, 1, 1); XRColor.FULL_ALPHA, 0, 0, 1, 1);
solidSrcPict = new XRSurfaceData.XRInternalSurfaceData(con, solidSrcPict = new XRSurfaceData.XRInternalSurfaceData(con,
solidSrcPictXID, null); solidSrcPictXID);
setForeground(0); setForeground(0);
int extraAlphaMask = con.createPixmap(parentXid, 8, 1, 1); int extraAlphaMask = con.createPixmap(parentXid, 8, 1, 1);
...@@ -198,7 +198,7 @@ public class XRCompositeManager { ...@@ -198,7 +198,7 @@ public class XRCompositeManager {
} catch (NoninvertibleTransformException e) { } catch (NoninvertibleTransformException e) {
at.setToIdentity(); at.setToIdentity();
} }
src.validateAsSource(at, -1, -1); src.validateAsSource(at, -1, XRUtils.ATransOpToXRQuality(sg2d.interpolationType));
} }
} }
......
...@@ -29,10 +29,9 @@ import java.awt.*; ...@@ -29,10 +29,9 @@ import java.awt.*;
import java.awt.MultipleGradientPaint.*; import java.awt.MultipleGradientPaint.*;
import java.awt.geom.*; import java.awt.geom.*;
import java.awt.image.*; import java.awt.image.*;
import sun.java2d.*; import sun.java2d.*;
import sun.java2d.loops.*; import sun.java2d.loops.*;
import sun.java2d.pipe.*; import sun.java2d.xr.XRSurfaceData.XRInternalSurfaceData;
abstract class XRPaints { abstract class XRPaints {
static XRCompositeManager xrCompMan; static XRCompositeManager xrCompMan;
...@@ -108,27 +107,16 @@ abstract class XRPaints { ...@@ -108,27 +107,16 @@ abstract class XRPaints {
void setXRPaint(SunGraphics2D sg2d, Paint pt) { void setXRPaint(SunGraphics2D sg2d, Paint pt) {
GradientPaint paint = (GradientPaint) pt; GradientPaint paint = (GradientPaint) pt;
int[] pixels = convertToIntArgbPixels(new Color[] { paint.getColor1(), paint.getColor2() }, false); int repeat = paint.isCyclic() ? XRUtils.RepeatReflect : XRUtils.RepeatPad;
float fractions[] = {0, 1};
float fractions[] = new float[2]; int[] pixels = convertToIntArgbPixels(new Color[] { paint.getColor1(), paint.getColor2() });
fractions[0] = 0;
fractions[1] = 1;
Point2D pt1 = paint.getPoint1(); Point2D pt1 = paint.getPoint1();
Point2D pt2 = paint.getPoint2(); Point2D pt2 = paint.getPoint2();
AffineTransform at = (AffineTransform) sg2d.transform.clone();
try {
at.invert();
} catch (NoninvertibleTransformException ex) {
at.setToIdentity();
}
int repeat = paint.isCyclic() ? XRUtils.RepeatReflect : XRUtils.RepeatPad;
XRBackend con = xrCompMan.getBackend(); XRBackend con = xrCompMan.getBackend();
int gradient = con.createLinearGradient(pt1, pt2, fractions, pixels, repeat, at); int gradient = con.createLinearGradient(pt1, pt2, fractions, pixels, repeat);
xrCompMan.setGradientPaint(new XRSurfaceData.XRInternalSurfaceData(con, gradient, at)); xrCompMan.setGradientPaint(new XRSurfaceData.XRInternalSurfaceData(con, gradient));
} }
} }
...@@ -142,26 +130,22 @@ abstract class XRPaints { ...@@ -142,26 +130,22 @@ abstract class XRPaints {
@Override @Override
boolean isPaintValid(SunGraphics2D sg2d) { boolean isPaintValid(SunGraphics2D sg2d) {
return true; return ((LinearGradientPaint) sg2d.getPaint()).getColorSpace() == ColorSpaceType.SRGB;
} }
@Override @Override
void setXRPaint(SunGraphics2D sg2d, Paint pt) { void setXRPaint(SunGraphics2D sg2d, Paint pt) {
LinearGradientPaint paint = (LinearGradientPaint) pt; LinearGradientPaint paint = (LinearGradientPaint) pt;
boolean linear = (paint.getColorSpace() == ColorSpaceType.LINEAR_RGB);
Color[] colors = paint.getColors(); Color[] colors = paint.getColors();
Point2D pt1 = paint.getStartPoint(); Point2D pt1 = paint.getStartPoint();
Point2D pt2 = paint.getEndPoint(); Point2D pt2 = paint.getEndPoint();
AffineTransform at = paint.getTransform();
at.preConcatenate(sg2d.transform);
int repeat = XRUtils.getRepeatForCycleMethod(paint.getCycleMethod()); int repeat = XRUtils.getRepeatForCycleMethod(paint.getCycleMethod());
float[] fractions = paint.getFractions(); float[] fractions = paint.getFractions();
int[] pixels = convertToIntArgbPixels(colors, linear); int[] pixels = convertToIntArgbPixels(colors);
AffineTransform at = paint.getTransform();
try { try {
at.invert(); at.invert();
} catch (NoninvertibleTransformException ex) { } catch (NoninvertibleTransformException ex) {
...@@ -169,8 +153,10 @@ abstract class XRPaints { ...@@ -169,8 +153,10 @@ abstract class XRPaints {
} }
XRBackend con = xrCompMan.getBackend(); XRBackend con = xrCompMan.getBackend();
int gradient = con.createLinearGradient(pt1, pt2, fractions, pixels, repeat, at); int gradient = con.createLinearGradient(pt1, pt2, fractions, pixels, repeat);
xrCompMan.setGradientPaint(new XRSurfaceData.XRInternalSurfaceData(con, gradient, at)); XRInternalSurfaceData x11sd = new XRSurfaceData.XRInternalSurfaceData(con, gradient);
x11sd.setStaticSrcTx(at);
xrCompMan.setGradientPaint(x11sd);
} }
} }
...@@ -179,136 +165,101 @@ abstract class XRPaints { ...@@ -179,136 +165,101 @@ abstract class XRPaints {
@Override @Override
boolean isPaintValid(SunGraphics2D sg2d) { boolean isPaintValid(SunGraphics2D sg2d) {
RadialGradientPaint grad = (RadialGradientPaint) sg2d.paint; RadialGradientPaint grad = (RadialGradientPaint) sg2d.paint;
return grad.getFocusPoint().equals(grad.getCenterPoint()); return grad.getFocusPoint().equals(grad.getCenterPoint())
&& grad.getColorSpace() == ColorSpaceType.SRGB;
} }
@Override @Override
void setXRPaint(SunGraphics2D sg2d, Paint pt) { void setXRPaint(SunGraphics2D sg2d, Paint pt) {
RadialGradientPaint paint = (RadialGradientPaint) pt; RadialGradientPaint paint = (RadialGradientPaint) pt;
boolean linear = (paint.getColorSpace() == ColorSpaceType.LINEAR_RGB);
Color[] colors = paint.getColors(); Color[] colors = paint.getColors();
Point2D center = paint.getCenterPoint(); Point2D center = paint.getCenterPoint();
Point2D focus = paint.getFocusPoint();
int repeat = XRUtils.getRepeatForCycleMethod(paint.getCycleMethod()); int repeat = XRUtils.getRepeatForCycleMethod(paint.getCycleMethod());
float[] fractions = paint.getFractions(); float[] fractions = paint.getFractions();
int[] pixels = convertToIntArgbPixels(colors, linear); int[] pixels = convertToIntArgbPixels(colors);
float radius = paint.getRadius(); float radius = paint.getRadius();
// save original (untransformed) center and focus points float cx = (float) center.getX();
double cx = center.getX(); float cy = (float) center.getY();
double cy = center.getY();
double fx = focus.getX();
double fy = focus.getY();
AffineTransform at = paint.getTransform(); AffineTransform at = paint.getTransform();
at.preConcatenate(sg2d.transform);
focus = at.transform(focus, focus);
// transform unit circle to gradient coords; we start with the
// unit circle (center=(0,0), focus on positive x-axis, radius=1)
// and then transform into gradient space
at.translate(cx, cy);
at.rotate(fx - cx, fy - cy);
// at.scale(radius, radius);
// invert to get mapping from device coords to unit circle
try { try {
at.invert(); at.invert();
} catch (Exception e) { } catch (NoninvertibleTransformException ex) {
at.setToScale(0.0, 0.0); ex.printStackTrace();
} }
focus = at.transform(focus, focus);
// clamp the focus point so that it does not rest on, or outside
// of, the circumference of the gradient circle
fx = Math.min(focus.getX(), 0.99);
XRBackend con = xrCompMan.getBackend(); XRBackend con = xrCompMan.getBackend();
int gradient = con.createRadialGradient(new Point2D.Float(0, 0), new Point2D.Float(0, 0), 0, radius, fractions, pixels, repeat, at); int gradient = con.createRadialGradient(cx, cy, 0, radius, fractions, pixels, repeat);
xrCompMan.setGradientPaint(new XRSurfaceData.XRInternalSurfaceData(con, gradient, at)); XRInternalSurfaceData x11sd = new XRSurfaceData.XRInternalSurfaceData(con, gradient);
x11sd.setStaticSrcTx(at);
xrCompMan.setGradientPaint(x11sd);
} }
} }
private static class XRTexture extends XRPaints { private static class XRTexture extends XRPaints {
@Override private XRSurfaceData getAccSrcSurface(XRSurfaceData dstData, BufferedImage bi) {
boolean isPaintValid(SunGraphics2D sg2d) { // REMIND: this is a hack that attempts to cache the system
TexturePaint paint = (TexturePaint) sg2d.paint; // memory image from the TexturePaint instance into an
BufferedImage bi = paint.getImage(); // XRender pixmap...
XRSurfaceData dstData = (XRSurfaceData) sg2d.getDestSurface();
SurfaceData srcData = dstData.getSourceSurfaceData(bi, SunGraphics2D.TRANSFORM_ISIDENT, CompositeType.SrcOver, null); SurfaceData srcData = dstData.getSourceSurfaceData(bi, SunGraphics2D.TRANSFORM_ISIDENT, CompositeType.SrcOver, null);
if (!(srcData instanceof XRSurfaceData)) { if (!(srcData instanceof XRSurfaceData)) {
// REMIND: this is a hack that attempts to cache the system
// memory image from the TexturePaint instance into an
// OpenGL texture...
srcData = dstData.getSourceSurfaceData(bi, SunGraphics2D.TRANSFORM_ISIDENT, CompositeType.SrcOver, null); srcData = dstData.getSourceSurfaceData(bi, SunGraphics2D.TRANSFORM_ISIDENT, CompositeType.SrcOver, null);
if (!(srcData instanceof XRSurfaceData)) { if (!(srcData instanceof XRSurfaceData)) {
return false; throw new InternalError("Surface not cachable");
} }
} }
return true; return (XRSurfaceData) srcData;
}
@Override
boolean isPaintValid(SunGraphics2D sg2d) {
TexturePaint paint = (TexturePaint) sg2d.paint;
BufferedImage bi = paint.getImage();
XRSurfaceData dstData = (XRSurfaceData) sg2d.getDestSurface();
return getAccSrcSurface(dstData, bi) != null;
} }
@Override @Override
void setXRPaint(SunGraphics2D sg2d, Paint pt) { void setXRPaint(SunGraphics2D sg2d, Paint pt) {
TexturePaint paint = (TexturePaint) pt; TexturePaint paint = (TexturePaint) pt;
BufferedImage bi = paint.getImage(); BufferedImage bi = paint.getImage();
SurfaceData dstData = sg2d.surfaceData; Rectangle2D anchor = paint.getAnchorRect();
SurfaceData srcData = dstData.getSourceSurfaceData(bi, SunGraphics2D.TRANSFORM_ISIDENT, CompositeType.SrcOver, null);
// REMIND: this hack tries to ensure that we have a cached texture
if (!(srcData instanceof XRSurfaceData)) {
srcData = dstData.getSourceSurfaceData(paint.getImage(), SunGraphics2D.TRANSFORM_ISIDENT, CompositeType.SrcOver, null);
if (!(srcData instanceof XRSurfaceData)) {
throw new InternalError("Surface not cachable");
}
}
XRSurfaceData x11SrcData = (XRSurfaceData) srcData; XRSurfaceData dstData = (XRSurfaceData) sg2d.surfaceData;
XRSurfaceData srcData = (XRSurfaceData) getAccSrcSurface(dstData, bi);
AffineTransform at = (AffineTransform) sg2d.transform.clone(); AffineTransform at = new AffineTransform();
Rectangle2D anchor = paint.getAnchorRect();
at.translate(anchor.getX(), anchor.getY()); at.translate(anchor.getX(), anchor.getY());
at.scale(anchor.getWidth() / ((double) bi.getWidth()), anchor.getHeight() / ((double) bi.getHeight())); at.scale(anchor.getWidth() / ((double) bi.getWidth()), anchor.getHeight() / ((double) bi.getHeight()));
try { try {
at.invert(); at.invert();
} catch (NoninvertibleTransformException ex) { } catch (NoninvertibleTransformException ex) {
at.setToIdentity(); /* TODO: Right thing to do in this case? */ at.setToIdentity();
} }
srcData.setStaticSrcTx(at);
x11SrcData.validateAsSource(at, XRUtils.RepeatNormal, XRUtils.ATransOpToXRQuality(sg2d.interpolationType)); srcData.validateAsSource(at, XRUtils.RepeatNormal, XRUtils.ATransOpToXRQuality(sg2d.interpolationType));
xrCompMan.setTexturePaint(((XRSurfaceData) srcData)); xrCompMan.setTexturePaint(srcData);
} }
} }
public int[] convertToIntArgbPixels(Color[] colors, boolean linear) { public int[] convertToIntArgbPixels(Color[] colors) {
int[] pixels = new int[colors.length]; int[] pixels = new int[colors.length];
for (int i = 0; i < colors.length; i++) { for (int i = 0; i < colors.length; i++) {
pixels[i] = colorToIntArgbPixel(colors[i], linear); pixels[i] = colorToIntArgbPixel(colors[i]);
} }
return pixels; return pixels;
} }
public int colorToIntArgbPixel(Color c, boolean linear) { public int colorToIntArgbPixel(Color c) {
int rgb = c.getRGB(); int rgb = c.getRGB();
int a = (int) Math.round(xrCompMan.getExtraAlpha() * (rgb >>> 24));
int a = rgb >>> 24; return ((a << 24) | (rgb & 0x00FFFFFF));
int r = (rgb >> 16) & 0xff;
int g = (rgb >> 8) & 0xff;
int b = (rgb) & 0xff;
if (linear) {
r = BufferedPaints.convertSRGBtoLinearRGB(r);
g = BufferedPaints.convertSRGBtoLinearRGB(g);
b = BufferedPaints.convertSRGBtoLinearRGB(b);
}
a *= xrCompMan.getExtraAlpha();
return ((a << 24) | (r << 16) | (g << 8) | (b));
} }
} }
...@@ -395,6 +395,7 @@ public abstract class XRSurfaceData extends XSurfaceData { ...@@ -395,6 +395,7 @@ public abstract class XRSurfaceData extends XSurfaceData {
boolean transformInUse = false; boolean transformInUse = false;
AffineTransform validatedSourceTransform = new AffineTransform(); AffineTransform validatedSourceTransform = new AffineTransform();
AffineTransform staticSrcTx = null;
int validatedRepeat = XRUtils.RepeatNone; int validatedRepeat = XRUtils.RepeatNone;
int validatedFilter = XRUtils.FAST; int validatedFilter = XRUtils.FAST;
...@@ -423,13 +424,24 @@ public abstract class XRSurfaceData extends XSurfaceData { ...@@ -423,13 +424,24 @@ public abstract class XRSurfaceData extends XSurfaceData {
} }
} else if (!transformInUse || } else if (!transformInUse ||
(transformInUse && !sxForm.equals(validatedSourceTransform))) { (transformInUse && !sxForm.equals(validatedSourceTransform))) {
validatedSourceTransform.setTransform(sxForm.getScaleX(), validatedSourceTransform.setTransform(sxForm.getScaleX(),
sxForm.getShearY(), sxForm.getShearY(),
sxForm.getShearX(), sxForm.getShearX(),
sxForm.getScaleY(), sxForm.getScaleY(),
sxForm.getTranslateX(), sxForm.getTranslateX(),
sxForm.getTranslateY()); sxForm.getTranslateY());
renderQueue.setPictureTransform(picture, validatedSourceTransform);
AffineTransform srcTransform = validatedSourceTransform;
if(staticSrcTx != null) {
// Apply static transform set when used as texture or gradient.
// Create a copy to not modify validatedSourceTransform as
// this would confuse the validation logic.
srcTransform = new AffineTransform(validatedSourceTransform);
srcTransform.preConcatenate(staticSrcTx);
}
renderQueue.setPictureTransform(picture, srcTransform);
transformInUse = true; transformInUse = true;
} }
...@@ -547,15 +559,10 @@ public abstract class XRSurfaceData extends XSurfaceData { ...@@ -547,15 +559,10 @@ public abstract class XRSurfaceData extends XSurfaceData {
} }
public static class XRInternalSurfaceData extends XRSurfaceData { public static class XRInternalSurfaceData extends XRSurfaceData {
public XRInternalSurfaceData(XRBackend renderQueue, int pictXid, public XRInternalSurfaceData(XRBackend renderQueue, int pictXid) {
AffineTransform transform) {
super(renderQueue); super(renderQueue);
this.picture = pictXid; this.picture = pictXid;
this.validatedSourceTransform = transform; this.transformInUse = false;
if (validatedSourceTransform != null) {
transformInUse = true;
}
} }
public boolean canSourceSendExposures(int x, int y, int w, int h) { public boolean canSourceSendExposures(int x, int y, int w, int h) {
...@@ -677,4 +684,8 @@ public abstract class XRSurfaceData extends XSurfaceData { ...@@ -677,4 +684,8 @@ public abstract class XRSurfaceData extends XSurfaceData {
public XRGraphicsConfig getGraphicsConfig() { public XRGraphicsConfig getGraphicsConfig() {
return graphicsConfig; return graphicsConfig;
} }
public void setStaticSrcTx(AffineTransform staticSrcTx) {
this.staticSrcTx = staticSrcTx;
}
} }
...@@ -523,12 +523,10 @@ JNIEXPORT jint JNICALL ...@@ -523,12 +523,10 @@ JNIEXPORT jint JNICALL
Java_sun_java2d_xr_XRBackendNative_XRCreateLinearGradientPaintNative Java_sun_java2d_xr_XRBackendNative_XRCreateLinearGradientPaintNative
(JNIEnv *env, jclass xsd, jfloatArray fractionsArray, (JNIEnv *env, jclass xsd, jfloatArray fractionsArray,
jshortArray pixelsArray, jint x1, jint y1, jint x2, jint y2, jshortArray pixelsArray, jint x1, jint y1, jint x2, jint y2,
jint numStops, jint repeat, jint numStops, jint repeat) {
jint m00, jint m01, jint m02, jint m10, jint m11, jint m12) {
jint i; jint i;
jshort* pixels; jshort* pixels;
jfloat* fractions; jfloat* fractions;
XTransform tr;
XRenderPictureAttributes pict_attr; XRenderPictureAttributes pict_attr;
Picture gradient = 0; Picture gradient = 0;
XRenderColor *colors; XRenderColor *colors;
...@@ -594,8 +592,6 @@ Java_sun_java2d_xr_XRBackendNative_XRCreateLinearGradientPaintNative ...@@ -594,8 +592,6 @@ Java_sun_java2d_xr_XRBackendNative_XRCreateLinearGradientPaintNative
(*env)->ReleasePrimitiveArrayCritical(env, fractionsArray, fractions, JNI_ABORT); (*env)->ReleasePrimitiveArrayCritical(env, fractionsArray, fractions, JNI_ABORT);
if (gradient != 0) { if (gradient != 0) {
BUILD_TRANSFORM_MATRIX(tr, m00, m01, m02, m10, m11, m12);
XRenderSetPictureTransform (awt_display, gradient, &tr);
pict_attr.repeat = repeat; pict_attr.repeat = repeat;
XRenderChangePicture (awt_display, gradient, CPRepeat, &pict_attr); XRenderChangePicture (awt_display, gradient, CPRepeat, &pict_attr);
} }
...@@ -608,12 +604,11 @@ JNIEXPORT jint JNICALL ...@@ -608,12 +604,11 @@ JNIEXPORT jint JNICALL
Java_sun_java2d_xr_XRBackendNative_XRCreateRadialGradientPaintNative Java_sun_java2d_xr_XRBackendNative_XRCreateRadialGradientPaintNative
(JNIEnv *env, jclass xsd, jfloatArray fractionsArray, (JNIEnv *env, jclass xsd, jfloatArray fractionsArray,
jshortArray pixelsArray, jint numStops, jshortArray pixelsArray, jint numStops,
jint innerRadius, jint outerRadius, jint repeat, jint centerX, jint centerY,
jint m00, jint m01, jint m02, jint m10, jint m11, jint m12) { jint innerRadius, jint outerRadius, jint repeat) {
jint i; jint i;
jshort* pixels; jshort* pixels;
jfloat* fractions; jfloat* fractions;
XTransform tr;
XRenderPictureAttributes pict_attr; XRenderPictureAttributes pict_attr;
Picture gradient = 0; Picture gradient = 0;
XRenderColor *colors; XRenderColor *colors;
...@@ -637,11 +632,11 @@ Java_sun_java2d_xr_XRBackendNative_XRCreateRadialGradientPaintNative ...@@ -637,11 +632,11 @@ Java_sun_java2d_xr_XRBackendNative_XRCreateRadialGradientPaintNative
return -1; //TODO release pixels first return -1; //TODO release pixels first
} }
grad.inner.x = 0; grad.inner.x = centerX;
grad.inner.y = 0; grad.inner.y = centerY;
grad.inner.radius = innerRadius; grad.inner.radius = innerRadius;
grad.outer.x = 0; grad.outer.x = centerX;
grad.outer.y = 0; grad.outer.y = centerY;
grad.outer.radius = outerRadius; grad.outer.radius = outerRadius;
/*TODO optimized & malloc check*/ /*TODO optimized & malloc check*/
...@@ -682,8 +677,6 @@ Java_sun_java2d_xr_XRBackendNative_XRCreateRadialGradientPaintNative ...@@ -682,8 +677,6 @@ Java_sun_java2d_xr_XRBackendNative_XRCreateRadialGradientPaintNative
if (gradient != 0) { if (gradient != 0) {
BUILD_TRANSFORM_MATRIX(tr, m00, m01, m02, m10, m11, m12);
XRenderSetPictureTransform (awt_display, gradient, &tr);
pict_attr.repeat = repeat; pict_attr.repeat = repeat;
XRenderChangePicture (awt_display, gradient, CPRepeat, &pict_attr); XRenderChangePicture (awt_display, gradient, CPRepeat, &pict_attr);
} }
......
/*
* Copyright (c) 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.
*
* 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.
*/
import java.awt.*;
import java.awt.MultipleGradientPaint.*;
import java.awt.geom.*;
import java.awt.image.*;
/**
* @test
* @bug 8023483
* @summary tests if the transform-parameter is applied correctly when creating
* a gradient.
* @author ceisserer
*/
public class GradientTransformTest extends Frame {
BufferedImage srcImg;
Image dstImg;
public GradientTransformTest() {
srcImg = createSrcImage();
dstImg = getGraphicsConfiguration().createCompatibleVolatileImage(20,
20);
}
protected void renderToVI(BufferedImage src, Image dst) {
Graphics2D g = (Graphics2D) dst.getGraphics();
g.setColor(Color.WHITE);
g.fillRect(0, 0, dst.getWidth(null), dst.getHeight(null));
AffineTransform at = new AffineTransform();
at.translate(-100, 0);
g.setPaint(new LinearGradientPaint(new Point2D.Float(100, 0),
new Point2D.Float(120, 0), new float[] { 0.0f, 0.75f, 1.0f },
new Color[] { Color.red, Color.green, Color.blue },
CycleMethod.NO_CYCLE, ColorSpaceType.SRGB, at));
g.fillRect(-10, -10, 30, 30);
}
public void paint(Graphics g1) {
Graphics2D g = (Graphics2D) g1;
renderToVI(createSrcImage(), dstImg);
g.drawImage(dstImg, 20, 20, null);
}
public void showFrame() {
setSize(500, 500);
setVisible(true);
}
public void test() {
renderToVI(createSrcImage(), dstImg);
BufferedImage validationImg = new BufferedImage(20, 20,
BufferedImage.TYPE_INT_RGB);
Graphics2D valG = (Graphics2D) validationImg.getGraphics();
valG.drawImage(dstImg, 0, 0, null);
// Loop over all pixel, and count the different pixel values
// encountered.
boolean gradientTranslated = false;
for (int x = 0; x < validationImg.getWidth() && !gradientTranslated; x++) {
for (int y = 0; y < validationImg.getHeight()
&& !gradientTranslated; y++) {
int rgb = validationImg.getRGB(x, y);
if (rgb != -65279) {
gradientTranslated = true;
}
}
}
if (gradientTranslated) {
System.out.println("Passed!");
} else {
throw new RuntimeException("Test FAILED!");
}
}
protected BufferedImage createSrcImage() {
BufferedImage bi = new BufferedImage(10, 10, BufferedImage.TYPE_INT_RGB);
Graphics2D g = (Graphics2D) bi.getGraphics();
g.setColor(Color.YELLOW);
g.fillRect(0, 0, 10, 10);
g.setColor(Color.black);
g.drawLine(0, 0, 10, 10);
return bi;
}
public static void main(String[] args) throws Exception {
boolean show = (args.length > 0 && "-show".equals(args[0]));
final GradientTransformTest t = new GradientTransformTest();
if (show) {
EventQueue.invokeAndWait(new Runnable() {
public void run() {
t.showFrame();
}
});
} else {
t.test();
}
}
}
/*
* Copyright (c) 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.
*
* 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.
*/
import java.awt.*;
import java.awt.MultipleGradientPaint.*;
import java.awt.geom.*;
import java.awt.image.*;
/**
* @test
* @bug 8023483
* @summary tests wether the colorspace-parameter is applied correctly when
* creating a gradient.
* @author ceisserer
*/
public class LinearColorSpaceGradientTest extends Frame {
BufferedImage srcImg;
Image dstImg;
public LinearColorSpaceGradientTest() {
srcImg = createSrcImage();
dstImg = getGraphicsConfiguration().createCompatibleVolatileImage(20,
20);
}
protected void renderToVI(BufferedImage src, Image dst) {
Graphics2D g = (Graphics2D) dst.getGraphics();
g.setColor(Color.WHITE);
g.fillRect(0, 0, dst.getWidth(null), dst.getHeight(null));
AffineTransform at = new AffineTransform();
g.setPaint(new LinearGradientPaint(new Point2D.Float(0, 0),
new Point2D.Float(20, 0), new float[] { 0.0f, 1.0f },
new Color[] { Color.green, Color.blue }, CycleMethod.NO_CYCLE,
ColorSpaceType.LINEAR_RGB, at));
g.fillRect(-10, -10, 30, 30);
}
public void paint(Graphics g1) {
Graphics2D g = (Graphics2D) g1;
renderToVI(createSrcImage(), dstImg);
g.drawImage(dstImg, 20, 20, null);
}
public void showFrame() {
setSize(500, 500);
setVisible(true);
}
public void test() {
renderToVI(createSrcImage(), dstImg);
BufferedImage validationImg = new BufferedImage(20, 20,
BufferedImage.TYPE_INT_RGB);
Graphics2D valG = (Graphics2D) validationImg.getGraphics();
valG.drawImage(dstImg, 0, 0, null);
int b = validationImg.getRGB(10, 10) & 0x000000FF;
if (b > 150) {
System.out.println("Passed!");
} else {
throw new RuntimeException("Test FAILED!");
}
}
protected BufferedImage createSrcImage() {
BufferedImage bi = new BufferedImage(10, 10, BufferedImage.TYPE_INT_RGB);
Graphics2D g = (Graphics2D) bi.getGraphics();
g.setColor(Color.YELLOW);
g.fillRect(0, 0, 10, 10);
g.setColor(Color.black);
g.drawLine(0, 0, 10, 10);
return bi;
}
public static void main(String[] args) throws Exception {
boolean show = (args.length > 0 && "-show".equals(args[0]));
final LinearColorSpaceGradientTest t = new LinearColorSpaceGradientTest();
if (show) {
EventQueue.invokeAndWait(new Runnable() {
public void run() {
t.showFrame();
}
});
} else {
t.test();
}
}
}
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
/* /*
* @test * @test
* @bug 6689025 * @bug 6689025 8023483
* @summary Tests that transformed Paints are rendered correctly * @summary Tests that transformed Paints are rendered correctly
* @author Dmitri.Trembovetski@sun.com: area=Graphics * @author Dmitri.Trembovetski@sun.com: area=Graphics
* @run main/othervm TransformedPaintTest * @run main/othervm TransformedPaintTest
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册