123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- /*
- * 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 {
- TF_565,
- TF_5551,
- TF_4444,
- TF_8888,
- TF_LA,
- TF_PVR4,
- TF_PVR4A,
- TF_PVR2,
- TF_PVR2A,
- } 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;
|