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[edit | edit source]
Graphic Image Map ? (GIM) is an image format that allows for lot of different settings that results in lot of different GIM files that are structurally different, strictly speaking the GIM format is always the same, but generally speaking it can be said that this different GIM files are "GIM formats", the amount of GIM formats supported by PlayStation consoles is limited though (restricted by the graphic enviroment, libraries, etc...). GIM files was found 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 meaning of the "GIM" acronym 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 please report back and we will change it
Structure[edit | edit source]
- Overview (4 unknown values left, marked in intense red)
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 (Root) 00000020 00 03 00 00 00 00 00 80 00 00 00 10 00 00 00 10 .......€........ <- Block 0x03 header (Picture) 00000030 00 04 00 00 00 00 00 70 00 00 00 70 00 00 00 10 .......p...p.... <- Block 0x04 header (Image) 00000040 00 30 00 00 00 03 00 00 00 04 00 02 00 20 00 10 .0........... .. <- Block 0x04 Data 00000050 00 01 00 02 00 00 00 00 00 00 00 30 00 00 00 40 ...........0...@ <- Block 0x04 Data 00000060 00 00 00 60 00 00 00 00 00 01 00 01 00 03 00 01 ...`............ <- Block 0x04 Data 00000070 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 ...@............ <- Block 0x04 Index 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 (Fileinfo) 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
GIM header[edit | edit source]
Offset | Length | Example | Name | Description | Notes |
---|---|---|---|---|---|
0x00 | 0x04 | .GIM | signature | little = MIG. big = .GIM |
This is the first place affected by format_endian in GimConv.cfg |
0x04 | 0x04 | 1.00 | version | Always 1.00 ? | |
0x08 | 0x04 | PSP | format_style | std = nothing ps3 = nothing psp = PSP |
Configured by format_style in GimConv.cfg |
0x0C | 0x04 | 00 00 00 00 | padding/unused ? | Unknown | Always 0 ? |
Block headers (generic)[edit | edit source]
Offset | Length | Example | Name | Description | Notes |
---|---|---|---|---|---|
0x00 | 0x02 | 00 02 | block_id | 0x02 = Root (first level) 0x03 = Picture (second level) 0x04 = Image (third level) 0x05 = Palette (third level) 0xFF = Fileinfo (second level) |
Block identifyer |
0x02 | 0x02 | 00 00 | block_unk | 0x00 = ? 0x10 = ? |
Unknown |
0x04 | 0x04 | 00 00 00 EC | block_size | Size of this block + children blocks | |
0x08 | 0x04 | 00 00 00 10 | block_header_next | Next block relative offset | |
0x0C | 0x04 | 00 00 00 10 | block_data_offset | Block data relative offset |
Block data (by block ID)[edit | edit source]
0x02 (Root)[edit | edit source]
Is the parent of block 0x03 (Picture) and 0x0FF (Fileinfo)
0x03 (Picture)[edit | edit source]
Is the parent of block 0x04 (Image) and block 0x05 (Palette)
- Experimental notes
- This block is repeated when using the option merge_mode = picture
0x04 (Image)[edit | edit source]
The image block contains some info about the image, and the pixel color info at bottom stored as levels or frames
- Experimental notes
- 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 ...`............
Offset | Length | Example | Name | Description | Notes |
---|---|---|---|---|---|
0x00 | 0x02 | 00 30 | block_data_lenght | Size of the block data | Indicates the relative offset of the area located inmediatly after frame_count |
0x02 | 0x02 | 00 00 | b45_unk1 | ? | Ignored ? |
0x04 | 0x02 | 00 03 | image_format | 0x00 = rgba5650 (16 bit no alpha) 0x01 = rgba5551 (16 bit sharp alpha) 0x02 = rgba4444 (16 bit gradient alpha) 0x03 = rgba8888 (32 bit gradient alpha) 0x04 = index4 (16 colors) 0x05 = index8 (256 colors) 0x06 = index16 (16 colors with alpha ?) 0x07 = index32 (256 colors with alpha ?) 0x08 = dxt1 (no alpha) 0x09 = dxt3 (sharp alpha) 0x0A = dxt5 (gradient alpha) 0x108 = dxt1ext 0x109 = dxt3ext 0x10A = dxt5ext |
Configured by image_format in GimConv.cfg Format in the GIS |
0x06 | 0x02 | 00 00 | pixel_order | 0x00 = normal 0x01 = faster |
Configured by pixel_order in GimConv.cfg with values: normal (default) or faster Order in the GIS with values: NORMAL or PSPIMAGE |
0x08 | 0x02 | 00 04 | width | Image/palette width in pixels | Restricted by limit_image_width in GimConv.cfg Width in the GIS |
0x0A | 0x02 | 00 02 | height | Image/palette height in pixels | Restricted by limit_image_height in GimConv.cfg Height in the GIS |
0x0C | 0x02 | 00 20 | bpp_align | Image/palette alignment BPP | |
0x0E | 0x02 | 00 10 | pitch_align | Image/palette alignment X | PitchAlign in the GIS |
0x10 | 0x02 | 00 01 | height_align | Image/palette alignment Y | HeightAlign in the GIS |
0x12 | 0x02 | 00 02 | b45_unk2 | ? | Ignored ? |
0x14 | 0x04 | 00 00 00 00 | b45_unk3 | ? | Ignored ? |
0x18 | 0x04 | 00 00 00 30 | index_start | Index relative start offset | |
0x1C | 0x04 | 00 00 00 40 | pixels_start | First plane/level/frame relative start offset | |
0x20 | 0x04 | 00 00 00 60 | pixels_end | Last plane/level/frame relative end offset | |
0x24 | 0x04 | 00 00 00 00 | plane_mask | Indicates a color (for alpha mask ?) | PlaneMask in the GIS |
0x28 | 0x02 | 00 01 | level_type | 0x00 = Illegal 0x01 = MIPMAP 0x02 = MIPMAP2 (used for palettes) |
LevelType in the GIS |
0x2A | 0x02 | 00 01 | level_count | Number of mipmaps | Restricted by limit_level_count in GimConv.cfg (default max 8) LevelCount in the GIS |
0x2C | 0x02 | 00 03 | frame_type | 0x00 = Illegal ? 0x01 = Illegal ? 0x02 = Illegal ? 0x03 = SEQUENCE |
FrameType in the GIS |
0x2E | 0x02 | 00 01 | frame_count | Number of frames | Restricted by limit_frame_count in GimConv.cfg (default no limit) FrameCount in the GIS |
0x30 | any | N/A | user_data | Optional User Data area | Enabled by update_userdata = on in GimConv.cfg. Stores the contents of <filename>.dat |
varies | varies | N/A | padding | Optional padding | To align user_data to 4 bytes |
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00000070 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 ...@............
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 ... | 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, for experimental purposes can be added manually by using GimConv.cfg setting merge_mode with values frame and level, and probably plane too, see Discussion page
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00000080 CA 5E 11 00 CA 5E 12 00 CA 5E 13 00 CA 5E 14 00 Ê^..Ê^..Ê^..Ê^.. 00000090 CA 5E 21 00 CA 5E 22 00 CA 5E 23 00 CA 5E 24 00 Ê^!.Ê^".Ê^#.Ê^$.
0x05 (Palette)[edit | edit source]
The palette block is used for 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 color palette (such BMP or DDS)
The concept of "palette" is a bit confusing because here is used for two different things, the block 0x05 is codenamed palette as a general concept, the file structure is the same than the block 0x04 (image), both ends with the user_data (optional), then it comes an index to indicate how many palettes there are and its offsets (usually only one palette), and then starts an area where are stored the pixel colors... this area to store pixel colors is the real palette in design slang but to avoid this name confussion we can call it the colormap
- The differences in between block 0x04 (image) and block 0x05 (palette) are minor, only differs in how are used
- The palette (block 0x05) is located before the image (block 0x04) in the block hierarchy of the GIM structure, doesnt seems to be anything that connects them, other than the fact that "the palette goes first"
- The palette stores the "colormap", and the image stores an "indexmap" (and every index value in the image loads a color from the palette colormap)
- The palette only allows for palette_format = rgba8888 rgba4444 rgba5551 rgba5650
- The "colormap" is stored as an image of 256x1 pixels (image_width = 0x100 image_height = 0x1) and allows to store 256 colors
- The "colormap" has a reserved bytes size in the GIM file structure based on the palette format, 0x400 bytes in rgba8888, 0x200 in rgba4444, etc...), if the number of colors is smaller than 256 the "colormap" area will have some bytes filled with zeroes (not used)
- The palette is stored as level_type = MIPMAP2
0xFF (Fileinfo)[edit | edit source]
This block only exists if the GIM is build using the setting update_fileinfo = on. Initially in old PS3 firmwares all the GIM files was made this way, eventually sony stopped using this setting and GIM files was updated/replaced by new ones without this fileinfo block. But there are many GIM files inside latest PS3 firmware that contains this fileinfo block (are GIM files made years ago and never was updated, this can be seen in the timestamps stored in them around 2005/2006)
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 | 4x2_CA5Exy_32bits.bmp | project_name | Original file name and file extension | ProjectName in the GIS |
0x16 | 0x0E | Administrator | user_name | Microsoft windows user account | UserName in the GIS |
0x24 | 0x19 | Sun Apr 15 01:25:02 2018 | saved_date | Timestamp | SavedDate in the GIS |
0x3D | 0x0E | GimConv 1.20h | originator | GimConv version | Originator in the GIS |
0x4B | 0x01 | 00 | padding | Optional padding | To align fileinfo block to 4 bytes |
Links[edit | edit source]
|