Changeset 19675 in josm


Ignore:
Timestamp:
2026-11-02T19:30:23+01:00 (23 hours ago)
Author:
gaben
Message:

fix #24997 - AIOOBE in CameraPlane after resizing a zoomed-in 360° image viewer

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java

    r19080 r19675  
    10511051
    10521052            maxVisibleRect.checkRectSize();
     1053            maxVisibleRect.checkRectPos();
    10531054            synchronized (this) {
    10541055                this.visibleRect = maxVisibleRect;
  • trunk/test/unit/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplayTest.java

    r18684 r19675  
    1010import java.awt.Graphics2D;
    1111import java.awt.Rectangle;
     12import java.awt.event.ComponentEvent;
     13import java.awt.event.ComponentListener;
    1214import java.awt.event.MouseWheelEvent;
    1315import java.awt.event.MouseWheelListener;
    … …  
    2628import org.junit.jupiter.api.Disabled;
    2729import org.junit.jupiter.api.Test;
     30import org.openstreetmap.josm.data.imagery.street_level.Projections;
    2831import org.openstreetmap.josm.gui.layer.geoimage.ImageDisplay.VisRect;
    2932import org.openstreetmap.josm.gui.layer.imagery.ImageryFilterSettings;
    … …  
    113116    }
    114117
     118    /**
     119     * Non-regression test for <a href="https://josm.openstreetmap.de/ticket/24997">#24997</a>, shrinking a zoomed-in
     120     * 360° image viewer must keep the visible rectangle inside the offscreen image.
     121     */
     122    @Test
     123    void testNonRegression24997() {
     124        final ImageDisplay imageDisplay = new ImageDisplay(new ImageryFilterSettings());
     125        imageDisplay.setSize(800, 400);
     126        imageDisplay.setImage0(new TestImageEntry(2000, 1000) {
     127            @Override
     128            public Projections getProjectionType() {
     129                return Projections.EQUIRECTANGULAR;
     130            }
     131
     132            @Override
     133            public BufferedImage read(Dimension target) {
     134                // Byte image, so that CameraPlane uses its fast byte mapping like for typical JPEG photos
     135                return new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_3BYTE_BGR);
     136            }
     137        }).run();
     138        // zoom in near the bottom right corner, so the visible rectangle is moved away from the origin
     139        final MouseWheelEvent zoomIn = new MouseWheelEvent(imageDisplay, 0, 0, 0, 790, 390, 790, 390, 0,
     140                false, MouseWheelEvent.WHEEL_UNIT_SCROLL, -1, -1, -1);
     141        for (MouseWheelListener listener : imageDisplay.getMouseWheelListeners()) {
     142            listener.mouseWheelMoved(zoomIn);
     143        }
     144
     145        imageDisplay.setSize(600, 300);
     146        final ComponentEvent resized = new ComponentEvent(imageDisplay, ComponentEvent.COMPONENT_RESIZED);
     147        for (ComponentListener listener : imageDisplay.getComponentListeners()) {
     148            listener.componentResized(resized);
     149        }
     150        final Graphics2D g = new BufferedImage(600, 300, BufferedImage.TYPE_INT_ARGB).createGraphics();
     151        assertDoesNotThrow(() -> imageDisplay.paintComponent(g));
     152    }
     153
    115154    private static class TestImageEntry extends ImageEntry {
    116155        private final int width;
Note: See TracChangeset for help on using the changeset viewer.