25 |
25 |
26 package sun.java2d.xr; |
26 package sun.java2d.xr; |
27 |
27 |
28 import java.awt.*; |
28 import java.awt.*; |
29 import java.awt.geom.*; |
29 import java.awt.geom.*; |
30 |
|
31 import sun.awt.SunToolkit; |
30 import sun.awt.SunToolkit; |
32 import sun.java2d.SunGraphics2D; |
31 import sun.java2d.SunGraphics2D; |
33 import sun.java2d.loops.*; |
32 import sun.java2d.loops.*; |
34 import sun.java2d.pipe.Region; |
33 import sun.java2d.pipe.Region; |
35 import sun.java2d.pipe.PixelDrawPipe; |
34 import sun.java2d.pipe.PixelDrawPipe; |
37 import sun.java2d.pipe.ShapeDrawPipe; |
36 import sun.java2d.pipe.ShapeDrawPipe; |
38 import sun.java2d.pipe.SpanIterator; |
37 import sun.java2d.pipe.SpanIterator; |
39 import sun.java2d.pipe.ShapeSpanIterator; |
38 import sun.java2d.pipe.ShapeSpanIterator; |
40 import sun.java2d.pipe.LoopPipe; |
39 import sun.java2d.pipe.LoopPipe; |
41 |
40 |
|
41 import static sun.java2d.xr.XRUtils.clampToShort; |
|
42 import static sun.java2d.xr.XRUtils.clampToUShort; |
|
43 |
42 /** |
44 /** |
43 * XRender provides only accalerated rectangles. To emulate higher "order" |
45 * XRender provides only accalerated rectangles. To emulate higher "order" |
44 * geometry we have to pass everything else to DoPath/FillSpans. |
46 * geometry we have to pass everything else to DoPath/FillSpans. |
45 * |
47 * |
46 * TODO: DrawRect could be instrified |
48 * TODO: DrawRect could be instrified |
68 sg2d.paint, sg2d); |
70 sg2d.paint, sg2d); |
69 } |
71 } |
70 |
72 |
71 public void drawLine(SunGraphics2D sg2d, int x1, int y1, int x2, int y2) { |
73 public void drawLine(SunGraphics2D sg2d, int x1, int y1, int x2, int y2) { |
72 Region compClip = sg2d.getCompClip(); |
74 Region compClip = sg2d.getCompClip(); |
73 int transX1 = x1 + sg2d.transX; |
75 int transX1 = Region.clipAdd(x1, sg2d.transX); |
74 int transY1 = y1 + sg2d.transY; |
76 int transY1 = Region.clipAdd(y1, sg2d.transY); |
75 int transX2 = x2 + sg2d.transX; |
77 int transX2 = Region.clipAdd(x2, sg2d.transX); |
76 int transY2 = y2 + sg2d.transY; |
78 int transY2 = Region.clipAdd(y2, sg2d.transY); |
77 |
79 |
78 // Non clipped fast path |
80 // Non clipped fast path |
79 if (compClip.contains(transX1, transY1) |
81 if (compClip.contains(transX1, transY1) |
80 && compClip.contains(transX2, transY2)) { |
82 && compClip.contains(transX2, transY2)) { |
|
83 SunToolkit.awtLock(); |
81 try { |
84 try { |
82 SunToolkit.awtLock(); |
|
83 |
|
84 validateSurface(sg2d); |
85 validateSurface(sg2d); |
85 tileManager.addLine(transX1, transY1, transX2, transY2); |
86 tileManager.addLine(transX1, transY1, transX2, transY2); |
86 tileManager.fillMask((XRSurfaceData) sg2d.surfaceData); |
87 tileManager.fillMask((XRSurfaceData) sg2d.surfaceData); |
87 } finally { |
88 } finally { |
88 SunToolkit.awtUnlock(); |
89 SunToolkit.awtUnlock(); |
113 public void drawPolygon(SunGraphics2D sg2d, |
114 public void drawPolygon(SunGraphics2D sg2d, |
114 int xpoints[], int ypoints[], int npoints) { |
115 int xpoints[], int ypoints[], int npoints) { |
115 draw(sg2d, new Polygon(xpoints, ypoints, npoints)); |
116 draw(sg2d, new Polygon(xpoints, ypoints, npoints)); |
116 } |
117 } |
117 |
118 |
118 public synchronized void fillRect(SunGraphics2D sg2d, |
119 public void fillRect(SunGraphics2D sg2d, int x, int y, int width, int height) { |
119 int x, int y, int width, int height) { |
120 x = Region.clipAdd(x, sg2d.transX); |
|
121 y = Region.clipAdd(y, sg2d.transY); |
|
122 |
|
123 /* |
|
124 * Limit x/y to signed short, width/height to unsigned short, |
|
125 * to match the X11 coordinate limits for rectangles. |
|
126 * Correct width/height in case x/y have been modified by clipping. |
|
127 */ |
|
128 if (x > Short.MAX_VALUE || y > Short.MAX_VALUE) { |
|
129 return; |
|
130 } |
|
131 |
|
132 int x2 = Region.dimAdd(x, width); |
|
133 int y2 = Region.dimAdd(y, height); |
|
134 |
|
135 if (x2 < Short.MIN_VALUE || y2 < Short.MIN_VALUE) { |
|
136 return; |
|
137 } |
|
138 |
|
139 x = clampToShort(x); |
|
140 y = clampToShort(y); |
|
141 width = clampToUShort(x2 - x); |
|
142 height = clampToUShort(y2 - y); |
|
143 |
|
144 if (width == 0 || height == 0) { |
|
145 return; |
|
146 } |
|
147 |
120 SunToolkit.awtLock(); |
148 SunToolkit.awtLock(); |
121 try { |
149 try { |
122 validateSurface(sg2d); |
150 validateSurface(sg2d); |
123 |
|
124 XRSurfaceData xrsd = (XRSurfaceData) sg2d.surfaceData; |
|
125 |
|
126 x += sg2d.transform.getTranslateX(); |
|
127 y += sg2d.transform.getTranslateY(); |
|
128 |
|
129 tileManager.addRect(x, y, width, height); |
151 tileManager.addRect(x, y, width, height); |
130 tileManager.fillMask(xrsd); |
152 tileManager.fillMask((XRSurfaceData) sg2d.surfaceData); |
131 |
|
132 } finally { |
153 } finally { |
133 SunToolkit.awtUnlock(); |
154 SunToolkit.awtUnlock(); |
134 } |
155 } |
135 } |
156 } |
136 |
157 |