Graphic Image Map (GIM)

From PS3 Developer wiki
Jump to navigation Jump to search

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 block_data_lenght Size of the block header Indicates the offset of the area located inmediatly after frame_count
0x02 0x02 00 00 b4_unk1 ? Ignored ?
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
0x01 = 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 width Image/palette width in pixels Width in the GIS
0x0A 0x02 00 02 height Image/palette height in pixels Height in the GIS
0x0C 0x02 00 20 bpp_align Image/palette bits per pixel alignment
0x0E 0x02 00 10 pitch_align Image/palette X alignment PitchAlign in the GIS
0x10 0x02 00 01 height_align Image/palette Y alignment HeightAlign in the GIS
0x12 0x02 00 02 b4_unk2 ? Ignored ?
0x14 0x04 00 00 00 00 b4_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
LevelType in the GIS
0x2A 0x02 00 01 level_count Number of mipmaps (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 FrameCount in the GIS
0x30 any N/A user_data Optional User Data area Stores the contents of <filename>.dat by using the setting update_userdata = on
0x30 varies N/A padding Optional padding To align user_data to 4 bytes


IMAGE_INDEX (contains IMAGE_PLANE/IMAGE_LEVEL/IMAGE_FRAME) ?
PALETTE_INDEX (contains PALETTE_LEVEL/PALETTE_FRAME) ?
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 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