137 double yDiff = Math.max(pt1.getY(), pt2.getY()) - Math.min(pt1.getY(), pt2.getY()); 138 return (int) Math.ceil(Math.sqrt(xDiff*xDiff + yDiff*yDiff)); 139 } 140 141 private static class XRLinearGradient extends XRPaints { 142 143 @Override 144 boolean isPaintValid(SunGraphics2D sg2d) { 145 return true; 146 } 147 148 @Override 149 void setXRPaint(SunGraphics2D sg2d, Paint pt) { 150 LinearGradientPaint paint = (LinearGradientPaint) pt; 151 boolean linear = (paint.getColorSpace() == ColorSpaceType.LINEAR_RGB); 152 153 Color[] colors = paint.getColors(); 154 Point2D pt1 = paint.getStartPoint(); 155 Point2D pt2 = paint.getEndPoint(); 156 157 158 AffineTransform at = paint.getTransform(); 159 at.preConcatenate(sg2d.transform); 160 161 int repeat = XRUtils.getRepeatForCycleMethod(paint.getCycleMethod()); 162 float[] fractions = paint.getFractions(); 163 int[] pixels = convertToIntArgbPixels(colors, linear); 164 165 try { 166 at.invert(); 167 } catch (NoninvertibleTransformException ex) { 168 ex.printStackTrace(); 169 } 170 171 XRBackend con = xrCompMan.getBackend(); 172 int gradient = con.createLinearGradient(pt1, pt2, fractions, pixels, repeat, at); 173 xrCompMan.setGradientPaint(new XRSurfaceData.XRInternalSurfaceData(con, gradient, at)); 174 } 175 } 176 177 private static class XRRadialGradient extends XRPaints { 178 179 @Override 180 boolean isPaintValid(SunGraphics2D sg2d) { 181 RadialGradientPaint grad = (RadialGradientPaint) sg2d.paint; 182 return grad.getFocusPoint().equals(grad.getCenterPoint()); 183 } 184 185 @Override 186 void setXRPaint(SunGraphics2D sg2d, Paint pt) { 187 RadialGradientPaint paint = (RadialGradientPaint) pt; 188 boolean linear = (paint.getColorSpace() == ColorSpaceType.LINEAR_RGB); 189 Color[] colors = paint.getColors(); 190 Point2D center = paint.getCenterPoint(); 191 Point2D focus = paint.getFocusPoint(); 192 193 int repeat = XRUtils.getRepeatForCycleMethod(paint.getCycleMethod()); 194 float[] fractions = paint.getFractions(); 195 int[] pixels = convertToIntArgbPixels(colors, linear); 196 float radius = paint.getRadius(); 197 198 // save original (untransformed) center and focus points 199 double cx = center.getX(); 200 double cy = center.getY(); 201 double fx = focus.getX(); 202 double fy = focus.getY(); 203 204 AffineTransform at = paint.getTransform(); 205 at.preConcatenate(sg2d.transform); 206 focus = at.transform(focus, focus); 207 208 // transform unit circle to gradient coords; we start with the 209 // unit circle (center=(0,0), focus on positive x-axis, radius=1) 210 // and then transform into gradient space 211 at.translate(cx, cy); 212 at.rotate(fx - cx, fy - cy); 213 // at.scale(radius, radius); 214 215 // invert to get mapping from device coords to unit circle 216 try { 217 at.invert(); 218 } catch (Exception e) { 219 at.setToScale(0.0, 0.0); 220 } 221 focus = at.transform(focus, focus); 222 223 // clamp the focus point so that it does not rest on, or outside 224 // of, the circumference of the gradient circle 225 fx = Math.min(focus.getX(), 0.99); 226 227 XRBackend con = xrCompMan.getBackend(); 228 int gradient = con.createRadialGradient(new Point2D.Float(0, 0), new Point2D.Float(0, 0), 0, radius, fractions, pixels, repeat, at); 229 xrCompMan.setGradientPaint(new XRSurfaceData.XRInternalSurfaceData(con, gradient, at)); 230 } 231 } 232 233 private static class XRTexture extends XRPaints { 234 235 @Override 236 boolean isPaintValid(SunGraphics2D sg2d) { 237 TexturePaint paint = (TexturePaint) sg2d.paint; 238 BufferedImage bi = paint.getImage(); 239 XRSurfaceData dstData = (XRSurfaceData) sg2d.getDestSurface(); 240 241 SurfaceData srcData = dstData.getSourceSurfaceData(bi, SunGraphics2D.TRANSFORM_ISIDENT, CompositeType.SrcOver, null); 242 if (!(srcData instanceof XRSurfaceData)) { 243 // REMIND: this is a hack that attempts to cache the system 244 // memory image from the TexturePaint instance into an 245 // OpenGL texture... 246 srcData = dstData.getSourceSurfaceData(bi, SunGraphics2D.TRANSFORM_ISIDENT, CompositeType.SrcOver, null); 247 if (!(srcData instanceof XRSurfaceData)) { 248 return false; 249 } 250 } 251 252 return true; 253 } 254 255 @Override 256 void setXRPaint(SunGraphics2D sg2d, Paint pt) { 257 TexturePaint paint = (TexturePaint) pt; 258 259 BufferedImage bi = paint.getImage(); 260 SurfaceData dstData = sg2d.surfaceData; 261 SurfaceData srcData = dstData.getSourceSurfaceData(bi, SunGraphics2D.TRANSFORM_ISIDENT, CompositeType.SrcOver, null); 262 263 // REMIND: this hack tries to ensure that we have a cached texture 264 if (!(srcData instanceof XRSurfaceData)) { 265 srcData = dstData.getSourceSurfaceData(paint.getImage(), SunGraphics2D.TRANSFORM_ISIDENT, CompositeType.SrcOver, null); 266 if (!(srcData instanceof XRSurfaceData)) { 267 throw new InternalError("Surface not cachable"); 268 } 269 } 270 271 XRSurfaceData x11SrcData = (XRSurfaceData) srcData; 272 273 AffineTransform at = (AffineTransform) sg2d.transform.clone(); 274 Rectangle2D anchor = paint.getAnchorRect(); 275 at.translate(anchor.getX(), anchor.getY()); 276 at.scale(anchor.getWidth() / ((double) bi.getWidth()), anchor.getHeight() / ((double) bi.getHeight())); 277 278 try { 279 at.invert(); 280 } catch (NoninvertibleTransformException ex) { 281 at.setToIdentity(); /* TODO: Right thing to do in this case? */ 282 } 283 284 x11SrcData.validateAsSource(at, XRUtils.RepeatNormal, XRUtils.ATransOpToXRQuality(sg2d.interpolationType)); 285 xrCompMan.setTexturePaint(((XRSurfaceData) srcData)); 286 } 287 } 288 289 public int[] convertToIntArgbPixels(Color[] colors, boolean linear) { 290 int[] pixels = new int[colors.length]; 291 for (int i = 0; i < colors.length; i++) { 292 pixels[i] = colorToIntArgbPixel(colors[i], linear); 293 } 294 return pixels; 295 } 296 297 public int colorToIntArgbPixel(Color c, boolean linear) { 298 int rgb = c.getRGB(); 299 300 int a = rgb >>> 24; 301 int r = (rgb >> 16) & 0xff; 302 int g = (rgb >> 8) & 0xff; 303 int b = (rgb) & 0xff; 304 if (linear) { 305 r = BufferedPaints.convertSRGBtoLinearRGB(r); | 137 double yDiff = Math.max(pt1.getY(), pt2.getY()) - Math.min(pt1.getY(), pt2.getY()); 138 return (int) Math.ceil(Math.sqrt(xDiff*xDiff + yDiff*yDiff)); 139 } 140 141 private static class XRLinearGradient extends XRPaints { 142 143 @Override 144 boolean isPaintValid(SunGraphics2D sg2d) { 145 return true; 146 } 147 148 @Override 149 void setXRPaint(SunGraphics2D sg2d, Paint pt) { 150 LinearGradientPaint paint = (LinearGradientPaint) pt; 151 boolean linear = (paint.getColorSpace() == ColorSpaceType.LINEAR_RGB); 152 153 Color[] colors = paint.getColors(); 154 Point2D pt1 = paint.getStartPoint(); 155 Point2D pt2 = paint.getEndPoint(); 156 157 AffineTransform at = paint.getTransform(); 158 at.preConcatenate(sg2d.transform); 159 160 int repeat = XRUtils.getRepeatForCycleMethod(paint.getCycleMethod()); 161 float[] fractions = paint.getFractions(); 162 int[] pixels = convertToIntArgbPixels(colors, linear); 163 164 try { 165 at.invert(); 166 } catch (NoninvertibleTransformException ex) { 167 ex.printStackTrace(); 168 } 169 170 XRBackend con = xrCompMan.getBackend(); 171 int gradient = con.createLinearGradient(pt1, pt2, fractions, pixels, repeat, at); 172 xrCompMan.setGradientPaint(new XRSurfaceData.XRInternalSurfaceData(con, gradient, at)); 173 } 174 } 175 176 private static class XRRadialGradient extends XRPaints { 177 178 @Override 179 boolean isPaintValid(SunGraphics2D sg2d) { 180 RadialGradientPaint grad = (RadialGradientPaint) sg2d.paint; 181 return grad.getFocusPoint().equals(grad.getCenterPoint()); 182 } 183 184 @Override 185 void setXRPaint(SunGraphics2D sg2d, Paint pt) { 186 RadialGradientPaint paint = (RadialGradientPaint) pt; 187 boolean linear = (paint.getColorSpace() == ColorSpaceType.LINEAR_RGB); 188 Color[] colors = paint.getColors(); 189 Point2D center = paint.getCenterPoint(); 190 191 int repeat = XRUtils.getRepeatForCycleMethod(paint.getCycleMethod()); 192 float[] fractions = paint.getFractions(); 193 int[] pixels = convertToIntArgbPixels(colors, linear); 194 float radius = paint.getRadius(); 195 196 float cx = (float) center.getX(); 197 float cy = (float) center.getY(); 198 199 AffineTransform at = paint.getTransform(); 200 at.preConcatenate(sg2d.transform); 201 try { 202 at.invert(); 203 } catch (NoninvertibleTransformException ex) { 204 ex.printStackTrace(); 205 } 206 207 XRBackend con = xrCompMan.getBackend(); 208 int gradient = con.createRadialGradient(cx, cy, 0, radius, fractions, pixels, repeat, at); 209 xrCompMan.setGradientPaint(new XRSurfaceData.XRInternalSurfaceData(con, gradient, at)); 210 } 211 } 212 213 private static class XRTexture extends XRPaints { 214 215 private XRSurfaceData getAccSrcSurface(XRSurfaceData dstData, BufferedImage bi) { 216 // REMIND: this is a hack that attempts to cache the system 217 // memory image from the TexturePaint instance into an 218 // XRender pixmap... 219 SurfaceData srcData = dstData.getSourceSurfaceData(bi, SunGraphics2D.TRANSFORM_ISIDENT, CompositeType.SrcOver, null); 220 if (!(srcData instanceof XRSurfaceData)) { 221 srcData = dstData.getSourceSurfaceData(bi, SunGraphics2D.TRANSFORM_ISIDENT, CompositeType.SrcOver, null); 222 if (!(srcData instanceof XRSurfaceData)) { 223 throw new InternalError("Surface not cachable"); 224 } 225 } 226 227 return (XRSurfaceData) srcData; 228 } 229 230 @Override 231 boolean isPaintValid(SunGraphics2D sg2d) { 232 TexturePaint paint = (TexturePaint) sg2d.paint; 233 BufferedImage bi = paint.getImage(); 234 XRSurfaceData dstData = (XRSurfaceData) sg2d.getDestSurface(); 235 236 return getAccSrcSurface(dstData, bi) != null; 237 } 238 239 @Override 240 void setXRPaint(SunGraphics2D sg2d, Paint pt) { 241 TexturePaint paint = (TexturePaint) pt; 242 BufferedImage bi = paint.getImage(); 243 Rectangle2D anchor = paint.getAnchorRect(); 244 245 XRSurfaceData dstData = (XRSurfaceData) sg2d.surfaceData; 246 XRSurfaceData srcData = (XRSurfaceData) getAccSrcSurface(dstData, bi); 247 248 AffineTransform at = new AffineTransform(); 249 at.translate(anchor.getX(), anchor.getY()); 250 at.scale(anchor.getWidth() / ((double) bi.getWidth()), anchor.getHeight() / ((double) bi.getHeight())); 251 252 try { 253 at.invert(); 254 } catch (NoninvertibleTransformException ex) { 255 at.setToIdentity(); 256 } 257 srcData.setStaticSrcTx(at); 258 259 srcData.validateAsSource(at, XRUtils.RepeatNormal, XRUtils.ATransOpToXRQuality(sg2d.interpolationType)); 260 xrCompMan.setTexturePaint(srcData); 261 } 262 } 263 264 public int[] convertToIntArgbPixels(Color[] colors, boolean linear) { 265 int[] pixels = new int[colors.length]; 266 for (int i = 0; i < colors.length; i++) { 267 pixels[i] = colorToIntArgbPixel(colors[i], linear); 268 } 269 return pixels; 270 } 271 272 public int colorToIntArgbPixel(Color c, boolean linear) { 273 int rgb = c.getRGB(); 274 275 int a = rgb >>> 24; 276 int r = (rgb >> 16) & 0xff; 277 int g = (rgb >> 8) & 0xff; 278 int b = (rgb) & 0xff; 279 if (linear) { 280 r = BufferedPaints.convertSRGBtoLinearRGB(r); |