|
25 | 25 |
|
26 | 26 | package sun.java2d;
|
27 | 27 |
|
28 |
| -import java.awt.Graphics; |
29 |
| -import java.awt.Graphics2D; |
30 |
| -import java.awt.RenderingHints; |
31 |
| -import java.awt.RenderingHints.Key; |
32 |
| -import java.awt.geom.Area; |
33 |
| -import java.awt.geom.AffineTransform; |
34 |
| -import java.awt.geom.NoninvertibleTransformException; |
35 | 28 | import java.awt.AlphaComposite;
|
36 | 29 | import java.awt.BasicStroke;
|
37 |
| -import java.awt.image.BufferedImage; |
38 |
| -import java.awt.image.BufferedImageOp; |
39 |
| -import java.awt.image.RenderedImage; |
40 |
| -import java.awt.image.renderable.RenderableImage; |
41 |
| -import java.awt.image.renderable.RenderContext; |
42 |
| -import java.awt.image.AffineTransformOp; |
43 |
| -import java.awt.image.Raster; |
44 |
| -import java.awt.image.WritableRaster; |
45 |
| -import java.awt.Image; |
46 |
| -import java.awt.Composite; |
47 | 30 | import java.awt.Color;
|
48 |
| -import java.awt.image.ColorModel; |
49 |
| -import java.awt.GraphicsConfiguration; |
50 |
| -import java.awt.Paint; |
| 31 | +import java.awt.Composite; |
| 32 | +import java.awt.Font; |
| 33 | +import java.awt.FontMetrics; |
51 | 34 | import java.awt.GradientPaint;
|
| 35 | +import java.awt.Graphics; |
| 36 | +import java.awt.Graphics2D; |
| 37 | +import java.awt.GraphicsConfiguration; |
| 38 | +import java.awt.Image; |
52 | 39 | import java.awt.LinearGradientPaint;
|
| 40 | +import java.awt.Paint; |
53 | 41 | import java.awt.RadialGradientPaint;
|
54 |
| -import java.awt.TexturePaint; |
55 |
| -import java.awt.geom.Rectangle2D; |
56 |
| -import java.awt.geom.PathIterator; |
57 |
| -import java.awt.geom.GeneralPath; |
| 42 | +import java.awt.Rectangle; |
| 43 | +import java.awt.RenderingHints; |
| 44 | +import java.awt.RenderingHints.Key; |
58 | 45 | import java.awt.Shape;
|
59 | 46 | import java.awt.Stroke;
|
60 |
| -import java.awt.FontMetrics; |
61 |
| -import java.awt.Rectangle; |
62 |
| -import java.text.AttributedCharacterIterator; |
63 |
| -import java.awt.Font; |
64 |
| -import java.awt.image.ImageObserver; |
| 47 | +import java.awt.TexturePaint; |
65 | 48 | import java.awt.Transparency;
|
| 49 | +import java.awt.font.FontRenderContext; |
66 | 50 | import java.awt.font.GlyphVector;
|
67 | 51 | import java.awt.font.TextLayout;
|
| 52 | +import java.awt.geom.AffineTransform; |
| 53 | +import java.awt.geom.Area; |
| 54 | +import java.awt.geom.GeneralPath; |
| 55 | +import java.awt.geom.NoninvertibleTransformException; |
| 56 | +import java.awt.geom.PathIterator; |
| 57 | +import java.awt.geom.Rectangle2D; |
| 58 | +import java.awt.image.AffineTransformOp; |
| 59 | +import java.awt.image.BufferedImage; |
| 60 | +import java.awt.image.BufferedImageOp; |
| 61 | +import java.awt.image.ColorModel; |
| 62 | +import java.awt.image.ImageObserver; |
| 63 | +import java.awt.image.MultiResolutionImage; |
| 64 | +import java.awt.image.Raster; |
| 65 | +import java.awt.image.RenderedImage; |
| 66 | +import java.awt.image.VolatileImage; |
| 67 | +import java.awt.image.WritableRaster; |
| 68 | +import java.awt.image.renderable.RenderContext; |
| 69 | +import java.awt.image.renderable.RenderableImage; |
| 70 | +import java.lang.annotation.Native; |
| 71 | +import java.text.AttributedCharacterIterator; |
| 72 | +import java.util.Iterator; |
| 73 | +import java.util.Map; |
68 | 74 |
|
| 75 | +import sun.awt.ConstrainableGraphics; |
| 76 | +import sun.awt.SunHints; |
| 77 | +import sun.awt.image.MultiResolutionToolkitImage; |
69 | 78 | import sun.awt.image.SurfaceManager;
|
| 79 | +import sun.awt.image.ToolkitImage; |
| 80 | +import sun.awt.util.PerformanceLogger; |
70 | 81 | import sun.font.FontDesignMetrics;
|
71 | 82 | import sun.font.FontUtilities;
|
| 83 | +import sun.java2d.loops.Blit; |
| 84 | +import sun.java2d.loops.CompositeType; |
| 85 | +import sun.java2d.loops.FontInfo; |
| 86 | +import sun.java2d.loops.MaskFill; |
| 87 | +import sun.java2d.loops.RenderLoops; |
| 88 | +import sun.java2d.loops.SurfaceType; |
| 89 | +import sun.java2d.loops.XORComposite; |
| 90 | +import sun.java2d.pipe.DrawImagePipe; |
| 91 | +import sun.java2d.pipe.LoopPipe; |
72 | 92 | import sun.java2d.pipe.PixelDrawPipe;
|
73 | 93 | import sun.java2d.pipe.PixelFillPipe;
|
| 94 | +import sun.java2d.pipe.Region; |
74 | 95 | import sun.java2d.pipe.ShapeDrawPipe;
|
75 |
| -import sun.java2d.pipe.ValidatePipe; |
76 | 96 | import sun.java2d.pipe.ShapeSpanIterator;
|
77 |
| -import sun.java2d.pipe.Region; |
78 | 97 | import sun.java2d.pipe.TextPipe;
|
79 |
| -import sun.java2d.pipe.DrawImagePipe; |
80 |
| -import sun.java2d.pipe.LoopPipe; |
81 |
| -import sun.java2d.loops.FontInfo; |
82 |
| -import sun.java2d.loops.RenderLoops; |
83 |
| -import sun.java2d.loops.CompositeType; |
84 |
| -import sun.java2d.loops.SurfaceType; |
85 |
| -import sun.java2d.loops.Blit; |
86 |
| -import sun.java2d.loops.MaskFill; |
87 |
| -import java.awt.font.FontRenderContext; |
88 |
| -import sun.java2d.loops.XORComposite; |
89 |
| -import sun.awt.ConstrainableGraphics; |
90 |
| -import sun.awt.SunHints; |
91 |
| -import sun.awt.util.PerformanceLogger; |
92 |
| -import java.util.Map; |
93 |
| -import java.util.Iterator; |
94 |
| - |
95 |
| -import java.lang.annotation.Native; |
96 |
| -import java.awt.image.MultiResolutionImage; |
| 98 | +import sun.java2d.pipe.ValidatePipe; |
97 | 99 |
|
98 | 100 | import static java.awt.geom.AffineTransform.TYPE_FLIP;
|
99 | 101 | import static java.awt.geom.AffineTransform.TYPE_MASK_SCALE;
|
100 | 102 | import static java.awt.geom.AffineTransform.TYPE_TRANSLATION;
|
101 |
| -import java.awt.image.VolatileImage; |
102 |
| -import sun.awt.image.MultiResolutionToolkitImage; |
103 |
| -import sun.awt.image.ToolkitImage; |
104 | 103 |
|
105 | 104 | /**
|
106 | 105 | * This is a the master Graphics2D superclass for all of the Sun
|
@@ -3102,99 +3101,102 @@ private Boolean drawHiDPIImage(Image img,
|
3102 | 3101 | int sx1, int sy1, int sx2, int sy2,
|
3103 | 3102 | Color bgcolor, ImageObserver observer,
|
3104 | 3103 | AffineTransform xform) {
|
3105 |
| - |
3106 |
| - if (img instanceof VolatileImage) { |
3107 |
| - final SurfaceData sd = SurfaceManager.getManager(img) |
3108 |
| - .getPrimarySurfaceData(); |
3109 |
| - final double scaleX = sd.getDefaultScaleX(); |
3110 |
| - final double scaleY = sd.getDefaultScaleY(); |
3111 |
| - if (scaleX == 1 && scaleY == 1) { |
3112 |
| - return null; |
3113 |
| - } |
3114 |
| - sx1 = Region.clipRound(sx1 * scaleX); |
3115 |
| - sx2 = Region.clipRound(sx2 * scaleX); |
3116 |
| - sy1 = Region.clipRound(sy1 * scaleY); |
3117 |
| - sy2 = Region.clipRound(sy2 * scaleY); |
3118 |
| - |
3119 |
| - AffineTransform tx = null; |
3120 |
| - if (xform != null) { |
3121 |
| - tx = new AffineTransform(transform); |
3122 |
| - transform(xform); |
3123 |
| - } |
3124 |
| - boolean result = scaleImage(img, dx1, dy1, dx2, dy2, |
3125 |
| - sx1, sy1, sx2, sy2, |
3126 |
| - bgcolor, observer); |
3127 |
| - if (tx != null) { |
3128 |
| - transform.setTransform(tx); |
3129 |
| - invalidateTransform(); |
3130 |
| - } |
3131 |
| - return result; |
3132 |
| - } else if (img instanceof MultiResolutionImage) { |
3133 |
| - // get scaled destination image size |
3134 |
| - |
3135 |
| - int width = img.getWidth(observer); |
3136 |
| - int height = img.getHeight(observer); |
3137 |
| - |
3138 |
| - MultiResolutionImage mrImage = (MultiResolutionImage) img; |
3139 |
| - Image resolutionVariant = getResolutionVariant(mrImage, width, height, |
3140 |
| - dx1, dy1, dx2, dy2, |
3141 |
| - sx1, sy1, sx2, sy2, |
3142 |
| - xform); |
3143 |
| - |
3144 |
| - if (resolutionVariant != img && resolutionVariant != null) { |
3145 |
| - // recalculate source region for the resolution variant |
3146 |
| - |
3147 |
| - ImageObserver rvObserver = MultiResolutionToolkitImage. |
3148 |
| - getResolutionVariantObserver(img, observer, |
3149 |
| - width, height, -1, -1); |
3150 |
| - |
3151 |
| - int rvWidth = resolutionVariant.getWidth(rvObserver); |
3152 |
| - int rvHeight = resolutionVariant.getHeight(rvObserver); |
3153 |
| - |
3154 |
| - if (rvWidth < 0 || rvHeight < 0) { |
3155 |
| - // The resolution variant is not loaded yet, try to use default resolution |
3156 |
| - resolutionVariant = mrImage.getResolutionVariant(width, height); |
3157 |
| - rvWidth = resolutionVariant.getWidth(rvObserver); |
3158 |
| - rvHeight = resolutionVariant.getHeight(rvObserver); |
| 3104 | + try { |
| 3105 | + if (img instanceof VolatileImage) { |
| 3106 | + final SurfaceData sd = SurfaceManager.getManager(img) |
| 3107 | + .getPrimarySurfaceData(); |
| 3108 | + final double scaleX = sd.getDefaultScaleX(); |
| 3109 | + final double scaleY = sd.getDefaultScaleY(); |
| 3110 | + if (scaleX == 1 && scaleY == 1) { |
| 3111 | + return null; |
3159 | 3112 | }
|
3160 |
| - |
3161 |
| - if (0 < width && 0 < height && 0 < rvWidth && 0 < rvHeight) { |
3162 |
| - |
3163 |
| - double widthScale = ((double) rvWidth) / width; |
3164 |
| - double heightScale = ((double) rvHeight) / height; |
3165 |
| - |
3166 |
| - if (resolutionVariant instanceof VolatileImage) { |
3167 |
| - SurfaceData sd = SurfaceManager |
3168 |
| - .getManager(resolutionVariant) |
3169 |
| - .getPrimarySurfaceData(); |
3170 |
| - widthScale *= sd.getDefaultScaleX(); |
3171 |
| - heightScale *= sd.getDefaultScaleY(); |
| 3113 | + sx1 = Region.clipRound(sx1 * scaleX); |
| 3114 | + sx2 = Region.clipRound(sx2 * scaleX); |
| 3115 | + sy1 = Region.clipRound(sy1 * scaleY); |
| 3116 | + sy2 = Region.clipRound(sy2 * scaleY); |
| 3117 | + |
| 3118 | + AffineTransform tx = null; |
| 3119 | + if (xform != null) { |
| 3120 | + tx = new AffineTransform(transform); |
| 3121 | + transform(xform); |
| 3122 | + } |
| 3123 | + boolean result = scaleImage(img, dx1, dy1, dx2, dy2, |
| 3124 | + sx1, sy1, sx2, sy2, |
| 3125 | + bgcolor, observer); |
| 3126 | + if (tx != null) { |
| 3127 | + transform.setTransform(tx); |
| 3128 | + invalidateTransform(); |
| 3129 | + } |
| 3130 | + return result; |
| 3131 | + } else if (img instanceof MultiResolutionImage) { |
| 3132 | + // get scaled destination image size |
| 3133 | + |
| 3134 | + int width = img.getWidth(observer); |
| 3135 | + int height = img.getHeight(observer); |
| 3136 | + |
| 3137 | + MultiResolutionImage mrImage = (MultiResolutionImage) img; |
| 3138 | + Image resolutionVariant = getResolutionVariant(mrImage, width, height, |
| 3139 | + dx1, dy1, dx2, dy2, |
| 3140 | + sx1, sy1, sx2, sy2, |
| 3141 | + xform); |
| 3142 | + |
| 3143 | + if (resolutionVariant != img && resolutionVariant != null) { |
| 3144 | + // recalculate source region for the resolution variant |
| 3145 | + |
| 3146 | + ImageObserver rvObserver = MultiResolutionToolkitImage. |
| 3147 | + getResolutionVariantObserver(img, observer, |
| 3148 | + width, height, -1, -1); |
| 3149 | + |
| 3150 | + int rvWidth = resolutionVariant.getWidth(rvObserver); |
| 3151 | + int rvHeight = resolutionVariant.getHeight(rvObserver); |
| 3152 | + |
| 3153 | + if (rvWidth < 0 || rvHeight < 0) { |
| 3154 | + // The resolution variant is not loaded yet, try to use default resolution |
| 3155 | + resolutionVariant = mrImage.getResolutionVariant(width, height); |
| 3156 | + rvWidth = resolutionVariant.getWidth(rvObserver); |
| 3157 | + rvHeight = resolutionVariant.getHeight(rvObserver); |
3172 | 3158 | }
|
3173 | 3159 |
|
3174 |
| - sx1 = Region.clipScale(sx1, widthScale); |
3175 |
| - sy1 = Region.clipScale(sy1, heightScale); |
3176 |
| - sx2 = Region.clipScale(sx2, widthScale); |
3177 |
| - sy2 = Region.clipScale(sy2, heightScale); |
3178 |
| - |
3179 |
| - observer = rvObserver; |
3180 |
| - img = resolutionVariant; |
3181 |
| - |
3182 |
| - if (xform != null) { |
3183 |
| - assert dx1 == 0 && dy1 == 0; |
3184 |
| - assert dx2 == img.getWidth(observer); |
3185 |
| - assert dy2 == img.getHeight(observer); |
3186 |
| - AffineTransform renderTX = new AffineTransform(xform); |
3187 |
| - renderTX.scale(1 / widthScale, 1 / heightScale); |
3188 |
| - return transformImage(img, renderTX, observer); |
| 3160 | + if (0 < width && 0 < height && 0 < rvWidth && 0 < rvHeight) { |
| 3161 | + |
| 3162 | + double widthScale = ((double) rvWidth) / width; |
| 3163 | + double heightScale = ((double) rvHeight) / height; |
| 3164 | + |
| 3165 | + if (resolutionVariant instanceof VolatileImage) { |
| 3166 | + SurfaceData sd = SurfaceManager |
| 3167 | + .getManager(resolutionVariant) |
| 3168 | + .getPrimarySurfaceData(); |
| 3169 | + widthScale *= sd.getDefaultScaleX(); |
| 3170 | + heightScale *= sd.getDefaultScaleY(); |
| 3171 | + } |
| 3172 | + |
| 3173 | + sx1 = Region.clipScale(sx1, widthScale); |
| 3174 | + sy1 = Region.clipScale(sy1, heightScale); |
| 3175 | + sx2 = Region.clipScale(sx2, widthScale); |
| 3176 | + sy2 = Region.clipScale(sy2, heightScale); |
| 3177 | + |
| 3178 | + observer = rvObserver; |
| 3179 | + img = resolutionVariant; |
| 3180 | + |
| 3181 | + if (xform != null) { |
| 3182 | + assert dx1 == 0 && dy1 == 0; |
| 3183 | + assert dx2 == img.getWidth(observer); |
| 3184 | + assert dy2 == img.getHeight(observer); |
| 3185 | + AffineTransform renderTX = new AffineTransform(xform); |
| 3186 | + renderTX.scale(1 / widthScale, 1 / heightScale); |
| 3187 | + return transformImage(img, renderTX, observer); |
| 3188 | + } |
| 3189 | + |
| 3190 | + return scaleImage(img, dx1, dy1, dx2, dy2, |
| 3191 | + sx1, sy1, sx2, sy2, |
| 3192 | + bgcolor, observer); |
| 3193 | + } else { |
| 3194 | + return false; // Image variant is not initialized yet |
3189 | 3195 | }
|
3190 |
| - |
3191 |
| - return scaleImage(img, dx1, dy1, dx2, dy2, |
3192 |
| - sx1, sy1, sx2, sy2, |
3193 |
| - bgcolor, observer); |
3194 |
| - } else { |
3195 |
| - return false; // Image variant is not initialized yet |
3196 | 3196 | }
|
3197 | 3197 | }
|
| 3198 | + } catch (InvalidPipeException e) { |
| 3199 | + return false; |
3198 | 3200 | }
|
3199 | 3201 | return null;
|
3200 | 3202 | }
|
|
0 commit comments