diff --git a/.gitignore b/.gitignore
index a73ec5ef12..614bbe7173 100644
--- a/.gitignore
+++ b/.gitignore
@@ -49,3 +49,6 @@ MediaInfoLib.VC.db
# Visual Studio 2015+ cache/options directory
.vs/
+
+# Temporary files
+*~
diff --git a/Project/BCB/Library/MediaInfoLib.cbproj b/Project/BCB/Library/MediaInfoLib.cbproj
index ba6243ca71..9fbbd00063 100644
--- a/Project/BCB/Library/MediaInfoLib.cbproj
+++ b/Project/BCB/Library/MediaInfoLib.cbproj
@@ -402,6 +402,9 @@
209
+
+ 70
+
71
diff --git a/Project/CMake/CMakeLists.txt b/Project/CMake/CMakeLists.txt
index e17a36a014..94c4c63571 100644
--- a/Project/CMake/CMakeLists.txt
+++ b/Project/CMake/CMakeLists.txt
@@ -221,6 +221,7 @@ set(MediaInfoLib_SRCS
${MediaInfoLib_SOURCES_PATH}/MediaInfo/Export/Export_PBCore.cpp
${MediaInfoLib_SOURCES_PATH}/MediaInfo/Export/Export_PBCore2.cpp
${MediaInfoLib_SOURCES_PATH}/MediaInfo/Export/Export_reVTMD.cpp
+ ${MediaInfoLib_SOURCES_PATH}/MediaInfo/Image/File_AmigaIcon.cpp
${MediaInfoLib_SOURCES_PATH}/MediaInfo/Image/File_ArriRaw.cpp
${MediaInfoLib_SOURCES_PATH}/MediaInfo/Image/File_Bmp.cpp
${MediaInfoLib_SOURCES_PATH}/MediaInfo/Image/File_Bpg.cpp
diff --git a/Project/GNU/Library/Makefile.am b/Project/GNU/Library/Makefile.am
index e6abcd92ae..59f49b117e 100644
--- a/Project/GNU/Library/Makefile.am
+++ b/Project/GNU/Library/Makefile.am
@@ -107,6 +107,7 @@ lib@MediaInfoLib_LibName@_la_SOURCES = \
../../../Source/MediaInfo/Export/Export_reVTMD.cpp \
../../../Source/MediaInfo/Export/Export_Niso.cpp \
../../../Source/MediaInfo/Export/Export_Graph.cpp \
+ ../../../Source/MediaInfo/Image/File_AmigaIcon.cpp \
../../../Source/MediaInfo/Image/File_ArriRaw.cpp \
../../../Source/MediaInfo/Image/File_Bmp.cpp \
../../../Source/MediaInfo/Image/File_Bpg.cpp \
diff --git a/Project/GNU/Library/configure.ac b/Project/GNU/Library/configure.ac
index fb7137024e..50048373f0 100644
--- a/Project/GNU/Library/configure.ac
+++ b/Project/GNU/Library/configure.ac
@@ -119,6 +119,7 @@ AC_ARG_ENABLE(tta, AC_HELP_STRING([--disable-tta], [Disable Audio - True
AC_ARG_ENABLE(twinvq, AC_HELP_STRING([--disable-twinvq], [Disable Audio - TwinVQ]), MediaInfoTwinVQ=$enableval, MediaInfoTwinVQ=depend)
AC_ARG_ENABLE(vorbis, AC_HELP_STRING([--disable-vorbis], [Disable Audio - Vorbis]), MediaInfovorbis=$enableval, MediaInfovorbis=depend)
AC_ARG_ENABLE(wvpk, AC_HELP_STRING([--disable-wvpk], [Disable Audio - Wavepack]), MediaInfoWvpk=$enableval, MediaInfoWvpk=depend)
+AC_ARG_ENABLE(amigaicon, AC_HELP_STRING([--disable-amigaicon], [Disable Image - Amiga Icon]), MediaInfoAmigaIcon=$enableval, MediaInfoAmigaIcon=depend)
AC_ARG_ENABLE(arriraw, AC_HELP_STRING([--disable-arriraw], [Disable Image - Arri Raw]), MediaInfoArriRaw=$enableval, MediaInfoArriRaw=depend)
AC_ARG_ENABLE(bmp, AC_HELP_STRING([--disable-bmp], [Disable Image - Bitmap]), MediaInfoBmp=$enableval, MediaInfoBmp=depend)
AC_ARG_ENABLE(bpg, AC_HELP_STRING([--disable-bpg], [Disable Image - BPG]), MediaInfoBpg=$enableval, MediaInfoBpg=depend)
@@ -300,6 +301,7 @@ if test "$MediaInfoTta" = "no"; then AC_DEFINE(MEDIAINFO_TTA_NO) fi; if
if test "$MediaInfoTwinVQ" = "no"; then AC_DEFINE(MEDIAINFO_TWINVQ_NO) fi; if test "$MediaInfoTwinVQ" = "yes"; then AC_DEFINE(MEDIAINFO_TWINVQ_YES) fi
if test "$MediaInfoVorbis" = "no"; then AC_DEFINE(MEDIAINFO_VORBIS_NO) fi; if test "$MediaInfoVorbis" = "yes"; then AC_DEFINE(MEDIAINFO_VORBIS_YES) fi
if test "$MediaInfoWvpk" = "no"; then AC_DEFINE(MEDIAINFO_WVPK_NO) fi; if test "$MediaInfoWvpk" = "yes"; then AC_DEFINE(MEDIAINFO_WVPK_YES) fi
+if test "$MediaInfoAmigaIcon" = "no"; then AC_DEFINE(MEDIAINFO_AMIGAICON_NO) fi; if test "$MediaInfoAmigaIcon" = "yes"; then AC_DEFINE(MEDIAINFO_AMIGAICON_YES) fi
if test "$MediaInfoArriRaw" = "no"; then AC_DEFINE(MEDIAINFO_ARRIRAW_NO) fi; if test "$MediaInfoArriRaw" = "yes"; then AC_DEFINE(MEDIAINFO_ARRIRAW_YES) fi
if test "$MediaInfoBmp" = "no"; then AC_DEFINE(MEDIAINFO_BMP_NO) fi; if test "$MediaInfoBmp" = "yes"; then AC_DEFINE(MEDIAINFO_BMP_YES) fi
if test "$MediaInfoBpg" = "no"; then AC_DEFINE(MEDIAINFO_BPG_NO) fi; if test "$MediaInfoBpg" = "yes"; then AC_DEFINE(MEDIAINFO_BPG_YES) fi
@@ -1076,6 +1078,7 @@ Mcho "Tta " "$MediaInfoTta"
Mcho "TwinVQ " "$MediaInfoTwinVQ"
Mcho "Vorbis " "$MediaInfoVorbis"
Mcho "Wvpk " "$MediaInfoWvpk"
+Mcho "AmigaIcon" "$MediaInfoAmigaIcon"
Mcho "ArriRaw" "$MediaInfoArriRaw"
Mcho "Bmp " "$MediaInfoBmp"
Mcho "Bpg " "$MediaInfoBpg"
diff --git a/Project/MSVC2022/Library/MediaInfoLib.vcxproj b/Project/MSVC2022/Library/MediaInfoLib.vcxproj
index 5989e70970..ebb901b7c5 100644
--- a/Project/MSVC2022/Library/MediaInfoLib.vcxproj
+++ b/Project/MSVC2022/Library/MediaInfoLib.vcxproj
@@ -404,6 +404,7 @@
+
@@ -823,6 +824,7 @@
+
diff --git a/Project/MSVC2022/Library/MediaInfoLib.vcxproj.filters b/Project/MSVC2022/Library/MediaInfoLib.vcxproj.filters
index 8d0be67880..2c20e2ec49 100644
--- a/Project/MSVC2022/Library/MediaInfoLib.vcxproj.filters
+++ b/Project/MSVC2022/Library/MediaInfoLib.vcxproj.filters
@@ -713,6 +713,9 @@
Source Files
+
+ Source Files\Image
+
Source Files\Image
@@ -1489,6 +1492,9 @@
Header Files
+
+ Header Files\Image
+
Header Files\Image
diff --git a/Project/MSVC2022/Library/MediaInfoLib_UWP.vcxproj b/Project/MSVC2022/Library/MediaInfoLib_UWP.vcxproj
index e7cb5e81ef..3c456d462d 100644
--- a/Project/MSVC2022/Library/MediaInfoLib_UWP.vcxproj
+++ b/Project/MSVC2022/Library/MediaInfoLib_UWP.vcxproj
@@ -229,6 +229,7 @@
+
@@ -563,6 +564,7 @@
+
diff --git a/Project/MSVC2026/Library/MediaInfoLib.vcxproj b/Project/MSVC2026/Library/MediaInfoLib.vcxproj
index 2524b285fa..67690d5b55 100644
--- a/Project/MSVC2026/Library/MediaInfoLib.vcxproj
+++ b/Project/MSVC2026/Library/MediaInfoLib.vcxproj
@@ -404,6 +404,7 @@
+
@@ -823,6 +824,7 @@
+
diff --git a/Project/MSVC2026/Library/MediaInfoLib.vcxproj.filters b/Project/MSVC2026/Library/MediaInfoLib.vcxproj.filters
index 1711604313..d1319adc2e 100644
--- a/Project/MSVC2026/Library/MediaInfoLib.vcxproj.filters
+++ b/Project/MSVC2026/Library/MediaInfoLib.vcxproj.filters
@@ -713,6 +713,9 @@
Source Files
+
+ Source Files\Image
+
Source Files\Image
@@ -1489,6 +1492,9 @@
Header Files
+
+ Header Files\Image
+
Header Files\Image
diff --git a/Project/MSVC2026/Library/MediaInfoLib_UWP.vcxproj b/Project/MSVC2026/Library/MediaInfoLib_UWP.vcxproj
index 07659e2c99..9f26a0a3d3 100644
--- a/Project/MSVC2026/Library/MediaInfoLib_UWP.vcxproj
+++ b/Project/MSVC2026/Library/MediaInfoLib_UWP.vcxproj
@@ -229,6 +229,7 @@
+
@@ -563,6 +564,7 @@
+
diff --git a/Project/Qt/MediaInfoLib.pro b/Project/Qt/MediaInfoLib.pro
index 3accf1f567..fbdf9c9003 100644
--- a/Project/Qt/MediaInfoLib.pro
+++ b/Project/Qt/MediaInfoLib.pro
@@ -122,6 +122,7 @@ HEADERS += \
../../Source/MediaInfo/File_Other.h \
../../Source/MediaInfo/File_Unknown.h \
../../Source/MediaInfo/HashWrapper.h \
+ ../../Source/MediaInfo/Image/File_AmigaIcon.h \
../../Source/MediaInfo/Image/File_ArriRaw.h \
../../Source/MediaInfo/Image/File_Bmp.h \
../../Source/MediaInfo/Image/File_Bpg.h \
@@ -368,6 +369,7 @@ SOURCES += \
../../Source/MediaInfo/File_Other.cpp \
../../Source/MediaInfo/File_Unknown.cpp \
../../Source/MediaInfo/HashWrapper.cpp \
+ ../../Source/MediaInfo/Image/File_AmigaIcon.cpp \
../../Source/MediaInfo/Image/File_ArriRaw.cpp \
../../Source/MediaInfo/Image/File_Bmp.cpp \
../../Source/MediaInfo/Image/File_Bpg.cpp \
diff --git a/Source/MediaInfo/File__MultipleParsing.cpp b/Source/MediaInfo/File__MultipleParsing.cpp
index 7721aec5e3..d8842f06fb 100644
--- a/Source/MediaInfo/File__MultipleParsing.cpp
+++ b/Source/MediaInfo/File__MultipleParsing.cpp
@@ -335,6 +335,9 @@
#if defined(MEDIAINFO_BPG_YES)
#include "MediaInfo/Image/File_Bpg.h"
#endif
+#if defined(MEDIAINFO_AMIGAICON_YES)
+ #include "MediaInfo/Image/File_AmigaIcon.h"
+#endif
#if defined(MEDIAINFO_DDS_YES)
#include "MediaInfo/Image/File_Dds.h"
#endif
@@ -777,6 +780,9 @@ File__MultipleParsing::File__MultipleParsing()
#if defined(MEDIAINFO_BPG_YES)
Parser.push_back(new File_Bpg());
#endif
+ #if defined(MEDIAINFO_AMIGAICON_YES)
+ Parser.push_back(new File_AmigaIcon());
+ #endif
#if defined(MEDIAINFO_DDS_YES)
Parser.push_back(new File_Dds());
#endif
diff --git a/Source/MediaInfo/Image/File_AmigaIcon.cpp b/Source/MediaInfo/Image/File_AmigaIcon.cpp
new file mode 100644
index 0000000000..18138b77a2
--- /dev/null
+++ b/Source/MediaInfo/Image/File_AmigaIcon.cpp
@@ -0,0 +1,424 @@
+/* Copyright (c) MediaArea.net SARL. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license that can
+ * be found in the License.html file in the root of the source tree.
+ */
+
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+// Amiga Icon - Format
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+//
+// Amiga .info (Workbench icon) files
+// Supports Classic, NewIcon, GlowIcon/ColorIcon, and ARGB image layers
+//
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+//---------------------------------------------------------------------------
+// Pre-compilation
+#include "MediaInfo/PreComp.h"
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+#include "MediaInfo/Setup.h"
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+#if defined(MEDIAINFO_AMIGAICON_YES)
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+#include "MediaInfo/Image/File_AmigaIcon.h"
+//---------------------------------------------------------------------------
+
+namespace MediaInfoLib
+{
+
+//***************************************************************************
+// Infos
+//***************************************************************************
+
+//---------------------------------------------------------------------------
+static const char* AmigaIcon_Type(int8u Type)
+{
+ switch (Type)
+ {
+ case 1 : return "Disk";
+ case 2 : return "Drawer";
+ case 3 : return "Tool";
+ case 4 : return "Project";
+ case 5 : return "Garbage";
+ case 6 : return "Kick";
+ case 8 : return "AppIcon";
+ default : return "";
+ }
+}
+
+//***************************************************************************
+// Static stuff
+//***************************************************************************
+
+//---------------------------------------------------------------------------
+bool File_AmigaIcon::FileHeader_Begin()
+{
+ //Element_Size
+ if (Buffer_Size<4)
+ return false; //Must wait for more data
+
+ if (CC2(Buffer)!=0xE310)
+ {
+ Reject("Amiga Icon");
+ return false;
+ }
+
+ //All should be OK...
+ return true;
+}
+
+//***************************************************************************
+// Buffer - Global
+//***************************************************************************
+
+//---------------------------------------------------------------------------
+void File_AmigaIcon::Read_Buffer_Continue()
+{
+ //Parsing
+ int32u GadgetRender, SelectRender, UserData;
+ int32u HasDefaultTool, HasToolTypes, HasDrawerData, HasToolWindow;
+ int16u Width, Height;
+ int8u IconType;
+
+ Element_Begin1("DiskObject header");
+ Skip_B2( "Magic");
+ Skip_B2( "Version");
+
+ Element_Begin1("Gadget");
+ Skip_B4( "ga_Next");
+ Skip_B2( "ga_LeftEdge");
+ Skip_B2( "ga_TopEdge");
+ Get_B2 (Width, "ga_Width");
+ Get_B2 (Height, "ga_Height");
+ Skip_B2( "ga_Flags");
+ Skip_B2( "ga_Activation");
+ Skip_B2( "ga_GadgetType");
+ Get_B4 (GadgetRender, "ga_GadgetRender");
+ Get_B4 (SelectRender, "ga_SelectRender");
+ Skip_B4( "ga_GadgetText");
+ Skip_B4( "ga_MutualExclude");
+ Skip_B4( "ga_SpecialInfo");
+ Skip_B2( "ga_GadgetID");
+ Get_B4 (UserData, "ga_UserData");
+ Element_End0();
+
+ Get_B1 (IconType, "do_Type");
+ Skip_B1( "do_Pad");
+ Get_B4 (HasDefaultTool, "do_DefaultTool");
+ Get_B4 (HasToolTypes, "do_ToolTypes");
+ Skip_B4( "do_CurrentX");
+ Skip_B4( "do_CurrentY");
+ Get_B4 (HasDrawerData, "do_DrawerData");
+ Get_B4 (HasToolWindow, "do_ToolWindow");
+ Skip_B4( "do_StackSize");
+ Element_End0();
+
+ FILLING_BEGIN();
+ Accept("Amiga Icon");
+
+ Fill(Stream_General, 0, General_Format, "Amiga Icon");
+ Fill(Stream_General, 0, General_Format_Profile, AmigaIcon_Type(IconType));
+ FILLING_END();
+
+ //DrawerData
+ if (HasDrawerData)
+ {
+ if (56<=Element_Size-Element_Offset)
+ {
+ Element_Begin1("DrawerData");
+ Skip_XX(56, "DrawerData");
+ Element_End0();
+ }
+ }
+
+ //Classic image (normal)
+ int16u ClassicWidth=0, ClassicHeight=0, ClassicDepth=0;
+ if (GadgetRender && 20<=Element_Size-Element_Offset)
+ {
+ int16u ImgWidth, ImgHeight, ImgDepth;
+ Element_Begin1("Classic image");
+ Skip_B2( "im_LeftEdge");
+ Skip_B2( "im_TopEdge");
+ Get_B2 (ImgWidth, "im_Width");
+ Get_B2 (ImgHeight, "im_Height");
+ Get_B2 (ImgDepth, "im_Depth");
+ Skip_B4( "im_ImageData");
+ Skip_B1( "im_PlanePick");
+ Skip_B1( "im_PlaneOnOff");
+ Skip_B4( "im_Next");
+
+ if (ImgWidth>0 && ImgHeight>0 && ImgDepth>0 && ImgDepth<=8)
+ {
+ int64u PlaneDataSize=((int64u)((ImgWidth+15)/16)*2)*ImgHeight*ImgDepth;
+ if (PlaneDataSize<=Element_Size-Element_Offset)
+ Skip_XX(PlaneDataSize, "Plane data");
+ }
+ Element_End0();
+
+ ClassicWidth=ImgWidth;
+ ClassicHeight=ImgHeight;
+ ClassicDepth=ImgDepth;
+ }
+
+ //Classic image (selected)
+ if (SelectRender && 20<=Element_Size-Element_Offset)
+ {
+ int16u ImgWidth, ImgHeight, ImgDepth;
+ Element_Begin1("Classic image (selected)");
+ Skip_B2( "im_LeftEdge");
+ Skip_B2( "im_TopEdge");
+ Get_B2 (ImgWidth, "im_Width");
+ Get_B2 (ImgHeight, "im_Height");
+ Get_B2 (ImgDepth, "im_Depth");
+ Skip_B4( "im_ImageData");
+ Skip_B1( "im_PlanePick");
+ Skip_B1( "im_PlaneOnOff");
+ Skip_B4( "im_Next");
+
+ if (ImgWidth>0 && ImgHeight>0 && ImgDepth>0 && ImgDepth<=8)
+ {
+ int64u PlaneDataSize=((int64u)((ImgWidth+15)/16)*2)*ImgHeight*ImgDepth;
+ if (PlaneDataSize<=Element_Size-Element_Offset)
+ Skip_XX(PlaneDataSize, "Plane data");
+ }
+ Element_End0();
+ }
+
+ //DefaultTool
+ if (HasDefaultTool && 4<=Element_Size-Element_Offset)
+ {
+ int32u Length;
+ Element_Begin1("DefaultTool");
+ Get_B4 (Length, "Length");
+ if (Length<=Element_Size-Element_Offset)
+ Skip_XX(Length, "Text");
+ else
+ Skip_XX(Element_Size-Element_Offset, "(Problem)");
+ Element_End0();
+ }
+
+ //ToolTypes
+ bool HasNewIcon=false;
+ int16u NewIconWidth=0, NewIconHeight=0;
+ if (HasToolTypes && 4<=Element_Size-Element_Offset)
+ {
+ int32u CountField;
+ Element_Begin1("ToolTypes");
+ Get_B4 (CountField, "Count");
+
+ if (CountField>=8)
+ {
+ int32u NumEntries=CountField/4-1;
+ if (NumEntries>(int32u)((Element_Size-Element_Offset)/4))
+ NumEntries=(int32u)((Element_Size-Element_Offset)/4);
+ for (int32u i=0; iElement_Size-Element_Offset)
+ break;
+
+ int32u Length;
+ Get_B4 (Length, "Length");
+
+ //Check for IM1= prefix to detect NewIcon
+ if (!HasNewIcon && Length>=5 && 4<=Element_Size-Element_Offset)
+ {
+ if (Buffer[(size_t)Element_Offset]=='I' && Buffer[(size_t)Element_Offset+1]=='M' && Buffer[(size_t)Element_Offset+2]=='1' && Buffer[(size_t)Element_Offset+3]=='=')
+ {
+ HasNewIcon=true;
+ //Parse NewIcon header: transparency(1) + width(1) + height(1) + colors_hi(1) + colors_lo(1)
+ if (Length>=9 && 9<=Element_Size-Element_Offset
+ && Buffer[(size_t)Element_Offset+5]>=0x21
+ && Buffer[(size_t)Element_Offset+6]>=0x21)
+ {
+ NewIconWidth=Buffer[(size_t)Element_Offset+5]-0x21;
+ NewIconHeight=Buffer[(size_t)Element_Offset+6]-0x21;
+ }
+ }
+ }
+
+ if (Length>Element_Size-Element_Offset)
+ break;
+ Skip_XX(Length, "ToolType");
+ }
+ }
+ Element_End0();
+ }
+
+ //ToolWindow
+ if (HasToolWindow && 4<=Element_Size-Element_Offset)
+ {
+ int32u Length;
+ Element_Begin1("ToolWindow");
+ Get_B4 (Length, "Length");
+ if (Length<=Element_Size-Element_Offset)
+ Skip_XX(Length, "Text");
+ else
+ Skip_XX(Element_Size-Element_Offset, "(Problem)");
+ Element_End0();
+ }
+
+ //DrawerData2
+ if (HasDrawerData && (UserData&0xFF))
+ {
+ if (6<=Element_Size-Element_Offset)
+ {
+ Element_Begin1("DrawerData2");
+ Skip_B4( "dd_Flags");
+ Skip_B2( "dd_ViewModes");
+ Element_End0();
+ }
+ }
+
+ //Fill Classic image stream
+ if (GadgetRender && ClassicWidth && ClassicHeight)
+ {
+ Stream_Prepare(Stream_Image);
+ Fill(Stream_Image, StreamPos_Last, Image_Width, ClassicWidth);
+ Fill(Stream_Image, StreamPos_Last, Image_Height, ClassicHeight);
+ Fill(Stream_Image, StreamPos_Last, Image_BitDepth, ClassicDepth);
+ Fill(Stream_Image, StreamPos_Last, Image_Format, "Raw");
+ Fill(Stream_Image, StreamPos_Last, Image_Format_Profile, "Classic");
+ Fill(Stream_Image, StreamPos_Last, Image_ColorSpace, "RGB");
+ }
+
+ //Fill NewIcon stream
+ if (HasNewIcon && NewIconWidth && NewIconHeight)
+ {
+ Stream_Prepare(Stream_Image);
+ Fill(Stream_Image, StreamPos_Last, Image_Width, NewIconWidth);
+ Fill(Stream_Image, StreamPos_Last, Image_Height, NewIconHeight);
+ Fill(Stream_Image, StreamPos_Last, Image_Format, "Raw");
+ Fill(Stream_Image, StreamPos_Last, Image_Format_Profile, "NewIcon");
+ Fill(Stream_Image, StreamPos_Last, Image_ColorSpace, "RGB");
+ }
+
+ //FORM ICON (GlowIcons / ARGB)
+ if (12<=Element_Size-Element_Offset)
+ {
+ //Search for "FORM" + "ICON"
+ int64u SearchPos=Element_Offset;
+ while (12<=Element_Size-SearchPos)
+ {
+ if (Buffer[(size_t)SearchPos]=='F' && Buffer[(size_t)SearchPos+1]=='O' && Buffer[(size_t)SearchPos+2]=='R' && Buffer[(size_t)SearchPos+3]=='M'
+ && Buffer[(size_t)SearchPos+8]=='I' && Buffer[(size_t)SearchPos+9]=='C' && Buffer[(size_t)SearchPos+10]=='O' && Buffer[(size_t)SearchPos+11]=='N')
+ {
+ //Found FORM ICON
+ if (SearchPos>Element_Offset)
+ Skip_XX(SearchPos-Element_Offset, "Padding");
+
+ int32u FormSize;
+ Element_Begin1("FORM ICON");
+ Skip_B4( "FORM");
+ Get_B4 (FormSize, "Size");
+ Skip_B4( "ICON");
+
+ int16u FaceWidth=0, FaceHeight=0;
+ bool HasIMAG=false, HasARGB=false;
+ int8u IMAGDepth=0, IMAGFormat=0;
+
+ int64u FormEnd=Element_Offset+(FormSize>=4?FormSize-4:0);
+ if (FormEnd>Element_Size)
+ FormEnd=Element_Size;
+ while (Element_Offset<=FormEnd && 8<=FormEnd-Element_Offset && 8<=Element_Size-Element_Offset)
+ {
+ int32u ChunkSize;
+ int32u ChunkName;
+ Peek_B4(ChunkName);
+ Skip_B4( "Chunk name");
+ Get_B4 (ChunkSize, "Chunk size");
+
+ if (ChunkName==0x46414345) //"FACE"
+ {
+ if (ChunkSize>=4 && 4<=Element_Size-Element_Offset)
+ {
+ FaceWidth=Buffer[(size_t)Element_Offset]+1;
+ FaceHeight=Buffer[(size_t)Element_Offset+1]+1;
+ }
+ }
+ else if (ChunkName==0x494D4147) //"IMAG"
+ {
+ if (!HasIMAG && ChunkSize>=10 && 6<=Element_Size-Element_Offset)
+ {
+ IMAGFormat=Buffer[(size_t)Element_Offset+3];
+ IMAGDepth=Buffer[(size_t)Element_Offset+5];
+ HasIMAG=true;
+ }
+ }
+ else if (ChunkName==0x41524742) //"ARGB"
+ {
+ HasARGB=true;
+ }
+
+ //Skip chunk data (padded to even)
+ if (ChunkSize==0)
+ break;
+ int32u SkipSize=ChunkSize;
+ if (SkipSize%2)
+ {
+ if (SkipSize==0xFFFFFFFF)
+ break;
+ SkipSize++;
+ }
+ if (SkipSize<=Element_Size-Element_Offset)
+ Skip_XX(SkipSize, "Chunk data");
+ else
+ break;
+ }
+
+ Element_End0();
+
+ //Fill GlowIcon stream
+ if (HasIMAG && FaceWidth && FaceHeight)
+ {
+ Stream_Prepare(Stream_Image);
+ Fill(Stream_Image, StreamPos_Last, Image_Width, FaceWidth);
+ Fill(Stream_Image, StreamPos_Last, Image_Height, FaceHeight);
+ Fill(Stream_Image, StreamPos_Last, Image_BitDepth, IMAGDepth);
+ Fill(Stream_Image, StreamPos_Last, Image_Format, IMAGFormat==1?"RLE":"Raw");
+ Fill(Stream_Image, StreamPos_Last, Image_Format_Profile, "GlowIcon");
+ Fill(Stream_Image, StreamPos_Last, Image_ColorSpace, "RGB");
+ }
+
+ //Fill ARGB stream
+ if (HasARGB && FaceWidth && FaceHeight)
+ {
+ Stream_Prepare(Stream_Image);
+ Fill(Stream_Image, StreamPos_Last, Image_Width, FaceWidth);
+ Fill(Stream_Image, StreamPos_Last, Image_Height, FaceHeight);
+ Fill(Stream_Image, StreamPos_Last, Image_BitDepth, 32);
+ Fill(Stream_Image, StreamPos_Last, Image_Format, "Raw");
+ Fill(Stream_Image, StreamPos_Last, Image_Format_Profile, "ARGB");
+ Fill(Stream_Image, StreamPos_Last, Image_ColorSpace, "RGBA");
+ }
+
+ break;
+ }
+ SearchPos++;
+ }
+ }
+
+ //Skip any remaining data
+ if (Element_OffsetFormat_Test_PerParser(this, File_Name)>0) return 1;
#endif
+ #if defined(MEDIAINFO_AMIGAICON_YES)
+ SAFE_DELETE(Info); Info=new File_AmigaIcon(); if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;
+ #endif
#if defined(MEDIAINFO_BPG_YES)
SAFE_DELETE(Info); Info=new File_Bpg(); if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;
#endif
@@ -1334,7 +1343,7 @@ bool MediaInfo_Internal::LibraryIsModified ()
|| defined(MEDIAINFO_AV1_NO) || defined(MEDIAINFO_AV2_NO) || defined(MEDIAINFO_AVC_NO) || defined(MEDIAINFO_AVS3V_NO) || defined(MEDIAINFO_AVSV_NO) || defined(MEDIAINFO_HEVC_NO) || defined(MEDIAINFO_MPEG4V_NO) || defined(MEDIAINFO_MPEGV_NO) || defined(MEDIAINFO_FLIC_NO) || defined(MEDIAINFO_THEORA_NO) || defined(MEDIAINFO_Y4M_NO) \
|| defined(MEDIAINFO_AC3_NO) || defined(MEDIAINFO_AC4_NO) || defined(MEDIAINFO_ADIF_NO) || defined(MEDIAINFO_ADTS_NO) || defined(MEDIAINFO_SMPTEST0337_NO) || defined(MEDIAINFO_AMR_NO) || defined(MEDIAINFO_DTS_NO) || defined(MEDIAINFO_DOLBYE_NO) || defined(MEDIAINFO_FLAC_NO) || defined(MEDIAINFO_IAMF_NO) || defined(MEDIAINFO_APE_NO) || defined(MEDIAINFO_MPC_NO) || defined(MEDIAINFO_MPCSV8_NO) || defined(MEDIAINFO_MPEGA_NO) || defined(MEDIAINFO_OPENMG_NO) || defined(MEDIAINFO_TWINVQ_NO) || defined(MEDIAINFO_XM_NO) || defined(MEDIAINFO_MOD_NO) || defined(MEDIAINFO_S3M_NO) || defined(MEDIAINFO_IT_NO) || defined(MEDIAINFO_SPEEX_NO) || defined(MEDIAINFO_TAK_NO) || defined(MEDIAINFO_PS2A_NO) \
|| defined(MEDIAINFO_CMML_NO) || defined(MEDIAINFO_KATE_NO) || defined(MEDIAINFO_PGS_NO) || defined(MEDIAINFO_OTHERTEXT_NO) \
- || defined(MEDIAINFO_ARRIRAW_NO) || defined(MEDIAINFO_BMP_NO) || defined(MEDIAINFO_DDS_NO) || defined(MEDIAINFO_DPX_NO) || defined(MEDIAINFO_EXR_NO) || defined(MEDIAINFO_GIF_NO) || defined(MEDIAINFO_ICO_NO) || defined(MEDIAINFO_JPEG_NO) || defined(MEDIAINFO_PNG_NO) || defined(MEDIAINFO_TGA_NO) || defined(MEDIAINFO_TIFF_NO) || defined(MEDIAINFO_WEBP_NO) \
+ || defined(MEDIAINFO_AMIGAICON_NO) || defined(MEDIAINFO_ARRIRAW_NO) || defined(MEDIAINFO_BMP_NO) || defined(MEDIAINFO_DDS_NO) || defined(MEDIAINFO_DPX_NO) || defined(MEDIAINFO_EXR_NO) || defined(MEDIAINFO_GIF_NO) || defined(MEDIAINFO_ICO_NO) || defined(MEDIAINFO_JPEG_NO) || defined(MEDIAINFO_PNG_NO) || defined(MEDIAINFO_TGA_NO) || defined(MEDIAINFO_TIFF_NO) || defined(MEDIAINFO_WEBP_NO) \
|| defined(MEDIAINFO_7Z_NO) || defined(MEDIAINFO_ZIP_NO) || defined(MEDIAINFO_RAR_NO) || defined(MEDIAINFO_ACE_NO) || defined(MEDIAINFO_ELF_NO) || defined(MEDIAINFO_MACHO_NO) || defined(MEDIAINFO_MZ_NO) \
|| defined(MEDIAINFO_OTHER_NO) || defined(MEDIAINFO_DUMMY_NO)
return true;
diff --git a/Source/MediaInfo/Setup.h b/Source/MediaInfo/Setup.h
index d875f37d3b..62e73e72f4 100644
--- a/Source/MediaInfo/Setup.h
+++ b/Source/MediaInfo/Setup.h
@@ -915,6 +915,9 @@
#if !defined(MEDIAINFO_IMAGE_NO) && !defined(MEDIAINFO_ARRIRAW_NO) && !defined(MEDIAINFO_ARRIRAW_YES)
#define MEDIAINFO_ARRIRAW_YES
#endif
+#if !defined(MEDIAINFO_IMAGE_NO) && !defined(MEDIAINFO_AMIGAICON_NO) && !defined(MEDIAINFO_AMIGAICON_YES)
+ #define MEDIAINFO_AMIGAICON_YES
+#endif
#if !defined(MEDIAINFO_IMAGE_NO) && !defined(MEDIAINFO_BMP_NO) && !defined(MEDIAINFO_BMP_YES)
#define MEDIAINFO_BMP_YES
#endif