<Swing Dev> [9] Review request for 8170387: JLightweightFrame#syncCopyBuffer() may throw IOOBE
Sergey Bylokhov
Sergey.Bylokhov at oracle.com
Tue Nov 29 16:59:12 UTC 2016
On 29.11.16 18:50, Semyon Sadetsky wrote:
> I did not get this. The area doesn't determine any sizes or location on
> screen. It's simply an optimization to update area of the buffer image
> which was really changed. It cannot be bigger than the buffer image
> size. The logic of the rounding is to "inflate" the rectangle area to
> its next integer coordinates in all directions. With other rounding
> logic you will see artifacts with non-integer scales.
you add this code to the fix:
302 int linestride = bbImage.getWidth();
+308 if (startX + width > linestride) {
+309 width = linestride - startX;
+310 }
the x,y,w,h passed to the method are inside the bounds of the component.
so the simple expectation which can be done is that
R(x*scale),R(x*scale),R(y*scale),R(w*scale),R(h*scale) should be inside
the image which was created in resizeBuffer(): BufferedImage(R(imgW),
R(imgH)). where the "R" is a round operation.
But for some reason the size of the image is smaller, I guess this is
because resizeBuffer() use Math.round() and syncCopyBuffer() uses
ceil+floor.
>>
>> On 28.11.16 16:50, Semyon Sadetsky wrote:
>>> Hello,
>>>
>>> Please review fix for JDK9:
>>>
>>> bug: https://bugs.openjdk.java.net/browse/JDK-8170387
>>>
>>> webrev: http://cr.openjdk.java.net/~ssadetsky/8170387/webrev.00/
>>>
>>> After the rounding the resulting rectangular area may became bigger than
>>> the buffer image size and this will cause IOOB error during the
>>> consequent System#arraycopy() calls. To prevent this error the updated
>>> area is bounded to the buffer image size.
>>>
>>> --Semyon
>>>
>>
>>
>
--
Best regards, Sergey.
More information about the swing-dev
mailing list