Find file
Fetching contributors…
Cannot retrieve contributors at this time
161 lines (136 sloc) 4.7 KB
* ipak.h
* General purpose data file management intended to be used
* as a read-only memory mapped file to play nice with iPhone OS's
* non-swapping and variable memory management.
* Created by John Carmack on 4/9/09.
* Copyright 2009 id Software. All rights reserved.
// In-file structures
// These stuctures are in the mapped data file, and shared
// between the app and utility.
// Type headers are stored separately from the bulk data to minimize the
// number of active pages.
// The full hash of the name is stored in nameHash, and nameHash&(PK_HASH_BUCKETS-1) is
// used to chain structures of a particular type together.
#define MAX_PK_NAME 64
typedef struct {
int nameHash; // PK_HashName( name )
int nextOnHashChain; // -1 = end of chain
char name[MAX_PK_NAME]; // in canonical form: backslashes to slashes and lowercase
} pkName_t;
#define PK_HASH_CHAINS 256
typedef struct {
int tableOfs; // // &firstStruct = (byte *)dfHeader + tableOfs
int count;
int structSize; // sizeof( pkWavData_t ), etc
int hashChains[PK_HASH_CHAINS]; // -1 = end of chain
} pkType_t;
// dfWavData holds everything necessary to fully create an OpenAL sample buffer
typedef struct {
pkName_t name;
int wavDataOfs;
int wavChannels; // 1 or 2
int wavChannelBytes; // 1 or 2
int wavRate; // 22050, etc
int wavNumSamples; // each sample holds all the channels
// we may want looping information here later
} pkWavData_t;
// iPhone does not natively support palettized textures, but we
// might conceivably want to support luminance and intensity textures
// in the future.
typedef enum {
} textureFormat_t;
// dfImageData_t holds everything necessary to fully create an OpenGL texture object
typedef struct {
pkName_t name;
int picDataOfs; // the raw bits to pass to gl, mipmaps appended
// for PVR formats, the minimum size of each level is 32 bytes
int format;
int uploadWidth;
int uploadHeight;
int numLevels; // 1 for non mipmapped, otherwise log2( largest dimension )
// glTexParameters
int wrapS;
int wrapT;
int minFilter;
int magFilter;
int aniso;
// The upload sizes can be larger than the source sizes for
// non power of two sources, or for non square sources in the
// case of PVR compression.
int srcWidth;
int srcHeight;
float maxS; // srcWidth / uploadWidth
float maxT;
// Track the outlines of up to two boxes of non-transparent pixels
// to allow optimized drawing of sprites with large empty areas.
// The reason for two boxes is that the common lights have something
// at the top and something at the bottom, with nothing inbetween.
// These are inclusive bounds of the rows / columns in
// uploadWidth / uploadHeight with non-0 alpha
int numBounds;
int bounds[2][2][2];
} pkTextureData_t;
typedef struct {
pkName_t name;
int rawDataOfs; // (byte *)pkHeader + dataOfs
int rawDataLen; // there will always be a 0 byte appended to terminate strings
// that is not counted in this length
} pkRawData_t;
#define PKFILE_VERSION 0x12340002
typedef struct {
int version;
pkType_t textures;
pkType_t wavs;
pkType_t raws;
} pkHeader_t;
// In-memory, writable structures
typedef struct {
unsigned glTexNum;
const pkTextureData_t *textureData;
// we will need to add LRU links if texture caching is needed
} pkTexture_t;
typedef struct {
unsigned alBufferNum; // created with the staticBuffer extension directly in the mapped memory
const pkWavData_t *wavData;
} pkWav_t;
void PK_Init( const char *pakFileName );
const pkName_t *PK_FindType( const char *rawName, const pkType_t *type, int *index );
const byte * PK_FindRaw( const char *rawName, int *len ); // len can be NULL if you don't need it
pkTexture_t * PK_FindTexture( const char *imageName );
pkWav_t * PK_FindWav( const char *soundName );
// The name will be converted to canonical name (backslashes converted to slashes and lowercase)
// before generating a hash.
int PK_HashName( const char *name, char canonical[MAX_PK_NAME] );
void PK_BindTexture( pkTexture_t *tex );
void PK_DrawTexture( pkTexture_t *tex, int x, int y );
void PK_StretchTexture( pkTexture_t *tex, float x, float y, float w, float h );
extern pkHeader_t * pkHeader;
extern int pkSize;
// images and wavs have writable state, so they need separate
// structs that also point to the source in the pak file
extern pkTexture_t *pkTextures;
extern pkWav_t * pkWavs;