]> git.wh0rd.org - ICEs.git/blob - 394889/s_triangle.i.13
more
[ICEs.git] / 394889 / s_triangle.i.13
1 typedef union {
2 float f;
3 int i;
4 } fi_type;
5 static __inline__ int IS_INF_OR_NAN(float x)
6 {
7 fi_type tmp;
8 tmp.f = x;
9 return !(int)((unsigned int)((tmp.i & 0x7fffffff) - 0x7f800000) >> 31);
10 }
11
12 struct gl_texture_image {
13 unsigned int Width;
14 unsigned int Height;
15 void *Data;
16 };
17 struct gl_renderbuffer {
18 void (*PutRowRGB) ();
19 };
20 struct gl_framebuffer {
21 struct gl_renderbuffer *_ColorDrawBuffers[8];
22 };
23 struct gl_context {
24 struct gl_framebuffer *DrawBuffer;
25 };
26 typedef struct {
27 float attrib[30][4];
28 } SWvertex;
29 typedef struct sw_span {
30 int x, y;
31 unsigned int end;
32 float attrStepX[30][4];
33 int intTex[2], intTexStep[2];
34 } SWspan;
35 static void simple_textured_triangle(const SWvertex * v1)
36 {
37 struct gl_context *ctx;
38 const SWvertex *v0;
39 const SWvertex *v2;
40 typedef struct {
41 float dx;
42 float dy;
43 int fsx;
44 int fx0;
45 int lines;
46 } EdgeT;
47 EdgeT eMaj;
48 EdgeT eTop;
49 EdgeT eBot;
50 float oneOverArea;
51 const SWvertex *vMin;
52 const SWvertex *vMid;
53 const SWvertex *vMax;
54 const int snapMask = ~127;
55 int vMin_fx;
56 int vMin_fy;
57 int vMid_fx;
58 int vMid_fy;
59 int vMax_fx;
60 int vMax_fy;
61 SWspan span;
62 const int fy0 =
63 (((int)
64 ((((v0->attrib[0][1] - 0) * (float)2048) >=
65 0) ? (((v0->attrib[0][1] - 0) * (float)2048) +
66 0) : (((v0->attrib[0][1] - 0) * (float)2048) -
67 0))));
68 const int fy1 =
69 (((int)
70 ((((v1->attrib[0][1] - 0) * (float)2048) >=
71 0.0F) ? (((v1->attrib[0][1] - 0) * (float)2048) +
72 0) : (((v1->attrib[0][1] - 0) * (float)2048) -
73 0))));
74 const int fy2 =
75 (((int)
76 ((((v2->attrib[0][1] - 0) * (float)2048) >=
77 0.0F) ? (((v2->attrib[0][1] - 0) * (float)2048) +
78 0) : (((v2->attrib[0][1] - 0) * (float)2048) -
79 0))));
80 if (fy1 <= fy2)
81 {
82 vMin = v0;
83 vMax = v1;
84 vMin_fy = fy0;
85 }
86 vMin_fx =
87 (((int)
88 ((((vMin->attrib[0][0] + 0.5F) * (float)2048) >=
89 0.0F) ? (((vMin->attrib[0][0] + 0.5F) * (float)2048) +
90 0.5F) : (((vMin->attrib[0][0] + 0.5F) * (float)2048) -
91 0.5F)))) & snapMask;
92 vMid_fx =
93 (((int)
94 ((((vMid->attrib[0][0] + 0.5F) * (float)2048) >=
95 0.0F) ? (((vMid->attrib[0][0] + 0.5F) * (float)2048) +
96 0.5F) : (((vMid->attrib[0][0] + 0.5F) * (float)2048) -
97 0.5F)))) & snapMask;
98 eMaj.dx = ((vMax_fx - vMin_fx) * (1.0F / (float)2048));
99 eMaj.dy = ((vMax_fy - vMin_fy) * (1.0F / (float)2048));
100 eTop.dx = ((vMax_fx - vMid_fx) * (1.0F / (float)2048));
101 eBot.dy = ((vMid_fy - vMin_fy) * (1.0F / (float)2048));
102 const float area = eMaj.dx * eBot.dy - eBot.dx * eMaj.dy;
103 if (IS_INF_OR_NAN(area))
104 return;
105 oneOverArea = 1.0F / area;
106 eBot.fx0 = vMin_fx;
107 int scan_from_left_to_right;
108 struct gl_renderbuffer *rb = ctx->DrawBuffer->_ColorDrawBuffers[0];
109 const struct gl_texture_image *texImg;
110 const float twidth;
111 const int twidth_log2;
112 const unsigned char *texture = texImg->Data;
113 const int smask = texImg->Width;
114 const int tmask = texImg->Height;
115 float eMaj_ds = (vMax->attrib[4][0] - vMin->attrib[4][0]) * twidth;
116 float eBot_ds;
117 span.attrStepX[4][0] =
118 oneOverArea * (eMaj_ds * eBot.dy - eMaj.dy * eBot_ds);
119 span.intTexStep[0] =
120 (((int)
121 ((((span.attrStepX[4][0]) * (float)2048) >=
122 0.0F) ? (((span.attrStepX[4][0]) * (float)2048) +
123 0.5F) : (((span.attrStepX[4][0]) * (float)2048) -
124 0.5F))));
125 int subTriangle;
126 int fxLeftEdge = 0;
127 int fxRightEdge = 0;
128 int sLeft = 0;
129 for (subTriangle = 0; subTriangle <= 1; subTriangle++) {
130 EdgeT *eRight;
131 int lines;
132 if (subTriangle == 0) {
133 if (scan_from_left_to_right) {
134 eRight = &eBot;
135 lines = eRight->lines;
136 } else {
137 eRight = &eMaj;
138 }
139 } else {
140 if (scan_from_left_to_right) {
141 eRight = &eTop;
142 }
143 fxRightEdge = eRight->fsx - 1;
144 }
145 while (lines > 0) {
146 const int right = fxRightEdge >> 11;
147 span.x = fxLeftEdge >> 11;
148 if (right <= span.x)
149 span.end = 0;
150 else
151 span.end = right - span.x;
152 span.intTex[0] = sLeft;
153 if (span.end > 0 && span.y >= 0) {
154 unsigned int i;
155 unsigned char rgb[16384][3];
156 for (i = 0; i < span.end; i++) {
157 int s =
158 ((span.intTex[0]) >> 11) & smask;
159 int t =
160 ((span.intTex[1]) >> 11) & tmask;
161 int pos = (t << twidth_log2) + s;
162 rgb[i][0] = texture[pos + 2];
163 span.intTex[0] += span.intTexStep[0];
164 }
165 rb->PutRowRGB(rgb);
166 }
167 }
168 }
169 }
170
171 void *foo()
172 {
173 return simple_textured_triangle;
174 }