openTRI 0.1
triImage.h
1/*
2 * triImage.h: Header for image loading/saving
3 * This file is part of the "tri Engine".
4 *
5 * Copyright (C) 2007 tri
6 * Copyright (C) 2007 Alexander Berl 'Raphael' <raphael@fx-world.org>
7 *
8 * $Id: $
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 */
24
25#ifndef __TRIIMAGE_H__
26#define __TRIIMAGE_H__
27
28#include "triTypes.h"
29#include "streams/streams.h"
30#include "triHeap.h"
31
32
37#ifdef __PSP__
38#include <pspgu.h>
39
40#define IMG_FORMAT_5650 GU_PSM_5650
41#define IMG_FORMAT_5551 GU_PSM_5551
42#define IMG_FORMAT_4444 GU_PSM_4444
43#define IMG_FORMAT_8888 GU_PSM_8888
44#define IMG_FORMAT_T4 GU_PSM_T4
45#define IMG_FORMAT_T8 GU_PSM_T8
46#define IMG_FORMAT_T16 GU_PSM_T16
47#define IMG_FORMAT_T32 GU_PSM_T32
48#define IMG_FORMAT_DXT1 GU_PSM_DXT1
49#define IMG_FORMAT_DXT3 GU_PSM_DXT3
50#define IMG_FORMAT_DXT5 GU_PSM_DXT5
51#else // __PSP__
52#define IMG_FORMAT_5650 0
53#define IMG_FORMAT_5551 1
54#define IMG_FORMAT_4444 2
55#define IMG_FORMAT_8888 3
56#define IMG_FORMAT_T4 4
57#define IMG_FORMAT_T8 5
58#define IMG_FORMAT_T16 6
59#define IMG_FORMAT_T32 7
60#define IMG_FORMAT_DXT1 8
61#define IMG_FORMAT_DXT3 9
62#define IMG_FORMAT_DXT5 10
63#endif // __PSP__
64
65
66// triImageLoad flags
67#define TRI_RAM 0x0000
68#define TRI_VRAM 0x0001
69#define TRI_SWIZZLE 0x0002
70// Bits 3-7 are reserved for later use
71#define TRI_FRAME(x) (((x) & ~0x7FF) << 11)
72#define TRI_LEVEL(x) (((x) & 0x7) << 8)
75// triImageChunkHeader/triImageSave flags
76#define TRI_IMG_FLAGS_SWIZZLE 0x0001
77#define TRI_IMG_FLAGS_RLE 0x0002
78#define TRI_IMG_FLAGS_GZIP 0x0004
79#define TRI_IMG_FLAGS_WAVELET 0x0008
82#define PACKED __attribute__((packed))
83
84
87typedef struct triImageFileHeader
88{
89 triChar magic[8];
90 triU32 numFrames;
91 triU32 reserved;
92} PACKED triImageFileHeader; // 16 byte header
93
94
95typedef struct triImageChunkHeader
96{
97 triU16 format;
98 triU16 palformat;
99 triU16 flags;
100 triU16 numLevels;
101 triU16 delay;
102 triS16 xOffs; // placement offset on screen
103 triS16 yOffs;
104 triU16 reserved;
105} PACKED triImageChunkHeader; // 16 byte Image Header
106
107
108typedef struct triImageChunk
109{
110 triU32 width;
111 triU32 height;
112 triU32 stride;
113 triU32 size;
114} PACKED triImageChunk; // 16 byte Image chunk
115
116
117/* .tri File Format Spec:
118 *
119 * <triImageFileHeader> (tIH)
120 * numFrames times:
121 * <triImageChunkHeader> (tCH)
122 * [palette]
123 * numLevels+1 times:
124 * <triImageChunk> (tIC)
125 * <data>
126 *
127 * Palette is either 16 (format = IMG_FORMAT_T4) or 256 (format = IMG_FORMAT_T*) entries.
128 * One palette entry is either 2 bytes (palformat = IMG_FORMAT_4444/5650/5551)
129 * or 4 bytes ( palformat = IMG_FORMAT_8888).
130 *
131 * Data is tIC.size bytes of data, either in raw, rle compressed (tCH.flags&TRI_IMG_FLAGS_RLE)
132 * or gzip compressed (tCH.flags&TRI_IMG_FLAGS_GZIP).
133 *
134 * A tIC represents one mipmap level for a texture. The size may vary, but the format and palette
135 * must be the same for all levels.
136 *
137 * A tCH represents one animation frame in an animated image/texture. Each frame
138 * can have a different format and palette.
139 */
140
141
142typedef struct triMipLevel
143{
144 triVoid *data;
145 triU32 size;
146 triU16 width;
147 triU16 height;
148 triU16 stride;
149 triU16 tex_height;
150
151 struct triMipLevel* next;
152} PACKED triMipLevel;
153
154
157typedef struct triImage
158{
159 triVoid *palette;
160 triU32 palformat;
162 triVoid *data;
163 triU32 size;
164 triU16 width;
165 triU16 height;
166 triU16 stride;
167 triU16 tex_height;
168 triU16 format;
169 triU8 bits;
171 triU8 levels;
174 triBool swizzled;
176 triChar filename[64]; // Needed for triModel saver to save filename within triModel
177} PACKED triImage; // 99 bytes
178
179
182typedef struct triImageSlice
183{
184 triVoid *data;
185 triU32 size;
186 triU16 width;
187 triU16 height;
188 triU16 pitch;
189} PACKED triImageSlice;
190
191
194typedef struct triImageLarge
195{
196 triVoid *palette;
197 triU32 palformat;
200 triU16 vslices;
201 triU16 hslices;
202 triU16 width;
203 triU16 height;
205 triU16 format;
206 triU8 bits;
208 triBool swizzled;
209} PACKED triImageLarge;
210
213// ImageList stays undocumented, as it's internal only
214typedef struct triImageList
215{
216 triImage *image;
217 triS16 sx, sy;
218 triS16 sw, sh; // source rect of image (sprite sheets)
219
220 triS16 xOffs; // placement offset on screen
221 triS16 yOffs;
222 triU32 delay; // delay of frame in timeBase resolution
223 struct triImageList *next;
224} PACKED triImageList; // 26 bytes
225
226
233typedef struct triImageAnimation
234{
240 triU32 numFrames;
242 // size of largest animation frame
243 triU16 width;
244 triU16 height;
246 // use a global palette - not currently used
247 triVoid *palette;
249 triU8 palformat;
252 triS16 loops;
253 triS16 loopsDone;
254 triS16 timeBase;
256 triBool playing;
257} PACKED triImageAnimation; // 43 bytes
258
259
260
268triVoid triImagePaletteGet( triImage* img, triU32 col, triU32 *r, triU32 *g, triU32 *b, triU32 *a );
269
277triVoid triImagePaletteSet( triImage* img, triU32 col, triU32 r, triU32 g, triU32 b, triU32 a );
278
283
287triVoid triImageSwizzle( triImage *img );
288
293
297triVoid triImageToVRAM( triImage *img );
298
302triVoid triImageToRAM( triImage *img );
303
307triVoid triImageFree( triImage *img );
308
313
314
322triImage* triImageGet( triS32 x, triS32 y, triS32 width, triS32 height );
323
333triImage* triImageSet( triS32 width, triS32 height, triS32 stride, triS32 bits, triS32 psm, triVoid* data );
334
335#ifdef TRI_SUPPORT_PNG
340triImage* triImageLoadPng( triChar* name );
341
346triImage* triImageLoadPngStream( stream* s );
347#endif // TRI_SUPPORT_PNG
348
353triImage* triImageLoadRaw( triChar* name );
354
360
365triImage* triImageLoadTga( triChar* name );
366
372
373
380triImage* triImageLoadTri( triChar* name, triU32 frame );
381
389
390
396triImage* triImageLoad( triChar* name, triU32 flags );
397
403triImage* triImageLoadStream( stream* s, triU32 flags );
404
405
406#ifdef TRI_SUPPORT_PNG
412triVoid triImageSavePng( triChar* name, triImage *img, triS32 saveAlpha );
413#endif // TRI_SUPPORT_PNG
414
421triVoid triImageSaveTga( triChar* name, triImage *img, triS32 saveAlpha, triS32 rle );
422
428triVoid triImageSaveTri( triChar* name, triImage *img, triU32 flags );
429
430
435
445triImageAnimation* triImageAnimationFromSheet( triImage* img, triS32 fwidth, triS32 fheight, triS32 hframes, triS32 vframes, triU32 delay );
446
458triImageAnimation* triImageAnimationFromSheet2( triImage* img, triS32 xoffs, triS32 yoffs, triS32 fwidth, triS32 fheight, triS32 hframes, triS32 vframes, triU32 delay );
459
469triImageAnimation* triImageAnimationFromSheetTga( triChar* name, triS32 fwidth, triS32 fheight, triS32 hframes, triS32 vframes, triU32 delay );
470
471#ifdef TRI_SUPPORT_PNG
481triImageAnimation* triImageAnimationFromSheetPng( triChar* name, triS32 fwidth, triS32 fheight, triS32 hframes, triS32 vframes, triU32 delay );
482#endif // TRI_SUPPORT_PNG
483
493triImageAnimation* triImageAnimationFromSheetFile( triChar* name, triS32 fwidth, triS32 fheight, triS32 hframes, triS32 vframes, triU32 delay );
494
506triImageAnimation* triImageAnimationFromSheetFile2( triChar* name, triS32 xoffs, triS32 yoffs, triS32 fwidth, triS32 fheight, triS32 hframes, triS32 vframes, triU32 delay );
507
508
520triVoid triImageAnimationAppend( triImageAnimation* ani, triImage* img, triS32 sx, triS32 sy, triS32 sw, triS32 sh, triS32 x_offs, triS32 y_offs, triU32 delay );
521
527triVoid triImageAnimationAppend2( triImageAnimation* ani, triImage* img, triU32 delay );
528
536triVoid triImageAnimationAppend3( triImageAnimation* ani, triImage* img, triS32 xOffs, triS32 yOffs, triU32 delay );
537
538
539triImageAnimation* triImageAnimationLoadGif( triChar* name );
540triImageAnimation* triImageAnimationLoadGifStream( stream* s );
541
542
548
554
560void triImageAnimationSaveTri( triChar* name, triImageAnimation* ani, triS32 flags );
561
562
567
572
577
583
588triVoid triImageAnimationSetSpeed( triImageAnimation* ani, triFloat factor );
589
595
602
605#endif
triVoid triImageAnimationAppend2(triImageAnimation *ani, triImage *img, triU32 delay)
Append a loaded triImage as last frame to an animation.
triVoid triImageAnimationFree(triImageAnimation *img)
Free an image animation.
triImage * triImageLoad(triChar *name, triU32 flags)
Generic file loader.
triImage * triImageGet(triS32 x, triS32 y, triS32 width, triS32 height)
Capture part of framebuffer to image.
triImage * triImageLoadTriStream(stream *s, triU32 frame)
Load TRI image from a stream.
triImageAnimation * triImageAnimationLoadTriStream(stream *s)
Load image animation from a stream.
triImage * triImageSet(triS32 width, triS32 height, triS32 stride, triS32 bits, triS32 psm, triVoid *data)
Create an image from a memory buffer.
triVoid triImageAnimationSetSpeed(triImageAnimation *ani, triFloat factor)
Set animation speed.
triVoid triImageToVRAM(triImage *img)
Upload an image to VRAM for faster drawing.
triBool triImageAnimationIsDone(triImageAnimation *ani)
Return if animation is finished.
triVoid triImageToRAM(triImage *img)
Download an image to RAM.
triImage * triImageLoadRaw(triChar *name)
Load image from a .raw file.
triImage * triImageLoadTga(triChar *name)
Load image from a .tga file.
triImageAnimation * triImageAnimationFromSheetTga(triChar *name, triS32 fwidth, triS32 fheight, triS32 hframes, triS32 vframes, triU32 delay)
Create an animation from an imagesheet in a Tga file, in order left-right, top-down.
triImageAnimation * triImageAnimationFromSheet(triImage *img, triS32 fwidth, triS32 fheight, triS32 hframes, triS32 vframes, triU32 delay)
Create an animation from an imagesheet in order left-right, top-down.
triImage * triImageAnimationGetFrame(triImageAnimation *ani, triS32 nFrame)
Return one frame from animation.
triImage * triImageLoadTgaStream(stream *s)
Load TGA image from a stream.
triVoid triImageAnimationStart(triImageAnimation *ani)
Start animation.
void triImageAnimationSaveTri(triChar *name, triImageAnimation *ani, triS32 flags)
Save image animation to a .tri file.
triImageAnimation * triImageAnimationFromSheetFile(triChar *name, triS32 fwidth, triS32 fheight, triS32 hframes, triS32 vframes, triU32 delay)
Create an animation from an imagesheet in a file, in order left-right, top-down.
triVoid triImageUnswizzle(triImage *img)
Unswizzle an image.
triVoid triImageAnimationPause(triImageAnimation *ani)
Pause animation.
triS32 triImageAnimationUpdate(triImageAnimation *ani)
Update animation.
triImageAnimation * triImageAnimationCreate()
Create a new blank triImageAnimation structure.
triImage * triImageLoadTri(triChar *name, triU32 frame)
Load image from a .tri file.
triVoid triImageFree(triImage *img)
Free an image.
triImageAnimation * triImageAnimationFromSheet2(triImage *img, triS32 xoffs, triS32 yoffs, triS32 fwidth, triS32 fheight, triS32 hframes, triS32 vframes, triU32 delay)
Create an animation from an imagesheet in order left-right, top-down.
triImageAnimation * triImageAnimationLoadTri(triChar *name)
Load image animation from a .tri file.
triImage * triImageLoadRawStream(stream *s)
Load RAW image from a stream.
triVoid triImageAnimationAppend3(triImageAnimation *ani, triImage *img, triS32 xOffs, triS32 yOffs, triU32 delay)
Append a loaded triImage as last frame to an animation.
triVoid triImageSaveTri(triChar *name, triImage *img, triU32 flags)
Save image to a .tri file.
triVoid triImageSwizzleToVRAM(triImage *img)
Swizzle and upload an image to VRAM for faster drawing.
triImageAnimation * triImageAnimationFromSheetFile2(triChar *name, triS32 xoffs, triS32 yoffs, triS32 fwidth, triS32 fheight, triS32 hframes, triS32 vframes, triU32 delay)
Create an animation from an imagesheet in a file, in order left-right, top-down.
triVoid triImageSaveTga(triChar *name, triImage *img, triS32 saveAlpha, triS32 rle)
Save image to a .tga file.
triVoid triImageSwizzle(triImage *img)
Swizzle an image for faster drawing.
triVoid triImagePaletteGet(triImage *img, triU32 col, triU32 *r, triU32 *g, triU32 *b, triU32 *a)
Get a palette entry from image.
triVoid triImageAnimationReset(triImageAnimation *ani)
Reset animation (Stop+Rewind).
triImage * triImageLoadStream(stream *s, triU32 flags)
Generic stream file loader.
triVoid triImagePaletteSet(triImage *img, triU32 col, triU32 r, triU32 g, triU32 b, triU32 a)
Set a palette entry in image.
triVoid triImageAnimationAppend(triImageAnimation *ani, triImage *img, triS32 sx, triS32 sy, triS32 sw, triS32 sh, triS32 x_offs, triS32 y_offs, triU32 delay)
Append a loaded triImage as last frame to an animation.
Definition streams.h:200
ImageAnimation struct.
Definition triImage.h:234
triU16 width
Maximum width of all frames.
Definition triImage.h:243
triS16 timeBase
Time base of delays in µs (default 1000 = 1ms).
Definition triImage.h:254
triS16 loops
Number of loops.
Definition triImage.h:252
triU16 height
Maximum height of all frames.
Definition triImage.h:244
triImageList * frames
List of animation frames.
Definition triImage.h:238
u64 lastUpdate
Time of last update.
Definition triImage.h:255
triImageList * curFrame
Current animation frame.
Definition triImage.h:239
triVoid * palette
Global palette for all animation frames.
Definition triImage.h:247
triU8 globalPalette
Animation frames use a global palette.
Definition triImage.h:248
triU8 palformat
Global palette format - one of IMG_FORMAT_5650, IMG_FORMAT_5551, IMG_FORMAT_4444, IMG_FORMAT_8888.
Definition triImage.h:249
triS16 loopsDone
Number of finished loops.
Definition triImage.h:253
triImage * image
Pointer to current frame image for easy access.
Definition triImage.h:235
triU32 numFrames
Number of frames.
Definition triImage.h:240
triBool playing
Is animation playing?
Definition triImage.h:256
Definition triImage.h:96
triU16 numLevels
Number of mipmap levels stored in the image.
Definition triImage.h:100
triU16 delay
Delay for image animation.
Definition triImage.h:101
triU16 flags
Is image swizzled/compressed.
Definition triImage.h:99
triU16 palformat
Palette format - one of IMG_FORMAT_5650, IMG_FORMAT_5551, IMG_FORMAT_4444, IMG_FORMAT_8888.
Definition triImage.h:98
triU16 format
Image format - one of IMG_FORMAT_*.
Definition triImage.h:97
Definition triImage.h:109
triU32 height
Image height.
Definition triImage.h:111
triU32 width
Image width.
Definition triImage.h:110
triU32 size
Size of data in bytes.
Definition triImage.h:113
triU32 stride
Image allocated width (power of two).
Definition triImage.h:112
Image File Header.
Definition triImage.h:88
triChar magic[8]
"triImage".
Definition triImage.h:89
triU32 numFrames
Number of frames for animations.
Definition triImage.h:90
Large Image struct.
Definition triImage.h:195
triU16 hslices
Number of horizontal slices.
Definition triImage.h:201
triVoid * palette
Image palette.
Definition triImage.h:196
triU8 bits
Image bits per pixel.
Definition triImage.h:206
triImageSlice * data
Image slices.
Definition triImage.h:199
triU16 height
Image height.
Definition triImage.h:203
triU16 width
Image width.
Definition triImage.h:202
triU16 vslices
Number of vertical slices.
Definition triImage.h:200
triU16 format
Image format - one of IMG_FORMAT_*.
Definition triImage.h:205
triU32 palformat
Palette format - one of IMG_FORMAT_5650, IMG_FORMAT_5551, IMG_FORMAT_4444, IMG_FORMAT_8888.
Definition triImage.h:197
triBool swizzled
Is image swizzled.
Definition triImage.h:208
Definition triImage.h:215
Image slice struct.
Definition triImage.h:183
triU16 height
Image height.
Definition triImage.h:187
triU32 size
Size of data in bytes.
Definition triImage.h:185
triU16 width
Image width.
Definition triImage.h:186
triVoid * data
Image data.
Definition triImage.h:184
triU16 pitch
Image allocated width (power of two).
Definition triImage.h:188
Image struct.
Definition triImage.h:158
triVoid * data
Image data.
Definition triImage.h:162
triU16 stride
Image allocated width (power of two).
Definition triImage.h:166
triU16 height
Image height.
Definition triImage.h:165
triU8 levels
Number of mipmap levels in image.
Definition triImage.h:171
triVoid * palette
Image palette.
Definition triImage.h:159
triU16 width
Image width.
Definition triImage.h:164
triU32 palformat
Palette format - one of IMG_FORMAT_5650, IMG_FORMAT_5551, IMG_FORMAT_4444, IMG_FORMAT_8888.
Definition triImage.h:160
triU16 tex_height
Image texture height (power of two).
Definition triImage.h:167
triU16 format
Image format - one of IMG_FORMAT_*.
Definition triImage.h:168
triBool swizzled
Is image swizzled.
Definition triImage.h:174
triMipLevel * level
Linked list of mipmap levels.
Definition triImage.h:172
triU8 bits
Image bits per pixel.
Definition triImage.h:169
triU32 size
Size of data in bytes.
Definition triImage.h:163
Definition triImage.h:143