提交 84e5f9de 编写于 作者: C ceisserer

8023098: XRender : AlphaComposite test results are incorrect.

Reviewed-by: prr, bae
上级 61d38058
...@@ -76,8 +76,9 @@ public class MaskTileManager { ...@@ -76,8 +76,9 @@ public class MaskTileManager {
public void fillMask(XRSurfaceData dst) { public void fillMask(XRSurfaceData dst) {
boolean maskRequired = xrMgr.maskRequired(); boolean maskRequired = xrMgr.maskRequired();
boolean maskEvaluated = XRUtils.isMaskEvaluated(xrMgr.compRule);
if (maskRequired) { if (maskRequired && maskEvaluated) {
mainTile.calculateDirtyAreas(); mainTile.calculateDirtyAreas();
DirtyRegion dirtyArea = mainTile.getDirtyArea().cloneRegion(); DirtyRegion dirtyArea = mainTile.getDirtyArea().cloneRegion();
mainTile.translate(-dirtyArea.x, -dirtyArea.y); mainTile.translate(-dirtyArea.x, -dirtyArea.y);
...@@ -106,7 +107,15 @@ public class MaskTileManager { ...@@ -106,7 +107,15 @@ public class MaskTileManager {
} }
} }
} else { } 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(); mainTile.reset();
......
...@@ -54,6 +54,7 @@ public class XRColor { ...@@ -54,6 +54,7 @@ public class XRColor {
} }
public XRColor(Color color) { public XRColor(Color color) {
setColorValues(color);
} }
public void setColorValues(Color color) { public void setColorValues(Color color) {
......
...@@ -48,7 +48,12 @@ public class XRCompositeManager { ...@@ -48,7 +48,12 @@ public class XRCompositeManager {
private static boolean enableGradCache = true; private static boolean enableGradCache = true;
private static XRCompositeManager instance; 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 texture;
XRSurfaceData gradient; XRSurfaceData gradient;
int alphaMask = XRUtils.None; int alphaMask = XRUtils.None;
...@@ -84,7 +89,6 @@ public class XRCompositeManager { ...@@ -84,7 +89,6 @@ public class XRCompositeManager {
private XRCompositeManager(XRSurfaceData surface) { private XRCompositeManager(XRSurfaceData surface) {
con = new XRBackendNative(); con = new XRBackendNative();
// con = XRBackendJava.getInstance();
String gradProp = String gradProp =
AccessController.doPrivileged(new PrivilegedAction<String>() { AccessController.doPrivileged(new PrivilegedAction<String>() {
...@@ -109,14 +113,7 @@ public class XRCompositeManager { ...@@ -109,14 +113,7 @@ public class XRCompositeManager {
public void initResources(XRSurfaceData surface) { public void initResources(XRSurfaceData surface) {
int parentXid = surface.getXid(); int parentXid = surface.getXid();
int solidPixmap = con.createPixmap(parentXid, 32, 1, 1); solidSrc32 = new XRSolidSrcPict(con, parentXid);
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);
setForeground(0); setForeground(0);
int extraAlphaMask = con.createPixmap(parentXid, 8, 1, 1); int extraAlphaMask = con.createPixmap(parentXid, 8, 1, 1);
...@@ -135,9 +132,7 @@ public class XRCompositeManager { ...@@ -135,9 +132,7 @@ public class XRCompositeManager {
} }
public void setForeground(int pixel) { public void setForeground(int pixel) {
solidColor.setColorValues(pixel, false); solidColor.setColorValues(pixel, true);
con.renderRectangle(solidSrcPict.picture, XRUtils.PictOpSrc,
solidColor, 0, 0, 1, 1);
} }
public void setGradientPaint(XRSurfaceData gradient) { public void setGradientPaint(XRSurfaceData gradient) {
...@@ -145,16 +140,16 @@ public class XRCompositeManager { ...@@ -145,16 +140,16 @@ public class XRCompositeManager {
con.freePicture(this.gradient.picture); con.freePicture(this.gradient.picture);
} }
this.gradient = gradient; this.gradient = gradient;
src = gradient; srcType = GRADIENT;
} }
public void setTexturePaint(XRSurfaceData texture) { public void setTexturePaint(XRSurfaceData texture) {
this.texture = texture; this.texture = texture;
src = texture; this.srcType = TEXTURE;
} }
public void XRResetPaint() { public void XRResetPaint() {
src = solidSrcPict; srcType = SOLID;
} }
public void validateCompositeState(Composite comp, AffineTransform xform, public void validateCompositeState(Composite comp, AffineTransform xform,
...@@ -175,7 +170,7 @@ public class XRCompositeManager { ...@@ -175,7 +170,7 @@ public class XRCompositeManager {
validatedComp = comp; validatedComp = comp;
} }
if (sg2d != null && validatedPixel != sg2d.pixel) { if (sg2d != null && (validatedPixel != sg2d.pixel || updatePaint)) {
validatedPixel = sg2d.pixel; validatedPixel = sg2d.pixel;
setForeground(validatedPixel); setForeground(validatedPixel);
} }
...@@ -191,14 +186,14 @@ public class XRCompositeManager { ...@@ -191,14 +186,14 @@ public class XRCompositeManager {
validatedPaint = paint; validatedPaint = paint;
} }
if (src != solidSrcPict) { if (srcType != SOLID) {
AffineTransform at = (AffineTransform) xform.clone(); AffineTransform at = (AffineTransform) xform.clone();
try { try {
at.invert(); at.invert();
} catch (NoninvertibleTransformException e) { } catch (NoninvertibleTransformException e) {
at.setToIdentity(); 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 { ...@@ -234,13 +229,13 @@ public class XRCompositeManager {
public boolean maskRequired() { public boolean maskRequired() {
return (!xorEnabled) return (!xorEnabled)
&& ((src != solidSrcPict) && ((srcType != SOLID)
|| (src == solidSrcPict && solidColor.alpha != 0xffff) || (extraAlpha != 1.0f)); || (srcType == SOLID && (solidColor.alpha != 0xffff) || (extraAlpha != 1.0f)));
} }
public void XRComposite(int src, int mask, int dst, int srcX, int srcY, 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 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 cachedX = srcX;
int cachedY = srcY; int cachedY = srcY;
...@@ -276,7 +271,7 @@ public class XRCompositeManager { ...@@ -276,7 +271,7 @@ public class XRCompositeManager {
renderReferenceY = (int) Math.floor(XRUtils renderReferenceY = (int) Math.floor(XRUtils
.XFixedToDouble(renderReferenceY)); .XFixedToDouble(renderReferenceY));
con.renderCompositeTrapezoids(compRule, src.picture, con.renderCompositeTrapezoids(compRule, getCurrentSource().picture,
XRUtils.PictStandardA8, dst, renderReferenceX, XRUtils.PictStandardA8, dst, renderReferenceX,
renderReferenceY, trapList); renderReferenceY, trapList);
} }
...@@ -294,15 +289,46 @@ public class XRCompositeManager { ...@@ -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, public void compositeBlit(XRSurfaceData src, XRSurfaceData dst, int sx,
int sy, int dx, int dy, int w, int h) { int sy, int dx, int dy, int w, int h) {
con.renderComposite(compRule, src.picture, alphaMask, dst.picture, sx, con.renderComposite(compRule, src.picture, alphaMask, dst.picture, sx,
sy, 0, 0, dx, dy, w, h); sy, 0, 0, dx, dy, w, h);
} }
public void compositeText(XRSurfaceData dst, int sx, int sy, public void compositeText(XRSurfaceData dst, int sx, int sy, int glyphSet,
int glyphSet, int maskFormat, GrowableEltArray elts) { int maskFormat, GrowableEltArray elts) {
con.XRenderCompositeText(compRule, src.picture, dst.picture, /*
* 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); maskFormat, sx, sy, 0, 0, glyphSet, elts);
} }
...@@ -315,7 +341,11 @@ public class XRCompositeManager { ...@@ -315,7 +341,11 @@ public class XRCompositeManager {
} }
public boolean isTexturePaintActive() { public boolean isTexturePaintActive() {
return src == texture; return srcType == TEXTURE;
}
public boolean isSolidPaintActive() {
return srcType == SOLID;
} }
public XRColor getAlphaColor() { public XRColor getAlphaColor() {
......
...@@ -38,6 +38,7 @@ import sun.java2d.pipe.*; ...@@ -38,6 +38,7 @@ import sun.java2d.pipe.*;
*/ */
public class XRDrawImage extends DrawImage { public class XRDrawImage extends DrawImage {
@Override @Override
protected void renderImageXform(SunGraphics2D sg, Image img, protected void renderImageXform(SunGraphics2D sg, Image img,
AffineTransform tx, int interpType, int sx1, int sy1, int sx2, AffineTransform tx, int interpType, int sx1, int sy1, int sx2,
...@@ -45,20 +46,24 @@ public class XRDrawImage extends DrawImage { ...@@ -45,20 +46,24 @@ public class XRDrawImage extends DrawImage {
SurfaceData dstData = sg.surfaceData; SurfaceData dstData = sg.surfaceData;
SurfaceData srcData = dstData.getSourceSurfaceData(img, SurfaceData srcData = dstData.getSourceSurfaceData(img,
SunGraphics2D.TRANSFORM_GENERIC, sg.imageComp, bgColor); SunGraphics2D.TRANSFORM_GENERIC, sg.imageComp, bgColor);
int compRule = ((AlphaComposite) sg.composite).getRule();
float extraAlpha = ((AlphaComposite) sg.composite).getAlpha();
if (srcData != null && !isBgOperation(srcData, bgColor) 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 srcType = srcData.getSurfaceType();
SurfaceType dstType = dstData.getSurfaceType(); SurfaceType dstType = dstData.getSurfaceType();
TransformBlit blit = TransformBlit.getFromCache(srcType, TransformBlit blit = TransformBlit.getFromCache(srcType,
sg.imageComp, dstType); sg.imageComp, dstType);
if (blit != null) { if (blit != null) {
blit.Transform(srcData, dstData, sg.composite, blit.Transform(srcData, dstData, sg.composite,
sg.getCompClip(), tx, interpType, sx1, sy1, 0, 0, sx2 sg.getCompClip(), tx, interpType, sx1, sy1, 0, 0, sx2
- sx1, sy2 - sy1); - sx1, sy2 - sy1);
return; return;
} }
} }
......
...@@ -84,7 +84,7 @@ public class XRMaskBlit extends MaskBlit { ...@@ -84,7 +84,7 @@ public class XRMaskBlit extends MaskBlit {
int maskPict = maskBuffer.getMaskBuffer(). int maskPict = maskBuffer.getMaskBuffer().
uploadMask(width, height, maskscan, maskoff, mask); 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); srcx, srcy, 0, 0, dstx, dsty, width, height);
maskBuffer.getMaskBuffer().clearUploadMask(maskPict, width, height); maskBuffer.getMaskBuffer().clearUploadMask(maskPict, width, height);
} finally { } finally {
......
/*
* 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 { ...@@ -109,6 +109,7 @@ public abstract class XRSurfaceData extends XSurfaceData {
return XRSurfaceDataProxy.createProxy(srcData, graphicsConfig); return XRSurfaceDataProxy.createProxy(srcData, graphicsConfig);
} }
@Override
public void validatePipe(SunGraphics2D sg2d) { public void validatePipe(SunGraphics2D sg2d) {
TextPipe textpipe; TextPipe textpipe;
boolean validated = false; boolean validated = false;
...@@ -117,14 +118,8 @@ public abstract class XRSurfaceData extends XSurfaceData { ...@@ -117,14 +118,8 @@ public abstract class XRSurfaceData extends XSurfaceData {
* The textpipe for now can't handle TexturePaint when extra-alpha is * The textpipe for now can't handle TexturePaint when extra-alpha is
* specified nore XOR mode * specified nore XOR mode
*/ */
if (sg2d.compositeState < SunGraphics2D.COMP_XOR && if ((textpipe = getTextPipe(sg2d)) == null)
(sg2d.paintState < SunGraphics2D.PAINT_TEXTURE ||
sg2d.composite == null ||
!(sg2d.composite instanceof AlphaComposite) ||
((AlphaComposite) sg2d.composite).getAlpha() == 1.0f))
{ {
textpipe = xrtextpipe;
} else {
super.validatePipe(sg2d); super.validatePipe(sg2d);
textpipe = sg2d.textpipe; textpipe = sg2d.textpipe;
validated = true; validated = true;
...@@ -184,13 +179,38 @@ public abstract class XRSurfaceData extends XSurfaceData { ...@@ -184,13 +179,38 @@ public abstract class XRSurfaceData extends XSurfaceData {
sg2d.imagepipe = xrDrawImage; sg2d.imagepipe = xrDrawImage;
} }
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 (supportedPaint && supportedCompOp) ? xrtextpipe : null;
}
protected MaskFill getMaskFill(SunGraphics2D sg2d) { protected MaskFill getMaskFill(SunGraphics2D sg2d) {
if (sg2d.paintState > SunGraphics2D.PAINT_ALPHACOLOR && AlphaComposite aComp = null;
!XRPaints.isValid(sg2d)) if(sg2d.composite != null
{ && sg2d.composite instanceof AlphaComposite) {
return null; 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 super.getMaskFill(sg2d);
return (supportedPaint && supportedCompOp) ? super.getMaskFill(sg2d) : null;
} }
public RenderLoops getRenderLoops(SunGraphics2D sg2d) { public RenderLoops getRenderLoops(SunGraphics2D sg2d) {
......
...@@ -27,6 +27,7 @@ package sun.java2d.xr; ...@@ -27,6 +27,7 @@ package sun.java2d.xr;
import java.awt.*; import java.awt.*;
import java.awt.MultipleGradientPaint.*; import java.awt.MultipleGradientPaint.*;
import java.awt.geom.AffineTransform;
import java.awt.image.*; import java.awt.image.*;
import sun.java2d.loops.*; import sun.java2d.loops.*;
import static java.awt.AlphaComposite.*; import static java.awt.AlphaComposite.*;
...@@ -258,4 +259,21 @@ public class XRUtils { ...@@ -258,4 +259,21 @@ public class XRUtils {
public static int clampToUShort(int x) { public static int clampToUShort(int x) {
return (x > 65535 ? 65535 : (x < 0) ? 0 : 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;
}
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册