src/solaris/classes/sun/java2d/xr/MaskTileManager.java

Print this page




  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          }