version 2.8
zbuffer.h
1 #ifndef _tgl_zbuffer_h_
2 #define _tgl_zbuffer_h_
3 
4 /*
5  * Z buffer
6  */
7 
8 #include "zfeatures.h"
9 
10 #define ZB_Z_BITS 16
11 
12 #define ZB_POINT_Z_FRAC_BITS 14
13 
14 #define ZB_POINT_S_MIN ( (1<<13) )
15 #define ZB_POINT_S_MAX ( (1<<22)-(1<<13) )
16 #define ZB_POINT_T_MIN ( (1<<21) )
17 #define ZB_POINT_T_MAX ( (1<<30)-(1<<21) )
18 
19 #define ZB_POINT_RED_MIN ( (1<<10) )
20 #define ZB_POINT_RED_MAX ( (1<<16)-(1<<10) )
21 #define ZB_POINT_GREEN_MIN ( (1<<9) )
22 #define ZB_POINT_GREEN_MAX ( (1<<16)-(1<<9) )
23 #define ZB_POINT_BLUE_MIN ( (1<<10) )
24 #define ZB_POINT_BLUE_MAX ( (1<<16)-(1<<10) )
25 
26 /* display modes */
27 #define ZB_MODE_5R6G5B 1 /* true color 16 bits */
28 #define ZB_MODE_INDEX 2 /* color index 8 bits */
29 #define ZB_MODE_RGBA 3 /* 32 bit rgba mode */
30 #define ZB_MODE_RGB24 4 /* 24 bit rgb mode */
31 #define ZB_NB_COLORS 225 /* number of colors for 8 bit display */
32 
33 #if TGL_FEATURE_RENDER_BITS == 15
34 
35 #define RGB_TO_PIXEL(r,g,b) \
36  ((((r) >> 1) & 0x7c00) | (((g) >> 6) & 0x03e0) | ((b) >> 11))
37 typedef unsigned short PIXEL;
38 /* bytes per pixel */
39 #define PSZB 2
40 /* bits per pixel = (1 << PSZH) */
41 #define PSZSH 4
42 
43 #elif TGL_FEATURE_RENDER_BITS == 16
44 
45 /* 16 bit mode */
46 #define RGB_TO_PIXEL(r,g,b) \
47  (((r) & 0xF800) | (((g) >> 5) & 0x07E0) | ((b) >> 11))
48 typedef unsigned short PIXEL;
49 #define PSZB 2
50 #define PSZSH 4
51 
52 #elif TGL_FEATURE_RENDER_BITS == 24
53 
54 #define RGB_TO_PIXEL(r,g,b) \
55  ((((r) << 8) & 0xff0000) | ((g) & 0xff00) | ((b) >> 8))
56 typedef unsigned char PIXEL;
57 #define PSZB 3
58 #define PSZSH 5
59 
60 #elif TGL_FEATURE_RENDER_BITS == 32
61 
62 #define RGB_TO_PIXEL(r,g,b) \
63  ((((r) << 8) & 0xff0000) | ((g) & 0xff00) | ((b) >> 8))
64 typedef unsigned int PIXEL;
65 #define PSZB 4
66 #define PSZSH 5
67 
68 #else
69 
70 #error Incorrect number of bits per pixel
71 
72 #endif
73 
74 typedef struct {
75  int xsize,ysize;
76  int linesize; /* line size, in bytes */
77  int mode;
78 
79  unsigned short *zbuf;
80  PIXEL *pbuf;
81  int frame_buffer_allocated;
82 
83  int nb_colors;
84  unsigned char *dctable;
85  int *ctable;
86  PIXEL *current_texture;
87 } ZBuffer;
88 
89 typedef struct {
90  int x,y,z; /* integer coordinates in the zbuffer */
91  int s,t; /* coordinates for the mapping */
92  int r,g,b; /* color indexes */
93 
94  float sz,tz; /* temporary coordinates for mapping */
95 } ZBufferPoint;
96 
97 /* zbuffer.c */
98 
99 ZBuffer *ZB_open(int xsize,int ysize,int mode,
100  int nb_colors,
101  unsigned char *color_indexes,
102  int *color_table,
103  void *frame_buffer);
104 
105 
106 void ZB_close(ZBuffer *zb);
107 
108 void ZB_resize(ZBuffer *zb,void *frame_buffer,int xsize,int ysize);
109 void ZB_clear(ZBuffer *zb,int clear_z,int z,
110  int clear_color,int r,int g,int b);
111 /* linesize is in BYTES */
112 void ZB_copyFrameBuffer(ZBuffer *zb,void *buf,int linesize);
113 
114 /* zdither.c */
115 
116 void ZB_initDither(ZBuffer *zb,int nb_colors,
117  unsigned char *color_indexes,int *color_table);
118 void ZB_closeDither(ZBuffer *zb);
119 void ZB_ditherFrameBuffer(ZBuffer *zb,unsigned char *dest,
120  int linesize);
121 
122 /* zline.c */
123 
124 void ZB_plot(ZBuffer *zb,ZBufferPoint *p);
125 void ZB_line(ZBuffer *zb,ZBufferPoint *p1,ZBufferPoint *p2);
126 void ZB_line_z(ZBuffer * zb, ZBufferPoint * p1, ZBufferPoint * p2);
127 
128 /* ztriangle.c */
129 
130 void ZB_setTexture(ZBuffer *zb, PIXEL *texture);
131 
132 void ZB_fillTriangleFlat(ZBuffer *zb,
133  ZBufferPoint *p1,ZBufferPoint *p2,ZBufferPoint *p3);
134 
135 void ZB_fillTriangleSmooth(ZBuffer *zb,
136  ZBufferPoint *p1,ZBufferPoint *p2,ZBufferPoint *p3);
137 
138 void ZB_fillTriangleMapping(ZBuffer *zb,
139  ZBufferPoint *p1,ZBufferPoint *p2,ZBufferPoint *p3);
140 
141 void ZB_fillTriangleMappingPerspective(ZBuffer *zb,
142  ZBufferPoint *p0,ZBufferPoint *p1,ZBufferPoint *p2);
143 
144 
145 typedef void (*ZB_fillTriangleFunc)(ZBuffer *,
146  ZBufferPoint *,ZBufferPoint *,ZBufferPoint *);
147 
148 /* memory.c */
149 void gl_free(void *p);
150 void *gl_malloc(int size);
151 void *gl_zalloc(int size);
152 
153 #endif /* _tgl_zbuffer_h_ */