Graphic Image Map (GIM)
This article is marked for rewrite/restructuring in proper wiki format. You can help PS3 Developer wiki by editing it. |
Description
Graphic Image Map ? (GIM) is an image format, allows for tenths of different storage settings and by combining settings results in hundreds (or thousands) of different GIM files that are structurally different, to simplify concepts people is naming this different GIM files as "GIM formats" but strictly speaking the GIM format is always the same, the amount of GIM formats used in PlayStation consoles is limited though (restricted by the graphic enviroment, libraries, etc...). GIM files was found used in PSP and PS3 firmwares inside Resource Container (RCO) files, PlayStation 3 Theme (P3T) files, etc... See GimConv and Multimedia Formats and Tools#GIM
The acronym of GIM used in this wiki (Graphic Image Map) is an speculative unnofficial name based in how the data is stored in the internal GIM structure, if someone finds the official codename somewhere please report back and we will change it
Structure
- Overview
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00000000 2E 47 49 4D 31 2E 30 30 00 50 53 50 00 00 00 00 .GIM1.00.PSP.... <- GIM header 00000010 00 02 00 00 00 00 00 EC 00 00 00 10 00 00 00 10 .......ì........ <- Block 0x02 header 00000020 00 03 00 00 00 00 00 80 00 00 00 10 00 00 00 10 .......€........ <- Block 0x03 header 00000030 00 04 00 00 00 00 00 70 00 00 00 70 00 00 00 10 .......p...p.... <- Block 0x04 header 00000040 00 30 00 00 00 03 00 00 00 04 00 02 00 20 00 10 .0........... .. <- Block 0x04 Info 00000050 00 01 00 02 00 00 00 00 00 00 00 30 00 00 00 40 ...........0...@ <- Block 0x04 Info 00000060 00 00 00 60 00 00 00 00 00 01 00 01 00 03 00 01 ...`............ <- Block 0x04 Info 00000070 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 ...@............ <- Block 0x04 Info 00000080 CA 5E 11 00 CA 5E 12 00 CA 5E 13 00 CA 5E 14 00 Ê^..Ê^..Ê^..Ê^.. <- Block 0x04 Frame 00000090 CA 5E 21 00 CA 5E 22 00 CA 5E 23 00 CA 5E 24 00 Ê^!.Ê^".Ê^#.Ê^$. <- Block 0x04 Frame 000000A0 00 FF 00 00 00 00 00 5C 00 00 00 5C 00 00 00 10 .ÿ.....\...\.... <- Block 0xFF header 000000B0 34 78 32 5F 43 41 35 45 78 79 5F 33 32 62 69 74 4x2_CA5Exy_32bit <- Block 0xFF Strings 000000C0 73 2E 62 6D 70 00 41 64 6D 69 6E 69 73 74 72 61 s.bmp.Administra <- Block 0xFF Strings 000000D0 74 6F 72 00 53 75 6E 20 41 70 72 20 31 35 20 30 tor.Sun Apr 15 0 <- Block 0xFF Strings 000000E0 31 3A 32 35 3A 30 32 20 32 30 31 38 00 47 69 6D 1:25:02 2018.Gim <- Block 0xFF Strings 000000F0 43 6F 6E 76 20 31 2E 32 30 68 00 00 Conv 1.20h.. <- Block 0xFF Strings
- Intermediate blocks are aligned to 16 bytes, last block is aligned to 4 bytes
GIM header
Offset | Length | Example | Name | Description | Notes |
---|---|---|---|---|---|
0x00 | 0x04 | 2E 47 49 4D | gim_signature | .GIM | |
0x04 | 0x04 | 31 2E 30 30 | gim_version | 1.00 | |
0x08 | 0x04 | 00 50 53 50 | gim_style | PSP | |
0x0C | 0x04 | 00 00 00 00 | gim_unk | Unknown |
Block headers (generic)
Offset | Length | Example | Name | Description | Notes |
---|---|---|---|---|---|
0x00 | 0x02 | 00 02 | block_id | Block identifyer | 0x02 = Root ? (first level) 0x03 = Picture (second level) 0x04 = Image (third level) 0x05 = Palette (third level) 0xFF = Fileinfo (second level) |
0x02 | 0x02 | 00 00 | block_unk1 | Unknown | 0x00 = ? 0x10 = ? |
0x04 | 0x04 | 00 00 01 0C | block_size | Size of this block + children blocks | |
0x08 | 0x04 | 00 00 00 10 | block_next | Next block relative offset | |
0x0C | 0x04 | 00 00 00 10 | block_unk2 | Block data relative offset ? |
Block data (by block ID)
0x02 (Root)
Empty/unknown. Is the parent of 0x03 and 0x0FF
0x03 (Picture)
Empty/unknown. Is the parent of 0x05 and 0x04 (in this order, the palette goes first)
This block is repeated when using the option merge_mode picture
0x04 (Image)
Some of the values on this area are the same than in the GIS file. Also are directly related with the available settings on GimConv.cfg (the configuration file of GimConv.exe)
This block is repeated when using the option merge_mode image
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00000040 00 30 00 00 00 03 00 00 00 04 00 02 00 20 00 10 .0........... .. 00000050 00 01 00 02 00 00 00 00 00 00 00 30 00 00 00 40 ...........0...@ 00000060 00 00 00 60 00 00 00 00 00 01 00 01 00 03 00 01 ...`............ 00000070 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 ...@............
Offset | Length | Example | Name | Description | Notes |
---|---|---|---|---|---|
0x00 | 0x02 | 00 30 | b4_unk1 | ? | |
0x02 | 0x02 | 00 00 | b4_unk2 | ? | |
0x04 | 0x02 | 00 03 | image_format | 0x00 = rgba5650 0x01 = rgba5551 0x02 = rgba4444 0x03 = rgba8888 0x04 = index4 0x05 = index8 0x06 = index16 0x07 = index32 0x08 = dxt1 0x09 = dxt3 0x0A = dxt5 0x108 = dxt1ext 0x109 = dxt3ext 0x10A = dxt5ext |
image_format in GimConv.cfg Format in the GIS |
0x06 | 0x02 | 00 00 | pixel_order | 0x00 = normal 0x10 = faster |
pixel_order in GimConv.cfg with values: normal (default) or faster Order in the GIS with values: NORMAL or PSPIMAGE |
0x08 | 0x02 | 00 04 | image_width | Image width in pixels | Width in the GIS |
0x0A | 0x02 | 00 02 | image_height | Image height in pixels | Height in the GIS |
0x0C | 0x02 | 00 20 | bpp_align | Bits per pixel alignment | |
0x0E | 0x02 | 00 10 | pitch_align | ? | PitchAlign in the GIS |
0x10 | 0x02 | 00 01 | height_align | ? | HeightAlign in the GIS |
0x12 | 0x02 | 00 02 | b4_unk3 | ||
0x14 | 0x04 | 00 00 00 00 | b4_unk4 | Bitmap Prev relative offset ? | |
0x18 | 0x04 | 00 00 00 30 | Relative offset of ??? (where ??? = value 0x00000040 in the example) | ||
0x1C | 0x04 | 00 00 00 40 | bitmap_start ? | Bitmap relative offset | |
0x20 | 0x04 | 00 00 00 60 | bitmap_end ? | Bitmap Next relative offset ? | |
0x24 | 0x04 | 00 00 00 00 | plane_mask | PlaneMask in the GIS | |
0x28 | 0x02 | 00 01 | level_type | 0x01 = MIPMAP 0x02 = MIPMAP2 |
LevelType in the GIS |
0x2A | 0x02 | 00 01 | level_count | LevelCount in the GIS | |
0x2C | 0x02 | 00 03 | frame_type ? | 0x03 = SEQUENCE ? | FrameType in the GIS ? |
0x2E | 0x02 | 00 01 | frame_count | FrameCount in the GIS | |
0x30 | varies | any | user_data | Optional area to store the contents of <filename>.dat when using the option update_userdata = on | |
0x30 | varies | 0 up to 3 | padding | Optional padding to align the user_data to 4 bytes |
Offset | Length | Example | Name | Description | Notes |
---|---|---|---|---|---|
0x30 | 0x04 | 00 00 00 40 | frame_n_offset | Where <n> is the frame number | This entry is repeated one time for every level_count or frame_count |
0x34 | 0x0C | 00 00 00 00 00 00 00 00 00 00 00 00 | padding | Optional padding to align the block to 16 bytes |
After this index comes the planes/levels/frames (the bytes with pixels color info), are one or several images concatenated when using the option merge_mode level or merge_mode frame. And probably "planes" with the option merge_mode = plane
IMAGE_INDEX IMAGE_PLANE IMAGE_LEVEL IMAGE_FRAME PALETTE_INDEX PALETTE_LEVEL PALETTE_FRAME
0x05 (Palette)
Only used when converting to indexed color formats (index4 index8 index16 index32), to create a GIM with a palette is needed to use as input an image that already contains a palette (so is already indexed), it seems GimConv.exe cant create the palette by itself
By default the palette frame (located most at bottom of the palette), is stored in rgba888 (i guess this can be changed with palette_format = default // default rgba8888 rgba4444 rgba5551 rgba5650), it has a fixed reserved size of 0x400 (to store a max of 256 colors?), and the "unused" color slots are filled with zeroes
The palette frame (or lookup table) is stored as an image with 1 pixel height, so by default it has 256x1 pixels size (image_width = 0x100 image_height = 0x1)
0xFF (Fileinfo)
This block only exists if the GIM was build using the option update_fileinfo = on. Initially in old PS3 firmwares all the GIM files was made using this option, eventually they stopped using this option and GIM files was updated/replaced by new ones without this area. But there are many GIM files inside latest PS3 4.82 firmware that contains this area (because was made lot of time ago and never was updated), this can be seen in the timestamps stored here, all this GIM files that was build using update_fileinfo = on was made around 2005/2006/2007
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 000000B0 34 78 32 5F 43 41 35 45 78 79 5F 33 32 62 69 74 4x2_CA5Exy_32bit 000000C0 73 2E 62 6D 70 00 41 64 6D 69 6E 69 73 74 72 61 s.bmp.Administra 000000D0 74 6F 72 00 53 75 6E 20 41 70 72 20 31 35 20 30 tor.Sun Apr 15 0 000000E0 31 3A 32 35 3A 30 32 20 32 30 31 38 00 47 69 6D 1:25:02 2018.Gim 000000F0 43 6F 6E 76 20 31 2E 32 30 68 00 00 Conv 1.20h..
Offset | Length | Example | Name | Description | Notes |
---|---|---|---|---|---|
0x00 | 0x16 | 34 78 32 5F 43 41 35 45 78 79 5F 33 32 62 69 74 73 2E 62 6D 70 00 | project_name | 4x2_CA5Exy_32bits.bmp | ProjectName in the GIS |
0x16 | 0x0E | 41 64 6D 69 6E 69 73 74 72 61 74 6F 72 00 | user_name | Administrator | UserName in the GIS |
0x24 | 0x19 | 53 75 6E 20 41 70 72 20 31 35 20 30 31 3A 32 35 3A 30 32 20 32 30 31 38 00 | saved_date | Sun Apr 15 01:25:02 2018 | SavedDate in the GIS |
0x3D | 0x0E | 47 69 6D 43 6F 6E 76 20 31 2E 32 30 68 00 | originator | GimConv 1.20h | Originator in the GIS |
0x4B | 0x01 | 00 | padding | Optional padding to align the block to 4 bytes |
Links
|