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

Print this page

        

@@ -51,14 +51,19 @@
  */
 
 public class XRRenderer implements PixelDrawPipe, PixelFillPipe, ShapeDrawPipe {
     XRDrawHandler drawHandler;
     MaskTileManager tileManager;
+    XRDrawLine lineGen;
+    GrowableRectArray rectBuffer;
 
     public XRRenderer(MaskTileManager tileManager) {
         this.tileManager = tileManager;
+        this.rectBuffer = tileManager.getMainTile().getRects();
+        
         this.drawHandler = new XRDrawHandler();
+        this.lineGen = new XRDrawLine();
     }
 
     /**
      * Common validate method, used by all XRRender functions to validate the
      * destination context.

@@ -75,24 +80,20 @@
         int transX1 = Region.clipAdd(x1, sg2d.transX);
         int transY1 = Region.clipAdd(y1, sg2d.transY);
         int transX2 = Region.clipAdd(x2, sg2d.transX);
         int transY2 = Region.clipAdd(y2, sg2d.transY);
 
-        // Non clipped fast path
-        if (compClip.contains(transX1, transY1)
-                && compClip.contains(transX2, transY2)) {
             SunToolkit.awtLock();
             try {
                 validateSurface(sg2d);
-                tileManager.addLine(transX1, transY1, transX2, transY2);
+            lineGen.rasterizeLine(rectBuffer, transX1, transY1,
+                    transX2, transY2, compClip.getLoX(), compClip.getLoY(),
+                    compClip.getHiX(), compClip.getHiY(), true, true);
                 tileManager.fillMask((XRSurfaceData) sg2d.surfaceData);
             } finally {
                 SunToolkit.awtUnlock();
             }
-        } else {
-            draw(sg2d, new Line2D.Float(x1, y1, x2, y2));
-        }
     }
 
     public void drawRect(SunGraphics2D sg2d,
                          int x, int y, int width, int height) {
         draw(sg2d, new Rectangle2D.Float(x, y, width, height));

@@ -146,11 +147,11 @@
         }
 
         SunToolkit.awtLock();
         try {
             validateSurface(sg2d);
-            tileManager.addRect(x, y, width, height);
+            rectBuffer.pushRectValues(x, y, width, height);
             tileManager.fillMask((XRSurfaceData) sg2d.surfaceData);
         } finally {
             SunToolkit.awtUnlock();
         }
     }

@@ -197,15 +198,17 @@
         fill(sg2d, new Arc2D.Float(x, y, width, height,
              startAngle, arcAngle, Arc2D.PIE));
     }
 
     private class XRDrawHandler extends ProcessPath.DrawHandler {
+        DirtyRegion region;
 
         XRDrawHandler() {
             // these are bogus values; the caller will use validate()
             // to ensure that they are set properly prior to each usage
             super(0, 0, 0, 0);
+            this.region = new DirtyRegion();
         }
 
         /**
          * This method needs to be called prior to each draw/fillPath()
          * operation to ensure the clip bounds are up to date.

@@ -216,19 +219,36 @@
                       clip.getHiX(), clip.getHiY(), sg2d.strokeHint);
             validateSurface(sg2d);
         }
 
         public void drawLine(int x1, int y1, int x2, int y2) {
-            tileManager.addLine(x1, y1, x2, y2);
+            region.setDirtyLineRegion(x1, y1, x2, y2);
+            int xDiff = region.x2 - region.x;
+            int yDiff = region.y2 - region.y;
+
+            if (xDiff == 0 || yDiff == 0) {
+                // horizontal / diagonal lines can be represented by a single
+                // rectangle
+                rectBuffer.pushRectValues(region.x, region.y, region.x2 - region.x
+                        + 1, region.y2 - region.y + 1);
+            } else if (xDiff == 1 && yDiff == 1) {
+                // fast path for pattern commonly generated by
+                // ProcessPath.DrawHandler
+                rectBuffer.pushRectValues(x1, y1, 1, 1);
+                rectBuffer.pushRectValues(x2, y2, 1, 1);
+            } else {
+                lineGen.rasterizeLine(rectBuffer, x1, y1, x2, y2, 0, 0,
+                        0, 0, false, false);
+            }
         }
 
         public void drawPixel(int x, int y) {
-            tileManager.addRect(x, y, 1, 1);
+            rectBuffer.pushRectValues(x, y, 1, 1);
         }
 
         public void drawScanline(int x1, int x2, int y) {
-            tileManager.addRect(x1, y, x2 - x1 + 1, 1);
+            rectBuffer.pushRectValues(x1, y, x2 - x1 + 1, 1);
         }
     }
 
     protected void drawPath(SunGraphics2D sg2d, Path2D.Float p2df,
                             int transx, int transy) {

@@ -261,11 +281,11 @@
         SunToolkit.awtLock();
         try {
             validateSurface(sg2d);
             int[] spanBox = new int[4];
             while (si.nextSpan(spanBox)) {
-                tileManager.addRect(spanBox[0] + transx,
+                rectBuffer.pushRectValues(spanBox[0] + transx,
                                     spanBox[1] + transy,
                                     spanBox[2] - spanBox[0],
                                     spanBox[3] - spanBox[1]);
             }
             tileManager.fillMask(((XRSurfaceData) sg2d.surfaceData));