1
1
/*******************************************************************************
2
- * Copyright (c) 2000, 2020 IBM Corporation and others.
2
+ * Copyright (c) 2000, 2025 IBM Corporation and others.
3
3
*
4
4
* This program and the accompanying materials
5
5
* are made available under the terms of the Eclipse Public License 2.0
15
15
16
16
17
17
import java .io .*;
18
+ import java .nio .file .Path ;
18
19
import java .util .*;
19
20
20
21
import org .eclipse .swt .*;
@@ -127,9 +128,9 @@ public final class Image extends Resource implements Drawable {
127
128
static final int DEFAULT_SCANLINE_PAD = 4 ;
128
129
129
130
/**
130
- * ImageFileNameProvider to provide file names at various Zoom levels
131
+ * ImageFileProvider to provide files at various Zoom levels
131
132
*/
132
- private ImageFileNameProvider imageFileNameProvider ;
133
+ private ImageFileProvider imageFileProvider ;
133
134
134
135
/**
135
136
* ImageDataProvider to provide ImageData at various Zoom levels
@@ -388,11 +389,11 @@ public Image(Device device, Image srcImage, int flag) {
388
389
/* Create the 100% representation for the new image from source image & apply flag */
389
390
createRepFromSourceAndApplyFlag (srcImage .getRepresentation (100 ), srcWidth , srcHeight , flag );
390
391
391
- imageFileNameProvider = srcImage .imageFileNameProvider ;
392
+ imageFileProvider = srcImage .imageFileProvider ;
392
393
imageDataProvider = srcImage .imageDataProvider ;
393
394
imageGcDrawer = srcImage .imageGcDrawer ;
394
395
this .styleFlag = srcImage .styleFlag | flag ;
395
- if (imageFileNameProvider != null || imageDataProvider != null ||srcImage .imageGcDrawer != null ) {
396
+ if (imageFileProvider != null || imageDataProvider != null ||srcImage .imageGcDrawer != null ) {
396
397
/* If source image has 200% representation then create the 200% representation for the new image & apply flag */
397
398
NSBitmapImageRep rep200 = srcImage .getRepresentation (200 );
398
399
if (rep200 != null ) createRepFromSourceAndApplyFlag (rep200 , srcWidth * 2 , srcHeight * 2 , flag );
@@ -713,7 +714,7 @@ public Image(Device device, InputStream stream) {
713
714
* </p>
714
715
*
715
716
* @param device the device on which to create the image
716
- * @param filename the name of the file to load the image from
717
+ * @param file the name of the file to load the image from
717
718
*
718
719
* @exception IllegalArgumentException <ul>
719
720
* <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
@@ -730,15 +731,16 @@ public Image(Device device, InputStream stream) {
730
731
* </ul>
731
732
*
732
733
* @see #dispose()
734
+ * @since 3.129
733
735
*/
734
- public Image (Device device , String filename ) {
736
+ public Image (Device device , Path file ) {
735
737
super (device );
736
738
NSAutoreleasePool pool = null ;
737
739
if (!NSThread .isMainThread ()) pool = (NSAutoreleasePool ) new NSAutoreleasePool ().alloc ().init ();
738
740
try {
739
- if (filename == null ) SWT .error (SWT .ERROR_NULL_ARGUMENT );
740
- initNative (filename );
741
- if (this .handle == null ) init (new ImageData ( filename ));
741
+ if (file == null ) SWT .error (SWT .ERROR_NULL_ARGUMENT );
742
+ initNative (file );
743
+ if (this .handle == null ) init (ImageData . create ( file ));
742
744
init ();
743
745
} finally {
744
746
if (pool != null ) pool .release ();
@@ -747,16 +749,54 @@ public Image(Device device, String filename) {
747
749
748
750
/**
749
751
* Constructs an instance of this class by loading its representation
750
- * from the file retrieved from the ImageFileNameProvider. Throws an
752
+ * from the file with the specified name. Throws an error if an error
753
+ * occurs while loading the image, or if the result is an image
754
+ * of an unsupported type.
755
+ * <p>
756
+ * This constructor is provided for convenience when loading
757
+ * a single image only. If the specified file contains
758
+ * multiple images, only the first one will be used.
759
+ * <p>
760
+ * You must dispose the image when it is no longer required.
761
+ * </p>
762
+ *
763
+ * @param device the device on which to create the image
764
+ * @param filename the name of the file to load the image from
765
+ *
766
+ * @exception IllegalArgumentException <ul>
767
+ * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
768
+ * <li>ERROR_NULL_ARGUMENT - if the file name is null</li>
769
+ * </ul>
770
+ * @exception SWTException <ul>
771
+ * <li>ERROR_IO - if an IO error occurs while reading from the file</li>
772
+ * <li>ERROR_INVALID_IMAGE - if the image file contains invalid data </li>
773
+ * <li>ERROR_UNSUPPORTED_DEPTH - if the image file describes an image with an unsupported depth</li>
774
+ * <li>ERROR_UNSUPPORTED_FORMAT - if the image file contains an unrecognized format</li>
775
+ * </ul>
776
+ * @exception SWTError <ul>
777
+ * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li>
778
+ * </ul>
779
+ *
780
+ * @see #dispose()
781
+ * @deprecated Instead use {@link #Image(Device, Path)}
782
+ */
783
+ @ Deprecated (since = "2025-03" )
784
+ public Image (Device device , String filename ) {
785
+ this (device , filename == null ? Path .of (filename ) : null );
786
+ }
787
+
788
+ /**
789
+ * Constructs an instance of this class by loading its representation
790
+ * from the file retrieved from the {@link ImageFileProvider}. Throws an
751
791
* error if an error occurs while loading the image, or if the result
752
792
* is an image of an unsupported type.
753
793
* <p>
754
794
* This constructor is provided for convenience for loading image as
755
795
* per DPI level.
756
796
*
757
797
* @param device the device on which to create the image
758
- * @param imageFileNameProvider the ImageFileNameProvider object that is
759
- * to be used to get the file name
798
+ * @param imageFileProvider the {@link ImageFileProvider} object that is
799
+ * to be used to get the file
760
800
*
761
801
* @exception IllegalArgumentException <ul>
762
802
* <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
@@ -772,24 +812,24 @@ public Image(Device device, String filename) {
772
812
* @exception SWTError <ul>
773
813
* <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li>
774
814
* </ul>
775
- * @since 3.104
815
+ * @since 3.129
776
816
*/
777
- public Image (Device device , ImageFileNameProvider imageFileNameProvider ) {
817
+ public Image (Device device , ImageFileProvider imageFileProvider ) {
778
818
super (device );
779
- if (imageFileNameProvider == null ) SWT .error (SWT .ERROR_NULL_ARGUMENT );
780
- this .imageFileNameProvider = imageFileNameProvider ;
781
- String filename = imageFileNameProvider .getImagePath (100 );
782
- if (filename == null ) SWT .error (SWT .ERROR_INVALID_ARGUMENT );
819
+ if (imageFileProvider == null ) SWT .error (SWT .ERROR_NULL_ARGUMENT );
820
+ this .imageFileProvider = imageFileProvider ;
821
+ Path file = imageFileProvider .getImagePath (100 );
822
+ if (file == null ) SWT .error (SWT .ERROR_INVALID_ARGUMENT );
783
823
NSAutoreleasePool pool = null ;
784
824
if (!NSThread .isMainThread ()) pool = (NSAutoreleasePool ) new NSAutoreleasePool ().alloc ().init ();
785
825
try {
786
- initNative (filename );
787
- if (this .handle == null ) init (new ImageData ( filename ));
826
+ initNative (file );
827
+ if (this .handle == null ) init (ImageData . create ( file ));
788
828
init ();
789
- String filename2x = imageFileNameProvider .getImagePath (200 );
790
- if (filename2x != null ) {
829
+ Path file2x = imageFileProvider .getImagePath (200 );
830
+ if (file2x != null ) {
791
831
alphaInfo_200 = new AlphaInfo ();
792
- id id = NSImageRep .imageRepWithContentsOfFile (NSString .stringWith (filename2x ));
832
+ id id = NSImageRep .imageRepWithContentsOfFile (NSString .stringWith (file2x . toString () ));
793
833
NSImageRep rep = new NSImageRep (id );
794
834
handle .addRepresentation (rep );
795
835
}
@@ -798,6 +838,41 @@ public Image(Device device, ImageFileNameProvider imageFileNameProvider) {
798
838
}
799
839
}
800
840
841
+ /**
842
+ * Constructs an instance of this class by loading its representation
843
+ * from the file retrieved from the ImageFileNameProvider. Throws an
844
+ * error if an error occurs while loading the image, or if the result
845
+ * is an image of an unsupported type.
846
+ * <p>
847
+ * This constructor is provided for convenience for loading image as
848
+ * per DPI level.
849
+ *
850
+ * @param device the device on which to create the image
851
+ * @param imageFileNameProvider the ImageFileNameProvider object that is
852
+ * to be used to get the file name
853
+ *
854
+ * @exception IllegalArgumentException <ul>
855
+ * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
856
+ * <li>ERROR_NULL_ARGUMENT - if the ImageFileNameProvider is null</li>
857
+ * <li>ERROR_INVALID_ARGUMENT - if the fileName provided by ImageFileNameProvider is null at 100% zoom</li>
858
+ * </ul>
859
+ * @exception SWTException <ul>
860
+ * <li>ERROR_IO - if an IO error occurs while reading from the file</li>
861
+ * <li>ERROR_INVALID_IMAGE - if the image file contains invalid data </li>
862
+ * <li>ERROR_UNSUPPORTED_DEPTH - if the image file describes an image with an unsupported depth</li>
863
+ * <li>ERROR_UNSUPPORTED_FORMAT - if the image file contains an unrecognized format</li>
864
+ * </ul>
865
+ * @exception SWTError <ul>
866
+ * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li>
867
+ * </ul>
868
+ * @since 3.104
869
+ * @deprecated Instead use {@link #Image(Device, ImageFileProvider)}
870
+ */
871
+ @ Deprecated (since = "2025-03" )
872
+ public Image (Device device , ImageFileNameProvider imageFileNameProvider ) {
873
+ this (device , (ImageFileProvider ) zoom -> Path .of (imageFileNameProvider .getImagePath (zoom )));
874
+ }
875
+
801
876
/**
802
877
* Constructs an instance of this class by loading its representation
803
878
* from the ImageData retrieved from the ImageDataProvider. Throws an
@@ -880,7 +955,7 @@ public Image(Device device, ImageGcDrawer imageGcDrawer, int width, int height)
880
955
if (!NSThread .isMainThread ()) pool = (NSAutoreleasePool ) new NSAutoreleasePool ().alloc ().init ();
881
956
try {
882
957
init (data );
883
- init ();
958
+ init ();
884
959
} finally {
885
960
if (pool != null ) pool .release ();
886
961
}
@@ -902,7 +977,7 @@ private ImageData drawWithImageGcDrawer(ImageGcDrawer imageGcDrawer, int width,
902
977
903
978
private AlphaInfo _getAlphaInfoAtCurrentZoom (NSBitmapImageRep rep ) {
904
979
int deviceZoom = DPIUtil .getDeviceZoom ();
905
- if (deviceZoom != 100 && (imageFileNameProvider != null || imageDataProvider != null )) {
980
+ if (deviceZoom != 100 && (imageFileProvider != null || imageDataProvider != null )) {
906
981
if (alphaInfo_100 .alphaData != null && alphaInfo_200 != null ) {
907
982
if (alphaInfo_200 .alphaData == null ) initAlpha_200 (rep );
908
983
return alphaInfo_200 ;
@@ -1176,8 +1251,8 @@ public boolean equals (Object object) {
1176
1251
if (device != image .device || alphaInfo_100 .transparentPixel != image .alphaInfo_100 .transparentPixel ) return false ;
1177
1252
if (imageDataProvider != null && image .imageDataProvider != null ) {
1178
1253
return styleFlag == image .styleFlag && imageDataProvider .equals (image .imageDataProvider );
1179
- } else if (imageFileNameProvider != null && image .imageFileNameProvider != null ) {
1180
- return styleFlag == image .styleFlag && imageFileNameProvider .equals (image .imageFileNameProvider );
1254
+ } else if (imageFileProvider != null && image .imageFileProvider != null ) {
1255
+ return styleFlag == image .styleFlag && imageFileProvider .equals (image .imageFileProvider );
1181
1256
} else if (imageGcDrawer != null && image .imageGcDrawer != null ) {
1182
1257
return styleFlag == image .styleFlag && imageGcDrawer .equals (image .imageGcDrawer ) && width == image .width
1183
1258
&& height == image .height ;
@@ -1415,8 +1490,8 @@ NSBitmapImageRep createImageRep(NSSize targetSize) {
1415
1490
public int hashCode () {
1416
1491
if (imageDataProvider != null ) {
1417
1492
return imageDataProvider .hashCode ();
1418
- } else if (imageFileNameProvider != null ) {
1419
- return imageFileNameProvider .hashCode ();
1493
+ } else if (imageFileProvider != null ) {
1494
+ return imageFileProvider .hashCode ();
1420
1495
} else if (imageGcDrawer != null ) {
1421
1496
return Objects .hash (imageGcDrawer , height , width );
1422
1497
} else {
@@ -1507,7 +1582,8 @@ void initAlpha_100(NSBitmapImageRep nativeRep) {
1507
1582
1508
1583
}
1509
1584
1510
- void initNative (String filename ) {
1585
+ void initNative (Path file ) {
1586
+ String filename = file .toString ();
1511
1587
NSAutoreleasePool pool = null ;
1512
1588
NSImage nativeImage = null ;
1513
1589
0 commit comments