< prev index next >
src/java.desktop/unix/classes/sun/java2d/xr/XRBackendNative.java
Print this page
rev 48927 : Xrender: make aa tile mask handling a responsibility of the backend implementation
rev 48928 : Xrender: Introduction of the deferred backend, allows for accumulated AA mask upload.
rev 48930 : Xrender: Perform Ximg allocation for tile upload only for non-deferred mode
@@ -39,21 +39,45 @@
*
* @author Clemens Eisserer
*/
public class XRBackendNative implements XRBackend {
+ private static long FMTPTR_A8;
+ private static long FMTPTR_ARGB32;
+ private static long ximgPtr;
+
+ private static final int AA_MASK_WIDTH = 128;
+ private static final int AA_MASK_HEIGHT = 64;
static {
initIDs();
}
- private static long FMTPTR_A8;
- private static long FMTPTR_ARGB32;
- private static long MASK_XIMG;
+ int maskPicture;
+ int maskPixmap;
+ long maskGC;
+
+ public XRBackendNative() {
+
+ }
+
+ public void initResources(int parentXID) {
+ ximgPtr = initDefaultAAXImg(AA_MASK_WIDTH, AA_MASK_HEIGHT);
+ if(ximgPtr == 0) {
+ throw new OutOfMemoryError("failed to allocate ximg");
+ }
+
+ maskPixmap = createPixmap(parentXID, 8, AA_MASK_WIDTH, AA_MASK_HEIGHT);
+ maskPicture = createPicture(maskPixmap, XRUtils.PictStandardA8);
+ maskGC = createGC(maskPixmap);
+ setGCExposures(maskGC, false);
+ }
private static native void initIDs();
+ private static native long initDefaultAAXImg(int maxAATileWidth, int maxAATileHeight);
+
public native long createGC(int drawable);
public native void freeGC(long gc);
public native int createPixmap(int drawable, int depth,
@@ -271,16 +295,27 @@
XRenderCompositeTextNative(op, src, dst, sx, sy, 0, elts.getArray(),
glyphs.getArray(), elts.getSize(),
glyphs.getSize());
}
+ public void maskedComposite(byte op, int src, int eaMask, int dst,
+ int srcX, int srcY, int dstX, int dstY, int width,
+ int height, int maskScan, int maskOff, byte[] mask, float ea) {
+ if(mask == null) {
+ renderComposite(op, src, eaMask, dst, srcX, srcY, 0, 0, dstX, dstY, width, height);
+ } else {
+ putMaskImage(maskPixmap, maskGC, mask, 0, 0, 0, 0, width, height, maskOff, maskScan, ea);
+ renderComposite(op, src, maskPicture, dst, srcX, srcY, 0, 0, dstX, dstY, width, height);
+ }
+ }
+
public void putMaskImage(int drawable, long gc, byte[] imageData,
int sx, int sy, int dx, int dy,
int width, int height, int maskOff,
int maskScan, float ea) {
putMaskNative(drawable, gc, imageData, sx, sy, dx, dy,
- width, height, maskOff, maskScan, ea, MASK_XIMG);
+ width, height, maskOff, maskScan, ea, ximgPtr);
}
private static native void putMaskNative(int drawable, long gc,
byte[] imageData,
int sx, int sy, int dx, int dy,
< prev index next >