[File] [PATCH] of Magdir/images for OS/2 "CI" color icon variant (*.ico)
Christos Zoulas
christos at zoulas.com
Wed Jun 19 15:25:50 UTC 2019
On Jun 19, 3:49pm, joerg.jen.der.ek at gmx.net (=?UTF-8?Q?J=c3=b6rg_Jenderek?=) wrote:
-- Subject: [File] [PATCH] of Magdir/images for OS/2 "CI" color icon variant
| Hello,
| some days ago i handle some OS/2 color icons with file name extension
| "ico". When i run file command version 5.37 all of these examples
| are only described as "data".
|
| More irritating is the fact that ico extension is used for MS
| Windows icons. Many popular graphic tools like GIMP, ImageMagick or
| XnView can open the Microsoft icon variant, but are not able to open
| that OS/2 icon variant. Finally i find a command line converter tool
| "deark" which is able to handle such icons by module os2bmp. So
| information about inspected icon is shown by list and debug option
| like in example command line:
| deark -l -d3 os220.ico
|
| So i add/change lines in Magdir/images. Some Information is found on
| fileformats.archiveteam.org website.
| In Magdir/image there exist an attempt to identify such examples by
| line
| #0 string CI PC color icon data
|
| Maybe this pattern is too simple. So this line now becomes
| 0 string CI
| And more additional test lines are needed to skip bad examples.
|
| The size of header or file in bytes is stored in variable cbSize.
| This is now shown by line like
| >>2 ulelong x \b, cbSize %u
| For inspected OS/2 color icons i found low values like 1Ah 4Eh 84Eh.
| This can be used as additional test by jumping 4 bytes before end of
| header/file and test for accessibility by line like
| >>(2.l-4) ubelong x End of header is OK!
| I do not use this, because accessing bytes beyond ranges is not a
| official documented feature in file command.
|
| The coordinates of the hotspot for icons like 0 1 16 20 32 33 63 64
| are stored in 2 bytes variables xHotspot and yHotspot, which are now
| shown by lines like
| >>6 uleshort x \b, hotspot %ux
| >>8 uleshort x \b%u
|
| Nowadays icon can becomes big with dimensions, but in ancient times of
| OS/2 systems with less RAM dimensions are low. The typical dimension
| sizes are 32 40 64. But i also found higher dimensions 128 and 256
| like in "DOOM!2 01.ICO". That also means in real examples hot spot
| values are low (maybe maximal 256). So upper bits of short stored
| value seems to be always null. So maybe skip bad examples by looking
| for valid hot spot coordinates by additional test line like
| >>6 ulelong&0xFE00FE00 =3D0
| But i do not use this test.
|
| After the first header comes the DIB header. In the first 4 bytes the
| DIB header size is stored. This can be shown by line like
| >>14 ulelong x \b, dib header size %u
| For the considered color icons only 2 values 12 or 64 occur. So test
| also for valid dib header sizes and start displaying by line
| >14 ulelong <65 OS/2
| Now afterwards show file name extension and a user defined mime type
| by lines
| !:mime image/x-os2-ico
| !:ext ico
|
| Afterwards split into 2 branches parts. First considered the OS/2 1.x
| variant by checking for dib header size twelve and show specific icon
| dimensions by lines
| >>14 ulelong 12 1.x color icon
| >>>18 uleshort x %u x
| >>>20 uleshort/2 x %u
| >>>24 uleshort >1 x %u
|
| For OS/2 image width and height fields are unsigned integers whereas
| for Microsoft Windows variants signed integers are used. The stored
| height value was always the double of the real height. I found no
| explanation about this item. So dived value by 2 before displaying
| value. Typical values for number of bits per pixel (color depth) are
| 32 24 16 8 4 1, but i only found value one. So show this values only
| if not one.
|
| The other branch is for the OS/2 2.x variant which start with looking
| for dib header size 64 and then display specific dimension by lines
| >>14 ulelong 64 2.x color icon
| >>>18 ulelong x %u x
| >>>22 ulelong/2 x %u
| >>>28 uleshort >1 x %u
| The main difference is that width and height values are stored as 4
| byte values instead by 2 bytes.
|
| After applying the above mentioned modifications by patch
| file-5.37-images-ico-CI.diff then unrecognized OS/2 color icons are
| now recognized and described like
|
| 4DOS-B.ICO: OS/2 1.x color icon 32 x 32,
| hotspot 1x31, cbSize 26, bits offset 106
| Car 02.ICO: OS/2 1.x color icon 80 x 80,
| hotspot 0x0, cbSize 26, bits offset 826
| DOOM!2 01.ICO: OS/2 2.x color icon 128 x 128,
| hotspot 64x64, cbSize 78, bits offset 1188
| os22-16rle.ico: OS/2 2.x color icon 256 x 256,
| Huffman 1D compression,
| hotspot 128x128, cbSize 78, bits offset 228
| os220.ico: OS/2 2.x color icon 40 x 40,
| hotspot 20x20, cbSize 78, bits offset 228
| Team_OS2.ICO: OS/2 1.x color icon 64 x 64,
| hotspot 32x32, cbSize 26, bits offset 106
| The_Ray.ICO: OS/2 1.x color icon 64 x 64,
| hotspot 33x63, cbSize 26, bits offset 826
| toolsfop.ico: OS/2 1.x color icon 32 x 32,
| hotspot 16x16, cbSize 26, bits offset 58
|
| I hope my diff file can be applied in future version of file utility.
|
| There still exist more OS/2 icons and bitmap files which are not
| recognized or misidentified by file command. I will handles such
| things in future session.
Applied, thanks! I still think that the magic is a bit weak, but I guess
improvements would make the magic a lot more complicated (to check dimension
sanity before printing for example).
christos
More information about the File
mailing list