59 tileList = new ArrayList<MaskTile>();
60 this.xrMgr = xrMgr;
61 this.con = xrMgr.getBackend();
62
63 maskPixmap = con.createPixmap(parentXid, 8, MASK_SIZE, MASK_SIZE);
64 maskPicture = con.createPicture(maskPixmap, XRUtils.PictStandardA8);
65 con.renderRectangle(maskPicture, XRUtils.PictOpClear,
66 new XRColor(Color.black),
67 0, 0, MASK_SIZE, MASK_SIZE);
68 maskGC = con.createGC(maskPixmap);
69 con.setGCExposures(maskGC, false);
70 }
71
72 /**
73 * Transfers the geometry stored (rectangles, lines) to one or more masks,
74 * and renders the result to the destination surface.
75 */
76 public void fillMask(XRSurfaceData dst) {
77
78 boolean maskRequired = xrMgr.maskRequired();
79
80 if (maskRequired) {
81 mainTile.calculateDirtyAreas();
82 DirtyRegion dirtyArea = mainTile.getDirtyArea().cloneRegion();
83 mainTile.translate(-dirtyArea.x, -dirtyArea.y);
84
85 XRColor maskColor = xrMgr.getMaskColor();
86
87 // We don't need tiling if all geometry fits in a single tile
88 if (dirtyArea.getWidth() <= MASK_SIZE &&
89 dirtyArea.getHeight() <= MASK_SIZE)
90 {
91 compositeSingleTile(dst, mainTile, dirtyArea,
92 maskRequired, 0, 0, maskColor);
93 } else {
94 allocTiles(dirtyArea);
95 tileRects();
96
97 for (int i = 0; i < yTiles; i++) {
98 for (int m = 0; m < xTiles; m++) {
99 MaskTile tile = tileList.get(i * xTiles + m);
100
101 int tileStartX = m * MASK_SIZE;
102 int tileStartY = i * MASK_SIZE;
103 compositeSingleTile(dst, tile, dirtyArea, maskRequired,
104 tileStartX, tileStartY, maskColor);
105 }
106 }
107 }
108 } else {
109 xrMgr.XRRenderRectangles(dst, mainTile.getRects());
110 }
111
112 mainTile.reset();
113 }
114
115 /**
116 * Uploads aa geometry generated for maskblit/fill into the mask pixmap.
117 */
118 public int uploadMask(int w, int h, int maskscan, int maskoff, byte[] mask) {
119 int maskPic = XRUtils.None;
120
121 if (mask != null) {
122 float maskAlpha =
123 xrMgr.isTexturePaintActive() ? xrMgr.getExtraAlpha() : 1.0f;
124 con.putMaskImage(maskPixmap, maskGC, mask, 0, 0, 0, 0,
125 w, h, maskoff, maskscan, maskAlpha);
126 maskPic = maskPicture;
127 } else if (xrMgr.isTexturePaintActive()) {
128 maskPic = xrMgr.getExtraAlphaMask();
129 }
|
59 tileList = new ArrayList<MaskTile>();
60 this.xrMgr = xrMgr;
61 this.con = xrMgr.getBackend();
62
63 maskPixmap = con.createPixmap(parentXid, 8, MASK_SIZE, MASK_SIZE);
64 maskPicture = con.createPicture(maskPixmap, XRUtils.PictStandardA8);
65 con.renderRectangle(maskPicture, XRUtils.PictOpClear,
66 new XRColor(Color.black),
67 0, 0, MASK_SIZE, MASK_SIZE);
68 maskGC = con.createGC(maskPixmap);
69 con.setGCExposures(maskGC, false);
70 }
71
72 /**
73 * Transfers the geometry stored (rectangles, lines) to one or more masks,
74 * and renders the result to the destination surface.
75 */
76 public void fillMask(XRSurfaceData dst) {
77
78 boolean maskRequired = xrMgr.maskRequired();
79 boolean maskEvaluated = XRUtils.isMaskEvaluated(xrMgr.compRule);
80
81 if (maskRequired && maskEvaluated) {
82 mainTile.calculateDirtyAreas();
83 DirtyRegion dirtyArea = mainTile.getDirtyArea().cloneRegion();
84 mainTile.translate(-dirtyArea.x, -dirtyArea.y);
85
86 XRColor maskColor = xrMgr.getMaskColor();
87
88 // We don't need tiling if all geometry fits in a single tile
89 if (dirtyArea.getWidth() <= MASK_SIZE &&
90 dirtyArea.getHeight() <= MASK_SIZE)
91 {
92 compositeSingleTile(dst, mainTile, dirtyArea,
93 maskRequired, 0, 0, maskColor);
94 } else {
95 allocTiles(dirtyArea);
96 tileRects();
97
98 for (int i = 0; i < yTiles; i++) {
99 for (int m = 0; m < xTiles; m++) {
100 MaskTile tile = tileList.get(i * xTiles + m);
101
102 int tileStartX = m * MASK_SIZE;
103 int tileStartY = i * MASK_SIZE;
104 compositeSingleTile(dst, tile, dirtyArea, maskRequired,
105 tileStartX, tileStartY, maskColor);
106 }
107 }
108 }
109 } else {
110 /*
111 * If a mask would be required to store geometry (maskRequired)
112 * composition has to be done rectangle-by-rectagle.
113 */
114 if(xrMgr.isSolidPaintActive()) {
115 xrMgr.XRRenderRectangles(dst, mainTile.getRects());
116 } else {
117 xrMgr.XRCompositeRectangles(dst, mainTile.getRects());
118 }
119 }
120
121 mainTile.reset();
122 }
123
124 /**
125 * Uploads aa geometry generated for maskblit/fill into the mask pixmap.
126 */
127 public int uploadMask(int w, int h, int maskscan, int maskoff, byte[] mask) {
128 int maskPic = XRUtils.None;
129
130 if (mask != null) {
131 float maskAlpha =
132 xrMgr.isTexturePaintActive() ? xrMgr.getExtraAlpha() : 1.0f;
133 con.putMaskImage(maskPixmap, maskGC, mask, 0, 0, 0, 0,
134 w, h, maskoff, maskscan, maskAlpha);
135 maskPic = maskPicture;
136 } else if (xrMgr.isTexturePaintActive()) {
137 maskPic = xrMgr.getExtraAlphaMask();
138 }
|