@@ -154,14 +154,19 @@ InternalImageHandle getOrCreate(int zoom, Supplier<DestroyableImageHandle> creat
154154 return null ;
155155 }
156156
157- DestroyableImageHandle imageHandle = (DestroyableImageHandle ) get (zoom );
158- if (imageHandle != null ) {
159- return imageHandle ;
157+ DestroyableImageHandle registeredimageHandle = (DestroyableImageHandle ) get (zoom );
158+ if (registeredimageHandle != null ) {
159+ return registeredimageHandle ;
160160 }
161161
162- imageHandle = creator .get ();
163- zoomLevelToImageHandle .put (zoom , imageHandle );
164- return imageHandle ;
162+ return runSynchronized (() -> {
163+ DestroyableImageHandle imageHandle = (DestroyableImageHandle ) get (zoom );
164+ if (imageHandle == null ) {
165+ imageHandle = creator .get ();
166+ zoomLevelToImageHandle .put (zoom , imageHandle );
167+ }
168+ return imageHandle ;
169+ });
165170 }
166171
167172 boolean contains (int zoom ) {
@@ -181,15 +186,24 @@ Set<Integer> getAllZooms() {
181186 }
182187
183188 void destroyHandles (Predicate <Integer > filter ) {
184- Iterator <Entry <Integer , DestroyableImageHandle >> it = zoomLevelToImageHandle .entrySet ().iterator ();
185- while (it .hasNext ()) {
186- Entry <Integer , DestroyableImageHandle > zoomToHandle = it .next ();
187- if (filter .test (zoomToHandle .getKey ())) {
188- DestroyableImageHandle imageHandle = zoomToHandle .getValue ();
189- it .remove ();
190- zoomLevelToImageHandle .remove (imageHandle .zoom , imageHandle );
191- imageHandle .destroy ();
189+ runSynchronized (() -> {
190+ Iterator <Entry <Integer , DestroyableImageHandle >> it = zoomLevelToImageHandle .entrySet ().iterator ();
191+ while (it .hasNext ()) {
192+ Entry <Integer , DestroyableImageHandle > zoomToHandle = it .next ();
193+ if (filter .test (zoomToHandle .getKey ())) {
194+ DestroyableImageHandle imageHandle = zoomToHandle .getValue ();
195+ it .remove ();
196+ zoomLevelToImageHandle .remove (imageHandle .zoom , imageHandle );
197+ imageHandle .destroy ();
198+ }
192199 }
200+ return null ;
201+ });
202+ }
203+
204+ <T > T runSynchronized (Supplier <T > supplier ) {
205+ synchronized (this ) {
206+ return supplier .get ();
193207 }
194208 }
195209
@@ -1304,8 +1318,8 @@ public Rectangle getBounds() {
13041318
13051319Rectangle getBounds (int zoom ) {
13061320 if (isDisposed ()) SWT .error (SWT .ERROR_GRAPHIC_DISPOSED );
1307- if ( imageHandleManager .contains (zoom )) {
1308- ImageHandle imageMetadata = imageHandleManager . get ( zoom );
1321+ ImageHandle imageMetadata = imageHandleManager .get (zoom );
1322+ if ( imageMetadata != null ) {
13091323 Rectangle rectangle = new Rectangle (0 , 0 , imageMetadata .width , imageMetadata .height );
13101324 return Win32DPIUtils .scaleBounds (rectangle , zoom , imageMetadata .zoom );
13111325 }
@@ -1388,7 +1402,13 @@ public ImageData getImageData (int zoom) {
13881402 return imageHandle .getImageData ();
13891403 }
13901404
1391- return this .imageProvider .newImageData (zoom );
1405+ return imageHandleManager .runSynchronized (() -> {
1406+ InternalImageHandle obtainedImageHandle = imageHandleManager .get (zoom );
1407+ if (obtainedImageHandle != null ) {
1408+ return obtainedImageHandle .getImageData ();
1409+ }
1410+ return this .imageProvider .newImageData (zoom );
1411+ });
13921412}
13931413
13941414/**
0 commit comments