mirror of
https://github.com/openjdk/jdk.git
synced 2026-02-18 06:15:16 +00:00
8023098: XRender : AlphaComposite test results are incorrect
Reviewed-by: prr, bae
This commit is contained in:
parent
8f5a3f7514
commit
95958a239e
@ -76,8 +76,9 @@ public class MaskTileManager {
|
||||
public void fillMask(XRSurfaceData dst) {
|
||||
|
||||
boolean maskRequired = xrMgr.maskRequired();
|
||||
boolean maskEvaluated = XRUtils.isMaskEvaluated(xrMgr.compRule);
|
||||
|
||||
if (maskRequired) {
|
||||
if (maskRequired && maskEvaluated) {
|
||||
mainTile.calculateDirtyAreas();
|
||||
DirtyRegion dirtyArea = mainTile.getDirtyArea().cloneRegion();
|
||||
mainTile.translate(-dirtyArea.x, -dirtyArea.y);
|
||||
@ -106,7 +107,15 @@ public class MaskTileManager {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
xrMgr.XRRenderRectangles(dst, mainTile.getRects());
|
||||
/*
|
||||
* If a mask would be required to store geometry (maskRequired)
|
||||
* composition has to be done rectangle-by-rectagle.
|
||||
*/
|
||||
if(xrMgr.isSolidPaintActive()) {
|
||||
xrMgr.XRRenderRectangles(dst, mainTile.getRects());
|
||||
} else {
|
||||
xrMgr.XRCompositeRectangles(dst, mainTile.getRects());
|
||||
}
|
||||
}
|
||||
|
||||
mainTile.reset();
|
||||
|
||||
@ -54,6 +54,7 @@ public class XRColor {
|
||||
}
|
||||
|
||||
public XRColor(Color color) {
|
||||
setColorValues(color);
|
||||
}
|
||||
|
||||
public void setColorValues(Color color) {
|
||||
|
||||
@ -48,7 +48,12 @@ public class XRCompositeManager {
|
||||
private static boolean enableGradCache = true;
|
||||
private static XRCompositeManager instance;
|
||||
|
||||
XRSurfaceData src;
|
||||
private final static int SOLID = 0;
|
||||
private final static int TEXTURE = 1;
|
||||
private final static int GRADIENT = 2;
|
||||
|
||||
int srcType;
|
||||
XRSolidSrcPict solidSrc32;
|
||||
XRSurfaceData texture;
|
||||
XRSurfaceData gradient;
|
||||
int alphaMask = XRUtils.None;
|
||||
@ -84,7 +89,6 @@ public class XRCompositeManager {
|
||||
|
||||
private XRCompositeManager(XRSurfaceData surface) {
|
||||
con = new XRBackendNative();
|
||||
// con = XRBackendJava.getInstance();
|
||||
|
||||
String gradProp =
|
||||
AccessController.doPrivileged(new PrivilegedAction<String>() {
|
||||
@ -109,14 +113,7 @@ public class XRCompositeManager {
|
||||
public void initResources(XRSurfaceData surface) {
|
||||
int parentXid = surface.getXid();
|
||||
|
||||
int solidPixmap = con.createPixmap(parentXid, 32, 1, 1);
|
||||
int solidSrcPictXID = con.createPicture(solidPixmap,
|
||||
XRUtils.PictStandardARGB32);
|
||||
con.setPictureRepeat(solidSrcPictXID, XRUtils.RepeatNormal);
|
||||
con.renderRectangle(solidSrcPictXID, XRUtils.PictOpSrc,
|
||||
XRColor.FULL_ALPHA, 0, 0, 1, 1);
|
||||
solidSrcPict = new XRSurfaceData.XRInternalSurfaceData(con,
|
||||
solidSrcPictXID);
|
||||
solidSrc32 = new XRSolidSrcPict(con, parentXid);
|
||||
setForeground(0);
|
||||
|
||||
int extraAlphaMask = con.createPixmap(parentXid, 8, 1, 1);
|
||||
@ -135,9 +132,7 @@ public class XRCompositeManager {
|
||||
}
|
||||
|
||||
public void setForeground(int pixel) {
|
||||
solidColor.setColorValues(pixel, false);
|
||||
con.renderRectangle(solidSrcPict.picture, XRUtils.PictOpSrc,
|
||||
solidColor, 0, 0, 1, 1);
|
||||
solidColor.setColorValues(pixel, true);
|
||||
}
|
||||
|
||||
public void setGradientPaint(XRSurfaceData gradient) {
|
||||
@ -145,16 +140,16 @@ public class XRCompositeManager {
|
||||
con.freePicture(this.gradient.picture);
|
||||
}
|
||||
this.gradient = gradient;
|
||||
src = gradient;
|
||||
srcType = GRADIENT;
|
||||
}
|
||||
|
||||
public void setTexturePaint(XRSurfaceData texture) {
|
||||
this.texture = texture;
|
||||
src = texture;
|
||||
this.srcType = TEXTURE;
|
||||
}
|
||||
|
||||
public void XRResetPaint() {
|
||||
src = solidSrcPict;
|
||||
srcType = SOLID;
|
||||
}
|
||||
|
||||
public void validateCompositeState(Composite comp, AffineTransform xform,
|
||||
@ -175,7 +170,7 @@ public class XRCompositeManager {
|
||||
validatedComp = comp;
|
||||
}
|
||||
|
||||
if (sg2d != null && validatedPixel != sg2d.pixel) {
|
||||
if (sg2d != null && (validatedPixel != sg2d.pixel || updatePaint)) {
|
||||
validatedPixel = sg2d.pixel;
|
||||
setForeground(validatedPixel);
|
||||
}
|
||||
@ -191,14 +186,14 @@ public class XRCompositeManager {
|
||||
validatedPaint = paint;
|
||||
}
|
||||
|
||||
if (src != solidSrcPict) {
|
||||
if (srcType != SOLID) {
|
||||
AffineTransform at = (AffineTransform) xform.clone();
|
||||
try {
|
||||
at.invert();
|
||||
} catch (NoninvertibleTransformException e) {
|
||||
at.setToIdentity();
|
||||
}
|
||||
src.validateAsSource(at, -1, XRUtils.ATransOpToXRQuality(sg2d.interpolationType));
|
||||
getCurrentSource().validateAsSource(at, -1, XRUtils.ATransOpToXRQuality(sg2d.interpolationType));
|
||||
}
|
||||
}
|
||||
|
||||
@ -234,13 +229,13 @@ public class XRCompositeManager {
|
||||
|
||||
public boolean maskRequired() {
|
||||
return (!xorEnabled)
|
||||
&& ((src != solidSrcPict)
|
||||
|| (src == solidSrcPict && solidColor.alpha != 0xffff) || (extraAlpha != 1.0f));
|
||||
&& ((srcType != SOLID)
|
||||
|| (srcType == SOLID && (solidColor.alpha != 0xffff) || (extraAlpha != 1.0f)));
|
||||
}
|
||||
|
||||
public void XRComposite(int src, int mask, int dst, int srcX, int srcY,
|
||||
int maskX, int maskY, int dstX, int dstY, int width, int height) {
|
||||
int cachedSrc = (src == XRUtils.None) ? this.src.picture : src;
|
||||
int cachedSrc = (src == XRUtils.None) ? getCurrentSource().picture : src;
|
||||
int cachedX = srcX;
|
||||
int cachedY = srcY;
|
||||
|
||||
@ -276,7 +271,7 @@ public class XRCompositeManager {
|
||||
renderReferenceY = (int) Math.floor(XRUtils
|
||||
.XFixedToDouble(renderReferenceY));
|
||||
|
||||
con.renderCompositeTrapezoids(compRule, src.picture,
|
||||
con.renderCompositeTrapezoids(compRule, getCurrentSource().picture,
|
||||
XRUtils.PictStandardA8, dst, renderReferenceX,
|
||||
renderReferenceY, trapList);
|
||||
}
|
||||
@ -294,15 +289,46 @@ public class XRCompositeManager {
|
||||
}
|
||||
}
|
||||
|
||||
public void XRCompositeRectangles(XRSurfaceData dst, GrowableRectArray rects) {
|
||||
int srcPict = getCurrentSource().picture;
|
||||
|
||||
for(int i=0; i < rects.getSize(); i++) {
|
||||
int x = rects.getX(i);
|
||||
int y = rects.getY(i);
|
||||
int width = rects.getWidth(i);
|
||||
int height = rects.getHeight(i);
|
||||
|
||||
con.renderComposite(compRule, srcPict, XRUtils.None, dst.picture, x, y, 0, 0, x, y, width, height);
|
||||
}
|
||||
}
|
||||
|
||||
protected XRSurfaceData getCurrentSource() {
|
||||
switch(srcType) {
|
||||
case SOLID:
|
||||
return solidSrc32.prepareSrcPict(validatedPixel);
|
||||
case TEXTURE:
|
||||
return texture;
|
||||
case GRADIENT:
|
||||
return gradient;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public void compositeBlit(XRSurfaceData src, XRSurfaceData dst, int sx,
|
||||
int sy, int dx, int dy, int w, int h) {
|
||||
con.renderComposite(compRule, src.picture, alphaMask, dst.picture, sx,
|
||||
sy, 0, 0, dx, dy, w, h);
|
||||
}
|
||||
|
||||
public void compositeText(XRSurfaceData dst, int sx, int sy,
|
||||
int glyphSet, int maskFormat, GrowableEltArray elts) {
|
||||
con.XRenderCompositeText(compRule, src.picture, dst.picture,
|
||||
public void compositeText(XRSurfaceData dst, int sx, int sy, int glyphSet,
|
||||
int maskFormat, GrowableEltArray elts) {
|
||||
/*
|
||||
* Try to emulate the SRC blend mode with SRC_OVER.
|
||||
* We bail out during pipe validation for cases where this is not possible.
|
||||
*/
|
||||
byte textCompRule = (compRule != XRUtils.PictOpSrc) ? compRule : XRUtils.PictOpOver;
|
||||
con.XRenderCompositeText(textCompRule, getCurrentSource().picture, dst.picture,
|
||||
maskFormat, sx, sy, 0, 0, glyphSet, elts);
|
||||
}
|
||||
|
||||
@ -315,7 +341,11 @@ public class XRCompositeManager {
|
||||
}
|
||||
|
||||
public boolean isTexturePaintActive() {
|
||||
return src == texture;
|
||||
return srcType == TEXTURE;
|
||||
}
|
||||
|
||||
public boolean isSolidPaintActive() {
|
||||
return srcType == SOLID;
|
||||
}
|
||||
|
||||
public XRColor getAlphaColor() {
|
||||
|
||||
@ -38,6 +38,7 @@ import sun.java2d.pipe.*;
|
||||
*/
|
||||
|
||||
public class XRDrawImage extends DrawImage {
|
||||
|
||||
@Override
|
||||
protected void renderImageXform(SunGraphics2D sg, Image img,
|
||||
AffineTransform tx, int interpType, int sx1, int sy1, int sx2,
|
||||
@ -45,20 +46,24 @@ public class XRDrawImage extends DrawImage {
|
||||
SurfaceData dstData = sg.surfaceData;
|
||||
SurfaceData srcData = dstData.getSourceSurfaceData(img,
|
||||
SunGraphics2D.TRANSFORM_GENERIC, sg.imageComp, bgColor);
|
||||
int compRule = ((AlphaComposite) sg.composite).getRule();
|
||||
float extraAlpha = ((AlphaComposite) sg.composite).getAlpha();
|
||||
|
||||
if (srcData != null && !isBgOperation(srcData, bgColor)
|
||||
&& interpType <= AffineTransformOp.TYPE_BILINEAR) {
|
||||
&& interpType <= AffineTransformOp.TYPE_BILINEAR
|
||||
&& (XRUtils.isMaskEvaluated(XRUtils.j2dAlphaCompToXR(compRule))
|
||||
|| (XRUtils.isTransformQuadrantRotated(tx)) && extraAlpha == 1.0f))
|
||||
{
|
||||
SurfaceType srcType = srcData.getSurfaceType();
|
||||
SurfaceType dstType = dstData.getSurfaceType();
|
||||
|
||||
TransformBlit blit = TransformBlit.getFromCache(srcType,
|
||||
sg.imageComp, dstType);
|
||||
|
||||
if (blit != null) {
|
||||
blit.Transform(srcData, dstData, sg.composite,
|
||||
sg.getCompClip(), tx, interpType, sx1, sy1, 0, 0, sx2
|
||||
- sx1, sy2 - sy1);
|
||||
return;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -84,7 +84,7 @@ public class XRMaskBlit extends MaskBlit {
|
||||
|
||||
int maskPict = maskBuffer.getMaskBuffer().
|
||||
uploadMask(width, height, maskscan, maskoff, mask);
|
||||
maskBuffer.XRComposite(x11sd.getPicture(), maskPict, x11sd.picture,
|
||||
maskBuffer.XRComposite(x11sd.getPicture(), maskPict, x11dst.getPicture(),
|
||||
srcx, srcy, 0, 0, dstx, dsty, width, height);
|
||||
maskBuffer.getMaskBuffer().clearUploadMask(maskPict, width, height);
|
||||
} finally {
|
||||
|
||||
57
jdk/src/solaris/classes/sun/java2d/xr/XRSolidSrcPict.java
Normal file
57
jdk/src/solaris/classes/sun/java2d/xr/XRSolidSrcPict.java
Normal file
@ -0,0 +1,57 @@
|
||||
/*
|
||||
* 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. 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;
|
||||
|
||||
public class XRSolidSrcPict {
|
||||
XRBackend con;
|
||||
|
||||
XRSurfaceData srcPict;
|
||||
XRColor xrCol;
|
||||
int curPixVal = -1;
|
||||
|
||||
public XRSolidSrcPict(XRBackend con, int parentXid) {
|
||||
this.con = con;
|
||||
|
||||
xrCol = new XRColor();
|
||||
int solidPixmap = con.createPixmap(parentXid, 32, 1, 1);
|
||||
int solidSrcPictXID = con.createPicture(solidPixmap, XRUtils.PictStandardARGB32);
|
||||
con.setPictureRepeat(solidSrcPictXID, XRUtils.RepeatNormal);
|
||||
con.renderRectangle(solidSrcPictXID, XRUtils.PictOpSrc, XRColor.FULL_ALPHA, 0, 0, 1, 1);
|
||||
srcPict = new XRSurfaceData.XRInternalSurfaceData(con, solidSrcPictXID);
|
||||
}
|
||||
|
||||
public XRSurfaceData prepareSrcPict(int pixelVal) {
|
||||
if(pixelVal != curPixVal) {
|
||||
xrCol.setColorValues(pixelVal, false);
|
||||
con.renderRectangle(srcPict.picture, XRUtils.PictOpSrc, xrCol, 0, 0, 1, 1);
|
||||
this.curPixVal = pixelVal;
|
||||
}
|
||||
|
||||
return srcPict;
|
||||
}
|
||||
|
||||
}
|
||||
@ -109,6 +109,7 @@ public abstract class XRSurfaceData extends XSurfaceData {
|
||||
return XRSurfaceDataProxy.createProxy(srcData, graphicsConfig);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void validatePipe(SunGraphics2D sg2d) {
|
||||
TextPipe textpipe;
|
||||
boolean validated = false;
|
||||
@ -117,14 +118,8 @@ public abstract class XRSurfaceData extends XSurfaceData {
|
||||
* The textpipe for now can't handle TexturePaint when extra-alpha is
|
||||
* specified nore XOR mode
|
||||
*/
|
||||
if (sg2d.compositeState < SunGraphics2D.COMP_XOR &&
|
||||
(sg2d.paintState < SunGraphics2D.PAINT_TEXTURE ||
|
||||
sg2d.composite == null ||
|
||||
!(sg2d.composite instanceof AlphaComposite) ||
|
||||
((AlphaComposite) sg2d.composite).getAlpha() == 1.0f))
|
||||
if ((textpipe = getTextPipe(sg2d)) == null)
|
||||
{
|
||||
textpipe = xrtextpipe;
|
||||
} else {
|
||||
super.validatePipe(sg2d);
|
||||
textpipe = sg2d.textpipe;
|
||||
validated = true;
|
||||
@ -184,13 +179,38 @@ public abstract class XRSurfaceData extends XSurfaceData {
|
||||
sg2d.imagepipe = xrDrawImage;
|
||||
}
|
||||
|
||||
protected MaskFill getMaskFill(SunGraphics2D sg2d) {
|
||||
if (sg2d.paintState > SunGraphics2D.PAINT_ALPHACOLOR &&
|
||||
!XRPaints.isValid(sg2d))
|
||||
{
|
||||
return null;
|
||||
protected TextPipe getTextPipe(SunGraphics2D sg2d) {
|
||||
boolean supportedPaint = sg2d.compositeState <= SunGraphics2D.COMP_ALPHA
|
||||
&& (sg2d.paintState <= SunGraphics2D.PAINT_ALPHACOLOR || sg2d.composite == null);
|
||||
|
||||
boolean supportedCompOp = false;
|
||||
if (sg2d.composite instanceof AlphaComposite) {
|
||||
int compRule = ((AlphaComposite) sg2d.composite).getRule();
|
||||
supportedCompOp = XRUtils.isMaskEvaluated(XRUtils.j2dAlphaCompToXR(compRule))
|
||||
|| (compRule == AlphaComposite.SRC
|
||||
&& sg2d.paintState <= SunGraphics2D.PAINT_ALPHACOLOR);
|
||||
}
|
||||
return super.getMaskFill(sg2d);
|
||||
|
||||
return (supportedPaint && supportedCompOp) ? xrtextpipe : null;
|
||||
}
|
||||
|
||||
protected MaskFill getMaskFill(SunGraphics2D sg2d) {
|
||||
AlphaComposite aComp = null;
|
||||
if(sg2d.composite != null
|
||||
&& sg2d.composite instanceof AlphaComposite) {
|
||||
aComp = (AlphaComposite) sg2d.composite;
|
||||
}
|
||||
|
||||
boolean supportedPaint = sg2d.paintState <= SunGraphics2D.PAINT_ALPHACOLOR
|
||||
|| XRPaints.isValid(sg2d);
|
||||
|
||||
boolean supportedCompOp = false;
|
||||
if(aComp != null) {
|
||||
int rule = aComp.getRule();
|
||||
supportedCompOp = XRUtils.isMaskEvaluated(XRUtils.j2dAlphaCompToXR(rule));
|
||||
}
|
||||
|
||||
return (supportedPaint && supportedCompOp) ? super.getMaskFill(sg2d) : null;
|
||||
}
|
||||
|
||||
public RenderLoops getRenderLoops(SunGraphics2D sg2d) {
|
||||
|
||||
@ -27,6 +27,7 @@ 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.*;
|
||||
@ -258,4 +259,21 @@ public class XRUtils {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user