pcsxr-1.9.92
[pcsx_rearmed.git] / plugins / peopsxgl / soft.c
1 /***************************************************************************\r
2                           soft.c  -  description\r
3                              -------------------\r
4     begin                : Sun Oct 28 2001\r
5     copyright            : (C) 2001 by Pete Bernert\r
6     web                  : www.pbernert.com   \r
7  ***************************************************************************/\r
8 \r
9 /***************************************************************************\r
10  *                                                                         *\r
11  *   This program is free software; you can redistribute it and/or modify  *\r
12  *   it under the terms of the GNU General Public License as published by  *\r
13  *   the Free Software Foundation; either version 2 of the License, or     *\r
14  *   (at your option) any later version. See also the license.txt file for *\r
15  *   additional informations.                                              *\r
16  *                                                                         *\r
17  ***************************************************************************/\r
18 \r
19 #include "stdafx.h"\r
20 \r
21 #define _IN_SOFT\r
22 \r
23 #include "externals.h"\r
24 #include "soft.h"\r
25 \r
26 int iDither = 0;\r
27 \r
28 ////////////////////////////////////////////////////////////////////////////////////\r
29 // "NO EDGE BUFFER" POLY VERSION... FUNCS BASED ON FATMAP.TXT FROM MRI / Doomsday\r
30 ////////////////////////////////////////////////////////////////////////////////////\r
31 \r
32 ////////////////////////////////////////////////////////////////////////////////////\r
33 // defines\r
34 ////////////////////////////////////////////////////////////////////////////////////\r
35 \r
36 // switches for painting textured quads as 2 triangles (small glitches, but better shading!)\r
37 // can be toggled by game fix 0x200 in version 1.17 anyway, so let the defines enabled!\r
38 \r
39 #define POLYQUAD3                 \r
40 #define POLYQUAD3GT                 \r
41 \r
42 // fast solid loops... a bit more additional code, of course\r
43 \r
44 #define FASTSOLID\r
45 \r
46 // psx blending mode 3 with 25% incoming color (instead 50% without the define)\r
47 \r
48 #define HALFBRIGHTMODE3\r
49 \r
50 // color decode defines\r
51 \r
52 #define XCOL1(x)     (x & 0x1f)\r
53 #define XCOL2(x)     (x & 0x3e0)\r
54 #define XCOL3(x)     (x & 0x7c00)\r
55 \r
56 #define XCOL1D(x)     (x & 0x1f)\r
57 #define XCOL2D(x)     ((x>>5) & 0x1f)\r
58 #define XCOL3D(x)     ((x>>10) & 0x1f)\r
59 \r
60 #define X32TCOL1(x)  ((x & 0x001f001f)<<7)\r
61 #define X32TCOL2(x)  ((x & 0x03e003e0)<<2)\r
62 #define X32TCOL3(x)  ((x & 0x7c007c00)>>3)\r
63 \r
64 #define X32COL1(x)   (x & 0x001f001f)\r
65 #define X32COL2(x)   ((x>>5) & 0x001f001f)\r
66 #define X32COL3(x)   ((x>>10) & 0x001f001f)\r
67 \r
68 #define X32ACOL1(x)  (x & 0x001e001e)\r
69 #define X32ACOL2(x)  ((x>>5) & 0x001e001e)\r
70 #define X32ACOL3(x)  ((x>>10) & 0x001e001e)\r
71 \r
72 #define X32BCOL1(x)  (x & 0x001c001c)\r
73 #define X32BCOL2(x)  ((x>>5) & 0x001c001c)\r
74 #define X32BCOL3(x)  ((x>>10) & 0x001c001c)\r
75 \r
76 #define X32PSXCOL(r,g,b) ((g<<10)|(b<<5)|r)\r
77 \r
78 #define XPSXCOL(r,g,b) ((g&0x7c00)|(b&0x3e0)|(r&0x1f))\r
79 \r
80 ////////////////////////////////////////////////////////////////////////////////////\r
81 // soft globals\r
82 ////////////////////////////////////////////////////////////////////////////////////\r
83 \r
84 short g_m1 = 255, g_m2 = 255, g_m3 = 255;\r
85 short DrawSemiTrans = FALSE;\r
86 short Ymin;\r
87 short Ymax;\r
88 \r
89 short          ly0, lx0, ly1, lx1, ly2, lx2, ly3, lx3;   // global psx vertex coords\r
90 int            GlobalTextAddrX, GlobalTextAddrY, GlobalTextTP;\r
91 int            GlobalTextREST, GlobalTextABR, GlobalTextPAGE;\r
92 \r
93 ////////////////////////////////////////////////////////////////////////\r
94 // POLYGON OFFSET FUNCS\r
95 ////////////////////////////////////////////////////////////////////////\r
96 \r
97 void offsetPSXLine(void)\r
98 {\r
99  short x0,x1,y0,y1,dx,dy;float px,py;\r
100 \r
101  x0 = lx0+1+PSXDisplay.DrawOffset.x;\r
102  x1 = lx1+1+PSXDisplay.DrawOffset.x;\r
103  y0 = ly0+1+PSXDisplay.DrawOffset.y;\r
104  y1 = ly1+1+PSXDisplay.DrawOffset.y;\r
105 \r
106  dx=x1-x0;\r
107  dy=y1-y0;\r
108 \r
109  // tricky line width without sqrt\r
110 \r
111  if(dx>=0)\r
112   {\r
113    if(dy>=0)\r
114     {\r
115      px=0.5f;\r
116           if(dx>dy) py=-0.5f;\r
117      else if(dx<dy) py= 0.5f;\r
118      else           py= 0.0f;\r
119     }\r
120    else\r
121     {\r
122      py=-0.5f;\r
123      dy=-dy;\r
124           if(dx>dy) px= 0.5f;\r
125      else if(dx<dy) px=-0.5f;\r
126      else           px= 0.0f;\r
127     }\r
128   }\r
129  else\r
130   {\r
131    if(dy>=0)\r
132     {\r
133      py=0.5f;\r
134      dx=-dx;\r
135           if(dx>dy) px=-0.5f;\r
136      else if(dx<dy) px= 0.5f;\r
137      else           px= 0.0f;\r
138     }\r
139    else\r
140     {\r
141      px=-0.5f;\r
142           if(dx>dy) py=-0.5f;\r
143      else if(dx<dy) py= 0.5f;\r
144      else           py= 0.0f;\r
145     }\r
146   } \r
147  \r
148  lx0=(short)((float)x0-px);\r
149  lx3=(short)((float)x0+py);\r
150  \r
151  ly0=(short)((float)y0-py);\r
152  ly3=(short)((float)y0-px);\r
153  \r
154  lx1=(short)((float)x1-py);\r
155  lx2=(short)((float)x1+px);\r
156  \r
157  ly1=(short)((float)y1+px);\r
158  ly2=(short)((float)y1+py);\r
159 }\r
160 \r
161 void offsetPSX2(void)\r
162 {\r
163  lx0 += PSXDisplay.DrawOffset.x;\r
164  ly0 += PSXDisplay.DrawOffset.y;\r
165  lx1 += PSXDisplay.DrawOffset.x;\r
166  ly1 += PSXDisplay.DrawOffset.y;\r
167 }\r
168 \r
169 void offsetPSX3(void)\r
170 {\r
171  lx0 += PSXDisplay.DrawOffset.x;\r
172  ly0 += PSXDisplay.DrawOffset.y;\r
173  lx1 += PSXDisplay.DrawOffset.x;\r
174  ly1 += PSXDisplay.DrawOffset.y;\r
175  lx2 += PSXDisplay.DrawOffset.x;\r
176  ly2 += PSXDisplay.DrawOffset.y;\r
177 }\r
178 \r
179 void offsetPSX4(void)\r
180 {\r
181  lx0 += PSXDisplay.DrawOffset.x;\r
182  ly0 += PSXDisplay.DrawOffset.y;\r
183  lx1 += PSXDisplay.DrawOffset.x;\r
184  ly1 += PSXDisplay.DrawOffset.y;\r
185  lx2 += PSXDisplay.DrawOffset.x;\r
186  ly2 += PSXDisplay.DrawOffset.y;\r
187  lx3 += PSXDisplay.DrawOffset.x;\r
188  ly3 += PSXDisplay.DrawOffset.y;\r
189 }\r
190 \r
191 /////////////////////////////////////////////////////////////////\r
192 /////////////////////////////////////////////////////////////////\r
193 /////////////////////////////////////////////////////////////////\r
194 // PER PIXEL FUNCS\r
195 ////////////////////////////////////////////////////////////////////////\r
196 /////////////////////////////////////////////////////////////////\r
197 /////////////////////////////////////////////////////////////////\r
198 \r
199 \r
200 unsigned char dithertable[16] =\r
201 {\r
202     7, 0, 6, 1,\r
203     2, 5, 3, 4,\r
204     1, 6, 0, 7,\r
205     4, 3, 5, 2\r
206 };\r
207 \r
208 void Dither16(unsigned short *pdest, uint32_t r, uint32_t g, uint32_t b, unsigned short sM)\r
209 {\r
210  unsigned char coeff;\r
211  unsigned char rlow, glow, blow;\r
212  int x, y;\r
213                  \r
214  x = pdest - psxVuw;\r
215  y = x >> 10;\r
216  x -= (y << 10);\r
217 \r
218  coeff = dithertable[(y&3)*4+(x&3)];\r
219 \r
220  rlow = r&7; glow = g&7; blow = b&7;\r
221 \r
222  r>>=3; g>>=3; b>>=3;\r
223 \r
224  if ((r < 0x1F) && rlow > coeff) r++;\r
225  if ((g < 0x1F) && glow > coeff) g++;\r
226  if ((b < 0x1F) && blow > coeff) b++;\r
227 \r
228  *pdest=((unsigned short)b<<10) |\r
229         ((unsigned short)g<<5) |\r
230         (unsigned short)r | sM;\r
231 }\r
232 \r
233 /////////////////////////////////////////////////////////////////\r
234 \r
235 __inline void GetShadeTransCol_Dither(unsigned short *pdest, int m1, int m2, int m3)\r
236 {\r
237  int r,g,b;\r
238 \r
239  if (bCheckMask && *pdest & 0x8000) return;\r
240 \r
241  if (DrawSemiTrans)\r
242   {\r
243    r=((XCOL1D(*pdest))<<3);\r
244    b=((XCOL2D(*pdest))<<3);\r
245    g=((XCOL3D(*pdest))<<3);\r
246 \r
247    if(GlobalTextABR==0)\r
248     {\r
249      r=(r>>1)+(m1>>1);\r
250      b=(b>>1)+(m2>>1);\r
251      g=(g>>1)+(m3>>1);\r
252     }\r
253    else\r
254    if(GlobalTextABR==1)\r
255     {\r
256      r+=m1;\r
257      b+=m2;\r
258      g+=m3;\r
259     }\r
260    else\r
261    if(GlobalTextABR==2)\r
262     {\r
263      r-=m1;\r
264      b-=m2;\r
265      g-=m3;\r
266      if(r&0x80000000) r=0;\r
267      if(b&0x80000000) b=0;\r
268      if(g&0x80000000) g=0;\r
269     }\r
270    else\r
271     {\r
272 #ifdef HALFBRIGHTMODE3\r
273      r+=(m1>>2);\r
274      b+=(m2>>2);\r
275      g+=(m3>>2);\r
276 #else\r
277      r+=(m1>>1);\r
278      b+=(m2>>1);\r
279      g+=(m3>>1);\r
280 #endif\r
281     }\r
282   }\r
283  else \r
284   {\r
285    r=m1;\r
286    b=m2;\r
287    g=m3;\r
288   }\r
289 \r
290  if(r&0x7FFFFF00) r=0xff;\r
291  if(b&0x7FFFFF00) b=0xff;\r
292  if(g&0x7FFFFF00) g=0xff;\r
293 \r
294  Dither16(pdest,r,b,g,sSetMask);\r
295 }\r
296 \r
297 ////////////////////////////////////////////////////////////////////////\r
298 \r
299 __inline void GetShadeTransCol(unsigned short * pdest,unsigned short color)\r
300 {\r
301  if(bCheckMask && *pdest&0x8000) return;\r
302 \r
303  if(DrawSemiTrans)\r
304   {\r
305    int r,g,b;\r
306  \r
307    if(GlobalTextABR==0)\r
308     {\r
309      *pdest=((((*pdest)&0x7bde)>>1)+(((color)&0x7bde)>>1))|sSetMask;//0x8000;\r
310      return;\r
311 /*\r
312      r=(XCOL1(*pdest)>>1)+((XCOL1(color))>>1);\r
313      b=(XCOL2(*pdest)>>1)+((XCOL2(color))>>1);\r
314      g=(XCOL3(*pdest)>>1)+((XCOL3(color))>>1);\r
315 */\r
316     }\r
317    else\r
318    if(GlobalTextABR==1)\r
319     {\r
320      r=(XCOL1(*pdest))+((XCOL1(color)));\r
321      b=(XCOL2(*pdest))+((XCOL2(color)));\r
322      g=(XCOL3(*pdest))+((XCOL3(color)));\r
323     }\r
324    else\r
325    if(GlobalTextABR==2)\r
326     {\r
327      r=(XCOL1(*pdest))-((XCOL1(color)));\r
328      b=(XCOL2(*pdest))-((XCOL2(color)));\r
329      g=(XCOL3(*pdest))-((XCOL3(color)));\r
330      if(r&0x80000000) r=0;\r
331      if(b&0x80000000) b=0;\r
332      if(g&0x80000000) g=0;\r
333     }\r
334    else\r
335     {\r
336 #ifdef HALFBRIGHTMODE3\r
337      r=(XCOL1(*pdest))+((XCOL1(color))>>2);\r
338      b=(XCOL2(*pdest))+((XCOL2(color))>>2);\r
339      g=(XCOL3(*pdest))+((XCOL3(color))>>2);\r
340 #else\r
341      r=(XCOL1(*pdest))+((XCOL1(color))>>1);\r
342      b=(XCOL2(*pdest))+((XCOL2(color))>>1);\r
343      g=(XCOL3(*pdest))+((XCOL3(color))>>1);\r
344 #endif\r
345     }\r
346 \r
347    if(r&0x7FFFFFE0) r=0x1f;\r
348    if(b&0x7FFFFC00) b=0x3e0;\r
349    if(g&0x7FFF8000) g=0x7c00;\r
350 \r
351    *pdest=(XPSXCOL(r,g,b))|sSetMask;//0x8000;\r
352   }\r
353  else *pdest=color|sSetMask;\r
354 }  \r
355 \r
356 ////////////////////////////////////////////////////////////////////////\r
357 \r
358 __inline void GetShadeTransCol32(uint32_t *pdest, uint32_t color)\r
359 {\r
360  if (DrawSemiTrans)\r
361   {\r
362    int r,g,b;\r
363 \r
364    if(GlobalTextABR==0)\r
365     {\r
366      if(!bCheckMask)\r
367       {\r
368        *pdest=((((*pdest)&0x7bde7bde)>>1)+(((color)&0x7bde7bde)>>1))|lSetMask;//0x80008000;\r
369        return;\r
370       }\r
371      r=(X32ACOL1(*pdest)>>1)+((X32ACOL1(color))>>1);\r
372      b=(X32ACOL2(*pdest)>>1)+((X32ACOL2(color))>>1);\r
373      g=(X32ACOL3(*pdest)>>1)+((X32ACOL3(color))>>1);\r
374     }\r
375    else\r
376    if(GlobalTextABR==1)\r
377     {\r
378      r=(X32COL1(*pdest))+((X32COL1(color)));\r
379      b=(X32COL2(*pdest))+((X32COL2(color)));\r
380      g=(X32COL3(*pdest))+((X32COL3(color)));\r
381     }\r
382    else\r
383    if(GlobalTextABR==2)\r
384     {\r
385      int sr,sb,sg,src,sbc,sgc,c;\r
386      src=XCOL1(color);sbc=XCOL2(color);sgc=XCOL3(color);\r
387      c=(*pdest)>>16;\r
388      sr=(XCOL1(c))-src;   if(sr&0x8000) sr=0;\r
389      sb=(XCOL2(c))-sbc;  if(sb&0x8000) sb=0;\r
390      sg=(XCOL3(c))-sgc; if(sg&0x8000) sg=0;\r
391      r=((int)sr)<<16;b=((int)sb)<<11;g=((int)sg)<<6;\r
392      c=LOWORD(*pdest);\r
393      sr=(XCOL1(c))-src;   if(sr&0x8000) sr=0;\r
394      sb=(XCOL2(c))-sbc;  if(sb&0x8000) sb=0;\r
395      sg=(XCOL3(c))-sgc; if(sg&0x8000) sg=0;\r
396      r|=sr;b|=sb>>5;g|=sg>>10;\r
397     }\r
398    else\r
399     {\r
400 #ifdef HALFBRIGHTMODE3\r
401      r=(X32COL1(*pdest))+((X32BCOL1(color))>>2);\r
402      b=(X32COL2(*pdest))+((X32BCOL2(color))>>2);\r
403      g=(X32COL3(*pdest))+((X32BCOL3(color))>>2);\r
404 #else\r
405      r=(X32COL1(*pdest))+((X32ACOL1(color))>>1);\r
406      b=(X32COL2(*pdest))+((X32ACOL2(color))>>1);\r
407      g=(X32COL3(*pdest))+((X32ACOL3(color))>>1);\r
408 #endif\r
409     }\r
410 \r
411    if(r&0x7FE00000) r=0x1f0000|(r&0xFFFF);\r
412    if(r&0x7FE0)     r=0x1f    |(r&0xFFFF0000);\r
413    if(b&0x7FE00000) b=0x1f0000|(b&0xFFFF);\r
414    if(b&0x7FE0)     b=0x1f    |(b&0xFFFF0000);\r
415    if(g&0x7FE00000) g=0x1f0000|(g&0xFFFF);\r
416    if(g&0x7FE0)     g=0x1f    |(g&0xFFFF0000);\r
417 \r
418    if(bCheckMask) \r
419     {\r
420      uint32_t ma=*pdest;\r
421      *pdest=(X32PSXCOL(r,g,b))|lSetMask;//0x80008000;\r
422      if(ma&0x80000000) *pdest=(ma&0xFFFF0000)|(*pdest&0xFFFF);\r
423      if(ma&0x00008000) *pdest=(ma&0xFFFF)    |(*pdest&0xFFFF0000);\r
424      return;\r
425     }\r
426    *pdest=(X32PSXCOL(r,g,b))|lSetMask;//0x80008000;\r
427   }\r
428  else\r
429   {\r
430    if(bCheckMask) \r
431     {\r
432      uint32_t ma=*pdest;\r
433      *pdest=color|lSetMask;//0x80008000;\r
434      if(ma&0x80000000) *pdest=(ma&0xFFFF0000)|(*pdest&0xFFFF);\r
435      if(ma&0x00008000) *pdest=(ma&0xFFFF)    |(*pdest&0xFFFF0000);\r
436      return;\r
437     }\r
438 \r
439    *pdest=color|lSetMask;//0x80008000;\r
440   }\r
441 }  \r
442 \r
443 ////////////////////////////////////////////////////////////////////////\r
444 \r
445 __inline void GetTextureTransColG(unsigned short * pdest,unsigned short color)\r
446 {\r
447  int r,g,b;unsigned short l;\r
448 \r
449  if(color==0) return;\r
450 \r
451  if(bCheckMask && *pdest&0x8000) return;\r
452 \r
453  l=sSetMask|(color&0x8000);\r
454 \r
455  if(DrawSemiTrans && (color&0x8000))\r
456   {\r
457    if(GlobalTextABR==0)\r
458     {\r
459      unsigned short d;\r
460      d     =((*pdest)&0x7bde)>>1;\r
461      color =((color) &0x7bde)>>1;\r
462      r=(XCOL1(d))+((((XCOL1(color)))* g_m1)>>7);\r
463      b=(XCOL2(d))+((((XCOL2(color)))* g_m2)>>7);\r
464      g=(XCOL3(d))+((((XCOL3(color)))* g_m3)>>7);\r
465 \r
466 /*\r
467      r=(XCOL1(*pdest)>>1)+((((XCOL1(color))>>1)* g_m1)>>7);\r
468      b=(XCOL2(*pdest)>>1)+((((XCOL2(color))>>1)* g_m2)>>7);\r
469      g=(XCOL3(*pdest)>>1)+((((XCOL3(color))>>1)* g_m3)>>7);\r
470 */\r
471     }\r
472    else\r
473    if(GlobalTextABR==1)\r
474     {\r
475      r=(XCOL1(*pdest))+((((XCOL1(color)))* g_m1)>>7);\r
476      b=(XCOL2(*pdest))+((((XCOL2(color)))* g_m2)>>7);\r
477      g=(XCOL3(*pdest))+((((XCOL3(color)))* g_m3)>>7);\r
478     }\r
479    else\r
480    if(GlobalTextABR==2)\r
481     {\r
482      r=(XCOL1(*pdest))-((((XCOL1(color)))* g_m1)>>7);\r
483      b=(XCOL2(*pdest))-((((XCOL2(color)))* g_m2)>>7);\r
484      g=(XCOL3(*pdest))-((((XCOL3(color)))* g_m3)>>7);\r
485      if(r&0x80000000) r=0;\r
486      if(b&0x80000000) b=0;\r
487      if(g&0x80000000) g=0;\r
488     }\r
489    else\r
490     {\r
491 #ifdef HALFBRIGHTMODE3\r
492      r=(XCOL1(*pdest))+((((XCOL1(color))>>2)* g_m1)>>7);\r
493      b=(XCOL2(*pdest))+((((XCOL2(color))>>2)* g_m2)>>7);\r
494      g=(XCOL3(*pdest))+((((XCOL3(color))>>2)* g_m3)>>7);\r
495 #else\r
496      r=(XCOL1(*pdest))+((((XCOL1(color))>>1)* g_m1)>>7);\r
497      b=(XCOL2(*pdest))+((((XCOL2(color))>>1)* g_m2)>>7);\r
498      g=(XCOL3(*pdest))+((((XCOL3(color))>>1)* g_m3)>>7);\r
499 #endif\r
500     }\r
501   }\r
502  else \r
503   {\r
504    r=((XCOL1(color))* g_m1)>>7;\r
505    b=((XCOL2(color))* g_m2)>>7;\r
506    g=((XCOL3(color))* g_m3)>>7;\r
507   }\r
508 \r
509  if(r&0x7FFFFFE0) r=0x1f;\r
510  if(b&0x7FFFFC00) b=0x3e0;\r
511  if(g&0x7FFF8000) g=0x7c00;\r
512 \r
513  *pdest=(XPSXCOL(r,g,b))|l;\r
514 }\r
515 \r
516 ////////////////////////////////////////////////////////////////////////\r
517 \r
518 __inline void GetTextureTransColG_S(unsigned short * pdest,unsigned short color)\r
519 {\r
520  int r,g,b;unsigned short l;\r
521 \r
522  if(color==0) return;\r
523 \r
524  l=sSetMask|(color&0x8000);\r
525 \r
526  r=((XCOL1(color))* g_m1)>>7;\r
527  b=((XCOL2(color))* g_m2)>>7;\r
528  g=((XCOL3(color))* g_m3)>>7;\r
529 \r
530  if(r&0x7FFFFFE0) r=0x1f;\r
531  if(b&0x7FFFFC00) b=0x3e0;\r
532  if(g&0x7FFF8000) g=0x7c00;\r
533 \r
534  *pdest=(XPSXCOL(r,g,b))|l;\r
535 }\r
536 \r
537 \r
538 ////////////////////////////////////////////////////////////////////////\r
539 \r
540 __inline void GetTextureTransColG_SPR(unsigned short * pdest,unsigned short color)\r
541 {\r
542  int r,g,b;unsigned short l;\r
543 \r
544  if(color==0) return;\r
545 \r
546  if(bCheckMask && *pdest&0x8000) return;\r
547 \r
548  l=sSetMask|(color&0x8000);\r
549 \r
550  if(DrawSemiTrans && (color&0x8000))\r
551   {\r
552    if(GlobalTextABR==0)\r
553     {\r
554      unsigned short d;\r
555      d     =((*pdest)&0x7bde)>>1;\r
556      color =((color) &0x7bde)>>1;\r
557      r=(XCOL1(d))+((((XCOL1(color)))* g_m1)>>7);\r
558      b=(XCOL2(d))+((((XCOL2(color)))* g_m2)>>7);\r
559      g=(XCOL3(d))+((((XCOL3(color)))* g_m3)>>7);\r
560 \r
561 /*\r
562      r=(XCOL1(*pdest)>>1)+((((XCOL1(color))>>1)* g_m1)>>7);\r
563      b=(XCOL2(*pdest)>>1)+((((XCOL2(color))>>1)* g_m2)>>7);\r
564      g=(XCOL3(*pdest)>>1)+((((XCOL3(color))>>1)* g_m3)>>7);\r
565 */\r
566     }\r
567    else\r
568    if(GlobalTextABR==1)\r
569     {\r
570      r=(XCOL1(*pdest))+((((XCOL1(color)))* g_m1)>>7);\r
571      b=(XCOL2(*pdest))+((((XCOL2(color)))* g_m2)>>7);\r
572      g=(XCOL3(*pdest))+((((XCOL3(color)))* g_m3)>>7);\r
573     }\r
574    else\r
575    if(GlobalTextABR==2)\r
576     {\r
577      r=(XCOL1(*pdest))-((((XCOL1(color)))* g_m1)>>7);\r
578      b=(XCOL2(*pdest))-((((XCOL2(color)))* g_m2)>>7);\r
579      g=(XCOL3(*pdest))-((((XCOL3(color)))* g_m3)>>7);\r
580      if(r&0x80000000) r=0;\r
581      if(b&0x80000000) b=0;\r
582      if(g&0x80000000) g=0;\r
583     }\r
584    else\r
585     {\r
586 #ifdef HALFBRIGHTMODE3\r
587      r=(XCOL1(*pdest))+((((XCOL1(color))>>2)* g_m1)>>7);\r
588      b=(XCOL2(*pdest))+((((XCOL2(color))>>2)* g_m2)>>7);\r
589      g=(XCOL3(*pdest))+((((XCOL3(color))>>2)* g_m3)>>7);\r
590 #else\r
591      r=(XCOL1(*pdest))+((((XCOL1(color))>>1)* g_m1)>>7);\r
592      b=(XCOL2(*pdest))+((((XCOL2(color))>>1)* g_m2)>>7);\r
593      g=(XCOL3(*pdest))+((((XCOL3(color))>>1)* g_m3)>>7);\r
594 #endif\r
595     }\r
596   }\r
597  else \r
598   {\r
599    r=((XCOL1(color))* g_m1)>>7;\r
600    b=((XCOL2(color))* g_m2)>>7;\r
601    g=((XCOL3(color))* g_m3)>>7;\r
602   }\r
603 \r
604  if(r&0x7FFFFFE0) r=0x1f;\r
605  if(b&0x7FFFFC00) b=0x3e0;\r
606  if(g&0x7FFF8000) g=0x7c00;\r
607 \r
608  *pdest=(XPSXCOL(r,g,b))|l;\r
609 }\r
610 \r
611 ////////////////////////////////////////////////////////////////////////\r
612 \r
613 __inline void GetTextureTransColG32(uint32_t *pdest, uint32_t color)\r
614 {\r
615  int r,g,b,l;\r
616 \r
617  if(color==0) return;\r
618 \r
619  l=lSetMask|(color&0x80008000);\r
620 \r
621  if(DrawSemiTrans && (color&0x80008000))\r
622   {\r
623    if(GlobalTextABR==0)\r
624     {                 \r
625      r=((((X32TCOL1(*pdest))+((X32COL1(color)) * g_m1))&0xFF00FF00)>>8);\r
626      b=((((X32TCOL2(*pdest))+((X32COL2(color)) * g_m2))&0xFF00FF00)>>8);\r
627      g=((((X32TCOL3(*pdest))+((X32COL3(color)) * g_m3))&0xFF00FF00)>>8);\r
628     }\r
629    else\r
630    if(GlobalTextABR==1)\r
631     {\r
632      r=(X32COL1(*pdest))+(((((X32COL1(color)))* g_m1)&0xFF80FF80)>>7);\r
633      b=(X32COL2(*pdest))+(((((X32COL2(color)))* g_m2)&0xFF80FF80)>>7);\r
634      g=(X32COL3(*pdest))+(((((X32COL3(color)))* g_m3)&0xFF80FF80)>>7);\r
635     }\r
636    else\r
637    if(GlobalTextABR==2)\r
638     {\r
639      int t;\r
640      r=(((((X32COL1(color)))* g_m1)&0xFF80FF80)>>7);\r
641      t=(*pdest&0x001f0000)-(r&0x003f0000); if(t&0x80000000) t=0;\r
642      r=(*pdest&0x0000001f)-(r&0x0000003f); if(r&0x80000000) r=0;\r
643      r|=t;\r
644 \r
645      b=(((((X32COL2(color)))* g_m2)&0xFF80FF80)>>7);\r
646      t=((*pdest>>5)&0x001f0000)-(b&0x003f0000); if(t&0x80000000) t=0;\r
647      b=((*pdest>>5)&0x0000001f)-(b&0x0000003f); if(b&0x80000000) b=0;\r
648      b|=t;\r
649 \r
650      g=(((((X32COL3(color)))* g_m3)&0xFF80FF80)>>7);\r
651      t=((*pdest>>10)&0x001f0000)-(g&0x003f0000); if(t&0x80000000) t=0;\r
652      g=((*pdest>>10)&0x0000001f)-(g&0x0000003f); if(g&0x80000000) g=0;\r
653      g|=t;\r
654     }\r
655    else\r
656     {\r
657 #ifdef HALFBRIGHTMODE3\r
658      r=(X32COL1(*pdest))+(((((X32BCOL1(color))>>2)* g_m1)&0xFF80FF80)>>7);\r
659      b=(X32COL2(*pdest))+(((((X32BCOL2(color))>>2)* g_m2)&0xFF80FF80)>>7);\r
660      g=(X32COL3(*pdest))+(((((X32BCOL3(color))>>2)* g_m3)&0xFF80FF80)>>7);\r
661 #else\r
662      r=(X32COL1(*pdest))+(((((X32ACOL1(color))>>1)* g_m1)&0xFF80FF80)>>7);\r
663      b=(X32COL2(*pdest))+(((((X32ACOL2(color))>>1)* g_m2)&0xFF80FF80)>>7);\r
664      g=(X32COL3(*pdest))+(((((X32ACOL3(color))>>1)* g_m3)&0xFF80FF80)>>7);\r
665 #endif\r
666     }\r
667 \r
668    if(!(color&0x8000))\r
669     {\r
670      r=(r&0xffff0000)|((((X32COL1(color))* g_m1)&0x0000FF80)>>7);\r
671      b=(b&0xffff0000)|((((X32COL2(color))* g_m2)&0x0000FF80)>>7);\r
672      g=(g&0xffff0000)|((((X32COL3(color))* g_m3)&0x0000FF80)>>7);\r
673     }\r
674    if(!(color&0x80000000))\r
675     {\r
676      r=(r&0xffff)|((((X32COL1(color))* g_m1)&0xFF800000)>>7);\r
677      b=(b&0xffff)|((((X32COL2(color))* g_m2)&0xFF800000)>>7);\r
678      g=(g&0xffff)|((((X32COL3(color))* g_m3)&0xFF800000)>>7);\r
679     }\r
680 \r
681   }\r
682  else \r
683   {\r
684    r=(((X32COL1(color))* g_m1)&0xFF80FF80)>>7;\r
685    b=(((X32COL2(color))* g_m2)&0xFF80FF80)>>7;\r
686    g=(((X32COL3(color))* g_m3)&0xFF80FF80)>>7;\r
687   }\r
688 \r
689  if(r&0x7FE00000) r=0x1f0000|(r&0xFFFF);\r
690  if(r&0x7FE0)     r=0x1f    |(r&0xFFFF0000);\r
691  if(b&0x7FE00000) b=0x1f0000|(b&0xFFFF);\r
692  if(b&0x7FE0)     b=0x1f    |(b&0xFFFF0000);\r
693  if(g&0x7FE00000) g=0x1f0000|(g&0xFFFF);\r
694  if(g&0x7FE0)     g=0x1f    |(g&0xFFFF0000);\r
695          \r
696  if(bCheckMask) \r
697   {\r
698    uint32_t ma=*pdest;\r
699 \r
700    *pdest=(X32PSXCOL(r,g,b))|l;\r
701    \r
702    if((color&0xffff)==0    ) *pdest=(ma&0xffff)|(*pdest&0xffff0000);\r
703    if((color&0xffff0000)==0) *pdest=(ma&0xffff0000)|(*pdest&0xffff);\r
704    if(ma&0x80000000) *pdest=(ma&0xFFFF0000)|(*pdest&0xFFFF);\r
705    if(ma&0x00008000) *pdest=(ma&0xFFFF)    |(*pdest&0xFFFF0000);\r
706 \r
707    return;                            \r
708   }\r
709  if((color&0xffff)==0    ) {*pdest=(*pdest&0xffff)|(((X32PSXCOL(r,g,b))|l)&0xffff0000);return;}\r
710  if((color&0xffff0000)==0) {*pdest=(*pdest&0xffff0000)|(((X32PSXCOL(r,g,b))|l)&0xffff);return;}\r
711 \r
712  *pdest=(X32PSXCOL(r,g,b))|l;\r
713 }\r
714 \r
715 ////////////////////////////////////////////////////////////////////////\r
716 \r
717 __inline void GetTextureTransColG32_S(uint32_t *pdest, uint32_t color)\r
718 {\r
719  int r,g,b;\r
720 \r
721  if(color==0) return;\r
722 \r
723  r=(((X32COL1(color))* g_m1)&0xFF80FF80)>>7;\r
724  b=(((X32COL2(color))* g_m2)&0xFF80FF80)>>7;\r
725  g=(((X32COL3(color))* g_m3)&0xFF80FF80)>>7;\r
726 \r
727  if(r&0x7FE00000) r=0x1f0000|(r&0xFFFF);\r
728  if(r&0x7FE0)     r=0x1f    |(r&0xFFFF0000);\r
729  if(b&0x7FE00000) b=0x1f0000|(b&0xFFFF);\r
730  if(b&0x7FE0)     b=0x1f    |(b&0xFFFF0000);\r
731  if(g&0x7FE00000) g=0x1f0000|(g&0xFFFF);\r
732  if(g&0x7FE0)     g=0x1f    |(g&0xFFFF0000);\r
733          \r
734  if((color&0xffff)==0)     {*pdest=(*pdest&0xffff)|(((X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000))&0xffff0000);return;}\r
735  if((color&0xffff0000)==0) {*pdest=(*pdest&0xffff0000)|(((X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000))&0xffff);return;}\r
736 \r
737  *pdest=(X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000);\r
738 }\r
739 \r
740 ////////////////////////////////////////////////////////////////////////\r
741 \r
742 __inline void GetTextureTransColG32_SPR(uint32_t *pdest, uint32_t color)\r
743 {\r
744  int r,g,b;\r
745 \r
746  if(color==0) return;\r
747 \r
748  if(DrawSemiTrans && (color&0x80008000))\r
749   {\r
750    if(GlobalTextABR==0)\r
751     {                 \r
752      r=((((X32TCOL1(*pdest))+((X32COL1(color)) * g_m1))&0xFF00FF00)>>8);\r
753      b=((((X32TCOL2(*pdest))+((X32COL2(color)) * g_m2))&0xFF00FF00)>>8);\r
754      g=((((X32TCOL3(*pdest))+((X32COL3(color)) * g_m3))&0xFF00FF00)>>8);\r
755     }\r
756    else\r
757    if(GlobalTextABR==1)\r
758     {\r
759      r=(X32COL1(*pdest))+(((((X32COL1(color)))* g_m1)&0xFF80FF80)>>7);\r
760      b=(X32COL2(*pdest))+(((((X32COL2(color)))* g_m2)&0xFF80FF80)>>7);\r
761      g=(X32COL3(*pdest))+(((((X32COL3(color)))* g_m3)&0xFF80FF80)>>7);\r
762     }\r
763    else\r
764    if(GlobalTextABR==2)\r
765     {\r
766      int t;\r
767      r=(((((X32COL1(color)))* g_m1)&0xFF80FF80)>>7);\r
768      t=(*pdest&0x001f0000)-(r&0x003f0000); if(t&0x80000000) t=0;\r
769      r=(*pdest&0x0000001f)-(r&0x0000003f); if(r&0x80000000) r=0;\r
770      r|=t;\r
771 \r
772      b=(((((X32COL2(color)))* g_m2)&0xFF80FF80)>>7);\r
773      t=((*pdest>>5)&0x001f0000)-(b&0x003f0000); if(t&0x80000000) t=0;\r
774      b=((*pdest>>5)&0x0000001f)-(b&0x0000003f); if(b&0x80000000) b=0;\r
775      b|=t;\r
776 \r
777      g=(((((X32COL3(color)))* g_m3)&0xFF80FF80)>>7);\r
778      t=((*pdest>>10)&0x001f0000)-(g&0x003f0000); if(t&0x80000000) t=0;\r
779      g=((*pdest>>10)&0x0000001f)-(g&0x0000003f); if(g&0x80000000) g=0;\r
780      g|=t;\r
781     }\r
782    else\r
783     {\r
784 #ifdef HALFBRIGHTMODE3\r
785      r=(X32COL1(*pdest))+(((((X32BCOL1(color))>>2)* g_m1)&0xFF80FF80)>>7);\r
786      b=(X32COL2(*pdest))+(((((X32BCOL2(color))>>2)* g_m2)&0xFF80FF80)>>7);\r
787      g=(X32COL3(*pdest))+(((((X32BCOL3(color))>>2)* g_m3)&0xFF80FF80)>>7);\r
788 #else\r
789      r=(X32COL1(*pdest))+(((((X32ACOL1(color))>>1)* g_m1)&0xFF80FF80)>>7);\r
790      b=(X32COL2(*pdest))+(((((X32ACOL2(color))>>1)* g_m2)&0xFF80FF80)>>7);\r
791      g=(X32COL3(*pdest))+(((((X32ACOL3(color))>>1)* g_m3)&0xFF80FF80)>>7);\r
792 #endif\r
793     }\r
794 \r
795    if(!(color&0x8000))\r
796     {\r
797      r=(r&0xffff0000)|((((X32COL1(color))* g_m1)&0x0000FF80)>>7);\r
798      b=(b&0xffff0000)|((((X32COL2(color))* g_m2)&0x0000FF80)>>7);\r
799      g=(g&0xffff0000)|((((X32COL3(color))* g_m3)&0x0000FF80)>>7);\r
800     }\r
801    if(!(color&0x80000000))\r
802     {\r
803      r=(r&0xffff)|((((X32COL1(color))* g_m1)&0xFF800000)>>7);\r
804      b=(b&0xffff)|((((X32COL2(color))* g_m2)&0xFF800000)>>7);\r
805      g=(g&0xffff)|((((X32COL3(color))* g_m3)&0xFF800000)>>7);\r
806     }\r
807 \r
808   }\r
809  else \r
810   {\r
811    r=(((X32COL1(color))* g_m1)&0xFF80FF80)>>7;\r
812    b=(((X32COL2(color))* g_m2)&0xFF80FF80)>>7;\r
813    g=(((X32COL3(color))* g_m3)&0xFF80FF80)>>7;\r
814   }\r
815 \r
816  if(r&0x7FE00000) r=0x1f0000|(r&0xFFFF);\r
817  if(r&0x7FE0)     r=0x1f    |(r&0xFFFF0000);\r
818  if(b&0x7FE00000) b=0x1f0000|(b&0xFFFF);\r
819  if(b&0x7FE0)     b=0x1f    |(b&0xFFFF0000);\r
820  if(g&0x7FE00000) g=0x1f0000|(g&0xFFFF);\r
821  if(g&0x7FE0)     g=0x1f    |(g&0xFFFF0000);\r
822          \r
823  if(bCheckMask) \r
824   {\r
825    uint32_t ma=*pdest;\r
826 \r
827    *pdest=(X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000);\r
828    \r
829    if((color&0xffff)==0    ) *pdest=(ma&0xffff)|(*pdest&0xffff0000);\r
830    if((color&0xffff0000)==0) *pdest=(ma&0xffff0000)|(*pdest&0xffff);\r
831    if(ma&0x80000000) *pdest=(ma&0xFFFF0000)|(*pdest&0xFFFF);\r
832    if(ma&0x00008000) *pdest=(ma&0xFFFF)    |(*pdest&0xFFFF0000);\r
833 \r
834    return;                            \r
835   }\r
836  if((color&0xffff)==0    ) {*pdest=(*pdest&0xffff)|(((X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000))&0xffff0000);return;}\r
837  if((color&0xffff0000)==0) {*pdest=(*pdest&0xffff0000)|(((X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000))&0xffff);return;}\r
838 \r
839  *pdest=(X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000);\r
840 }\r
841 \r
842 ////////////////////////////////////////////////////////////////////////\r
843 \r
844 __inline void GetTextureTransColGX_Dither(unsigned short * pdest, unsigned short color, int m1, int m2, int m3)\r
845 {\r
846  int r,g,b;\r
847 \r
848  if(color==0) return;\r
849  \r
850  if(bCheckMask && *pdest&0x8000) return;\r
851 \r
852  m1=(((XCOL1D(color)))*m1)>>4;\r
853  m2=(((XCOL2D(color)))*m2)>>4;\r
854  m3=(((XCOL3D(color)))*m3)>>4;\r
855 \r
856  if(DrawSemiTrans && (color&0x8000))\r
857   {\r
858    r=((XCOL1D(*pdest))<<3);\r
859    b=((XCOL2D(*pdest))<<3);\r
860    g=((XCOL3D(*pdest))<<3);\r
861 \r
862    if(GlobalTextABR==0)\r
863     {\r
864      r=(r>>1)+(m1>>1);\r
865      b=(b>>1)+(m2>>1);\r
866      g=(g>>1)+(m3>>1);\r
867     }\r
868    else\r
869    if(GlobalTextABR==1)\r
870     {\r
871      r+=m1;\r
872      b+=m2;\r
873      g+=m3;\r
874     }\r
875    else\r
876    if(GlobalTextABR==2)\r
877     {\r
878      r-=m1;\r
879      b-=m2;\r
880      g-=m3;\r
881      if(r&0x80000000) r=0;\r
882      if(b&0x80000000) b=0;\r
883      if(g&0x80000000) g=0;\r
884     }\r
885    else\r
886     {\r
887 #ifdef HALFBRIGHTMODE3\r
888      r+=(m1>>2);\r
889      b+=(m2>>2);\r
890      g+=(m3>>2);\r
891 #else\r
892      r+=(m1>>1);\r
893      b+=(m2>>1);\r
894      g+=(m3>>1);\r
895 #endif\r
896     }\r
897   }\r
898  else \r
899   {\r
900    r=m1;\r
901    b=m2;\r
902    g=m3;\r
903   }\r
904 \r
905  if(r&0x7FFFFF00) r=0xff;\r
906  if(b&0x7FFFFF00) b=0xff;\r
907  if(g&0x7FFFFF00) g=0xff;\r
908 \r
909  Dither16(pdest,r,b,g,sSetMask|(color&0x8000));\r
910 \r
911 }\r
912 \r
913 ////////////////////////////////////////////////////////////////////////\r
914 \r
915 __inline void GetTextureTransColGX(unsigned short * pdest,unsigned short color,short m1,short m2,short m3)\r
916 {\r
917  int r,g,b;unsigned short l;\r
918 \r
919  if(color==0) return;\r
920  \r
921  if(bCheckMask && *pdest&0x8000) return;\r
922 \r
923  l=sSetMask|(color&0x8000);\r
924 \r
925  if(DrawSemiTrans && (color&0x8000))\r
926   {\r
927    if(GlobalTextABR==0)\r
928     {\r
929      unsigned short d;\r
930      d     =((*pdest)&0x7bde)>>1;\r
931      color =((color) &0x7bde)>>1;\r
932      r=(XCOL1(d))+((((XCOL1(color)))* m1)>>7);\r
933      b=(XCOL2(d))+((((XCOL2(color)))* m2)>>7);\r
934      g=(XCOL3(d))+((((XCOL3(color)))* m3)>>7);\r
935 /*\r
936      r=(XCOL1(*pdest)>>1)+((((XCOL1(color))>>1)* m1)>>7);\r
937      b=(XCOL2(*pdest)>>1)+((((XCOL2(color))>>1)* m2)>>7);\r
938      g=(XCOL3(*pdest)>>1)+((((XCOL3(color))>>1)* m3)>>7);\r
939 */\r
940     }\r
941    else\r
942    if(GlobalTextABR==1)\r
943     {\r
944      r=(XCOL1(*pdest))+((((XCOL1(color)))* m1)>>7);\r
945      b=(XCOL2(*pdest))+((((XCOL2(color)))* m2)>>7);\r
946      g=(XCOL3(*pdest))+((((XCOL3(color)))* m3)>>7);\r
947     }\r
948    else\r
949    if(GlobalTextABR==2)\r
950     {\r
951      r=(XCOL1(*pdest))-((((XCOL1(color)))* m1)>>7);\r
952      b=(XCOL2(*pdest))-((((XCOL2(color)))* m2)>>7);\r
953      g=(XCOL3(*pdest))-((((XCOL3(color)))* m3)>>7);\r
954      if(r&0x80000000) r=0;\r
955      if(b&0x80000000) b=0;\r
956      if(g&0x80000000) g=0;\r
957     }\r
958    else\r
959     {\r
960 #ifdef HALFBRIGHTMODE3\r
961      r=(XCOL1(*pdest))+((((XCOL1(color))>>2)* m1)>>7);\r
962      b=(XCOL2(*pdest))+((((XCOL2(color))>>2)* m2)>>7);\r
963      g=(XCOL3(*pdest))+((((XCOL3(color))>>2)* m3)>>7);\r
964 #else\r
965      r=(XCOL1(*pdest))+((((XCOL1(color))>>1)* m1)>>7);\r
966      b=(XCOL2(*pdest))+((((XCOL2(color))>>1)* m2)>>7);\r
967      g=(XCOL3(*pdest))+((((XCOL3(color))>>1)* m3)>>7);\r
968 #endif\r
969     }\r
970   }\r
971  else \r
972   {\r
973    r=((XCOL1(color))* m1)>>7;\r
974    b=((XCOL2(color))* m2)>>7;\r
975    g=((XCOL3(color))* m3)>>7;\r
976   }\r
977 \r
978  if(r&0x7FFFFFE0) r=0x1f;\r
979  if(b&0x7FFFFC00) b=0x3e0;\r
980  if(g&0x7FFF8000) g=0x7c00;\r
981 \r
982  *pdest=(XPSXCOL(r,g,b))|l;\r
983 }\r
984 \r
985 ////////////////////////////////////////////////////////////////////////\r
986 \r
987 __inline void GetTextureTransColGX_S(unsigned short * pdest,unsigned short color,short m1,short m2,short m3)\r
988 {\r
989  int r,g,b;\r
990 \r
991  if(color==0) return;\r
992  \r
993  r=((XCOL1(color))* m1)>>7;\r
994  b=((XCOL2(color))* m2)>>7;\r
995  g=((XCOL3(color))* m3)>>7;\r
996 \r
997  if(r&0x7FFFFFE0) r=0x1f;\r
998  if(b&0x7FFFFC00) b=0x3e0;\r
999  if(g&0x7FFF8000) g=0x7c00;\r
1000 \r
1001  *pdest=(XPSXCOL(r,g,b))|sSetMask|(color&0x8000);\r
1002 }\r
1003 \r
1004 ////////////////////////////////////////////////////////////////////////\r
1005 \r
1006 __inline void GetTextureTransColGX32_S(uint32_t *pdest, uint32_t color, short m1, short m2, short m3)\r
1007 {\r
1008  int r,g,b;\r
1009  \r
1010  if(color==0) return;\r
1011 \r
1012  r=(((X32COL1(color))* m1)&0xFF80FF80)>>7;\r
1013  b=(((X32COL2(color))* m2)&0xFF80FF80)>>7;\r
1014  g=(((X32COL3(color))* m3)&0xFF80FF80)>>7;\r
1015                 \r
1016  if(r&0x7FE00000) r=0x1f0000|(r&0xFFFF);\r
1017  if(r&0x7FE0)     r=0x1f    |(r&0xFFFF0000);\r
1018  if(b&0x7FE00000) b=0x1f0000|(b&0xFFFF);\r
1019  if(b&0x7FE0)     b=0x1f    |(b&0xFFFF0000);\r
1020  if(g&0x7FE00000) g=0x1f0000|(g&0xFFFF);\r
1021  if(g&0x7FE0)     g=0x1f    |(g&0xFFFF0000);\r
1022 \r
1023  if((color&0xffff)==0)     {*pdest=(*pdest&0xffff)|(((X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000))&0xffff0000);return;}\r
1024  if((color&0xffff0000)==0) {*pdest=(*pdest&0xffff0000)|(((X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000))&0xffff);return;}\r
1025 \r
1026  *pdest=(X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000);\r
1027 }\r
1028 \r
1029 ////////////////////////////////////////////////////////////////////////\r
1030 // FILL FUNCS\r
1031 ////////////////////////////////////////////////////////////////////////\r
1032 \r
1033 void FillSoftwareAreaTrans(short x0,short y0,short x1, // FILL AREA TRANS\r
1034                       short y1,unsigned short col)\r
1035 {\r
1036  short j,i,dx,dy;\r
1037 \r
1038  if(y0>y1) return;\r
1039  if(x0>x1) return;\r
1040 \r
1041  if(x1<drawX) return;\r
1042  if(y1<drawY) return;\r
1043  if(x0>drawW) return;\r
1044  if(y0>drawH) return;\r
1045 \r
1046  x1=min(x1,drawW+1);\r
1047  y1=min(y1,drawH+1);\r
1048  x0=max(x0,drawX);\r
1049  y0=max(y0,drawY);\r
1050     \r
1051  if(y0>=iGPUHeight)   return;\r
1052  if(x0>1023)          return;\r
1053 \r
1054  if(y1>iGPUHeight) y1=iGPUHeight;\r
1055  if(x1>1024)       x1=1024;\r
1056 \r
1057  dx=x1-x0;dy=y1-y0;\r
1058 \r
1059  if(dx==1 && dy==1 && x0==1020 && y0==511)             // special fix for pinball game... emu protection???\r
1060   {\r
1061 /*\r
1062 m->v 1020 511 1 1\r
1063 writedatamem 0x00000000 1\r
1064 tile1 newcol 7fff (orgcol 0xffffff), oldvram 0\r
1065 v->m 1020 511 1 1\r
1066 readdatamem 0x00007fff 1\r
1067 m->v 1020 511 1 1\r
1068 writedatamem 0x00000000 1\r
1069 tile1 newcol 8000 (orgcol 0xffffff), oldvram 0\r
1070 v->m 1020 511 1 1\r
1071 readdatamem 0x00008000 1\r
1072 */\r
1073 \r
1074    static int iCheat=0;\r
1075    col+=iCheat;\r
1076    if(iCheat==1) iCheat=0; else iCheat=1;\r
1077   }\r
1078 \r
1079  if(dx&1)                                              // slow fill\r
1080   {\r
1081    unsigned short *DSTPtr;\r
1082    unsigned short LineOffset;\r
1083    DSTPtr = psxVuw + (1024*y0) + x0;\r
1084    LineOffset = 1024 - dx;\r
1085    for(i=0;i<dy;i++)\r
1086     {\r
1087      for(j=0;j<dx;j++)\r
1088       GetShadeTransCol(DSTPtr++,col);\r
1089      DSTPtr += LineOffset;\r
1090     } \r
1091   }\r
1092  else                                                  // fast fill\r
1093   {\r
1094    uint32_t *DSTPtr;\r
1095    unsigned short LineOffset;\r
1096    uint32_t lcol=lSetMask|(((uint32_t)(col))<<16)|col;\r
1097    dx>>=1;\r
1098    DSTPtr = (uint32_t *)(psxVuw + (1024*y0) + x0);\r
1099    LineOffset = 512 - dx;\r
1100 \r
1101    if(!bCheckMask && !DrawSemiTrans)\r
1102     {\r
1103      for(i=0;i<dy;i++)\r
1104       {\r
1105        for(j=0;j<dx;j++) *DSTPtr++=lcol;\r
1106        DSTPtr += LineOffset;\r
1107       }\r
1108     }\r
1109    else\r
1110     {\r
1111      for(i=0;i<dy;i++)\r
1112       {\r
1113        for(j=0;j<dx;j++) \r
1114         GetShadeTransCol32(DSTPtr++,lcol);\r
1115        DSTPtr += LineOffset;\r
1116       } \r
1117     }\r
1118   }\r
1119 }\r
1120 \r
1121 ////////////////////////////////////////////////////////////////////////\r
1122 \r
1123 void FillSoftwareArea(short x0,short y0,short x1,      // FILL AREA (BLK FILL)\r
1124                       short y1,unsigned short col)     // no draw area check here!\r
1125 {\r
1126  short j,i,dx,dy;\r
1127 \r
1128  if(y0>y1) return;\r
1129  if(x0>x1) return;\r
1130     \r
1131  if(y0>=iGPUHeight)   return;\r
1132  if(x0>1023)          return;\r
1133 \r
1134  if(y1>iGPUHeight) y1=iGPUHeight;\r
1135  if(x1>1024)       x1=1024;\r
1136 \r
1137  dx=x1-x0;dy=y1-y0;\r
1138  if(dx&1)\r
1139   {\r
1140    unsigned short *DSTPtr;\r
1141    unsigned short LineOffset;\r
1142 \r
1143    DSTPtr = psxVuw + (1024*y0) + x0;\r
1144    LineOffset = 1024 - dx;\r
1145 \r
1146    for(i=0;i<dy;i++)\r
1147     {\r
1148      for(j=0;j<dx;j++) *DSTPtr++=col;\r
1149      DSTPtr += LineOffset;\r
1150     } \r
1151   }\r
1152  else\r
1153   {\r
1154    uint32_t *DSTPtr;\r
1155    unsigned short LineOffset;\r
1156    uint32_t lcol=(((int)col)<<16)|col;\r
1157    dx>>=1;\r
1158    DSTPtr = (uint32_t *)(psxVuw + (1024*y0) + x0);\r
1159    LineOffset = 512 - dx;\r
1160 \r
1161    for(i=0;i<dy;i++)\r
1162     {\r
1163      for(j=0;j<dx;j++) *DSTPtr++=lcol;\r
1164      DSTPtr += LineOffset;\r
1165     } \r
1166   }\r
1167 }\r
1168 \r
1169 ////////////////////////////////////////////////////////////////////////\r
1170 // EDGE INTERPOLATION\r
1171 ////////////////////////////////////////////////////////////////////////\r
1172 \r
1173 typedef struct SOFTVTAG\r
1174 {\r
1175  int x,y;   \r
1176  int u,v;\r
1177  int R,G,B;\r
1178 } soft_vertex;\r
1179 \r
1180 static soft_vertex vtx[4];\r
1181 static soft_vertex * left_array[4], * right_array[4];\r
1182 static int left_section, right_section;\r
1183 static int left_section_height, right_section_height;\r
1184 static int left_x, delta_left_x, right_x, delta_right_x;\r
1185 static int left_u, delta_left_u, left_v, delta_left_v;\r
1186 static int right_u, delta_right_u, right_v, delta_right_v;\r
1187 static int left_R, delta_left_R, right_R, delta_right_R;\r
1188 static int left_G, delta_left_G, right_G, delta_right_G;\r
1189 static int left_B, delta_left_B, right_B, delta_right_B;\r
1190 \r
1191 __inline int shl10idiv(int x, int y)\r
1192 {\r
1193  long long int bi=x;\r
1194  bi<<=10;\r
1195  return bi/y;\r
1196 }\r
1197 \r
1198 __inline int RightSection_F(void)\r
1199 {\r
1200  soft_vertex * v1 = right_array[ right_section ];\r
1201  soft_vertex * v2 = right_array[ right_section-1 ];\r
1202 \r
1203  int height = v2->y - v1->y;\r
1204  if(height == 0) return 0;\r
1205  delta_right_x = (v2->x - v1->x) / height;\r
1206  right_x = v1->x;\r
1207 \r
1208  right_section_height = height;\r
1209  return height;\r
1210 }\r
1211 \r
1212 __inline int LeftSection_F(void)\r
1213 {\r
1214  soft_vertex * v1 = left_array[ left_section ];\r
1215  soft_vertex * v2 = left_array[ left_section-1 ];\r
1216 \r
1217  int height = v2->y - v1->y;\r
1218  if(height == 0) return 0;\r
1219  delta_left_x = (v2->x - v1->x) / height;\r
1220  left_x = v1->x;\r
1221 \r
1222  left_section_height = height;\r
1223  return height;  \r
1224 }\r
1225 \r
1226 __inline BOOL NextRow_F(void)\r
1227 {\r
1228  if(--left_section_height<=0) \r
1229   {\r
1230    if(--left_section <= 0) {return TRUE;}\r
1231    if(LeftSection_F()  <= 0) {return TRUE;}\r
1232   }\r
1233  else\r
1234   {\r
1235    left_x += delta_left_x;\r
1236   }\r
1237 \r
1238  if(--right_section_height<=0) \r
1239   {\r
1240    if(--right_section<=0) {return TRUE;}\r
1241    if(RightSection_F() <=0) {return TRUE;}\r
1242   }\r
1243  else\r
1244   {\r
1245    right_x += delta_right_x;\r
1246   }\r
1247  return FALSE;\r
1248 }\r
1249 \r
1250 __inline BOOL SetupSections_F(short x1, short y1, short x2, short y2, short x3, short y3)\r
1251 {\r
1252  soft_vertex * v1, * v2, * v3;\r
1253  int height,longest;\r
1254 \r
1255  v1 = vtx;   v1->x=x1<<16;v1->y=y1;\r
1256  v2 = vtx+1; v2->x=x2<<16;v2->y=y2;\r
1257  v3 = vtx+2; v3->x=x3<<16;v3->y=y3;\r
1258 \r
1259  if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }\r
1260  if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }\r
1261  if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }\r
1262 \r
1263  height = v3->y - v1->y;\r
1264  if(height == 0) {return FALSE;}\r
1265  longest = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);\r
1266  if(longest == 0) {return FALSE;}\r
1267 \r
1268  if(longest < 0)\r
1269   {\r
1270    right_array[0] = v3;\r
1271    right_array[1] = v2;\r
1272    right_array[2] = v1;\r
1273    right_section  = 2;\r
1274    left_array[0]  = v3;\r
1275    left_array[1]  = v1;\r
1276    left_section   = 1;\r
1277 \r
1278    if(LeftSection_F() <= 0) return FALSE;\r
1279    if(RightSection_F() <= 0)\r
1280     {\r
1281      right_section--;\r
1282      if(RightSection_F() <= 0) return FALSE;\r
1283     }\r
1284   }\r
1285  else\r
1286   {\r
1287    left_array[0]  = v3;\r
1288    left_array[1]  = v2;\r
1289    left_array[2]  = v1;\r
1290    left_section   = 2;\r
1291    right_array[0] = v3;\r
1292    right_array[1] = v1;\r
1293    right_section  = 1;\r
1294 \r
1295    if(RightSection_F() <= 0) return FALSE;\r
1296    if(LeftSection_F() <= 0)\r
1297     {    \r
1298      left_section--;\r
1299      if(LeftSection_F() <= 0) return FALSE;\r
1300     }\r
1301   }\r
1302 \r
1303  Ymin=v1->y;\r
1304  Ymax=min(v3->y-1,drawH);\r
1305 \r
1306  return TRUE;\r
1307 }\r
1308 \r
1309 __inline int RightSection_G(void)\r
1310 {\r
1311  soft_vertex * v1 = right_array[ right_section ];\r
1312  soft_vertex * v2 = right_array[ right_section-1 ];\r
1313 \r
1314  int height = v2->y - v1->y;\r
1315  if(height == 0) return 0;\r
1316  delta_right_x = (v2->x - v1->x) / height;\r
1317  right_x = v1->x;\r
1318 \r
1319  right_section_height = height;\r
1320  return height;\r
1321 }\r
1322 \r
1323 __inline int LeftSection_G(void)\r
1324 {\r
1325  soft_vertex * v1 = left_array[ left_section ];\r
1326  soft_vertex * v2 = left_array[ left_section-1 ];\r
1327 \r
1328  int height = v2->y - v1->y;\r
1329  if(height == 0) return 0;\r
1330  delta_left_x = (v2->x - v1->x) / height;\r
1331  left_x = v1->x;\r
1332 \r
1333  delta_left_R = ((v2->R - v1->R)) / height;\r
1334  left_R = v1->R;\r
1335  delta_left_G = ((v2->G - v1->G)) / height;\r
1336  left_G = v1->G;\r
1337  delta_left_B = ((v2->B - v1->B)) / height;\r
1338  left_B = v1->B;\r
1339 \r
1340  left_section_height = height;\r
1341  return height;  \r
1342 }\r
1343 \r
1344 __inline BOOL NextRow_G(void)\r
1345 {\r
1346  if(--left_section_height<=0) \r
1347   {\r
1348    if(--left_section <= 0) {return TRUE;}\r
1349    if(LeftSection_G()  <= 0) {return TRUE;}\r
1350   }\r
1351  else\r
1352   {\r
1353    left_x += delta_left_x;\r
1354    left_R += delta_left_R;\r
1355    left_G += delta_left_G;\r
1356    left_B += delta_left_B;\r
1357   }\r
1358 \r
1359  if(--right_section_height<=0) \r
1360   {\r
1361    if(--right_section<=0) {return TRUE;}\r
1362    if(RightSection_G() <=0) {return TRUE;}\r
1363   }\r
1364  else\r
1365   {\r
1366    right_x += delta_right_x;\r
1367   }\r
1368  return FALSE;\r
1369 }\r
1370 \r
1371 __inline BOOL SetupSections_G(short x1,short y1,short x2,short y2,short x3,short y3, int rgb1, int rgb2, int rgb3){\r
1372  soft_vertex *v1, *v2, *v3;\r
1373  int height, longest, temp;\r
1374 \r
1375  v1 = vtx;   v1->x=x1<<16;v1->y=y1;\r
1376  v1->R=(rgb1) & 0x00ff0000;\r
1377  v1->G=(rgb1<<8) & 0x00ff0000;\r
1378  v1->B=(rgb1<<16) & 0x00ff0000;\r
1379  v2 = vtx+1; v2->x=x2<<16;v2->y=y2;\r
1380  v2->R=(rgb2) & 0x00ff0000;\r
1381  v2->G=(rgb2<<8) & 0x00ff0000;\r
1382  v2->B=(rgb2<<16) & 0x00ff0000;\r
1383  v3 = vtx+2; v3->x=x3<<16;v3->y=y3;\r
1384  v3->R=(rgb3) & 0x00ff0000;\r
1385  v3->G=(rgb3<<8) & 0x00ff0000;\r
1386  v3->B=(rgb3<<16) & 0x00ff0000;\r
1387 \r
1388  if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }\r
1389  if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }\r
1390  if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }\r
1391 \r
1392  height = v3->y - v1->y;\r
1393  if(height == 0) {return FALSE;}\r
1394  temp=(((v2->y - v1->y) << 16) / height);\r
1395  longest = temp * ((v3->x - v1->x)>>16) + (v1->x - v2->x);\r
1396  if(longest == 0) {return FALSE;}\r
1397 \r
1398  if(longest < 0)\r
1399   {\r
1400    right_array[0] = v3;\r
1401    right_array[1] = v2;\r
1402    right_array[2] = v1;\r
1403    right_section  = 2;\r
1404    left_array[0]  = v3;\r
1405    left_array[1]  = v1;\r
1406    left_section   = 1;\r
1407 \r
1408    if(LeftSection_G() <= 0) return FALSE;\r
1409    if(RightSection_G() <= 0)\r
1410     {\r
1411      right_section--;\r
1412      if(RightSection_G() <= 0) return FALSE;\r
1413     }\r
1414    if(longest > -0x1000) longest = -0x1000;     \r
1415   }\r
1416  else\r
1417   {\r
1418    left_array[0]  = v3;\r
1419    left_array[1]  = v2;\r
1420    left_array[2]  = v1;\r
1421    left_section   = 2;\r
1422    right_array[0] = v3;\r
1423    right_array[1] = v1;\r
1424    right_section  = 1;\r
1425 \r
1426    if(RightSection_G() <= 0) return FALSE;\r
1427    if(LeftSection_G() <= 0)\r
1428     {    \r
1429      left_section--;\r
1430      if(LeftSection_G() <= 0) return FALSE;\r
1431     }\r
1432    if(longest < 0x1000) longest = 0x1000;     \r
1433   }\r
1434 \r
1435  Ymin=v1->y;\r
1436  Ymax=min(v3->y-1,drawH);    \r
1437 \r
1438  delta_right_R=shl10idiv(temp*((v3->R - v1->R)>>10)+((v1->R - v2->R)<<6),longest);\r
1439  delta_right_G=shl10idiv(temp*((v3->G - v1->G)>>10)+((v1->G - v2->G)<<6),longest);\r
1440  delta_right_B=shl10idiv(temp*((v3->B - v1->B)>>10)+((v1->B - v2->B)<<6),longest);\r
1441 \r
1442  return TRUE;\r
1443 }\r
1444 \r
1445 __inline int RightSection_FT(void)\r
1446 {\r
1447  soft_vertex * v1 = right_array[ right_section ];\r
1448  soft_vertex * v2 = right_array[ right_section-1 ];\r
1449 \r
1450  int height = v2->y - v1->y;\r
1451  if(height == 0) return 0;\r
1452  delta_right_x = (v2->x - v1->x) / height;\r
1453  right_x = v1->x;\r
1454 \r
1455  right_section_height = height;\r
1456  return height;\r
1457 }\r
1458 \r
1459 __inline int LeftSection_FT(void)\r
1460 {\r
1461  soft_vertex * v1 = left_array[ left_section ];\r
1462  soft_vertex * v2 = left_array[ left_section-1 ];\r
1463 \r
1464  int height = v2->y - v1->y;\r
1465  if(height == 0) return 0;\r
1466  delta_left_x = (v2->x - v1->x) / height;\r
1467  left_x = v1->x;\r
1468  \r
1469  delta_left_u = ((v2->u - v1->u)) / height;\r
1470  left_u = v1->u;\r
1471  delta_left_v = ((v2->v - v1->v)) / height;\r
1472  left_v = v1->v;\r
1473 \r
1474  left_section_height = height;\r
1475  return height;  \r
1476 }\r
1477 \r
1478 __inline BOOL NextRow_FT(void)\r
1479 {\r
1480  if(--left_section_height<=0) \r
1481   {\r
1482    if(--left_section <= 0) {return TRUE;}\r
1483    if(LeftSection_FT()  <= 0) {return TRUE;}\r
1484   }\r
1485  else\r
1486   {\r
1487    left_x += delta_left_x;\r
1488    left_u += delta_left_u;\r
1489    left_v += delta_left_v;\r
1490   }\r
1491 \r
1492  if(--right_section_height<=0) \r
1493   {\r
1494    if(--right_section<=0) {return TRUE;}\r
1495    if(RightSection_FT() <=0) {return TRUE;}\r
1496   }\r
1497  else\r
1498   {\r
1499    right_x += delta_right_x;\r
1500   }\r
1501  return FALSE;\r
1502 }\r
1503 \r
1504 __inline BOOL SetupSections_FT(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3)\r
1505 {\r
1506  soft_vertex * v1, * v2, * v3;\r
1507  int height,longest,temp;\r
1508 \r
1509  v1 = vtx;   v1->x=x1<<16;v1->y=y1;\r
1510  v1->u=tx1<<16;v1->v=ty1<<16;\r
1511  v2 = vtx+1; v2->x=x2<<16;v2->y=y2;\r
1512  v2->u=tx2<<16;v2->v=ty2<<16;\r
1513  v3 = vtx+2; v3->x=x3<<16;v3->y=y3;\r
1514  v3->u=tx3<<16;v3->v=ty3<<16;\r
1515 \r
1516  if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }\r
1517  if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }\r
1518  if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }\r
1519 \r
1520  height = v3->y - v1->y;\r
1521  if(height == 0) {return FALSE;}\r
1522 \r
1523  temp=(((v2->y - v1->y) << 16) / height);\r
1524  longest = temp * ((v3->x - v1->x)>>16) + (v1->x - v2->x);\r
1525 \r
1526  if(longest == 0) {return FALSE;}\r
1527 \r
1528  if(longest < 0)\r
1529   {\r
1530    right_array[0] = v3;\r
1531    right_array[1] = v2;\r
1532    right_array[2] = v1;\r
1533    right_section  = 2;\r
1534    left_array[0]  = v3;\r
1535    left_array[1]  = v1;\r
1536    left_section   = 1;\r
1537 \r
1538    if(LeftSection_FT() <= 0) return FALSE;\r
1539    if(RightSection_FT() <= 0)\r
1540     {\r
1541      right_section--;\r
1542      if(RightSection_FT() <= 0) return FALSE;\r
1543     }\r
1544    if(longest > -0x1000) longest = -0x1000;     \r
1545   }\r
1546  else\r
1547   {\r
1548    left_array[0]  = v3;\r
1549    left_array[1]  = v2;\r
1550    left_array[2]  = v1;\r
1551    left_section   = 2;\r
1552    right_array[0] = v3;\r
1553    right_array[1] = v1;\r
1554    right_section  = 1;\r
1555 \r
1556    if(RightSection_FT() <= 0) return FALSE;\r
1557    if(LeftSection_FT() <= 0)\r
1558     {    \r
1559      left_section--;                \r
1560      if(LeftSection_FT() <= 0) return FALSE;\r
1561     }\r
1562    if(longest < 0x1000) longest = 0x1000;     \r
1563   }\r
1564 \r
1565  Ymin=v1->y;\r
1566  Ymax=min(v3->y-1,drawH);\r
1567 \r
1568  delta_right_u=shl10idiv(temp*((v3->u - v1->u)>>10)+((v1->u - v2->u)<<6),longest);\r
1569  delta_right_v=shl10idiv(temp*((v3->v - v1->v)>>10)+((v1->v - v2->v)<<6),longest);\r
1570 \r
1571 /*\r
1572 Mmm... adjust neg tex deltas... will sometimes cause slight\r
1573 texture distortions \r
1574 \r
1575  longest>>=16;\r
1576  if(longest)\r
1577   {\r
1578    if(longest<0) longest=-longest;\r
1579    if(delta_right_u<0)\r
1580     delta_right_u-=delta_right_u/longest;\r
1581    if(delta_right_v<0)\r
1582     delta_right_v-=delta_right_v/longest;\r
1583   }\r
1584 */\r
1585 \r
1586  return TRUE;\r
1587 }\r
1588 \r
1589 __inline int RightSection_GT(void)\r
1590 {\r
1591  soft_vertex * v1 = right_array[ right_section ];\r
1592  soft_vertex * v2 = right_array[ right_section-1 ];\r
1593 \r
1594  int height = v2->y - v1->y;\r
1595  if(height == 0) return 0;\r
1596  delta_right_x = (v2->x - v1->x) / height;\r
1597  right_x = v1->x;\r
1598 \r
1599  right_section_height = height;\r
1600  return height;\r
1601 }\r
1602 \r
1603 __inline int LeftSection_GT(void)\r
1604 {\r
1605  soft_vertex * v1 = left_array[ left_section ];\r
1606  soft_vertex * v2 = left_array[ left_section-1 ];\r
1607 \r
1608  int height = v2->y - v1->y;\r
1609  if(height == 0) return 0;\r
1610  delta_left_x = (v2->x - v1->x) / height;\r
1611  left_x = v1->x;\r
1612 \r
1613  delta_left_u = ((v2->u - v1->u)) / height;\r
1614  left_u = v1->u;\r
1615  delta_left_v = ((v2->v - v1->v)) / height;\r
1616  left_v = v1->v;\r
1617 \r
1618  delta_left_R = ((v2->R - v1->R)) / height;\r
1619  left_R = v1->R;\r
1620  delta_left_G = ((v2->G - v1->G)) / height;\r
1621  left_G = v1->G;\r
1622  delta_left_B = ((v2->B - v1->B)) / height;\r
1623  left_B = v1->B;\r
1624 \r
1625  left_section_height = height;\r
1626  return height;  \r
1627 }\r
1628 \r
1629 __inline BOOL NextRow_GT(void)\r
1630 {\r
1631  if(--left_section_height<=0) \r
1632   {\r
1633    if(--left_section <= 0) {return TRUE;}\r
1634    if(LeftSection_GT()  <= 0) {return TRUE;}\r
1635   }\r
1636  else\r
1637   {\r
1638    left_x += delta_left_x;\r
1639    left_u += delta_left_u;\r
1640    left_v += delta_left_v;\r
1641    left_R += delta_left_R;\r
1642    left_G += delta_left_G;\r
1643    left_B += delta_left_B;\r
1644   }\r
1645 \r
1646  if(--right_section_height<=0) \r
1647   {\r
1648    if(--right_section<=0) {return TRUE;}\r
1649    if(RightSection_GT() <=0) {return TRUE;}\r
1650   }\r
1651  else\r
1652   {\r
1653    right_x += delta_right_x;\r
1654   }\r
1655  return FALSE;\r
1656 }\r
1657 \r
1658 __inline BOOL SetupSections_GT(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, int rgb1, int rgb2, int rgb3)\r
1659 {\r
1660  soft_vertex * v1, * v2, * v3;\r
1661  int height,longest,temp;\r
1662 \r
1663  v1 = vtx;   v1->x=x1<<16;v1->y=y1;\r
1664  v1->u=tx1<<16;v1->v=ty1<<16;\r
1665  v1->R=(rgb1) & 0x00ff0000;\r
1666  v1->G=(rgb1<<8) & 0x00ff0000;\r
1667  v1->B=(rgb1<<16) & 0x00ff0000;\r
1668 \r
1669  v2 = vtx+1; v2->x=x2<<16;v2->y=y2;\r
1670  v2->u=tx2<<16;v2->v=ty2<<16;\r
1671  v2->R=(rgb2) & 0x00ff0000;\r
1672  v2->G=(rgb2<<8) & 0x00ff0000;\r
1673  v2->B=(rgb2<<16) & 0x00ff0000;\r
1674              \r
1675  v3 = vtx+2; v3->x=x3<<16;v3->y=y3;\r
1676  v3->u=tx3<<16;v3->v=ty3<<16;\r
1677  v3->R=(rgb3) & 0x00ff0000;\r
1678  v3->G=(rgb3<<8) & 0x00ff0000;\r
1679  v3->B=(rgb3<<16) & 0x00ff0000;\r
1680 \r
1681  if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }\r
1682  if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }\r
1683  if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }\r
1684 \r
1685  height = v3->y - v1->y;\r
1686  if(height == 0) {return FALSE;}\r
1687 \r
1688  temp=(((v2->y - v1->y) << 16) / height);\r
1689  longest = temp * ((v3->x - v1->x)>>16) + (v1->x - v2->x);\r
1690 \r
1691  if(longest == 0) {return FALSE;}\r
1692 \r
1693  if(longest < 0)\r
1694   {\r
1695    right_array[0] = v3;\r
1696    right_array[1] = v2;\r
1697    right_array[2] = v1;\r
1698    right_section  = 2;\r
1699    left_array[0]  = v3;\r
1700    left_array[1]  = v1;\r
1701    left_section   = 1;\r
1702 \r
1703    if(LeftSection_GT() <= 0) return FALSE;\r
1704    if(RightSection_GT() <= 0)\r
1705     {\r
1706      right_section--;\r
1707      if(RightSection_GT() <= 0) return FALSE;\r
1708     }\r
1709 \r
1710    if(longest > -0x1000) longest = -0x1000;     \r
1711   }\r
1712  else\r
1713   {\r
1714    left_array[0]  = v3;\r
1715    left_array[1]  = v2;\r
1716    left_array[2]  = v1;\r
1717    left_section   = 2;\r
1718    right_array[0] = v3;\r
1719    right_array[1] = v1;\r
1720    right_section  = 1;\r
1721 \r
1722    if(RightSection_GT() <= 0) return FALSE;\r
1723    if(LeftSection_GT() <= 0)\r
1724     {    \r
1725      left_section--;\r
1726      if(LeftSection_GT() <= 0) return FALSE;\r
1727     }\r
1728    if(longest < 0x1000) longest = 0x1000;     \r
1729   }\r
1730 \r
1731  Ymin=v1->y;\r
1732  Ymax=min(v3->y-1,drawH);\r
1733 \r
1734  delta_right_R=shl10idiv(temp*((v3->R - v1->R)>>10)+((v1->R - v2->R)<<6),longest);\r
1735  delta_right_G=shl10idiv(temp*((v3->G - v1->G)>>10)+((v1->G - v2->G)<<6),longest);\r
1736  delta_right_B=shl10idiv(temp*((v3->B - v1->B)>>10)+((v1->B - v2->B)<<6),longest);\r
1737 \r
1738  delta_right_u=shl10idiv(temp*((v3->u - v1->u)>>10)+((v1->u - v2->u)<<6),longest);\r
1739  delta_right_v=shl10idiv(temp*((v3->v - v1->v)>>10)+((v1->v - v2->v)<<6),longest);\r
1740 \r
1741 \r
1742 /*\r
1743 Mmm... adjust neg tex deltas... will sometimes cause slight\r
1744 texture distortions \r
1745  longest>>=16;\r
1746  if(longest)\r
1747   {\r
1748    if(longest<0) longest=-longest;\r
1749    if(delta_right_u<0)\r
1750     delta_right_u-=delta_right_u/longest;\r
1751    if(delta_right_v<0)\r
1752     delta_right_v-=delta_right_v/longest;\r
1753   }\r
1754 */\r
1755 \r
1756 \r
1757  return TRUE;\r
1758 }\r
1759 \r
1760 __inline int RightSection_F4(void)\r
1761 {\r
1762  soft_vertex * v1 = right_array[ right_section ];\r
1763  soft_vertex * v2 = right_array[ right_section-1 ];\r
1764 \r
1765  int height = v2->y - v1->y;\r
1766  right_section_height = height;\r
1767  right_x = v1->x;\r
1768  if(height == 0) \r
1769   {\r
1770    return 0;\r
1771   }\r
1772  delta_right_x = (v2->x - v1->x) / height;\r
1773 \r
1774  return height;\r
1775 }\r
1776 \r
1777 __inline int LeftSection_F4(void)\r
1778 {\r
1779  soft_vertex * v1 = left_array[ left_section ];\r
1780  soft_vertex * v2 = left_array[ left_section-1 ];\r
1781 \r
1782  int height = v2->y - v1->y;\r
1783  left_section_height = height;\r
1784  left_x = v1->x;\r
1785  if(height == 0) \r
1786   {\r
1787    return 0;\r
1788   }\r
1789  delta_left_x = (v2->x - v1->x) / height;\r
1790 \r
1791  return height;  \r
1792 }\r
1793 \r
1794 __inline BOOL NextRow_F4(void)\r
1795 {\r
1796  if(--left_section_height<=0) \r
1797   {\r
1798    if(--left_section > 0) \r
1799     while(LeftSection_F4()<=0) \r
1800      {\r
1801       if(--left_section  <= 0) break;\r
1802      }\r
1803   }\r
1804  else\r
1805   {\r
1806    left_x += delta_left_x;\r
1807   }\r
1808 \r
1809  if(--right_section_height<=0) \r
1810   {\r
1811    if(--right_section > 0) \r
1812     while(RightSection_F4()<=0) \r
1813      {\r
1814       if(--right_section<=0) break;\r
1815      }\r
1816   }\r
1817  else\r
1818   {\r
1819    right_x += delta_right_x;\r
1820   }\r
1821  return FALSE;\r
1822 }\r
1823 \r
1824 __inline BOOL SetupSections_F4(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4)\r
1825 {\r
1826  soft_vertex * v1, * v2, * v3, * v4;\r
1827  int height,width,longest1,longest2;\r
1828 \r
1829  v1 = vtx;   v1->x=x1<<16;v1->y=y1;\r
1830  v2 = vtx+1; v2->x=x2<<16;v2->y=y2;\r
1831  v3 = vtx+2; v3->x=x3<<16;v3->y=y3;\r
1832  v4 = vtx+3; v4->x=x4<<16;v4->y=y4;\r
1833 \r
1834  if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }\r
1835  if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }\r
1836  if(v1->y > v4->y) { soft_vertex * v = v1; v1 = v4; v4 = v; }\r
1837  if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }\r
1838  if(v2->y > v4->y) { soft_vertex * v = v2; v2 = v4; v4 = v; }\r
1839  if(v3->y > v4->y) { soft_vertex * v = v3; v3 = v4; v4 = v; }\r
1840 \r
1841  height = v4->y - v1->y; if(height == 0) height =1;\r
1842  width  = (v4->x - v1->x)>>16;\r
1843  longest1 = (((v2->y - v1->y) << 16) / height) * width + (v1->x - v2->x);\r
1844  longest2 = (((v3->y - v1->y) << 16) / height) * width + (v1->x - v3->x);\r
1845 \r
1846  if(longest1 < 0)                                      // 2 is right\r
1847   {\r
1848    if(longest2 < 0)                                    // 3 is right\r
1849     {\r
1850      left_array[0]  = v4;\r
1851      left_array[1]  = v1;\r
1852      left_section   = 1;\r
1853 \r
1854      height = v3->y - v1->y; if(height == 0) height=1;\r
1855      longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);\r
1856      if(longest1 >= 0)\r
1857       {\r
1858        right_array[0] = v4;                     //  1\r
1859        right_array[1] = v3;                     //     3\r
1860        right_array[2] = v1;                     //  4\r
1861        right_section  = 2;    \r
1862       }\r
1863      else\r
1864       {\r
1865        height = v4->y - v2->y; if(height == 0) height=1;\r
1866        longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);\r
1867        if(longest1 >= 0)\r
1868         {\r
1869          right_array[0] = v4;                    //  1\r
1870          right_array[1] = v2;                    //     2\r
1871          right_array[2] = v1;                    //  4\r
1872          right_section  = 2;    \r
1873         }\r
1874        else\r
1875         {\r
1876          right_array[0] = v4;                    //  1\r
1877          right_array[1] = v3;                    //     2\r
1878          right_array[2] = v2;                    //     3\r
1879          right_array[3] = v1;                    //  4\r
1880          right_section  = 3;    \r
1881         }\r
1882       }\r
1883     }\r
1884    else                                            \r
1885     {\r
1886      left_array[0]  = v4;\r
1887      left_array[1]  = v3;                         //    1\r
1888      left_array[2]  = v1;                         //      2\r
1889      left_section   = 2;                          //  3\r
1890      right_array[0] = v4;                         //    4\r
1891      right_array[1] = v2;\r
1892      right_array[2] = v1;\r
1893      right_section  = 2;\r
1894     }\r
1895   }\r
1896  else\r
1897   {\r
1898    if(longest2 < 0)             \r
1899     {\r
1900      left_array[0]  = v4;                          //    1\r
1901      left_array[1]  = v2;                          //  2\r
1902      left_array[2]  = v1;                          //      3\r
1903      left_section   = 2;                           //    4\r
1904      right_array[0] = v4;\r
1905      right_array[1] = v3;\r
1906      right_array[2] = v1;\r
1907      right_section  = 2;\r
1908     }\r
1909    else                         \r
1910     {\r
1911      right_array[0] = v4;\r
1912      right_array[1] = v1;\r
1913      right_section  = 1;\r
1914 \r
1915      height = v3->y - v1->y; if(height == 0) height=1;\r
1916      longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);\r
1917      if(longest1<0)\r
1918       {\r
1919        left_array[0]  = v4;                        //    1\r
1920        left_array[1]  = v3;                        //  3\r
1921        left_array[2]  = v1;                        //    4\r
1922        left_section   = 2;    \r
1923       }\r
1924      else\r
1925       {\r
1926        height = v4->y - v2->y; if(height == 0) height=1;\r
1927        longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);\r
1928        if(longest1<0)\r
1929         {\r
1930          left_array[0]  = v4;                      //    1\r
1931          left_array[1]  = v2;                      //  2\r
1932          left_array[2]  = v1;                      //    4\r
1933          left_section   = 2;    \r
1934         }\r
1935        else\r
1936         {\r
1937          left_array[0]  = v4;                      //    1\r
1938          left_array[1]  = v3;                      //  2\r
1939          left_array[2]  = v2;                      //  3\r
1940          left_array[3]  = v1;                      //     4\r
1941          left_section   = 3;    \r
1942         }\r
1943       }\r
1944     }\r
1945   }\r
1946 \r
1947  while(LeftSection_F4()<=0) \r
1948   {\r
1949    if(--left_section  <= 0) break;\r
1950   }\r
1951 \r
1952  while(RightSection_F4()<=0) \r
1953   {\r
1954    if(--right_section <= 0) break;\r
1955   }\r
1956 \r
1957  Ymin=v1->y;\r
1958  Ymax=min(v4->y-1,drawH);\r
1959 \r
1960  return TRUE;\r
1961 }\r
1962 \r
1963 __inline int RightSection_FT4(void)\r
1964 {\r
1965  soft_vertex * v1 = right_array[ right_section ];\r
1966  soft_vertex * v2 = right_array[ right_section-1 ];\r
1967 \r
1968  int height = v2->y - v1->y;\r
1969  right_section_height = height;\r
1970  right_x = v1->x;\r
1971  right_u = v1->u;\r
1972  right_v = v1->v;\r
1973  if(height == 0) \r
1974   {\r
1975    return 0;\r
1976   }\r
1977  delta_right_x = (v2->x - v1->x) / height;\r
1978  delta_right_u = (v2->u - v1->u) / height;\r
1979  delta_right_v = (v2->v - v1->v) / height;\r
1980 \r
1981  return height;\r
1982 }\r
1983 \r
1984 __inline int LeftSection_FT4(void)\r
1985 {\r
1986  soft_vertex * v1 = left_array[ left_section ];\r
1987  soft_vertex * v2 = left_array[ left_section-1 ];\r
1988 \r
1989  int height = v2->y - v1->y;\r
1990  left_section_height = height;\r
1991  left_x = v1->x;\r
1992  left_u = v1->u;\r
1993  left_v = v1->v;\r
1994  if(height == 0) \r
1995   {\r
1996    return 0;\r
1997   }\r
1998  delta_left_x = (v2->x - v1->x) / height;\r
1999  delta_left_u = (v2->u - v1->u) / height;\r
2000  delta_left_v = (v2->v - v1->v) / height;\r
2001 \r
2002  return height;  \r
2003 }\r
2004 \r
2005 __inline BOOL NextRow_FT4(void)\r
2006 {\r
2007  if(--left_section_height<=0) \r
2008   {\r
2009    if(--left_section > 0) \r
2010     while(LeftSection_FT4()<=0) \r
2011      {\r
2012       if(--left_section  <= 0) break;\r
2013      }\r
2014   }\r
2015  else\r
2016   {\r
2017    left_x += delta_left_x;\r
2018    left_u += delta_left_u;\r
2019    left_v += delta_left_v;\r
2020   }\r
2021 \r
2022  if(--right_section_height<=0) \r
2023   {\r
2024    if(--right_section > 0) \r
2025     while(RightSection_FT4()<=0) \r
2026      {\r
2027       if(--right_section<=0) break;\r
2028      }\r
2029   }\r
2030  else\r
2031   {\r
2032    right_x += delta_right_x;\r
2033    right_u += delta_right_u;\r
2034    right_v += delta_right_v;\r
2035   }\r
2036  return FALSE;\r
2037 }\r
2038 \r
2039 __inline BOOL SetupSections_FT4(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4)\r
2040 {\r
2041  soft_vertex * v1, * v2, * v3, * v4;\r
2042  int height,width,longest1,longest2;\r
2043 \r
2044  v1 = vtx;   v1->x=x1<<16;v1->y=y1;\r
2045  v1->u=tx1<<16;v1->v=ty1<<16;\r
2046 \r
2047  v2 = vtx+1; v2->x=x2<<16;v2->y=y2;\r
2048  v2->u=tx2<<16;v2->v=ty2<<16;\r
2049              \r
2050  v3 = vtx+2; v3->x=x3<<16;v3->y=y3;\r
2051  v3->u=tx3<<16;v3->v=ty3<<16;\r
2052 \r
2053  v4 = vtx+3; v4->x=x4<<16;v4->y=y4;\r
2054  v4->u=tx4<<16;v4->v=ty4<<16;\r
2055 \r
2056  if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }\r
2057  if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }\r
2058  if(v1->y > v4->y) { soft_vertex * v = v1; v1 = v4; v4 = v; }\r
2059  if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }\r
2060  if(v2->y > v4->y) { soft_vertex * v = v2; v2 = v4; v4 = v; }\r
2061  if(v3->y > v4->y) { soft_vertex * v = v3; v3 = v4; v4 = v; }\r
2062 \r
2063  height = v4->y - v1->y; if(height == 0) height =1;\r
2064  width  = (v4->x - v1->x)>>16;\r
2065  longest1 = (((v2->y - v1->y) << 16) / height) * width + (v1->x - v2->x);\r
2066  longest2 = (((v3->y - v1->y) << 16) / height) * width + (v1->x - v3->x);\r
2067 \r
2068  if(longest1 < 0)                                      // 2 is right\r
2069   {\r
2070    if(longest2 < 0)                                    // 3 is right\r
2071     {\r
2072      left_array[0]  = v4;\r
2073      left_array[1]  = v1;\r
2074      left_section   = 1;\r
2075 \r
2076      height = v3->y - v1->y; if(height == 0) height=1;\r
2077      longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);\r
2078      if(longest1 >= 0)\r
2079       {\r
2080        right_array[0] = v4;                     //  1\r
2081        right_array[1] = v3;                     //     3\r
2082        right_array[2] = v1;                     //  4\r
2083        right_section  = 2;    \r
2084       }\r
2085      else\r
2086       {\r
2087        height = v4->y - v2->y; if(height == 0) height=1;\r
2088        longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);\r
2089        if(longest1 >= 0)\r
2090         {\r
2091          right_array[0] = v4;                    //  1\r
2092          right_array[1] = v2;                    //     2\r
2093          right_array[2] = v1;                    //  4\r
2094          right_section  = 2;    \r
2095         }\r
2096        else\r
2097         {\r
2098          right_array[0] = v4;                    //  1\r
2099          right_array[1] = v3;                    //     2\r
2100          right_array[2] = v2;                    //     3\r
2101          right_array[3] = v1;                    //  4\r
2102          right_section  = 3;    \r
2103         }\r
2104       }\r
2105     }\r
2106    else                                            \r
2107     {\r
2108      left_array[0]  = v4;\r
2109      left_array[1]  = v3;                         //    1\r
2110      left_array[2]  = v1;                         //      2\r
2111      left_section   = 2;                          //  3\r
2112      right_array[0] = v4;                         //    4\r
2113      right_array[1] = v2;\r
2114      right_array[2] = v1;\r
2115      right_section  = 2;\r
2116     }\r
2117   }\r
2118  else\r
2119   {\r
2120    if(longest2 < 0)             \r
2121     {\r
2122      left_array[0]  = v4;                          //    1\r
2123      left_array[1]  = v2;                          //  2\r
2124      left_array[2]  = v1;                          //      3\r
2125      left_section   = 2;                           //    4\r
2126      right_array[0] = v4;\r
2127      right_array[1] = v3;\r
2128      right_array[2] = v1;\r
2129      right_section  = 2;\r
2130     }\r
2131    else                         \r
2132     {\r
2133      right_array[0] = v4;\r
2134      right_array[1] = v1;\r
2135      right_section  = 1;\r
2136 \r
2137      height = v3->y - v1->y; if(height == 0) height=1;\r
2138      longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);\r
2139      if(longest1<0)\r
2140       {\r
2141        left_array[0]  = v4;                        //    1\r
2142        left_array[1]  = v3;                        //  3\r
2143        left_array[2]  = v1;                        //    4\r
2144        left_section   = 2;    \r
2145       }\r
2146      else\r
2147       {\r
2148        height = v4->y - v2->y; if(height == 0) height=1;\r
2149        longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);\r
2150        if(longest1<0)\r
2151         {\r
2152          left_array[0]  = v4;                      //    1\r
2153          left_array[1]  = v2;                      //  2\r
2154          left_array[2]  = v1;                      //    4\r
2155          left_section   = 2;    \r
2156         }\r
2157        else\r
2158         {\r
2159          left_array[0]  = v4;                      //    1\r
2160          left_array[1]  = v3;                      //  2\r
2161          left_array[2]  = v2;                      //  3\r
2162          left_array[3]  = v1;                      //     4\r
2163          left_section   = 3;    \r
2164         }\r
2165       }\r
2166     }\r
2167   }\r
2168 \r
2169  while(LeftSection_FT4()<=0) \r
2170   {\r
2171    if(--left_section  <= 0) break;\r
2172   }\r
2173 \r
2174  while(RightSection_FT4()<=0) \r
2175   {\r
2176    if(--right_section <= 0) break;\r
2177   }\r
2178 \r
2179  Ymin=v1->y;\r
2180  Ymax=min(v4->y-1,drawH);\r
2181 \r
2182  return TRUE;\r
2183 }\r
2184 \r
2185 __inline int RightSection_GT4(void)\r
2186 {\r
2187  soft_vertex * v1 = right_array[ right_section ];\r
2188  soft_vertex * v2 = right_array[ right_section-1 ];\r
2189 \r
2190  int height = v2->y - v1->y;\r
2191  right_section_height = height;\r
2192  right_x = v1->x;\r
2193  right_u = v1->u;\r
2194  right_v = v1->v;\r
2195  right_R = v1->R;\r
2196  right_G = v1->G;\r
2197  right_B = v1->B;\r
2198 \r
2199  if(height == 0) \r
2200   {\r
2201    return 0;\r
2202   }\r
2203  delta_right_x = (v2->x - v1->x) / height;\r
2204  delta_right_u = (v2->u - v1->u) / height;\r
2205  delta_right_v = (v2->v - v1->v) / height;\r
2206  delta_right_R = (v2->R - v1->R) / height;\r
2207  delta_right_G = (v2->G - v1->G) / height;\r
2208  delta_right_B = (v2->B - v1->B) / height;\r
2209 \r
2210  return height;\r
2211 }\r
2212 \r
2213 __inline int LeftSection_GT4(void)\r
2214 {\r
2215  soft_vertex * v1 = left_array[ left_section ];\r
2216  soft_vertex * v2 = left_array[ left_section-1 ];\r
2217 \r
2218  int height = v2->y - v1->y;\r
2219  left_section_height = height;\r
2220  left_x = v1->x;\r
2221  left_u = v1->u;\r
2222  left_v = v1->v;\r
2223  left_R = v1->R;\r
2224  left_G = v1->G;\r
2225  left_B = v1->B;\r
2226 \r
2227  if(height == 0) \r
2228   {\r
2229    return 0;\r
2230   }\r
2231  delta_left_x = (v2->x - v1->x) / height;\r
2232  delta_left_u = (v2->u - v1->u) / height;\r
2233  delta_left_v = (v2->v - v1->v) / height;\r
2234  delta_left_R = (v2->R - v1->R) / height;\r
2235  delta_left_G = (v2->G - v1->G) / height;\r
2236  delta_left_B = (v2->B - v1->B) / height;\r
2237 \r
2238  return height;  \r
2239 }\r
2240 \r
2241 __inline BOOL NextRow_GT4(void)\r
2242 {\r
2243  if(--left_section_height<=0) \r
2244   {\r
2245    if(--left_section > 0) \r
2246     while(LeftSection_GT4()<=0) \r
2247      {\r
2248       if(--left_section  <= 0) break;\r
2249      }\r
2250   }\r
2251  else\r
2252   {\r
2253    left_x += delta_left_x;\r
2254    left_u += delta_left_u;\r
2255    left_v += delta_left_v;\r
2256    left_R += delta_left_R;\r
2257    left_G += delta_left_G;\r
2258    left_B += delta_left_B;\r
2259   }\r
2260 \r
2261  if(--right_section_height<=0) \r
2262   {\r
2263    if(--right_section > 0) \r
2264     while(RightSection_GT4()<=0) \r
2265      {\r
2266       if(--right_section<=0) break;\r
2267      }\r
2268   }\r
2269  else\r
2270   {\r
2271    right_x += delta_right_x;\r
2272    right_u += delta_right_u;\r
2273    right_v += delta_right_v;\r
2274    right_R += delta_right_R;\r
2275    right_G += delta_right_G;\r
2276    right_B += delta_right_B;\r
2277   }\r
2278  return FALSE;\r
2279 }\r
2280 \r
2281 __inline BOOL SetupSections_GT4(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4, int rgb1, int rgb2, int rgb3, int rgb4)\r
2282 {\r
2283  soft_vertex * v1, * v2, * v3, * v4;\r
2284  int height,width,longest1,longest2;\r
2285 \r
2286  v1 = vtx;   v1->x=x1<<16;v1->y=y1;\r
2287  v1->u=tx1<<16;v1->v=ty1<<16;\r
2288  v1->R=(rgb1) & 0x00ff0000;\r
2289  v1->G=(rgb1<<8) & 0x00ff0000;\r
2290  v1->B=(rgb1<<16) & 0x00ff0000;\r
2291 \r
2292  v2 = vtx+1; v2->x=x2<<16;v2->y=y2;\r
2293  v2->u=tx2<<16;v2->v=ty2<<16;\r
2294  v2->R=(rgb2) & 0x00ff0000;\r
2295  v2->G=(rgb2<<8) & 0x00ff0000;\r
2296  v2->B=(rgb2<<16) & 0x00ff0000;\r
2297              \r
2298  v3 = vtx+2; v3->x=x3<<16;v3->y=y3;\r
2299  v3->u=tx3<<16;v3->v=ty3<<16;\r
2300  v3->R=(rgb3) & 0x00ff0000;\r
2301  v3->G=(rgb3<<8) & 0x00ff0000;\r
2302  v3->B=(rgb3<<16) & 0x00ff0000;\r
2303 \r
2304  v4 = vtx+3; v4->x=x4<<16;v4->y=y4;\r
2305  v4->u=tx4<<16;v4->v=ty4<<16;\r
2306  v4->R=(rgb4) & 0x00ff0000;\r
2307  v4->G=(rgb4<<8) & 0x00ff0000;\r
2308  v4->B=(rgb4<<16) & 0x00ff0000;\r
2309 \r
2310  if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }\r
2311  if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }\r
2312  if(v1->y > v4->y) { soft_vertex * v = v1; v1 = v4; v4 = v; }\r
2313  if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }\r
2314  if(v2->y > v4->y) { soft_vertex * v = v2; v2 = v4; v4 = v; }\r
2315  if(v3->y > v4->y) { soft_vertex * v = v3; v3 = v4; v4 = v; }\r
2316 \r
2317  height = v4->y - v1->y; if(height == 0) height =1;\r
2318  width  = (v4->x - v1->x)>>16;\r
2319  longest1 = (((v2->y - v1->y) << 16) / height) * width + (v1->x - v2->x);\r
2320  longest2 = (((v3->y - v1->y) << 16) / height) * width + (v1->x - v3->x);\r
2321 \r
2322  if(longest1 < 0)                                      // 2 is right\r
2323   {\r
2324    if(longest2 < 0)                                    // 3 is right\r
2325     {\r
2326      left_array[0]  = v4;\r
2327      left_array[1]  = v1;\r
2328      left_section   = 1;\r
2329 \r
2330      height = v3->y - v1->y; if(height == 0) height=1;\r
2331      longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);\r
2332      if(longest1 >= 0)\r
2333       {\r
2334        right_array[0] = v4;                     //  1\r
2335        right_array[1] = v3;                     //     3\r
2336        right_array[2] = v1;                     //  4\r
2337        right_section  = 2;    \r
2338       }\r
2339      else\r
2340       {\r
2341        height = v4->y - v2->y; if(height == 0) height=1;\r
2342        longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);\r
2343        if(longest1 >= 0)\r
2344         {\r
2345          right_array[0] = v4;                    //  1\r
2346          right_array[1] = v2;                    //     2\r
2347          right_array[2] = v1;                    //  4\r
2348          right_section  = 2;    \r
2349         }\r
2350        else\r
2351         {\r
2352          right_array[0] = v4;                    //  1\r
2353          right_array[1] = v3;                    //     2\r
2354          right_array[2] = v2;                    //     3\r
2355          right_array[3] = v1;                    //  4\r
2356          right_section  = 3;    \r
2357         }\r
2358       }\r
2359     }\r
2360    else                                            \r
2361     {\r
2362      left_array[0]  = v4;\r
2363      left_array[1]  = v3;                         //    1\r
2364      left_array[2]  = v1;                         //      2\r
2365      left_section   = 2;                          //  3\r
2366      right_array[0] = v4;                         //    4\r
2367      right_array[1] = v2;\r
2368      right_array[2] = v1;\r
2369      right_section  = 2;\r
2370     }\r
2371   }\r
2372  else\r
2373   {\r
2374    if(longest2 < 0)             \r
2375     {\r
2376      left_array[0]  = v4;                          //    1\r
2377      left_array[1]  = v2;                          //  2\r
2378      left_array[2]  = v1;                          //      3\r
2379      left_section   = 2;                           //    4\r
2380      right_array[0] = v4;\r
2381      right_array[1] = v3;\r
2382      right_array[2] = v1;\r
2383      right_section  = 2;\r
2384     }\r
2385    else                         \r
2386     {\r
2387      right_array[0] = v4;\r
2388      right_array[1] = v1;\r
2389      right_section  = 1;\r
2390 \r
2391      height = v3->y - v1->y; if(height == 0) height=1;\r
2392      longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);\r
2393      if(longest1<0)\r
2394       {\r
2395        left_array[0]  = v4;                        //    1\r
2396        left_array[1]  = v3;                        //  3\r
2397        left_array[2]  = v1;                        //    4\r
2398        left_section   = 2;    \r
2399       }\r
2400      else\r
2401       {\r
2402        height = v4->y - v2->y; if(height == 0) height=1;\r
2403        longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);\r
2404        if(longest1<0)\r
2405         {\r
2406          left_array[0]  = v4;                      //    1\r
2407          left_array[1]  = v2;                      //  2\r
2408          left_array[2]  = v1;                      //    4\r
2409          left_section   = 2;    \r
2410         }\r
2411        else\r
2412         {\r
2413          left_array[0]  = v4;                      //    1\r
2414          left_array[1]  = v3;                      //  2\r
2415          left_array[2]  = v2;                      //  3\r
2416          left_array[3]  = v1;                      //     4\r
2417          left_section   = 3;    \r
2418         }\r
2419       }\r
2420     }\r
2421   }\r
2422 \r
2423  while(LeftSection_GT4()<=0) \r
2424   {\r
2425    if(--left_section  <= 0) break;\r
2426   }\r
2427 \r
2428  while(RightSection_GT4()<=0) \r
2429   {\r
2430    if(--right_section <= 0) break;\r
2431   }\r
2432 \r
2433  Ymin=v1->y;\r
2434  Ymax=min(v4->y-1,drawH);\r
2435 \r
2436  return TRUE;\r
2437 }\r
2438 \r
2439 ////////////////////////////////////////////////////////////////////////\r
2440 // POLY FUNCS\r
2441 ////////////////////////////////////////////////////////////////////////\r
2442 \r
2443 ////////////////////////////////////////////////////////////////////////\r
2444 // POLY 3/4 FLAT SHADED\r
2445 ////////////////////////////////////////////////////////////////////////\r
2446 \r
2447 __inline void drawPoly3Fi(short x1, short y1, short x2, short y2, short x3, short y3, int rgb)\r
2448 {\r
2449  int i,j,xmin,xmax,ymin,ymax;\r
2450  unsigned short color;\r
2451  uint32_t lcolor;\r
2452 \r
2453  if(x1>drawW && x2>drawW && x3>drawW) return;\r
2454  if(y1>drawH && y2>drawH && y3>drawH) return;\r
2455  if(x1<drawX && x2<drawX && x3<drawX) return;\r
2456  if(y1<drawY && y2<drawY && y3<drawY) return;\r
2457  if(drawY>=drawH) return;\r
2458  if(drawX>=drawW) return; \r
2459 \r
2460  if(!SetupSections_F(x1,y1,x2,y2,x3,y3)) return;\r
2461 \r
2462  ymax=Ymax;\r
2463 \r
2464  color = ((rgb & 0x00f80000)>>9) | ((rgb & 0x0000f800)>>6) | ((rgb & 0x000000f8)>>3);\r
2465  lcolor=lSetMask|(((uint32_t)(color))<<16)|color;\r
2466 \r
2467  for(ymin=Ymin;ymin<drawY;ymin++)\r
2468   if(NextRow_F()) return;\r
2469 \r
2470 #ifdef FASTSOLID\r
2471 \r
2472  if(!bCheckMask && !DrawSemiTrans)\r
2473   {\r
2474    color |=sSetMask;\r
2475    for (i=ymin;i<=ymax;i++)\r
2476     {\r
2477      xmin=left_x >> 16;      if(drawX>xmin) xmin=drawX;\r
2478      xmax=(right_x >> 16)-1; if(drawW<xmax) xmax=drawW;\r
2479 \r
2480      for(j=xmin;j<xmax;j+=2) \r
2481       {\r
2482        *((uint32_t *)&psxVuw[(i<<10)+j])=lcolor;\r
2483       }\r
2484      if(j==xmax) psxVuw[(i<<10)+j]=color;\r
2485 \r
2486      if(NextRow_F()) return;\r
2487     }\r
2488    return;\r
2489   }\r
2490 \r
2491 #endif\r
2492 \r
2493  for (i=ymin;i<=ymax;i++)\r
2494   {\r
2495    xmin=left_x >> 16;      if(drawX>xmin) xmin=drawX;\r
2496    xmax=(right_x >> 16)-1; if(drawW<xmax) xmax=drawW;\r
2497 \r
2498    for(j=xmin;j<xmax;j+=2) \r
2499     {\r
2500      GetShadeTransCol32((uint32_t *)&psxVuw[(i<<10)+j], lcolor);\r
2501     }\r
2502    if(j == xmax)\r
2503     GetShadeTransCol(&psxVuw[(i << 10) + j],color);\r
2504 \r
2505    if(NextRow_F()) return;\r
2506   }\r
2507 }\r
2508 \r
2509 ////////////////////////////////////////////////////////////////////////\r
2510 \r
2511 void drawPoly3F(int rgb)\r
2512 {\r
2513  drawPoly3Fi(lx0,ly0,lx1,ly1,lx2,ly2,rgb);\r
2514 }\r
2515 \r
2516 #ifdef POLYQUAD3FS\r
2517 \r
2518 void drawPoly4F_TRI(int rgb)\r
2519 {\r
2520  drawPoly3Fi(lx1,ly1,lx3,ly3,lx2,ly2,rgb);\r
2521  drawPoly3Fi(lx0,ly0,lx1,ly1,lx2,ly2,rgb);\r
2522 }\r
2523 \r
2524 #endif\r
2525 \r
2526 // more exact:\r
2527 \r
2528 void drawPoly4F(int rgb)\r
2529 {\r
2530  int i,j,xmin,xmax,ymin,ymax;\r
2531  unsigned short color;unsigned int lcolor;\r
2532  \r
2533  if(lx0>drawW && lx1>drawW && lx2>drawW && lx3>drawW) return;\r
2534  if(ly0>drawH && ly1>drawH && ly2>drawH && ly3>drawH) return;\r
2535  if(lx0<drawX && lx1<drawX && lx2<drawX && lx3<drawX) return;\r
2536  if(ly0<drawY && ly1<drawY && ly2<drawY && ly3<drawY) return;\r
2537  if(drawY>=drawH) return;\r
2538  if(drawX>=drawW) return; \r
2539 \r
2540  if(!SetupSections_F4(lx0,ly0,lx1,ly1,lx2,ly2,lx3,ly3)) return;\r
2541 \r
2542  ymax=Ymax;\r
2543 \r
2544  for(ymin=Ymin;ymin<drawY;ymin++)\r
2545   if(NextRow_F4()) return;\r
2546 \r
2547  color = ((rgb & 0x00f80000)>>9) | ((rgb & 0x0000f800)>>6) | ((rgb & 0x000000f8)>>3);\r
2548  lcolor= lSetMask|(((uint32_t)(color))<<16)|color;\r
2549 \r
2550 #ifdef FASTSOLID\r
2551 \r
2552  if(!bCheckMask && !DrawSemiTrans)\r
2553   {\r
2554    color |=sSetMask;\r
2555    for (i=ymin;i<=ymax;i++)\r
2556     {\r
2557      xmin=left_x >> 16;      if(drawX>xmin) xmin=drawX;\r
2558      xmax=(right_x >> 16)-1; if(drawW<xmax) xmax=drawW;\r
2559 \r
2560      for(j=xmin;j<xmax;j+=2) \r
2561       {\r
2562        *((uint32_t *)&psxVuw[(i<<10)+j])=lcolor;\r
2563       }\r
2564      if(j==xmax) psxVuw[(i<<10)+j]=color;\r
2565 \r
2566      if(NextRow_F4()) return;\r
2567     }\r
2568    return;\r
2569   }                                                        \r
2570 \r
2571 #endif\r
2572 \r
2573  for (i = ymin; i <= ymax; i++)\r
2574   {\r
2575    xmin = left_x >> 16;      if(drawX > xmin) xmin = drawX;\r
2576    xmax = (right_x >> 16) - 1; if(drawW < xmax) xmax = drawW;\r
2577 \r
2578    for(j = xmin; j < xmax; j += 2) \r
2579     {\r
2580      GetShadeTransCol32((uint32_t *)&psxVuw[(i<<10) + j],lcolor);\r
2581     }\r
2582    if(j == xmax) GetShadeTransCol(&psxVuw[(i<<10) + j],color);\r
2583 \r
2584    if(NextRow_F4()) return;\r
2585   }\r
2586 }\r
2587 \r
2588 ////////////////////////////////////////////////////////////////////////\r
2589 // POLY 3/4 F-SHADED TEX PAL 4\r
2590 ////////////////////////////////////////////////////////////////////////\r
2591 \r
2592 void drawPoly3TEx4(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3,short clX, short clY)\r
2593 {\r
2594  int i,j,xmin,xmax,ymin,ymax;\r
2595  int difX, difY,difX2, difY2;\r
2596  int posX,posY,YAdjust,XAdjust;\r
2597  int clutP;\r
2598  short tC1,tC2;\r
2599  \r
2600  if (x1 > drawW && x2 > drawW && x3 > drawW) return;\r
2601  if (y1 > drawH && y2 > drawH && y3 > drawH) return;\r
2602  if (x1 < drawX && x2 < drawX && x3 < drawX) return;\r
2603  if (y1 < drawY && y2 < drawY && y3 < drawY) return;\r
2604  if (drawY >= drawH) return;\r
2605  if (drawX >= drawW) return; \r
2606 \r
2607  if (!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;\r
2608 \r
2609  ymax = Ymax;\r
2610 \r
2611  for (ymin = Ymin; ymin < drawY; ymin++)\r
2612   if (NextRow_FT()) return;\r
2613 \r
2614  clutP = (clY << 10) + clX;\r
2615 \r
2616  YAdjust = ((GlobalTextAddrY) << 11) + (GlobalTextAddrX << 1);\r
2617 \r
2618  difX = delta_right_u; difX2 = difX << 1;\r
2619  difY = delta_right_v; difY2 = difY << 1;\r
2620 \r
2621 #ifdef FASTSOLID\r
2622 \r
2623  if(!bCheckMask && !DrawSemiTrans)\r
2624   {\r
2625    for (i=ymin;i<=ymax;i++)\r
2626     {\r
2627      xmin=(left_x >> 16);\r
2628      xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!\r
2629      if(drawW<xmax) xmax=drawW;\r
2630 \r
2631      if(xmax>=xmin)\r
2632       {\r
2633        posX=left_u;\r
2634        posY=left_v;\r
2635 \r
2636        if(xmin<drawX)\r
2637         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
2638 \r
2639        for(j=xmin;j<xmax;j+=2)\r
2640         {\r
2641          XAdjust=(posX>>16);\r
2642          tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(XAdjust>>1)];\r
2643          tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
2644          XAdjust=((posX+difX)>>16);\r
2645          tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+\r
2646                     (XAdjust>>1)];\r
2647          tC2=(tC2>>((XAdjust&1)<<2))&0xf;\r
2648 \r
2649          GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
2650              psxVuw[clutP+tC1]|\r
2651              ((int)psxVuw[clutP+tC2])<<16);\r
2652 \r
2653          posX+=difX2;\r
2654          posY+=difY2;\r
2655         }\r
2656        if(j==xmax)\r
2657         {\r
2658          XAdjust=(posX>>16);\r
2659          tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+\r
2660                       (XAdjust>>1)];\r
2661          tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
2662          GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
2663         }\r
2664       }\r
2665      if(NextRow_FT()) \r
2666       {\r
2667        return;\r
2668       }\r
2669     }\r
2670    return;\r
2671   }\r
2672 \r
2673 #endif\r
2674 \r
2675  for (i=ymin;i<=ymax;i++)\r
2676   {\r
2677    xmin=(left_x >> 16);\r
2678    xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!\r
2679    if(drawW<xmax) xmax=drawW;\r
2680 \r
2681    if(xmax>=xmin)\r
2682     {\r
2683      posX=left_u;\r
2684      posY=left_v;\r
2685 \r
2686      if(xmin<drawX)\r
2687       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
2688 \r
2689      for(j=xmin;j<xmax;j+=2)\r
2690       {\r
2691        XAdjust=(posX>>16);\r
2692        tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(XAdjust>>1)];\r
2693        tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
2694        XAdjust=((posX+difX)>>16);\r
2695        tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+\r
2696                     (XAdjust>>1)];\r
2697        tC2=(tC2>>((XAdjust&1)<<2))&0xf;\r
2698 \r
2699        GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],\r
2700            psxVuw[clutP+tC1]|\r
2701            ((int)psxVuw[clutP+tC2])<<16);\r
2702 \r
2703        posX+=difX2;\r
2704        posY+=difY2;\r
2705       }\r
2706      if(j==xmax)\r
2707       {\r
2708        XAdjust=(posX>>16);\r
2709        tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+\r
2710                     (XAdjust>>1)];\r
2711        tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
2712        GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
2713       }\r
2714     }\r
2715    if(NextRow_FT()) \r
2716     {\r
2717      return;\r
2718     }\r
2719   }\r
2720 }\r
2721 \r
2722 ////////////////////////////////////////////////////////////////////////\r
2723 \r
2724 void drawPoly3TEx4_IL(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3,short clX, short clY)\r
2725 {\r
2726  int i,j,xmin,xmax,ymin,ymax,n_xi,n_yi,TXV;\r
2727  int difX, difY,difX2, difY2;\r
2728  int posX,posY,YAdjust,XAdjust;\r
2729  int clutP;\r
2730  short tC1,tC2;\r
2731  \r
2732  if(x1>drawW && x2>drawW && x3>drawW) return;\r
2733  if(y1>drawH && y2>drawH && y3>drawH) return;\r
2734  if(x1<drawX && x2<drawX && x3<drawX) return;\r
2735  if(y1<drawY && y2<drawY && y3<drawY) return;\r
2736  if(drawY>=drawH) return;\r
2737  if(drawX>=drawW) return; \r
2738 \r
2739  if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;\r
2740 \r
2741  ymax=Ymax;\r
2742 \r
2743  for(ymin=Ymin;ymin<drawY;ymin++)\r
2744   if(NextRow_FT()) return;\r
2745 \r
2746  clutP=(clY<<10)+clX;\r
2747 \r
2748  YAdjust=(GlobalTextAddrY<<10)+GlobalTextAddrX;\r
2749 \r
2750  difX=delta_right_u;difX2=difX<<1;\r
2751  difY=delta_right_v;difY2=difY<<1;\r
2752 \r
2753 #ifdef FASTSOLID\r
2754 \r
2755  if(!bCheckMask && !DrawSemiTrans)\r
2756   {\r
2757    for (i=ymin;i<=ymax;i++)\r
2758     {\r
2759      xmin=(left_x >> 16);\r
2760      xmax=(right_x >> 16)-1;\r
2761      if(drawW<xmax) xmax=drawW;\r
2762 \r
2763      if(xmax>=xmin)\r
2764       {\r
2765        posX=left_u;\r
2766        posY=left_v;\r
2767 \r
2768        if(xmin<drawX)\r
2769         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
2770 \r
2771        for(j=xmin;j<xmax;j+=2)\r
2772         {\r
2773          XAdjust=(posX>>16);\r
2774 \r
2775          TXV=posY>>16;\r
2776          n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );\r
2777          n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );\r
2778 \r
2779          tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
2780 \r
2781          XAdjust=((posX+difX)>>16);\r
2782 \r
2783          TXV=(posY+difY)>>16;\r
2784          n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );\r
2785          n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );\r
2786 \r
2787          tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
2788 \r
2789          GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
2790              psxVuw[clutP+tC1]|\r
2791              ((int)psxVuw[clutP+tC2])<<16);\r
2792 \r
2793          posX+=difX2;\r
2794          posY+=difY2;\r
2795         }\r
2796        if(j==xmax)\r
2797         {\r
2798          XAdjust=(posX>>16);\r
2799 \r
2800          TXV=posY>>16;\r
2801          n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );\r
2802          n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );\r
2803 \r
2804          tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
2805 \r
2806          GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
2807         }\r
2808       }\r
2809      if(NextRow_FT()) \r
2810       {\r
2811        return;\r
2812       }\r
2813     }\r
2814    return;\r
2815   }\r
2816 \r
2817 #endif\r
2818 \r
2819  for (i=ymin;i<=ymax;i++)\r
2820   {\r
2821    xmin=(left_x >> 16);\r
2822    xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!\r
2823    if(drawW<xmax) xmax=drawW;\r
2824 \r
2825    if(xmax>=xmin)\r
2826     {\r
2827      posX=left_u;\r
2828      posY=left_v;\r
2829 \r
2830      if(xmin<drawX)\r
2831       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
2832 \r
2833      for(j=xmin;j<xmax;j+=2)\r
2834       {\r
2835        XAdjust=(posX>>16);\r
2836 \r
2837        TXV=posY>>16;\r
2838        n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );\r
2839        n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );\r
2840 \r
2841        tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
2842 \r
2843        XAdjust=((posX+difX)>>16);\r
2844 \r
2845        TXV=(posY+difY)>>16;\r
2846        n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );\r
2847        n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );\r
2848 \r
2849        tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
2850 \r
2851        GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],\r
2852            psxVuw[clutP+tC1]|\r
2853            ((int)psxVuw[clutP+tC2])<<16);\r
2854 \r
2855        posX+=difX2;\r
2856        posY+=difY2;\r
2857       }\r
2858      if(j==xmax)\r
2859       {\r
2860        XAdjust=(posX>>16);\r
2861 \r
2862        TXV=posY>>16;\r
2863        n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );\r
2864        n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );\r
2865 \r
2866        tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
2867 \r
2868        GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
2869       }\r
2870     }\r
2871    if(NextRow_FT()) \r
2872     {\r
2873      return;\r
2874     }\r
2875   }\r
2876 }\r
2877 \r
2878 ////////////////////////////////////////////////////////////////////////\r
2879 \r
2880 void drawPoly3TEx4_TW(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3,short clX, short clY)\r
2881 {\r
2882  int i,j,xmin,xmax,ymin,ymax;\r
2883  int difX, difY,difX2, difY2;\r
2884  int posX,posY,YAdjust,XAdjust;\r
2885  int clutP;\r
2886  short tC1,tC2;\r
2887  \r
2888  if(x1>drawW && x2>drawW && x3>drawW) return;\r
2889  if(y1>drawH && y2>drawH && y3>drawH) return;\r
2890  if(x1<drawX && x2<drawX && x3<drawX) return;\r
2891  if(y1<drawY && y2<drawY && y3<drawY) return;\r
2892  if(drawY>=drawH) return;\r
2893  if(drawX>=drawW) return; \r
2894 \r
2895  if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;\r
2896 \r
2897  ymax=Ymax;\r
2898 \r
2899  for(ymin=Ymin;ymin<drawY;ymin++)\r
2900   if(NextRow_FT()) return;\r
2901 \r
2902  clutP=(clY<<10)+clX;\r
2903 \r
2904  YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
2905  YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0>>1);\r
2906 \r
2907  difX=delta_right_u;difX2=difX<<1;\r
2908  difY=delta_right_v;difY2=difY<<1;\r
2909 \r
2910 #ifdef FASTSOLID\r
2911 \r
2912  if(!bCheckMask && !DrawSemiTrans)\r
2913   {\r
2914    for (i=ymin;i<=ymax;i++)\r
2915     {\r
2916      xmin=(left_x >> 16);\r
2917      xmax=(right_x >> 16);//-1; //!!!!!!!!!!!!!!!!\r
2918      if(xmax>xmin) xmax--;\r
2919 \r
2920      if(drawW<xmax) xmax=drawW;\r
2921 \r
2922      if(xmax>=xmin)\r
2923       {\r
2924        posX=left_u;\r
2925        posY=left_v;\r
2926 \r
2927        if(xmin<drawX)\r
2928         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
2929 \r
2930        for(j=xmin;j<xmax;j+=2)\r
2931         {\r
2932          XAdjust=(posX>>16)%TWin.Position.x1;\r
2933          tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+\r
2934                       YAdjust+(XAdjust>>1)];\r
2935          tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
2936          XAdjust=((posX+difX)>>16)%TWin.Position.x1;\r
2937          tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+\r
2938                       YAdjust+(XAdjust>>1)];\r
2939          tC2=(tC2>>((XAdjust&1)<<2))&0xf;\r
2940 \r
2941          GetTextureTransColG32_S((uint32_t *)&psxVuw[(i << 10) + j],\r
2942              psxVuw[clutP+tC1]|\r
2943              ((int)psxVuw[clutP+tC2])<<16);\r
2944 \r
2945          posX+=difX2;\r
2946          posY+=difY2;\r
2947         }\r
2948        if(j==xmax)\r
2949         {\r
2950          XAdjust=(posX>>16)%TWin.Position.x1;\r
2951          tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+\r
2952                       YAdjust+(XAdjust>>1)];\r
2953          tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
2954          GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
2955         }\r
2956       }\r
2957      if(NextRow_FT()) \r
2958       {\r
2959        return;\r
2960       }\r
2961     }\r
2962    return;\r
2963   }\r
2964 \r
2965 #endif\r
2966 \r
2967  for (i=ymin;i<=ymax;i++)\r
2968   {\r
2969    xmin=(left_x >> 16);\r
2970    xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!\r
2971    if(drawW<xmax) xmax=drawW;\r
2972 \r
2973    if(xmax>=xmin)\r
2974     {\r
2975      posX=left_u;\r
2976      posY=left_v;\r
2977 \r
2978      if(xmin<drawX)\r
2979       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
2980 \r
2981      for(j=xmin;j<xmax;j+=2)\r
2982       {\r
2983        XAdjust=(posX>>16)%TWin.Position.x1;\r
2984        tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+\r
2985                     YAdjust+(XAdjust>>1)];\r
2986        tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
2987        XAdjust=((posX+difX)>>16)%TWin.Position.x1;\r
2988        tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+\r
2989                     YAdjust+(XAdjust>>1)];\r
2990        tC2=(tC2>>((XAdjust&1)<<2))&0xf;\r
2991 \r
2992        GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],\r
2993            psxVuw[clutP+tC1]|\r
2994            ((int)psxVuw[clutP+tC2])<<16);\r
2995 \r
2996        posX+=difX2;\r
2997        posY+=difY2;\r
2998       }\r
2999      if(j==xmax)\r
3000       {\r
3001        XAdjust=(posX>>16)%TWin.Position.x1;\r
3002        tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+\r
3003                     YAdjust+(XAdjust>>1)];\r
3004        tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
3005        GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
3006       }\r
3007     }\r
3008    if(NextRow_FT()) \r
3009     {\r
3010      return;\r
3011     }\r
3012   }\r
3013 }\r
3014 \r
3015 ////////////////////////////////////////////////////////////////////////\r
3016 \r
3017 #ifdef POLYQUAD3\r
3018 \r
3019 void drawPoly4TEx4_TRI(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,short clX, short clY)\r
3020 {\r
3021  drawPoly3TEx4(x2,y2,x3,y3,x4,y4,\r
3022                tx2,ty2,tx3,ty3,tx4,ty4,\r
3023                clX,clY);\r
3024  drawPoly3TEx4(x1,y1,x2,y2,x4,y4,\r
3025                tx1,ty1,tx2,ty2,tx4,ty4,\r
3026                clX,clY);\r
3027 }\r
3028 \r
3029 #endif\r
3030 \r
3031 // more exact:\r
3032 \r
3033 void drawPoly4TEx4(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,short clX, short clY)\r
3034 {\r
3035  int num; \r
3036  int i,j,xmin,xmax,ymin,ymax;\r
3037  int difX, difY, difX2, difY2;\r
3038  int posX,posY,YAdjust,clutP,XAdjust;\r
3039  short tC1,tC2;\r
3040 \r
3041  if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;\r
3042  if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;\r
3043  if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;\r
3044  if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;\r
3045  if(drawY>=drawH) return;\r
3046  if(drawX>=drawW) return; \r
3047 \r
3048  if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;\r
3049 \r
3050  ymax=Ymax;\r
3051 \r
3052  for(ymin=Ymin;ymin<drawY;ymin++)\r
3053   if(NextRow_FT4()) return;\r
3054 \r
3055  clutP=(clY<<10)+clX;\r
3056 \r
3057  YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
3058 \r
3059 #ifdef FASTSOLID\r
3060 \r
3061  if(!bCheckMask && !DrawSemiTrans)\r
3062   {\r
3063    for (i=ymin;i<=ymax;i++)\r
3064     {\r
3065      xmin=(left_x >> 16);\r
3066      xmax=(right_x >> 16);\r
3067 \r
3068      if(xmax>=xmin)\r
3069       {\r
3070        posX=left_u;\r
3071        posY=left_v;\r
3072 \r
3073        num=(xmax-xmin);\r
3074        if(num==0) num=1;\r
3075        difX=(right_u-posX)/num;\r
3076        difY=(right_v-posY)/num;\r
3077        difX2=difX<<1;\r
3078        difY2=difY<<1;\r
3079 \r
3080        if(xmin<drawX)\r
3081         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
3082        xmax--;if(drawW<xmax) xmax=drawW;\r
3083 \r
3084        for(j=xmin;j<xmax;j+=2)\r
3085         {\r
3086          XAdjust=(posX>>16);\r
3087          tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(XAdjust>>1)];\r
3088          tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
3089          XAdjust=((posX+difX)>>16);\r
3090          tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+\r
3091                        (XAdjust>>1)];\r
3092          tC2=(tC2>>((XAdjust&1)<<2))&0xf;\r
3093 \r
3094          GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
3095               psxVuw[clutP+tC1]|\r
3096               ((int)psxVuw[clutP+tC2])<<16);\r
3097          posX+=difX2;\r
3098          posY+=difY2;\r
3099         }\r
3100        if(j==xmax)\r
3101         {\r
3102          XAdjust=(posX>>16);\r
3103          tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+\r
3104                       (XAdjust>>1)];\r
3105          tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
3106          GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
3107         }\r
3108 \r
3109       }\r
3110      if(NextRow_FT4()) return;\r
3111     }\r
3112    return;\r
3113   }\r
3114 \r
3115 #endif\r
3116 \r
3117  for (i=ymin;i<=ymax;i++)\r
3118   {\r
3119    xmin=(left_x >> 16);\r
3120    xmax=(right_x >> 16);\r
3121 \r
3122    if(xmax>=xmin)\r
3123     {\r
3124      posX=left_u;\r
3125      posY=left_v;\r
3126 \r
3127      num=(xmax-xmin);\r
3128      if(num==0) num=1;\r
3129      difX=(right_u-posX)/num;\r
3130      difY=(right_v-posY)/num;\r
3131      difX2=difX<<1;\r
3132      difY2=difY<<1;\r
3133 \r
3134      if(xmin<drawX)\r
3135       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
3136      xmax--;if(drawW<xmax) xmax=drawW;\r
3137 \r
3138      for(j=xmin;j<xmax;j+=2)\r
3139       {\r
3140        XAdjust=(posX>>16);\r
3141        tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(XAdjust>>1)];\r
3142        tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
3143        XAdjust=((posX+difX)>>16);\r
3144        tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+\r
3145                      (XAdjust>>1)];\r
3146        tC2=(tC2>>((XAdjust&1)<<2))&0xf;\r
3147 \r
3148        GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],\r
3149             psxVuw[clutP+tC1]|\r
3150             ((int)psxVuw[clutP+tC2])<<16);\r
3151        posX+=difX2;\r
3152        posY+=difY2;\r
3153       }\r
3154      if(j==xmax)\r
3155       {\r
3156        XAdjust=(posX>>16);\r
3157        tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+\r
3158                     (XAdjust>>1)];\r
3159        tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
3160        GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
3161       }\r
3162     }\r
3163    if(NextRow_FT4()) return;\r
3164   }\r
3165 }\r
3166 \r
3167 ////////////////////////////////////////////////////////////////////////\r
3168 \r
3169 void drawPoly4TEx4_IL(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,short clX, short clY)\r
3170 {\r
3171  int num; \r
3172  int i,j,xmin,xmax,ymin,ymax,n_xi,n_yi,TXV;\r
3173  int difX, difY, difX2, difY2;\r
3174  int posX,posY,YAdjust,clutP,XAdjust;\r
3175  short tC1,tC2;\r
3176 \r
3177  if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;\r
3178  if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;\r
3179  if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;\r
3180  if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;\r
3181  if(drawY>=drawH) return;\r
3182  if(drawX>=drawW) return; \r
3183 \r
3184  if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;\r
3185 \r
3186  ymax=Ymax;\r
3187 \r
3188  for(ymin=Ymin;ymin<drawY;ymin++)\r
3189   if(NextRow_FT4()) return;\r
3190 \r
3191  clutP=(clY<<10)+clX;\r
3192 \r
3193  YAdjust=((GlobalTextAddrY)<<10)+GlobalTextAddrX;\r
3194 \r
3195 #ifdef FASTSOLID\r
3196 \r
3197  if(!bCheckMask && !DrawSemiTrans)\r
3198   {\r
3199    for (i=ymin;i<=ymax;i++)\r
3200     {\r
3201      xmin=(left_x >> 16);\r
3202      xmax=(right_x >> 16);\r
3203 \r
3204      if(xmax>=xmin)\r
3205       {\r
3206        posX=left_u;\r
3207        posY=left_v;\r
3208 \r
3209        num=(xmax-xmin);\r
3210        if(num==0) num=1;\r
3211        difX=(right_u-posX)/num;\r
3212        difY=(right_v-posY)/num;\r
3213        difX2=difX<<1;\r
3214        difY2=difY<<1;\r
3215 \r
3216        if(xmin<drawX)\r
3217         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
3218        xmax--;if(drawW<xmax) xmax=drawW;\r
3219 \r
3220        for(j=xmin;j<xmax;j+=2)\r
3221         {\r
3222          XAdjust=(posX>>16);\r
3223 \r
3224          TXV=posY>>16;\r
3225          n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );\r
3226          n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );\r
3227 \r
3228          tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
3229 \r
3230          XAdjust=((posX+difX)>>16);\r
3231 \r
3232          TXV=(posY+difY)>>16;\r
3233          n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );\r
3234          n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );\r
3235 \r
3236          tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
3237 \r
3238          GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
3239               psxVuw[clutP+tC1]|\r
3240               ((int)psxVuw[clutP+tC2])<<16);\r
3241          posX+=difX2;\r
3242          posY+=difY2;\r
3243         }\r
3244 \r
3245        if(j==xmax)\r
3246         {\r
3247          XAdjust=(posX>>16);\r
3248          TXV=posY>>16;\r
3249          n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );\r
3250          n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );\r
3251 \r
3252          tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
3253 \r
3254          GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
3255         }\r
3256 \r
3257       }\r
3258      if(NextRow_FT4()) return;\r
3259     }\r
3260    return;\r
3261   }\r
3262 \r
3263 #endif\r
3264 \r
3265  for (i=ymin;i<=ymax;i++)\r
3266   {\r
3267    xmin=(left_x >> 16);\r
3268    xmax=(right_x >> 16);\r
3269 \r
3270    if(xmax>=xmin)\r
3271     {\r
3272      posX=left_u;\r
3273      posY=left_v;\r
3274 \r
3275      num=(xmax-xmin);\r
3276      if(num==0) num=1;\r
3277      difX=(right_u-posX)/num;\r
3278      difY=(right_v-posY)/num;\r
3279      difX2=difX<<1;\r
3280      difY2=difY<<1;\r
3281 \r
3282      if(xmin<drawX)\r
3283       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
3284      xmax--;if(drawW<xmax) xmax=drawW;\r
3285 \r
3286      for(j=xmin;j<xmax;j+=2)\r
3287       {\r
3288        XAdjust=(posX>>16);\r
3289 \r
3290        TXV=posY>>16;\r
3291        n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );\r
3292        n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );\r
3293 \r
3294        tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
3295 \r
3296        XAdjust=((posX+difX)>>16);\r
3297 \r
3298        TXV=(posY+difY)>>16;\r
3299        n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );\r
3300        n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );\r
3301 \r
3302        tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
3303 \r
3304        GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],\r
3305             psxVuw[clutP+tC1]|\r
3306             ((int)psxVuw[clutP+tC2])<<16);\r
3307        posX+=difX2;\r
3308        posY+=difY2;\r
3309       }\r
3310      if(j==xmax)\r
3311       {\r
3312        XAdjust=(posX>>16);\r
3313        TXV=posY>>16;\r
3314        n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );\r
3315        n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );\r
3316 \r
3317        tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
3318 \r
3319        GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
3320       }\r
3321     }\r
3322    if(NextRow_FT4()) return;\r
3323   }\r
3324 }\r
3325 \r
3326 ////////////////////////////////////////////////////////////////////////\r
3327 \r
3328 void drawPoly4TEx4_TW(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,short clX, short clY)\r
3329 {\r
3330  int num; \r
3331  int i,j,xmin,xmax,ymin,ymax;\r
3332  int difX, difY, difX2, difY2;\r
3333  int posX,posY,YAdjust,clutP,XAdjust;\r
3334  short tC1,tC2;\r
3335 \r
3336  if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;\r
3337  if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;\r
3338  if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;\r
3339  if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;\r
3340  if(drawY>=drawH) return;\r
3341  if(drawX>=drawW) return; \r
3342 \r
3343  if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;\r
3344 \r
3345  ymax=Ymax;\r
3346 \r
3347  for(ymin=Ymin;ymin<drawY;ymin++)\r
3348   if(NextRow_FT4()) return;\r
3349 \r
3350  clutP=(clY<<10)+clX;\r
3351 \r
3352  YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
3353  YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0>>1);\r
3354 \r
3355 #ifdef FASTSOLID\r
3356 \r
3357  if(!bCheckMask && !DrawSemiTrans)\r
3358   {\r
3359    for (i=ymin;i<=ymax;i++)\r
3360     {\r
3361      xmin=(left_x >> 16);\r
3362      xmax=(right_x >> 16);\r
3363 \r
3364      if(xmax>=xmin)\r
3365       {\r
3366        posX=left_u;\r
3367        posY=left_v;\r
3368 \r
3369        num=(xmax-xmin);\r
3370        if(num==0) num=1;\r
3371        difX=(right_u-posX)/num;\r
3372        difY=(right_v-posY)/num;\r
3373        difX2=difX<<1;\r
3374        difY2=difY<<1;\r
3375 \r
3376        if(xmin<drawX)\r
3377         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
3378        xmax--;if(drawW<xmax) xmax=drawW;\r
3379 \r
3380        for(j=xmin;j<xmax;j+=2)\r
3381         {\r
3382          XAdjust=(posX>>16)%TWin.Position.x1;\r
3383          tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+\r
3384                       YAdjust+(XAdjust>>1)];\r
3385          tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
3386          XAdjust=((posX+difX)>>16)%TWin.Position.x1;\r
3387          tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+\r
3388                       YAdjust+(XAdjust>>1)];\r
3389          tC2=(tC2>>((XAdjust&1)<<2))&0xf;\r
3390 \r
3391          GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
3392               psxVuw[clutP+tC1]|\r
3393               ((int)psxVuw[clutP+tC2])<<16);\r
3394          posX+=difX2;\r
3395          posY+=difY2;\r
3396         }\r
3397        if(j==xmax)\r
3398         {\r
3399          XAdjust=(posX>>16)%TWin.Position.x1;\r
3400          tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+\r
3401                       YAdjust+(XAdjust>>1)];\r
3402          tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
3403          GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
3404         }\r
3405       }\r
3406      if(NextRow_FT4()) return;\r
3407     }\r
3408    return;\r
3409   }\r
3410 \r
3411 #endif\r
3412 \r
3413  for (i=ymin;i<=ymax;i++)\r
3414   {\r
3415    xmin=(left_x >> 16);\r
3416    xmax=(right_x >> 16);\r
3417 \r
3418    if(xmax>=xmin)\r
3419     {\r
3420      posX=left_u;\r
3421      posY=left_v;\r
3422 \r
3423      num=(xmax-xmin);\r
3424      if(num==0) num=1;\r
3425      difX=(right_u-posX)/num;\r
3426      difY=(right_v-posY)/num;\r
3427      difX2=difX<<1;\r
3428      difY2=difY<<1;\r
3429 \r
3430      if(xmin<drawX)\r
3431       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
3432      xmax--;if(drawW<xmax) xmax=drawW;\r
3433 \r
3434      for(j=xmin;j<xmax;j+=2)\r
3435       {\r
3436        XAdjust=(posX>>16)%TWin.Position.x1;\r
3437        tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+\r
3438                     YAdjust+(XAdjust>>1)];\r
3439        tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
3440        XAdjust=((posX+difX)>>16)%TWin.Position.x1;\r
3441        tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+\r
3442                     YAdjust+(XAdjust>>1)];\r
3443        tC2=(tC2>>((XAdjust&1)<<2))&0xf;\r
3444 \r
3445        GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],\r
3446             psxVuw[clutP+tC1]|\r
3447             ((int)psxVuw[clutP+tC2])<<16);\r
3448        posX+=difX2;\r
3449        posY+=difY2;\r
3450       }\r
3451      if(j==xmax)\r
3452       {\r
3453        XAdjust=(posX>>16)%TWin.Position.x1;\r
3454        tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+\r
3455                     YAdjust+(XAdjust>>1)];\r
3456        tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
3457        GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
3458       }\r
3459     }\r
3460    if(NextRow_FT4()) return;\r
3461   }\r
3462 }\r
3463 \r
3464 ////////////////////////////////////////////////////////////////////////\r
3465 \r
3466 void drawPoly4TEx4_TW_S(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,short clX, short clY)\r
3467 {\r
3468  int num; \r
3469  int i,j,xmin,xmax,ymin,ymax;\r
3470  int difX, difY, difX2, difY2;\r
3471  int posX,posY,YAdjust,clutP,XAdjust;\r
3472  short tC1,tC2;\r
3473 \r
3474  if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;\r
3475  if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;\r
3476  if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;\r
3477  if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;\r
3478  if(drawY>=drawH) return;\r
3479  if(drawX>=drawW) return; \r
3480 \r
3481  if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;\r
3482 \r
3483  ymax=Ymax;\r
3484 \r
3485  for(ymin=Ymin;ymin<drawY;ymin++)\r
3486   if(NextRow_FT4()) return;\r
3487 \r
3488  clutP=(clY<<10)+clX;\r
3489 \r
3490  YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
3491  YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0>>1);\r
3492 \r
3493 #ifdef FASTSOLID\r
3494 \r
3495  if(!bCheckMask && !DrawSemiTrans)\r
3496   {\r
3497    for (i=ymin;i<=ymax;i++)\r
3498     {\r
3499      xmin=(left_x >> 16);\r
3500      xmax=(right_x >> 16);\r
3501 \r
3502      if(xmax>=xmin)\r
3503       {\r
3504        posX=left_u;\r
3505        posY=left_v;\r
3506 \r
3507        num=(xmax-xmin);\r
3508        if(num==0) num=1;\r
3509        difX=(right_u-posX)/num;\r
3510        difY=(right_v-posY)/num;\r
3511        difX2=difX<<1;\r
3512        difY2=difY<<1;\r
3513 \r
3514        if(xmin<drawX)\r
3515         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
3516        xmax--;if(drawW<xmax) xmax=drawW;\r
3517 \r
3518        for(j=xmin;j<xmax;j+=2)\r
3519         {\r
3520          XAdjust=(posX>>16)%TWin.Position.x1;\r
3521          tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+\r
3522                       YAdjust+(XAdjust>>1)];\r
3523          tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
3524          XAdjust=((posX+difX)>>16)%TWin.Position.x1;\r
3525          tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+\r
3526                       YAdjust+(XAdjust>>1)];\r
3527          tC2=(tC2>>((XAdjust&1)<<2))&0xf;\r
3528 \r
3529          GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
3530               psxVuw[clutP+tC1]|\r
3531               ((int)psxVuw[clutP+tC2])<<16);\r
3532          posX+=difX2;\r
3533          posY+=difY2;\r
3534         }\r
3535        if(j==xmax)\r
3536         {\r
3537          XAdjust=(posX>>16)%TWin.Position.x1;\r
3538          tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+\r
3539                       YAdjust+(XAdjust>>1)];\r
3540          tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
3541          GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
3542         }\r
3543       }\r
3544      if(NextRow_FT4()) return;\r
3545     }\r
3546    return;\r
3547   }\r
3548 \r
3549 #endif\r
3550 \r
3551  for (i=ymin;i<=ymax;i++)\r
3552   {\r
3553    xmin=(left_x >> 16);\r
3554    xmax=(right_x >> 16);\r
3555 \r
3556    if(xmax>=xmin)\r
3557     {\r
3558      posX=left_u;\r
3559      posY=left_v;\r
3560 \r
3561      num=(xmax-xmin);\r
3562      if(num==0) num=1;\r
3563      difX=(right_u-posX)/num;\r
3564      difY=(right_v-posY)/num;\r
3565      difX2=difX<<1;\r
3566      difY2=difY<<1;\r
3567 \r
3568      if(xmin<drawX)\r
3569       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
3570      xmax--;if(drawW<xmax) xmax=drawW;\r
3571 \r
3572      for(j=xmin;j<xmax;j+=2)\r
3573       {\r
3574        XAdjust=(posX>>16)%TWin.Position.x1;\r
3575        tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+\r
3576                     YAdjust+(XAdjust>>1)];\r
3577        tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
3578        XAdjust=((posX+difX)>>16)%TWin.Position.x1;\r
3579        tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+\r
3580                     YAdjust+(XAdjust>>1)];\r
3581        tC2=(tC2>>((XAdjust&1)<<2))&0xf;\r
3582 \r
3583        GetTextureTransColG32_SPR((uint32_t *)&psxVuw[(i<<10)+j],\r
3584             psxVuw[clutP+tC1]|\r
3585             ((int)psxVuw[clutP+tC2])<<16);\r
3586        posX+=difX2;\r
3587        posY+=difY2;\r
3588       }\r
3589      if(j==xmax)\r
3590       {\r
3591        XAdjust=(posX>>16)%TWin.Position.x1;\r
3592        tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+\r
3593                     YAdjust+(XAdjust>>1)];\r
3594        tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
3595        GetTextureTransColG_SPR(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
3596       }\r
3597     }\r
3598    if(NextRow_FT4()) return;\r
3599   }\r
3600 }\r
3601 ////////////////////////////////////////////////////////////////////////\r
3602 // POLY 3 F-SHADED TEX PAL 8\r
3603 ////////////////////////////////////////////////////////////////////////\r
3604 \r
3605 void drawPoly3TEx8(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3,short clX, short clY)\r
3606 {\r
3607  int i,j,xmin,xmax,ymin,ymax;\r
3608  int difX, difY,difX2, difY2;\r
3609  int posX,posY,YAdjust,clutP;\r
3610  short tC1,tC2;\r
3611 \r
3612  if(x1>drawW && x2>drawW && x3>drawW) return;\r
3613  if(y1>drawH && y2>drawH && y3>drawH) return;\r
3614  if(x1<drawX && x2<drawX && x3<drawX) return;\r
3615  if(y1<drawY && y2<drawY && y3<drawY) return;\r
3616  if(drawY>=drawH) return;\r
3617  if(drawX>=drawW) return; \r
3618 \r
3619  if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;\r
3620 \r
3621  ymax=Ymax;\r
3622 \r
3623  for(ymin=Ymin;ymin<drawY;ymin++)\r
3624   if(NextRow_FT()) return;\r
3625 \r
3626  clutP=(clY<<10)+clX;\r
3627 \r
3628  YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
3629 \r
3630  difX=delta_right_u;difX2=difX<<1;\r
3631  difY=delta_right_v;difY2=difY<<1;\r
3632 \r
3633 #ifdef FASTSOLID\r
3634 \r
3635  if(!bCheckMask && !DrawSemiTrans)\r
3636   {\r
3637    for (i=ymin;i<=ymax;i++)\r
3638     {\r
3639      xmin=(left_x >> 16);\r
3640      xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!\r
3641      if(drawW<xmax) xmax=drawW;\r
3642 \r
3643      if(xmax>=xmin)\r
3644       {\r
3645        posX=left_u;\r
3646        posY=left_v;\r
3647 \r
3648        if(xmin<drawX)\r
3649         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
3650 \r
3651        for(j=xmin;j<xmax;j+=2)\r
3652         {\r
3653          tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];\r
3654          tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+\r
3655                       ((posX+difX)>>16)];\r
3656          GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
3657              psxVuw[clutP+tC1]|\r
3658              ((int)psxVuw[clutP+tC2])<<16);\r
3659          posX+=difX2;\r
3660          posY+=difY2;\r
3661         }\r
3662 \r
3663        if(j==xmax)\r
3664         {\r
3665          tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];\r
3666          GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
3667         }\r
3668       }\r
3669      if(NextRow_FT()) \r
3670       {\r
3671        return;\r
3672       }\r
3673     }\r
3674    return;\r
3675   }\r
3676 \r
3677 #endif\r
3678 \r
3679  for (i=ymin;i<=ymax;i++)\r
3680   {\r
3681    xmin=(left_x >> 16);\r
3682    xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!\r
3683    if(drawW<xmax) xmax=drawW;\r
3684 \r
3685    if(xmax>=xmin)\r
3686     {\r
3687      posX=left_u;\r
3688      posY=left_v;\r
3689 \r
3690      if(xmin<drawX)\r
3691       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
3692 \r
3693      for(j=xmin;j<xmax;j+=2)\r
3694       {\r
3695        tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];\r
3696        tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+\r
3697                     ((posX+difX)>>16)];\r
3698        GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],\r
3699            psxVuw[clutP+tC1]|\r
3700            ((int)psxVuw[clutP+tC2])<<16);\r
3701        posX+=difX2;\r
3702        posY+=difY2;\r
3703       }\r
3704 \r
3705      if(j==xmax)\r
3706       {\r
3707        tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];\r
3708        GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
3709       }\r
3710 \r
3711     }\r
3712    if(NextRow_FT()) \r
3713     {\r
3714      return;\r
3715     }\r
3716   }\r
3717 }\r
3718 \r
3719 ////////////////////////////////////////////////////////////////////////\r
3720 \r
3721 void drawPoly3TEx8_IL(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3,short clX, short clY)\r
3722 {\r
3723  int i,j,xmin,xmax,ymin,ymax,n_xi,n_yi,TXV,TXU;\r
3724  int difX, difY,difX2, difY2;\r
3725  int posX,posY,YAdjust,clutP;\r
3726  short tC1,tC2;\r
3727 \r
3728  if(x1>drawW && x2>drawW && x3>drawW) return;\r
3729  if(y1>drawH && y2>drawH && y3>drawH) return;\r
3730  if(x1<drawX && x2<drawX && x3<drawX) return;\r
3731  if(y1<drawY && y2<drawY && y3<drawY) return;\r
3732  if(drawY>=drawH) return;\r
3733  if(drawX>=drawW) return; \r
3734 \r
3735  if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;\r
3736 \r
3737  ymax=Ymax;\r
3738 \r
3739  for(ymin=Ymin;ymin<drawY;ymin++)\r
3740   if(NextRow_FT()) return;\r
3741 \r
3742  clutP=(clY<<10)+clX;\r
3743 \r
3744  YAdjust=(GlobalTextAddrY<<10)+GlobalTextAddrX;\r
3745 \r
3746  difX=delta_right_u;difX2=difX<<1;\r
3747  difY=delta_right_v;difY2=difY<<1;\r
3748 \r
3749 #ifdef FASTSOLID\r
3750 \r
3751  if(!bCheckMask && !DrawSemiTrans)\r
3752   {\r
3753    for (i=ymin;i<=ymax;i++)\r
3754     {\r
3755      xmin=(left_x >> 16);\r
3756      xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!\r
3757      if(drawW<xmax) xmax=drawW;\r
3758 \r
3759      if(xmax>=xmin)\r
3760       {\r
3761        posX=left_u;\r
3762        posY=left_v;\r
3763 \r
3764        if(xmin<drawX)\r
3765         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
3766 \r
3767        for(j=xmin;j<xmax;j+=2)\r
3768         {\r
3769          TXU=posX>>16;\r
3770          TXV=posY>>16;\r
3771          n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );\r
3772          n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );\r
3773 \r
3774          tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
3775 \r
3776          TXU=(posX+difX)>>16;\r
3777          TXV=(posY+difY)>>16;\r
3778          n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );\r
3779          n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );\r
3780 \r
3781          tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
3782 \r
3783          GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
3784              psxVuw[clutP+tC1]|\r
3785              ((int)psxVuw[clutP+tC2])<<16);\r
3786          posX+=difX2;\r
3787          posY+=difY2;\r
3788         }\r
3789 \r
3790        if(j==xmax)\r
3791         {\r
3792          TXU=posX>>16;\r
3793          TXV=posY>>16;\r
3794          n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );\r
3795          n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );\r
3796 \r
3797          tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
3798 \r
3799          GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
3800         }\r
3801       }\r
3802      if(NextRow_FT()) \r
3803       {\r
3804        return;\r
3805       }\r
3806     }\r
3807    return;\r
3808   }\r
3809 \r
3810 #endif\r
3811 \r
3812  for (i=ymin;i<=ymax;i++)\r
3813   {\r
3814    xmin=(left_x >> 16);\r
3815    xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!\r
3816    if(drawW<xmax) xmax=drawW;\r
3817 \r
3818    if(xmax>=xmin)\r
3819     {\r
3820      posX=left_u;\r
3821      posY=left_v;\r
3822 \r
3823      if(xmin<drawX)\r
3824       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
3825 \r
3826      for(j=xmin;j<xmax;j+=2)\r
3827       {\r
3828        TXU=posX>>16;\r
3829        TXV=posY>>16;\r
3830        n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );\r
3831        n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );\r
3832 \r
3833        tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
3834 \r
3835        TXU=(posX+difX)>>16;\r
3836        TXV=(posY+difY)>>16;\r
3837        n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );\r
3838        n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );\r
3839 \r
3840        tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
3841 \r
3842        GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],\r
3843            psxVuw[clutP+tC1]|\r
3844            ((int)psxVuw[clutP+tC2])<<16);\r
3845        posX+=difX2;\r
3846        posY+=difY2;\r
3847       }\r
3848 \r
3849      if(j==xmax)\r
3850       {\r
3851        TXU=posX>>16;\r
3852        TXV=posY>>16;\r
3853        n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );\r
3854        n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );\r
3855 \r
3856        tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
3857 \r
3858        GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
3859       }\r
3860 \r
3861     }\r
3862    if(NextRow_FT()) \r
3863     {\r
3864      return;\r
3865     }\r
3866   }\r
3867 }\r
3868 \r
3869 ////////////////////////////////////////////////////////////////////////\r
3870 \r
3871 void drawPoly3TEx8_TW(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3,short clX, short clY)\r
3872 {\r
3873  int i,j,xmin,xmax,ymin,ymax;\r
3874  int difX, difY,difX2, difY2;\r
3875  int posX,posY,YAdjust,clutP;\r
3876  short tC1,tC2;\r
3877 \r
3878  if(x1>drawW && x2>drawW && x3>drawW) return;\r
3879  if(y1>drawH && y2>drawH && y3>drawH) return;\r
3880  if(x1<drawX && x2<drawX && x3<drawX) return;\r
3881  if(y1<drawY && y2<drawY && y3<drawY) return;\r
3882  if(drawY>=drawH) return;\r
3883  if(drawX>=drawW) return; \r
3884 \r
3885  if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;\r
3886 \r
3887  ymax=Ymax;\r
3888 \r
3889  for(ymin=Ymin;ymin<drawY;ymin++)\r
3890   if(NextRow_FT()) return;\r
3891 \r
3892  clutP=(clY<<10)+clX;\r
3893 \r
3894  YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
3895  YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0);\r
3896 \r
3897  difX=delta_right_u;difX2=difX<<1;\r
3898  difY=delta_right_v;difY2=difY<<1;\r
3899 \r
3900 #ifdef FASTSOLID\r
3901 \r
3902  if(!bCheckMask && !DrawSemiTrans)\r
3903   {\r
3904    for (i=ymin;i<=ymax;i++)\r
3905     {\r
3906      xmin=(left_x >> 16);\r
3907      xmax=(right_x >> 16);//-1; //!!!!!!!!!!!!!!!!\r
3908      if(xmax>xmin) xmax--;\r
3909 \r
3910      if(drawW<xmax) xmax=drawW;\r
3911 \r
3912      if(xmax>=xmin)\r
3913       {\r
3914        posX=left_u;\r
3915        posY=left_v;\r
3916 \r
3917        if(xmin<drawX)\r
3918         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
3919 \r
3920        for(j=xmin;j<xmax;j+=2)\r
3921         {\r
3922          tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+\r
3923                       YAdjust+((posX>>16)%TWin.Position.x1)];\r
3924          tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+\r
3925                       YAdjust+(((posX+difX)>>16)%TWin.Position.x1)];\r
3926          GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
3927              psxVuw[clutP+tC1]|\r
3928              ((int)psxVuw[clutP+tC2])<<16);\r
3929          posX+=difX2;\r
3930          posY+=difY2;\r
3931         }\r
3932 \r
3933        if(j==xmax)\r
3934         {\r
3935          tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+\r
3936                       YAdjust+((posX>>16)%TWin.Position.x1)];\r
3937          GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
3938         }\r
3939       }\r
3940      if(NextRow_FT()) \r
3941       {\r
3942        return;\r
3943       }\r
3944     }\r
3945    return;\r
3946   }\r
3947 \r
3948 #endif\r
3949 \r
3950  for (i=ymin;i<=ymax;i++)\r
3951   {\r
3952    xmin=(left_x >> 16);\r
3953    xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!\r
3954    if(drawW<xmax) xmax=drawW;\r
3955 \r
3956    if(xmax>=xmin)\r
3957     {\r
3958      posX=left_u;\r
3959      posY=left_v;\r
3960 \r
3961      if(xmin<drawX)\r
3962       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
3963 \r
3964      for(j=xmin;j<xmax;j+=2)\r
3965       {\r
3966        tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+\r
3967                     YAdjust+((posX>>16)%TWin.Position.x1)];\r
3968        tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+\r
3969                     YAdjust+(((posX+difX)>>16)%TWin.Position.x1)];\r
3970        GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],\r
3971            psxVuw[clutP+tC1]|\r
3972            ((int)psxVuw[clutP+tC2])<<16);\r
3973        posX+=difX2;\r
3974        posY+=difY2;\r
3975       }\r
3976 \r
3977      if(j==xmax)\r
3978       {\r
3979        tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+\r
3980                     YAdjust+((posX>>16)%TWin.Position.x1)];\r
3981        GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
3982       }\r
3983 \r
3984     }\r
3985    if(NextRow_FT()) \r
3986     {\r
3987      return;\r
3988     }\r
3989   }\r
3990 }\r
3991 \r
3992 ////////////////////////////////////////////////////////////////////////\r
3993 \r
3994 #ifdef POLYQUAD3\r
3995 \r
3996 void drawPoly4TEx8_TRI(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,short clX, short clY)\r
3997 {\r
3998  drawPoly3TEx8(x2,y2,x3,y3,x4,y4,\r
3999                tx2,ty2,tx3,ty3,tx4,ty4,\r
4000                clX,clY);\r
4001 \r
4002  drawPoly3TEx8(x1,y1,x2,y2,x4,y4,\r
4003                tx1,ty1,tx2,ty2,tx4,ty4,\r
4004                clX,clY);\r
4005 }\r
4006 \r
4007 #endif\r
4008 \r
4009 // more exact:\r
4010 \r
4011 void drawPoly4TEx8(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,short clX, short clY)\r
4012 {\r
4013  int num; \r
4014  int i,j,xmin,xmax,ymin,ymax;\r
4015  int difX, difY, difX2, difY2;\r
4016  int posX,posY,YAdjust,clutP;\r
4017  short tC1,tC2;\r
4018 \r
4019  if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;\r
4020  if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;\r
4021  if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;\r
4022  if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;\r
4023  if(drawY>=drawH) return;\r
4024  if(drawX>=drawW) return; \r
4025 \r
4026  if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;\r
4027 \r
4028  ymax=Ymax;\r
4029 \r
4030  for(ymin=Ymin;ymin<drawY;ymin++)\r
4031   if(NextRow_FT4()) return;\r
4032 \r
4033  clutP=(clY<<10)+clX;\r
4034 \r
4035  YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
4036 \r
4037 #ifdef FASTSOLID\r
4038 \r
4039  if(!bCheckMask && !DrawSemiTrans)\r
4040   {\r
4041    for (i=ymin;i<=ymax;i++)\r
4042     {\r
4043      xmin=(left_x >> 16);\r
4044      xmax=(right_x >> 16);\r
4045 \r
4046      if(xmax>=xmin)\r
4047       {\r
4048        posX=left_u;\r
4049        posY=left_v;\r
4050 \r
4051        num=(xmax-xmin);\r
4052        if(num==0) num=1;\r
4053        difX=(right_u-posX)/num;\r
4054        difY=(right_v-posY)/num;\r
4055        difX2=difX<<1;\r
4056        difY2=difY<<1;\r
4057 \r
4058        if(xmin<drawX)\r
4059         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4060        xmax--;if(drawW<xmax) xmax=drawW;\r
4061 \r
4062        for(j=xmin;j<xmax;j+=2)\r
4063         {\r
4064          tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];\r
4065          tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+\r
4066                      ((posX+difX)>>16)];\r
4067          GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
4068               psxVuw[clutP+tC1]|\r
4069               ((int)psxVuw[clutP+tC2])<<16);\r
4070          posX+=difX2;\r
4071          posY+=difY2;\r
4072         }\r
4073        if(j==xmax)\r
4074         {\r
4075          tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];\r
4076          GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
4077         }\r
4078       }\r
4079      if(NextRow_FT4()) return;\r
4080     }\r
4081    return;\r
4082   }\r
4083 \r
4084 #endif\r
4085 \r
4086  for (i=ymin;i<=ymax;i++)\r
4087   {\r
4088    xmin=(left_x >> 16);\r
4089    xmax=(right_x >> 16);\r
4090 \r
4091    if(xmax>=xmin)\r
4092     {\r
4093      posX=left_u;\r
4094      posY=left_v;\r
4095 \r
4096      num=(xmax-xmin);\r
4097      if(num==0) num=1;\r
4098      difX=(right_u-posX)/num;\r
4099      difY=(right_v-posY)/num;\r
4100      difX2=difX<<1;\r
4101      difY2=difY<<1;\r
4102 \r
4103      if(xmin<drawX)\r
4104       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4105      xmax--;if(drawW<xmax) xmax=drawW;\r
4106 \r
4107      for(j=xmin;j<xmax;j+=2)\r
4108       {\r
4109        tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];\r
4110        tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+\r
4111                      ((posX+difX)>>16)];\r
4112        GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],\r
4113             psxVuw[clutP+tC1]|\r
4114             ((int)psxVuw[clutP+tC2])<<16);\r
4115        posX+=difX2;\r
4116        posY+=difY2;\r
4117       }\r
4118      if(j==xmax)\r
4119       {\r
4120        tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];\r
4121        GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
4122       }\r
4123     }\r
4124    if(NextRow_FT4()) return;\r
4125   }\r
4126 }\r
4127 \r
4128 ////////////////////////////////////////////////////////////////////////\r
4129 \r
4130 void drawPoly4TEx8_IL(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,short clX, short clY)\r
4131 {\r
4132  int num; \r
4133  int i,j,xmin,xmax,ymin,ymax,n_xi,n_yi,TXV,TXU;\r
4134  int difX, difY, difX2, difY2;\r
4135  int posX,posY,YAdjust,clutP;\r
4136  short tC1,tC2;\r
4137 \r
4138  if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;\r
4139  if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;\r
4140  if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;\r
4141  if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;\r
4142  if(drawY>=drawH) return;\r
4143  if(drawX>=drawW) return; \r
4144 \r
4145  if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;\r
4146 \r
4147  ymax=Ymax;\r
4148 \r
4149  for(ymin=Ymin;ymin<drawY;ymin++)\r
4150   if(NextRow_FT4()) return;\r
4151 \r
4152  clutP=(clY<<10)+clX;\r
4153 \r
4154  YAdjust=(GlobalTextAddrY<<10)+GlobalTextAddrX;\r
4155 \r
4156 #ifdef FASTSOLID\r
4157 \r
4158  if(!bCheckMask && !DrawSemiTrans)\r
4159   {\r
4160    for (i=ymin;i<=ymax;i++)\r
4161     {\r
4162      xmin=(left_x >> 16);\r
4163      xmax=(right_x >> 16);\r
4164 \r
4165      if(xmax>=xmin)\r
4166       {\r
4167        posX=left_u;\r
4168        posY=left_v;\r
4169 \r
4170        num=(xmax-xmin);\r
4171        if(num==0) num=1;\r
4172        difX=(right_u-posX)/num;\r
4173        difY=(right_v-posY)/num;\r
4174        difX2=difX<<1;\r
4175        difY2=difY<<1;\r
4176 \r
4177        if(xmin<drawX)\r
4178         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4179        xmax--;if(drawW<xmax) xmax=drawW;\r
4180 \r
4181        for(j=xmin;j<xmax;j+=2)\r
4182         {\r
4183          TXU=posX>>16;\r
4184          TXV=posY>>16;\r
4185          n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );\r
4186          n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );\r
4187 \r
4188          tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
4189 \r
4190          TXU=(posX+difX)>>16;\r
4191          TXV=(posY+difY)>>16;\r
4192          n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );\r
4193          n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );\r
4194 \r
4195          tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
4196 \r
4197          GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
4198               psxVuw[clutP+tC1]|\r
4199               ((int)psxVuw[clutP+tC2])<<16);\r
4200          posX+=difX2;\r
4201          posY+=difY2;\r
4202         }\r
4203        if(j==xmax)\r
4204         {\r
4205          TXU=posX>>16;\r
4206          TXV=posY>>16;\r
4207          n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );\r
4208          n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );\r
4209 \r
4210          tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
4211 \r
4212          GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
4213         }\r
4214       }\r
4215      if(NextRow_FT4()) return;\r
4216     }\r
4217    return;\r
4218   }\r
4219 \r
4220 #endif\r
4221 \r
4222  for (i=ymin;i<=ymax;i++)\r
4223   {\r
4224    xmin=(left_x >> 16);\r
4225    xmax=(right_x >> 16);\r
4226 \r
4227    if(xmax>=xmin)\r
4228     {\r
4229      posX=left_u;\r
4230      posY=left_v;\r
4231 \r
4232      num=(xmax-xmin);\r
4233      if(num==0) num=1;\r
4234      difX=(right_u-posX)/num;\r
4235      difY=(right_v-posY)/num;\r
4236      difX2=difX<<1;\r
4237      difY2=difY<<1;\r
4238 \r
4239      if(xmin<drawX)\r
4240       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4241      xmax--;if(drawW<xmax) xmax=drawW;\r
4242 \r
4243      for(j=xmin;j<xmax;j+=2)\r
4244       {\r
4245        TXU=posX>>16;\r
4246        TXV=posY>>16;\r
4247        n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );\r
4248        n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );\r
4249 \r
4250        tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
4251 \r
4252        TXU=(posX+difX)>>16;\r
4253        TXV=(posY+difY)>>16;\r
4254        n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );\r
4255        n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );\r
4256        \r
4257        tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
4258 \r
4259        GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],\r
4260             psxVuw[clutP+tC1]|\r
4261             ((int)psxVuw[clutP+tC2])<<16);\r
4262        posX+=difX2;\r
4263        posY+=difY2;\r
4264       }\r
4265      if(j==xmax)\r
4266       {\r
4267        TXU=posX>>16;\r
4268        TXV=posY>>16;\r
4269        n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );\r
4270        n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );\r
4271        tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
4272        GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
4273       }\r
4274     }\r
4275    if(NextRow_FT4()) return;\r
4276   }\r
4277 }\r
4278 \r
4279 ////////////////////////////////////////////////////////////////////////\r
4280 \r
4281 void drawPoly4TEx8_TW(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,short clX, short clY)\r
4282 {\r
4283  int num; \r
4284  int i, j, xmin, xmax, ymin, ymax;\r
4285  int difX, difY, difX2, difY2;\r
4286  int posX, posY, YAdjust, clutP;\r
4287  short tC1, tC2;\r
4288 \r
4289  if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;\r
4290  if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;\r
4291  if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;\r
4292  if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;\r
4293  if(drawY>=drawH) return;\r
4294  if(drawX>=drawW) return; \r
4295 \r
4296  if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;\r
4297 \r
4298  ymax=Ymax;\r
4299 \r
4300  for(ymin=Ymin;ymin<drawY;ymin++)\r
4301   if(NextRow_FT4()) return;\r
4302 \r
4303  clutP=(clY<<10)+clX;\r
4304 \r
4305  YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
4306  YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0);\r
4307 \r
4308 #ifdef FASTSOLID\r
4309 \r
4310  if(!bCheckMask && !DrawSemiTrans)\r
4311   {\r
4312    for (i=ymin;i<=ymax;i++)\r
4313     {\r
4314      xmin=(left_x >> 16);\r
4315      xmax=(right_x >> 16);\r
4316 \r
4317      if(xmax>=xmin)\r
4318       {\r
4319        posX=left_u;\r
4320        posY=left_v;\r
4321 \r
4322        num=(xmax-xmin);\r
4323        if(num==0) num=1;\r
4324        difX=(right_u-posX)/num;\r
4325        difY=(right_v-posY)/num;\r
4326        difX2=difX<<1;\r
4327        difY2=difY<<1;\r
4328 \r
4329        if(xmin<drawX)\r
4330         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4331        xmax--;if(drawW<xmax) xmax=drawW;\r
4332 \r
4333        for(j=xmin;j<xmax;j+=2)\r
4334         {\r
4335          tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+\r
4336                       YAdjust+((posX>>16)%TWin.Position.x1)];\r
4337          tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+\r
4338                       YAdjust+(((posX+difX)>>16)%TWin.Position.x1)];\r
4339          GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
4340               psxVuw[clutP+tC1]|\r
4341               ((int)psxVuw[clutP+tC2])<<16);\r
4342          posX += difX2;\r
4343          posY += difY2;\r
4344         }\r
4345        if(j==xmax)\r
4346         {\r
4347          tC1 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+\r
4348                       YAdjust+((posX>>16)%TWin.Position.x1)];\r
4349          GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
4350         }\r
4351       }\r
4352      if(NextRow_FT4()) return;\r
4353     }\r
4354    return;\r
4355   }\r
4356 \r
4357 #endif\r
4358 \r
4359 \r
4360  for (i=ymin;i<=ymax;i++)\r
4361   {\r
4362    xmin=(left_x >> 16);\r
4363    xmax=(right_x >> 16);\r
4364 \r
4365    if(xmax>=xmin)\r
4366     {\r
4367      posX=left_u;\r
4368      posY=left_v;\r
4369 \r
4370      num=(xmax-xmin);\r
4371      if(num==0) num=1;\r
4372      difX=(right_u-posX)/num;\r
4373      difY=(right_v-posY)/num;\r
4374      difX2=difX<<1;\r
4375      difY2=difY<<1;\r
4376 \r
4377      if(xmin<drawX)\r
4378       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4379      xmax--;if(drawW<xmax) xmax=drawW;\r
4380 \r
4381      for(j=xmin;j<xmax;j+=2)\r
4382       {\r
4383        tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+\r
4384                     YAdjust+((posX>>16)%TWin.Position.x1)];\r
4385        tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+\r
4386                      YAdjust+(((posX+difX)>>16)%TWin.Position.x1)];\r
4387        GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],\r
4388             psxVuw[clutP+tC1]|\r
4389             ((int)psxVuw[clutP+tC2])<<16);\r
4390        posX+=difX2;\r
4391        posY+=difY2;\r
4392       }\r
4393      if(j==xmax)\r
4394       {\r
4395        tC1 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+\r
4396                     YAdjust+((posX>>16)%TWin.Position.x1)];\r
4397        GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
4398       }\r
4399     }\r
4400    if(NextRow_FT4()) return;\r
4401   }\r
4402 }\r
4403 \r
4404 ////////////////////////////////////////////////////////////////////////\r
4405 \r
4406 void drawPoly4TEx8_TW_S(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,short clX, short clY)\r
4407 {\r
4408  int num; \r
4409  int i,j,xmin,xmax,ymin,ymax;\r
4410  int difX, difY, difX2, difY2;\r
4411  int posX,posY,YAdjust,clutP;\r
4412  short tC1,tC2;\r
4413 \r
4414  if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;\r
4415  if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;\r
4416  if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;\r
4417  if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;\r
4418  if(drawY>=drawH) return;\r
4419  if(drawX>=drawW) return; \r
4420 \r
4421  if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;\r
4422 \r
4423  ymax=Ymax;\r
4424 \r
4425  for(ymin=Ymin;ymin<drawY;ymin++)\r
4426   if(NextRow_FT4()) return;\r
4427 \r
4428  clutP=(clY<<10)+clX;\r
4429 \r
4430  YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
4431  YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0);\r
4432 \r
4433 #ifdef FASTSOLID\r
4434 \r
4435  if(!bCheckMask && !DrawSemiTrans)\r
4436   {\r
4437    for (i=ymin;i<=ymax;i++)\r
4438     {\r
4439      xmin=(left_x >> 16);\r
4440      xmax=(right_x >> 16);\r
4441 \r
4442      if(xmax>=xmin)\r
4443       {\r
4444        posX=left_u;\r
4445        posY=left_v;\r
4446 \r
4447        num=(xmax-xmin);\r
4448        if(num==0) num=1;\r
4449        difX=(right_u-posX)/num;\r
4450        difY=(right_v-posY)/num;\r
4451        difX2=difX<<1;\r
4452        difY2=difY<<1;\r
4453 \r
4454        if(xmin<drawX)\r
4455         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4456        xmax--;if(drawW<xmax) xmax=drawW;\r
4457 \r
4458        for(j=xmin;j<xmax;j+=2)\r
4459         {\r
4460          tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+\r
4461                       YAdjust+((posX>>16)%TWin.Position.x1)];\r
4462          tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+\r
4463                       YAdjust+(((posX+difX)>>16)%TWin.Position.x1)];\r
4464          GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
4465               psxVuw[clutP+tC1]|\r
4466               ((int)psxVuw[clutP+tC2])<<16);\r
4467          posX+=difX2;\r
4468          posY+=difY2;\r
4469         }\r
4470        if(j==xmax)\r
4471         {\r
4472          tC1 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+\r
4473                       YAdjust+((posX>>16)%TWin.Position.x1)];\r
4474          GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
4475         }\r
4476       }\r
4477      if(NextRow_FT4()) return;\r
4478     }\r
4479    return;\r
4480   }\r
4481 \r
4482 #endif\r
4483 \r
4484 \r
4485  for (i=ymin;i<=ymax;i++)\r
4486   {\r
4487    xmin=(left_x >> 16);\r
4488    xmax=(right_x >> 16);\r
4489 \r
4490    if(xmax>=xmin)\r
4491     {\r
4492      posX=left_u;\r
4493      posY=left_v;\r
4494 \r
4495      num=(xmax-xmin);\r
4496      if(num==0) num=1;\r
4497      difX=(right_u-posX)/num;\r
4498      difY=(right_v-posY)/num;\r
4499      difX2=difX<<1;\r
4500      difY2=difY<<1;\r
4501 \r
4502      if(xmin<drawX)\r
4503       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4504      xmax--;if(drawW<xmax) xmax=drawW;\r
4505 \r
4506      for(j=xmin;j<xmax;j+=2)\r
4507       {\r
4508        tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+\r
4509                     YAdjust+((posX>>16)%TWin.Position.x1)];\r
4510        tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+\r
4511                      YAdjust+(((posX+difX)>>16)%TWin.Position.x1)];\r
4512        GetTextureTransColG32_SPR((uint32_t *)&psxVuw[(i<<10)+j],\r
4513             psxVuw[clutP+tC1]|\r
4514             ((int)psxVuw[clutP+tC2])<<16);\r
4515        posX+=difX2;\r
4516        posY+=difY2;\r
4517       }\r
4518      if(j==xmax)\r
4519       {\r
4520        tC1 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+\r
4521                     YAdjust+((posX>>16)%TWin.Position.x1)];\r
4522        GetTextureTransColG_SPR(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
4523       }\r
4524     }\r
4525    if(NextRow_FT4()) return;\r
4526   }\r
4527 }\r
4528 \r
4529 ////////////////////////////////////////////////////////////////////////\r
4530 // POLY 3 F-SHADED TEX 15 BIT\r
4531 ////////////////////////////////////////////////////////////////////////\r
4532 \r
4533 void drawPoly3TD(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3)\r
4534 {\r
4535  int i,j,xmin,xmax,ymin,ymax;\r
4536  int difX, difY,difX2, difY2;\r
4537  int posX,posY;\r
4538 \r
4539  if(x1>drawW && x2>drawW && x3>drawW) return;\r
4540  if(y1>drawH && y2>drawH && y3>drawH) return;\r
4541  if(x1<drawX && x2<drawX && x3<drawX) return;\r
4542  if(y1<drawY && y2<drawY && y3<drawY) return;\r
4543  if(drawY>=drawH) return;\r
4544  if(drawX>=drawW) return; \r
4545                      \r
4546  if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;\r
4547 \r
4548  ymax=Ymax;\r
4549 \r
4550  for(ymin=Ymin;ymin<drawY;ymin++)\r
4551   if(NextRow_FT()) return;\r
4552 \r
4553  difX=delta_right_u;difX2=difX<<1;\r
4554  difY=delta_right_v;difY2=difY<<1;\r
4555 \r
4556 #ifdef FASTSOLID\r
4557 \r
4558  if(!bCheckMask && !DrawSemiTrans)\r
4559   {\r
4560    for (i=ymin;i<=ymax;i++)\r
4561     {\r
4562      xmin=(left_x >> 16);\r
4563      xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!\r
4564      if(drawW<xmax) xmax=drawW;\r
4565 \r
4566      if(xmax>=xmin)\r
4567       {\r
4568        posX=left_u;\r
4569        posY=left_v;\r
4570 \r
4571        if(xmin<drawX)\r
4572         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4573 \r
4574        for(j=xmin;j<xmax;j+=2)\r
4575         {\r
4576          GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
4577               (((int)psxVuw[((((posY+difY)>>16)+GlobalTextAddrY)<<10)+((posX+difX)>>16)+GlobalTextAddrX])<<16)|\r
4578               psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+((posX)>>16)+GlobalTextAddrX]);\r
4579 \r
4580          posX+=difX2;\r
4581          posY+=difY2;\r
4582         }\r
4583        if(j==xmax)\r
4584          GetTextureTransColG_S(&psxVuw[(i<<10)+j],\r
4585              psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX]);\r
4586       }\r
4587      if(NextRow_FT()) \r
4588       {\r
4589        return;\r
4590       }\r
4591     }\r
4592    return;\r
4593   }\r
4594 \r
4595 #endif\r
4596 \r
4597  for (i=ymin;i<=ymax;i++)\r
4598   {\r
4599    xmin=(left_x >> 16);\r
4600    xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!\r
4601    if(drawW<xmax) xmax=drawW;\r
4602 \r
4603    if(xmax>=xmin)\r
4604     {\r
4605      posX=left_u;\r
4606      posY=left_v;\r
4607 \r
4608      if(xmin<drawX)\r
4609       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4610 \r
4611      for(j=xmin;j<xmax;j+=2)\r
4612       {\r
4613        GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],\r
4614             (((int)psxVuw[((((posY+difY)>>16)+GlobalTextAddrY)<<10)+((posX+difX)>>16)+GlobalTextAddrX])<<16)|\r
4615             psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+((posX)>>16)+GlobalTextAddrX]);\r
4616 \r
4617        posX+=difX2;\r
4618        posY+=difY2;\r
4619       }\r
4620      if(j==xmax)\r
4621        GetTextureTransColG(&psxVuw[(i<<10)+j],\r
4622            psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX]);\r
4623     }\r
4624    if(NextRow_FT()) \r
4625     {\r
4626      return;\r
4627     }\r
4628   }\r
4629 }\r
4630 \r
4631 ////////////////////////////////////////////////////////////////////////\r
4632 \r
4633 void drawPoly3TD_TW(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3)\r
4634 {\r
4635  int i,j,xmin,xmax,ymin,ymax;\r
4636  int difX, difY,difX2, difY2;\r
4637  int posX,posY;\r
4638 \r
4639  if(x1>drawW && x2>drawW && x3>drawW) return;\r
4640  if(y1>drawH && y2>drawH && y3>drawH) return;\r
4641  if(x1<drawX && x2<drawX && x3<drawX) return;\r
4642  if(y1<drawY && y2<drawY && y3<drawY) return;\r
4643  if(drawY>=drawH) return;\r
4644  if(drawX>=drawW) return; \r
4645                      \r
4646  if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;\r
4647 \r
4648  ymax=Ymax;\r
4649 \r
4650  for(ymin=Ymin;ymin<drawY;ymin++)\r
4651   if(NextRow_FT()) return;\r
4652 \r
4653  difX=delta_right_u;difX2=difX<<1;\r
4654  difY=delta_right_v;difY2=difY<<1;\r
4655 \r
4656 #ifdef FASTSOLID\r
4657 \r
4658  if(!bCheckMask && !DrawSemiTrans)\r
4659   {\r
4660    for (i=ymin;i<=ymax;i++)\r
4661     {\r
4662      xmin=(left_x >> 16);\r
4663      xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!\r
4664      if(drawW<xmax) xmax=drawW;\r
4665 \r
4666      if(xmax>=xmin)\r
4667       {\r
4668        posX=left_u;\r
4669        posY=left_v;\r
4670 \r
4671        if(xmin<drawX)\r
4672         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4673 \r
4674        for(j=xmin;j<xmax;j+=2)\r
4675         {\r
4676          GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
4677               (((int)psxVuw[(((((posY+difY)>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+\r
4678               (((posX+difX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0])<<16)|\r
4679               psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+\r
4680                      (((posX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);\r
4681 \r
4682          posX+=difX2;\r
4683          posY+=difY2;\r
4684         }\r
4685        if(j==xmax)\r
4686          GetTextureTransColG_S(&psxVuw[(i<<10)+j],\r
4687              psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+\r
4688                     ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);\r
4689       }\r
4690      if(NextRow_FT()) \r
4691       {\r
4692        return;\r
4693       }\r
4694     }\r
4695    return;\r
4696   }\r
4697 \r
4698 #endif\r
4699 \r
4700  for (i=ymin;i<=ymax;i++)\r
4701   {\r
4702    xmin=(left_x >> 16);\r
4703    xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!\r
4704    if(drawW<xmax) xmax=drawW;\r
4705 \r
4706    if(xmax>=xmin)\r
4707     {\r
4708      posX=left_u;\r
4709      posY=left_v;\r
4710 \r
4711      if(xmin<drawX)\r
4712       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4713 \r
4714      for(j=xmin;j<xmax;j+=2)\r
4715       {\r
4716        GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],\r
4717             (((int)psxVuw[(((((posY+difY)>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+\r
4718             (((posX+difX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0])<<16)|\r
4719             psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+\r
4720                    (((posX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);\r
4721 \r
4722        posX+=difX2;\r
4723        posY+=difY2;\r
4724       }\r
4725      if(j==xmax)\r
4726        GetTextureTransColG(&psxVuw[(i<<10)+j],\r
4727            psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+\r
4728                   ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);\r
4729     }\r
4730    if(NextRow_FT()) \r
4731     {\r
4732      return;\r
4733     }\r
4734   }\r
4735 }\r
4736 \r
4737 \r
4738 ////////////////////////////////////////////////////////////////////////\r
4739 \r
4740 #ifdef POLYQUAD3\r
4741 \r
4742 void drawPoly4TD_TRI(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4)\r
4743 {\r
4744  drawPoly3TD(x2,y2,x3,y3,x4,y4,\r
4745             tx2,ty2,tx3,ty3,tx4,ty4);\r
4746  drawPoly3TD(x1,y1,x2,y2,x4,y4,\r
4747             tx1,ty1,tx2,ty2,tx4,ty4);\r
4748 }\r
4749 \r
4750 #endif\r
4751 \r
4752 // more exact:\r
4753 \r
4754 void drawPoly4TD(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4)\r
4755 {\r
4756  int num; \r
4757  int i,j,xmin,xmax,ymin,ymax;\r
4758  int difX, difY, difX2, difY2;\r
4759  int posX,posY;\r
4760 \r
4761  if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;\r
4762  if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;\r
4763  if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;\r
4764  if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;\r
4765  if(drawY>=drawH) return;\r
4766  if(drawX>=drawW) return; \r
4767 \r
4768  if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;\r
4769 \r
4770  ymax=Ymax;\r
4771 \r
4772  for(ymin=Ymin;ymin<drawY;ymin++)\r
4773   if(NextRow_FT4()) return;\r
4774 \r
4775 #ifdef FASTSOLID\r
4776 \r
4777  if(!bCheckMask && !DrawSemiTrans)\r
4778   {\r
4779    for (i=ymin;i<=ymax;i++)\r
4780     {\r
4781      xmin=(left_x >> 16);\r
4782      xmax=(right_x >> 16);\r
4783 \r
4784      if(xmax>=xmin)\r
4785       {\r
4786        posX=left_u;\r
4787        posY=left_v;\r
4788 \r
4789        num=(xmax-xmin);\r
4790        if(num==0) num=1;\r
4791        difX=(right_u-posX)/num;\r
4792        difY=(right_v-posY)/num;\r
4793        difX2=difX<<1;\r
4794        difY2=difY<<1;\r
4795 \r
4796        if(xmin<drawX)\r
4797         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4798        xmax--;if(drawW<xmax) xmax=drawW;\r
4799 \r
4800        for(j=xmin;j<xmax;j+=2)\r
4801         {\r
4802          GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
4803               (((int)psxVuw[((((posY+difY)>>16)+GlobalTextAddrY)<<10)+((posX+difX)>>16)+GlobalTextAddrX])<<16)|\r
4804               psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+((posX)>>16)+GlobalTextAddrX]);\r
4805 \r
4806          posX+=difX2;\r
4807          posY+=difY2;\r
4808         }\r
4809        if(j==xmax)\r
4810         GetTextureTransColG_S(&psxVuw[(i<<10)+j],\r
4811            psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX]);\r
4812       }\r
4813      if(NextRow_FT4()) return;\r
4814     }\r
4815    return;\r
4816   }\r
4817 \r
4818 #endif\r
4819 \r
4820  for (i=ymin;i<=ymax;i++)\r
4821   {\r
4822    xmin=(left_x >> 16);\r
4823    xmax=(right_x >> 16);\r
4824 \r
4825    if(xmax>=xmin)\r
4826     {\r
4827      posX=left_u;\r
4828      posY=left_v;\r
4829 \r
4830      num=(xmax-xmin);\r
4831      if(num==0) num=1;\r
4832      difX=(right_u-posX)/num;\r
4833      difY=(right_v-posY)/num;\r
4834      difX2=difX<<1;\r
4835      difY2=difY<<1;\r
4836 \r
4837      if(xmin<drawX)\r
4838       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4839      xmax--;if(drawW<xmax) xmax=drawW;\r
4840 \r
4841      for(j=xmin;j<xmax;j+=2)\r
4842       {\r
4843        GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],\r
4844             (((int)psxVuw[((((posY+difY)>>16)+GlobalTextAddrY)<<10)+((posX+difX)>>16)+GlobalTextAddrX])<<16)|\r
4845             psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+((posX)>>16)+GlobalTextAddrX]);\r
4846 \r
4847        posX+=difX2;\r
4848        posY+=difY2;\r
4849       }\r
4850      if(j==xmax)\r
4851       GetTextureTransColG(&psxVuw[(i<<10)+j],\r
4852          psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX]);\r
4853     }\r
4854    if(NextRow_FT4()) return;\r
4855   }\r
4856 }\r
4857 \r
4858 ////////////////////////////////////////////////////////////////////////\r
4859 \r
4860 void drawPoly4TD_TW(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4)\r
4861 {\r
4862  int num; \r
4863  int i,j,xmin,xmax,ymin,ymax;\r
4864  int difX, difY, difX2, difY2;\r
4865  int posX,posY;\r
4866 \r
4867  if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;\r
4868  if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;\r
4869  if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;\r
4870  if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;\r
4871  if(drawY>=drawH) return;\r
4872  if(drawX>=drawW) return; \r
4873 \r
4874  if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;\r
4875 \r
4876  ymax=Ymax;\r
4877 \r
4878  for(ymin=Ymin;ymin<drawY;ymin++)\r
4879   if(NextRow_FT4()) return;\r
4880 \r
4881 #ifdef FASTSOLID\r
4882 \r
4883  if(!bCheckMask && !DrawSemiTrans)\r
4884   {\r
4885    for (i=ymin;i<=ymax;i++)\r
4886     {\r
4887      xmin=(left_x >> 16);\r
4888      xmax=(right_x >> 16);\r
4889 \r
4890      if(xmax>=xmin)\r
4891       {\r
4892        posX=left_u;\r
4893        posY=left_v;\r
4894 \r
4895        num=(xmax-xmin);\r
4896        if(num==0) num=1;\r
4897        difX=(right_u-posX)/num;\r
4898        difY=(right_v-posY)/num;\r
4899        difX2=difX<<1;\r
4900        difY2=difY<<1;\r
4901 \r
4902        if(xmin<drawX)\r
4903         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4904        xmax--;if(drawW<xmax) xmax=drawW;\r
4905 \r
4906        for(j=xmin;j<xmax;j+=2)\r
4907         {\r
4908          GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
4909               (((int)psxVuw[(((((posY+difY)>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+\r
4910                              (((posX+difX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0])<<16)|\r
4911               psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY)<<10)+TWin.Position.y0+\r
4912                      ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);\r
4913 \r
4914          posX+=difX2;\r
4915          posY+=difY2;\r
4916         }\r
4917        if(j==xmax)\r
4918         GetTextureTransColG_S(&psxVuw[(i<<10)+j],\r
4919            psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+\r
4920                   ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);\r
4921       }\r
4922      if(NextRow_FT4()) return;\r
4923     }\r
4924    return;\r
4925   }\r
4926 \r
4927 #endif\r
4928 \r
4929  for (i=ymin;i<=ymax;i++)\r
4930   {\r
4931    xmin=(left_x >> 16);\r
4932    xmax=(right_x >> 16);\r
4933 \r
4934    if(xmax>=xmin)\r
4935     {\r
4936      posX=left_u;\r
4937      posY=left_v;\r
4938 \r
4939      num=(xmax-xmin);\r
4940      if(num==0) num=1;\r
4941      difX=(right_u-posX)/num;\r
4942      difY=(right_v-posY)/num;\r
4943      difX2=difX<<1;\r
4944      difY2=difY<<1;\r
4945 \r
4946      if(xmin<drawX)\r
4947       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4948      xmax--;if(drawW<xmax) xmax=drawW;\r
4949 \r
4950      for(j=xmin;j<xmax;j+=2)\r
4951       {\r
4952        GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],\r
4953             (((int)psxVuw[(((((posY+difY)>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+\r
4954                            (((posX+difX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0])<<16)|\r
4955             psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+\r
4956                    ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);\r
4957 \r
4958        posX+=difX2;\r
4959        posY+=difY2;\r
4960       }\r
4961      if(j==xmax)\r
4962       GetTextureTransColG(&psxVuw[(i<<10)+j],\r
4963          psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+\r
4964                 ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);\r
4965     }\r
4966    if(NextRow_FT4()) return;\r
4967   }\r
4968 }\r
4969 \r
4970 ////////////////////////////////////////////////////////////////////////\r
4971 \r
4972 void drawPoly4TD_TW_S(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4)\r
4973 {\r
4974  int num; \r
4975  int i,j,xmin,xmax,ymin,ymax;\r
4976  int difX, difY, difX2, difY2;\r
4977  int posX, posY;\r
4978 \r
4979  if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;\r
4980  if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;\r
4981  if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;\r
4982  if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;\r
4983  if(drawY>=drawH) return;\r
4984  if(drawX>=drawW) return; \r
4985 \r
4986  if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;\r
4987 \r
4988  ymax=Ymax;\r
4989 \r
4990  for(ymin=Ymin;ymin<drawY;ymin++)\r
4991   if(NextRow_FT4()) return;\r
4992 \r
4993 #ifdef FASTSOLID\r
4994 \r
4995  if(!bCheckMask && !DrawSemiTrans)\r
4996   {\r
4997    for (i=ymin;i<=ymax;i++)\r
4998     {\r
4999      xmin=(left_x >> 16);\r
5000      xmax=(right_x >> 16);\r
5001 \r
5002      if(xmax>=xmin)\r
5003       {\r
5004        posX=left_u;\r
5005        posY=left_v;\r
5006 \r
5007        num=(xmax-xmin);\r
5008        if(num==0) num=1;\r
5009        difX=(right_u-posX)/num;\r
5010        difY=(right_v-posY)/num;\r
5011        difX2=difX<<1;\r
5012        difY2=difY<<1;\r
5013 \r
5014        if(xmin<drawX)\r
5015         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
5016        xmax--;if(drawW<xmax) xmax=drawW;\r
5017 \r
5018        for(j=xmin;j<xmax;j+=2)\r
5019         {\r
5020          GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
5021               (((int)psxVuw[(((((posY+difY)>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+\r
5022                              (((posX+difX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0])<<16)|\r
5023               psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY)<<10)+TWin.Position.y0+\r
5024                      ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);\r
5025 \r
5026          posX+=difX2;\r
5027          posY+=difY2;\r
5028         }\r
5029        if(j==xmax)\r
5030         GetTextureTransColG_S(&psxVuw[(i<<10)+j],\r
5031            psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+\r
5032                   ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);\r
5033       }\r
5034      if(NextRow_FT4()) return;\r
5035     }\r
5036    return;\r
5037   }\r
5038 \r
5039 #endif\r
5040 \r
5041  for (i=ymin;i<=ymax;i++)\r
5042   {\r
5043    xmin=(left_x >> 16);\r
5044    xmax=(right_x >> 16);\r
5045 \r
5046    if(xmax>=xmin)\r
5047     {\r
5048      posX=left_u;\r
5049      posY=left_v;\r
5050 \r
5051      num=(xmax-xmin);\r
5052      if(num==0) num=1;\r
5053      difX=(right_u-posX)/num;\r
5054      difY=(right_v-posY)/num;\r
5055      difX2=difX<<1;\r
5056      difY2=difY<<1;\r
5057 \r
5058      if(xmin<drawX)\r
5059       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
5060      xmax--;if(drawW<xmax) xmax=drawW;\r
5061 \r
5062      for(j=xmin;j<xmax;j+=2)\r
5063       {\r
5064        GetTextureTransColG32_SPR((uint32_t *)&psxVuw[(i<<10)+j],\r
5065             (((int)psxVuw[(((((posY+difY)>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+\r
5066                            (((posX+difX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0])<<16)|\r
5067             psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+\r
5068                    ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);\r
5069 \r
5070        posX+=difX2;\r
5071        posY+=difY2;\r
5072       }\r
5073      if(j==xmax)\r
5074       GetTextureTransColG_SPR(&psxVuw[(i<<10)+j],\r
5075          psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+\r
5076                 ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);\r
5077     }\r
5078    if(NextRow_FT4()) return;\r
5079   }\r
5080 }\r
5081 \r
5082 ////////////////////////////////////////////////////////////////////////\r
5083 // POLY 3/4 G-SHADED\r
5084 ////////////////////////////////////////////////////////////////////////\r
5085  \r
5086 __inline void drawPoly3Gi(short x1,short y1,short x2,short y2,short x3,short y3, int rgb1, int rgb2, int rgb3)\r
5087 {\r
5088  int i,j,xmin,xmax,ymin,ymax;\r
5089  int cR1,cG1,cB1;\r
5090  int difR,difB,difG,difR2,difB2,difG2;\r
5091 \r
5092  if(x1>drawW && x2>drawW && x3>drawW) return;\r
5093  if(y1>drawH && y2>drawH && y3>drawH) return;\r
5094  if(x1<drawX && x2<drawX && x3<drawX) return;\r
5095  if(y1<drawY && y2<drawY && y3<drawY) return;\r
5096  if(drawY>=drawH) return;\r
5097  if(drawX>=drawW) return; \r
5098 \r
5099  if(!SetupSections_G(x1,y1,x2,y2,x3,y3,rgb1,rgb2,rgb3)) return;\r
5100 \r
5101  ymax=Ymax;\r
5102 \r
5103  for(ymin=Ymin;ymin<drawY;ymin++)\r
5104   if(NextRow_G()) return;\r
5105 \r
5106  difR=delta_right_R;\r
5107  difG=delta_right_G;\r
5108  difB=delta_right_B;\r
5109  difR2=difR<<1;\r
5110  difG2=difG<<1;\r
5111  difB2=difB<<1;\r
5112 \r
5113 #ifdef FASTSOLID\r
5114 \r
5115  if(!bCheckMask && !DrawSemiTrans && iDither!=2)\r
5116   {\r
5117    for (i=ymin;i<=ymax;i++)\r
5118     {\r
5119      xmin=(left_x >> 16);\r
5120      xmax=(right_x >> 16)-1;if(drawW<xmax) xmax=drawW;\r
5121 \r
5122      if(xmax>=xmin)\r
5123       {\r
5124        cR1=left_R;\r
5125        cG1=left_G;\r
5126        cB1=left_B;\r
5127 \r
5128        if(xmin<drawX)\r
5129         {j=drawX-xmin;xmin=drawX;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
5130 \r
5131        for(j=xmin;j<xmax;j+=2) \r
5132         {\r
5133          *((uint32_t *)&psxVuw[(i<<10)+j])=\r
5134             ((((cR1+difR) <<7)&0x7c000000)|(((cG1+difG) << 2)&0x03e00000)|(((cB1+difB)>>3)&0x001f0000)|\r
5135              (((cR1) >> 9)&0x7c00)|(((cG1) >> 14)&0x03e0)|(((cB1) >> 19)&0x001f))|lSetMask;\r
5136    \r
5137          cR1+=difR2;\r
5138          cG1+=difG2;\r
5139          cB1+=difB2;\r
5140         }\r
5141        if(j==xmax)\r
5142         psxVuw[(i<<10)+j]=(((cR1 >> 9)&0x7c00)|((cG1 >> 14)&0x03e0)|((cB1 >> 19)&0x001f))|sSetMask;\r
5143       }\r
5144      if(NextRow_G()) return;\r
5145     }\r
5146    return;\r
5147   }\r
5148 \r
5149 #endif\r
5150 \r
5151  if(iDither==2)\r
5152  for (i=ymin;i<=ymax;i++)\r
5153   {\r
5154    xmin=(left_x >> 16);\r
5155    xmax=(right_x >> 16)-1;if(drawW<xmax) xmax=drawW;\r
5156 \r
5157    if(xmax>=xmin)\r
5158     {\r
5159      cR1=left_R;\r
5160      cG1=left_G;\r
5161      cB1=left_B;\r
5162 \r
5163      if(xmin<drawX)\r
5164       {j=drawX-xmin;xmin=drawX;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
5165 \r
5166      for(j=xmin;j<=xmax;j++) \r
5167       {\r
5168        GetShadeTransCol_Dither(&psxVuw[(i<<10)+j],(cB1>>16),(cG1>>16),(cR1>>16));\r
5169 \r
5170        cR1+=difR;\r
5171        cG1+=difG;\r
5172        cB1+=difB;\r
5173       }\r
5174     }\r
5175    if(NextRow_G()) return;\r
5176   }\r
5177  else\r
5178  for (i=ymin;i<=ymax;i++)\r
5179   {\r
5180    xmin=(left_x >> 16);\r
5181    xmax=(right_x >> 16)-1;if(drawW<xmax) xmax=drawW;\r
5182 \r
5183    if(xmax>=xmin)\r
5184     {\r
5185      cR1=left_R;\r
5186      cG1=left_G;\r
5187      cB1=left_B;\r
5188 \r
5189      if(xmin<drawX)\r
5190       {j=drawX-xmin;xmin=drawX;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
5191 \r
5192      for(j=xmin;j<=xmax;j++) \r
5193       {\r
5194        GetShadeTransCol(&psxVuw[(i<<10)+j],((cR1 >> 9)&0x7c00)|((cG1 >> 14)&0x03e0)|((cB1 >> 19)&0x001f));\r
5195 \r
5196        cR1+=difR;\r
5197        cG1+=difG;\r
5198        cB1+=difB;\r
5199       }\r
5200     }\r
5201    if(NextRow_G()) return;\r
5202   }\r
5203 \r
5204 }\r
5205 \r
5206 ////////////////////////////////////////////////////////////////////////\r
5207 \r
5208 void drawPoly3G(int rgb1, int rgb2, int rgb3)\r
5209 {\r
5210  drawPoly3Gi(lx0,ly0,lx1,ly1,lx2,ly2,rgb1,rgb2,rgb3);\r
5211 }\r
5212 \r
5213 // draw two g-shaded tris for right psx shading emulation\r
5214 \r
5215 void drawPoly4G(int rgb1, int rgb2, int rgb3, int rgb4)\r
5216 {\r
5217  drawPoly3Gi(lx1,ly1,lx3,ly3,lx2,ly2,\r
5218              rgb2,rgb4,rgb3);\r
5219  drawPoly3Gi(lx0,ly0,lx1,ly1,lx2,ly2,\r
5220              rgb1,rgb2,rgb3);\r
5221 }\r
5222 \r
5223 ////////////////////////////////////////////////////////////////////////\r
5224 // POLY 3/4 G-SHADED TEX PAL4\r
5225 ////////////////////////////////////////////////////////////////////////\r
5226 \r
5227 void drawPoly3TGEx4(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short clX, short clY,int col1, int col2, int col3)\r
5228 {\r
5229  int i,j,xmin,xmax,ymin,ymax;\r
5230  int cR1,cG1,cB1;\r
5231  int difR,difB,difG,difR2,difB2,difG2;\r
5232  int difX, difY,difX2, difY2;\r
5233  int posX,posY,YAdjust,clutP,XAdjust;\r
5234  short tC1,tC2;\r
5235 \r
5236  if(x1>drawW && x2>drawW && x3>drawW) return;\r
5237  if(y1>drawH && y2>drawH && y3>drawH) return;\r
5238  if(x1<drawX && x2<drawX && x3<drawX) return;\r
5239  if(y1<drawY && y2<drawY && y3<drawY) return;\r
5240  if(drawY>=drawH) return;\r
5241  if(drawX>=drawW) return; \r
5242 \r
5243  if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;\r
5244 \r
5245  ymax=Ymax;\r
5246 \r
5247  for(ymin=Ymin;ymin<drawY;ymin++)\r
5248   if(NextRow_GT()) return;\r
5249 \r
5250  clutP=(clY<<10)+clX;\r
5251 \r
5252  YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
5253 \r
5254  difR=delta_right_R;\r
5255  difG=delta_right_G;\r
5256  difB=delta_right_B;\r
5257  difR2=difR<<1;\r
5258  difG2=difG<<1;\r
5259  difB2=difB<<1;\r
5260 \r
5261  difX=delta_right_u;difX2=difX<<1;\r
5262  difY=delta_right_v;difY2=difY<<1;\r
5263 \r
5264 #ifdef FASTSOLID\r
5265 \r
5266  if(!bCheckMask && !DrawSemiTrans && !iDither)\r
5267   {\r
5268    for (i=ymin;i<=ymax;i++)\r
5269     {\r
5270      xmin=((left_x) >> 16);\r
5271      xmax=((right_x) >> 16)-1; //!!!!!!!!!!!!!\r
5272      if(drawW<xmax) xmax=drawW;\r
5273 \r
5274      if(xmax>=xmin)\r
5275       {\r
5276        posX=left_u;\r
5277        posY=left_v;\r
5278        cR1=left_R;\r
5279        cG1=left_G;\r
5280        cB1=left_B;\r
5281 \r
5282        if(xmin<drawX)\r
5283         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
5284 \r
5285        for(j=xmin;j<xmax;j+=2) \r
5286         {\r
5287          XAdjust=(posX>>16);\r
5288          tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(XAdjust>>1)];\r
5289          tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
5290          XAdjust=((posX+difX)>>16);\r
5291          tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+\r
5292                       (XAdjust>>1)];\r
5293          tC2=(tC2>>((XAdjust&1)<<2))&0xf;\r
5294 \r
5295          GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
5296                psxVuw[clutP+tC1]|\r
5297                ((int)psxVuw[clutP+tC2])<<16,\r
5298                (cB1>>16)|((cB1+difB)&0xff0000),\r
5299                (cG1>>16)|((cG1+difG)&0xff0000),\r
5300                (cR1>>16)|((cR1+difR)&0xff0000));\r
5301          posX+=difX2;\r
5302          posY+=difY2;\r
5303          cR1+=difR2;\r
5304          cG1+=difG2;\r
5305          cB1+=difB2;\r
5306         }\r
5307        if(j==xmax)\r
5308         {\r
5309          XAdjust=(posX>>16);\r
5310          tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(XAdjust>>1)];\r
5311          tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
5312          GetTextureTransColGX_S(&psxVuw[(i<<10)+j], \r
5313               psxVuw[clutP+tC1],\r
5314               (cB1>>16),(cG1>>16),(cR1>>16));\r
5315         }\r
5316       }\r
5317      if(NextRow_GT()) \r
5318       {\r
5319        return;\r
5320       }\r
5321     }\r
5322    return;\r
5323   }\r
5324 \r
5325 #endif\r
5326 \r
5327  for (i=ymin;i<=ymax;i++)\r
5328   {\r
5329    xmin=(left_x >> 16);\r
5330    xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!\r
5331    if(drawW<xmax) xmax=drawW;\r
5332 \r
5333    if(xmax>=xmin)\r
5334     {\r
5335      posX=left_u;\r
5336      posY=left_v;\r
5337      cR1=left_R;\r
5338      cG1=left_G;\r
5339      cB1=left_B;\r
5340 \r
5341      if(xmin<drawX)\r
5342       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
5343 \r
5344      for(j=xmin;j<=xmax;j++) \r
5345       {\r
5346        XAdjust=(posX>>16);\r
5347        tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(XAdjust>>1)];\r
5348        tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
5349        if(iDither)\r
5350         GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j], \r
5351             psxVuw[clutP+tC1],\r
5352             (cB1>>16),(cG1>>16),(cR1>>16));\r
5353        else\r
5354         GetTextureTransColGX(&psxVuw[(i<<10)+j], \r
5355             psxVuw[clutP+tC1],\r
5356             (cB1>>16),(cG1>>16),(cR1>>16));\r
5357        posX+=difX;\r
5358        posY+=difY;\r
5359        cR1+=difR;\r
5360        cG1+=difG;\r
5361        cB1+=difB;\r
5362       }\r
5363     }\r
5364    if(NextRow_GT()) \r
5365     {\r
5366      return;\r
5367     }\r
5368   }\r
5369 }\r
5370 \r
5371 ////////////////////////////////////////////////////////////////////////\r
5372 \r
5373 void drawPoly3TGEx4_IL(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short clX, short clY,int col1, int col2, int col3)\r
5374 {\r
5375  int i,j,xmin,xmax,ymin,ymax,n_xi,n_yi,TXV;\r
5376  int cR1,cG1,cB1;\r
5377  int difR,difB,difG,difR2,difB2,difG2;\r
5378  int difX, difY,difX2, difY2;\r
5379  int posX,posY,YAdjust,clutP,XAdjust;\r
5380  short tC1,tC2;\r
5381 \r
5382  if(x1>drawW && x2>drawW && x3>drawW) return;\r
5383  if(y1>drawH && y2>drawH && y3>drawH) return;\r
5384  if(x1<drawX && x2<drawX && x3<drawX) return;\r
5385  if(y1<drawY && y2<drawY && y3<drawY) return;\r
5386  if(drawY>=drawH) return;\r
5387  if(drawX>=drawW) return; \r
5388 \r
5389  if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;\r
5390 \r
5391  ymax=Ymax;\r
5392 \r
5393  for(ymin=Ymin;ymin<drawY;ymin++)\r
5394   if(NextRow_GT()) return;\r
5395 \r
5396  clutP=(clY<<10)+clX;\r
5397 \r
5398  YAdjust=(GlobalTextAddrY<<10)+GlobalTextAddrX;\r
5399 \r
5400  difR=delta_right_R;\r
5401  difG=delta_right_G;\r
5402  difB=delta_right_B;\r
5403  difR2=difR<<1;\r
5404  difG2=difG<<1;\r
5405  difB2=difB<<1;\r
5406 \r
5407  difX=delta_right_u;difX2=difX<<1;\r
5408  difY=delta_right_v;difY2=difY<<1;\r
5409 \r
5410 #ifdef FASTSOLID\r
5411 \r
5412  if(!bCheckMask && !DrawSemiTrans && !iDither)\r
5413   {\r
5414    for (i=ymin;i<=ymax;i++)\r
5415     {\r
5416      xmin=((left_x) >> 16);\r
5417      xmax=((right_x) >> 16)-1; //!!!!!!!!!!!!!\r
5418      if(drawW<xmax) xmax=drawW;\r
5419 \r
5420      if(xmax>=xmin)\r
5421       {\r
5422        posX=left_u;\r
5423        posY=left_v;\r
5424        cR1=left_R;\r
5425        cG1=left_G;\r
5426        cB1=left_B;\r
5427 \r
5428        if(xmin<drawX)\r
5429         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
5430 \r
5431        for(j=xmin;j<xmax;j+=2) \r
5432         {\r
5433          XAdjust=(posX>>16);\r
5434 \r
5435          TXV=posY>>16;\r
5436          n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );\r
5437          n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );\r
5438  \r
5439          tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
5440 \r
5441          XAdjust=((posX+difX)>>16);\r
5442 \r
5443          TXV=(posY+difY)>>16;\r
5444          n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );\r
5445          n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );\r
5446 \r
5447          tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
5448 \r
5449          GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
5450                psxVuw[clutP+tC1]|\r
5451                ((int)psxVuw[clutP+tC2])<<16,\r
5452                (cB1>>16)|((cB1+difB)&0xff0000),\r
5453                (cG1>>16)|((cG1+difG)&0xff0000),\r
5454                (cR1>>16)|((cR1+difR)&0xff0000));\r
5455          posX+=difX2;\r
5456          posY+=difY2;\r
5457          cR1+=difR2;\r
5458          cG1+=difG2;\r
5459          cB1+=difB2;\r
5460         }\r
5461        if(j==xmax)\r
5462         {\r
5463          XAdjust=(posX>>16);\r
5464 \r
5465          TXV=posY>>16;\r
5466          n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );\r
5467          n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );\r
5468 \r
5469          tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
5470 \r
5471          GetTextureTransColGX_S(&psxVuw[(i<<10)+j], \r
5472               psxVuw[clutP+tC1],\r
5473               (cB1>>16),(cG1>>16),(cR1>>16));\r
5474         }\r
5475       }\r
5476      if(NextRow_GT()) \r
5477       {\r
5478        return;\r
5479       }\r
5480     }\r
5481    return;\r
5482   }\r
5483 \r
5484 #endif\r
5485 \r
5486  for (i=ymin;i<=ymax;i++)\r
5487   {\r
5488    xmin=(left_x >> 16);\r
5489    xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!\r
5490    if(drawW<xmax) xmax=drawW;\r
5491 \r
5492    if(xmax>=xmin)\r
5493     {\r
5494      posX=left_u;\r
5495      posY=left_v;\r
5496      cR1=left_R;\r
5497      cG1=left_G;\r
5498      cB1=left_B;\r
5499 \r
5500      if(xmin<drawX)\r
5501       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
5502 \r
5503      for(j=xmin;j<=xmax;j++) \r
5504       {\r
5505        XAdjust=(posX>>16);\r
5506 \r
5507        TXV=posY>>16;\r
5508        n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );\r
5509        n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );\r
5510 \r
5511        tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
5512 \r
5513        if(iDither)\r
5514         GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j], \r
5515             psxVuw[clutP+tC1],\r
5516             (cB1>>16),(cG1>>16),(cR1>>16));\r
5517        else\r
5518         GetTextureTransColGX(&psxVuw[(i<<10)+j], \r
5519             psxVuw[clutP+tC1],\r
5520             (cB1>>16),(cG1>>16),(cR1>>16));\r
5521        posX+=difX;\r
5522        posY+=difY;\r
5523        cR1+=difR;\r
5524        cG1+=difG;\r
5525        cB1+=difB;\r
5526       }\r
5527     }\r
5528    if(NextRow_GT()) \r
5529     {\r
5530      return;\r
5531     }\r
5532   }\r
5533 }\r
5534 \r
5535 ////////////////////////////////////////////////////////////////////////\r
5536 \r
5537 void drawPoly3TGEx4_TW(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short clX, short clY, int col1, int col2, int col3)\r
5538 {\r
5539  int i, j, xmin, xmax, ymin, ymax;\r
5540  int cR1, cG1, cB1;\r
5541  int difR, difB, difG, difR2, difB2, difG2;\r
5542  int difX, difY,difX2, difY2;\r
5543  int posX, posY, YAdjust, clutP, XAdjust;\r
5544  short tC1,tC2;\r
5545 \r
5546  if(x1>drawW && x2>drawW && x3>drawW) return;\r
5547  if(y1>drawH && y2>drawH && y3>drawH) return;\r
5548  if(x1<drawX && x2<drawX && x3<drawX) return;\r
5549  if(y1<drawY && y2<drawY && y3<drawY) return;\r
5550  if(drawY>=drawH) return;\r
5551  if(drawX>=drawW) return; \r
5552 \r
5553  if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;\r
5554 \r
5555  ymax=Ymax;\r
5556 \r
5557  for(ymin=Ymin;ymin<drawY;ymin++)\r
5558   if(NextRow_GT()) return;\r
5559 \r
5560  clutP=(clY<<10)+clX;\r
5561 \r
5562  YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
5563  YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0>>1);\r
5564 \r
5565  difR=delta_right_R;\r
5566  difG=delta_right_G;\r
5567  difB=delta_right_B;\r
5568  difR2=difR<<1;\r
5569  difG2=difG<<1;\r
5570  difB2=difB<<1;\r
5571 \r
5572  difX=delta_right_u;difX2=difX<<1;\r
5573  difY=delta_right_v;difY2=difY<<1;\r
5574 \r
5575 #ifdef FASTSOLID\r
5576 \r
5577  if(!bCheckMask && !DrawSemiTrans && !iDither)\r
5578   {\r
5579    for (i=ymin;i<=ymax;i++)\r
5580     {\r
5581      xmin=((left_x) >> 16);\r
5582      xmax=((right_x) >> 16)-1; //!!!!!!!!!!!!!\r
5583      if(drawW<xmax) xmax=drawW;\r
5584 \r
5585      if(xmax>=xmin)\r
5586       {\r
5587        posX=left_u;\r
5588        posY=left_v;\r
5589        cR1=left_R;\r
5590        cG1=left_G;\r
5591        cB1=left_B;\r
5592 \r
5593        if(xmin<drawX)\r
5594         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
5595 \r
5596        for(j=xmin;j<xmax;j+=2) \r
5597         {\r
5598          XAdjust=(posX>>16)%TWin.Position.x1;\r
5599          tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+\r
5600                       YAdjust+(XAdjust>>1)];\r
5601          tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
5602          XAdjust=((posX+difX)>>16)%TWin.Position.x1;\r
5603          tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+\r
5604                       YAdjust+(XAdjust>>1)];\r
5605          tC2=(tC2>>((XAdjust&1)<<2))&0xf;\r
5606          GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
5607               psxVuw[clutP+tC1]|\r
5608               ((int)psxVuw[clutP+tC2])<<16,\r
5609               (cB1>>16)|((cB1+difB)&0xff0000),\r
5610               (cG1>>16)|((cG1+difG)&0xff0000),\r
5611               (cR1>>16)|((cR1+difR)&0xff0000));\r
5612          posX+=difX2;\r
5613          posY+=difY2;\r
5614          cR1+=difR2;\r
5615          cG1+=difG2;\r
5616          cB1+=difB2;\r
5617         }\r
5618        if(j==xmax)\r
5619         {\r
5620          XAdjust=(posX>>16)%TWin.Position.x1;\r
5621          tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+\r
5622                        YAdjust+(XAdjust>>1)];\r
5623          tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
5624          GetTextureTransColGX_S(&psxVuw[(i<<10)+j], \r
5625              psxVuw[clutP+tC1],\r
5626              (cB1>>16),(cG1>>16),(cR1>>16));\r
5627         }\r
5628       }\r
5629      if(NextRow_GT()) \r
5630       {\r
5631        return;\r
5632       }\r
5633     }\r
5634    return;\r
5635   }\r
5636 \r
5637 #endif\r
5638 \r
5639  for (i=ymin;i<=ymax;i++)\r
5640   {\r
5641    xmin=(left_x >> 16);\r
5642    xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!\r
5643    if(drawW<xmax) xmax=drawW;\r
5644 \r
5645    if(xmax>=xmin)\r
5646     {\r
5647      posX=left_u;\r
5648      posY=left_v;\r
5649      cR1=left_R;\r
5650      cG1=left_G;\r
5651      cB1=left_B;\r
5652 \r
5653      if(xmin<drawX)\r
5654       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
5655 \r
5656      for(j=xmin;j<=xmax;j++) \r
5657       {\r
5658        XAdjust=(posX>>16)%TWin.Position.x1;\r
5659        tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+\r
5660                     YAdjust+(XAdjust>>1)];\r
5661        tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
5662        if(iDither)\r
5663         GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j], \r
5664             psxVuw[clutP+tC1],\r
5665             (cB1>>16),(cG1>>16),(cR1>>16));\r
5666        else\r
5667         GetTextureTransColGX(&psxVuw[(i<<10)+j], \r
5668             psxVuw[clutP+tC1],\r
5669             (cB1>>16),(cG1>>16),(cR1>>16));\r
5670        posX+=difX;\r
5671        posY+=difY;\r
5672        cR1+=difR;\r
5673        cG1+=difG;\r
5674        cB1+=difB;\r
5675       }\r
5676     }\r
5677    if(NextRow_GT()) \r
5678     {\r
5679      return;\r
5680     }\r
5681   }\r
5682 }\r
5683 \r
5684 ////////////////////////////////////////////////////////////////////////\r
5685 \r
5686 // note: the psx is doing g-shaded quads as two g-shaded tris,\r
5687 // like the following func... sadly texturing is not 100%\r
5688 // correct that way, so small texture distortions can \r
5689 // happen... \r
5690 \r
5691 void drawPoly4TGEx4_TRI_IL(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, \r
5692                     short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4, \r
5693                     short clX, short clY,\r
5694                     int col1, int col2, int col3, int col4)\r
5695 {\r
5696  drawPoly3TGEx4_IL(x2,y2,x3,y3,x4,y4,\r
5697                    tx2,ty2,tx3,ty3,tx4,ty4,\r
5698                    clX,clY,\r
5699                    col2,col4,col3);\r
5700  drawPoly3TGEx4_IL(x1,y1,x2,y2,x4,y4,\r
5701                    tx1,ty1,tx2,ty2,tx4,ty4,\r
5702                    clX,clY,\r
5703                    col1,col2,col3);\r
5704 }\r
5705 \r
5706 #ifdef POLYQUAD3GT\r
5707 \r
5708 void drawPoly4TGEx4_TRI(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, \r
5709                     short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4, \r
5710                     short clX, short clY,\r
5711                     int col1, int col2, int col3, int col4)\r
5712 {\r
5713  drawPoly3TGEx4(x2,y2,x3,y3,x4,y4,\r
5714                 tx2,ty2,tx3,ty3,tx4,ty4,\r
5715                 clX,clY,\r
5716                 col2,col4,col3);\r
5717  drawPoly3TGEx4(x1,y1,x2,y2,x4,y4,\r
5718                 tx1,ty1,tx2,ty2,tx4,ty4,\r
5719                 clX,clY,\r
5720                 col1,col2,col3);\r
5721 }\r
5722 \r
5723 #endif\r
5724                \r
5725 ////////////////////////////////////////////////////////////////////////\r
5726 \r
5727 void drawPoly4TGEx4(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, \r
5728                     short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4, \r
5729                     short clX, short clY,\r
5730                     int col1, int col2, int col4, int col3)\r
5731 {\r
5732  int num; \r
5733  int i,j,xmin,xmax,ymin,ymax;\r
5734  int cR1,cG1,cB1;\r
5735  int difR,difB,difG,difR2,difB2,difG2;\r
5736  int difX, difY, difX2, difY2;\r
5737  int posX,posY,YAdjust,clutP,XAdjust;\r
5738  short tC1,tC2;\r
5739 \r
5740  if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;\r
5741  if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;\r
5742  if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;\r
5743  if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;\r
5744  if(drawY>=drawH) return;\r
5745  if(drawX>=drawW) return; \r
5746 \r
5747  if(!SetupSections_GT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4,col1,col2,col3,col4)) return;\r
5748 \r
5749  ymax=Ymax;\r
5750 \r
5751  for(ymin=Ymin;ymin<drawY;ymin++)\r
5752   if(NextRow_GT4()) return;\r
5753 \r
5754  clutP=(clY<<10)+clX;\r
5755 \r
5756  YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
5757 \r
5758 \r
5759 #ifdef FASTSOLID\r
5760 \r
5761  if(!bCheckMask && !DrawSemiTrans && !iDither)\r
5762   {\r
5763    for (i=ymin;i<=ymax;i++)\r
5764     {\r
5765      xmin=(left_x >> 16);\r
5766      xmax=(right_x >> 16);\r
5767 \r
5768      if(xmax>=xmin)\r
5769       {\r
5770        posX=left_u;\r
5771        posY=left_v;\r
5772 \r
5773        num=(xmax-xmin);\r
5774        if(num==0) num=1;\r
5775        difX=(right_u-posX)/num;\r
5776        difY=(right_v-posY)/num;\r
5777        difX2=difX<<1;\r
5778        difY2=difY<<1;\r
5779 \r
5780        cR1=left_R;\r
5781        cG1=left_G;\r
5782        cB1=left_B;\r
5783        difR=(right_R-cR1)/num;\r
5784        difG=(right_G-cG1)/num;\r
5785        difB=(right_B-cB1)/num;\r
5786        difR2=difR<<1;\r
5787        difG2=difG<<1;\r
5788        difB2=difB<<1;\r
5789 \r
5790        if(xmin<drawX)\r
5791         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
5792        xmax--;if(drawW<xmax) xmax=drawW;\r
5793 \r
5794        for(j=xmin;j<xmax;j+=2)\r
5795         {\r
5796          XAdjust=(posX>>16);\r
5797          tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(XAdjust>>1)];\r
5798          tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
5799          XAdjust=((posX+difX)>>16);\r
5800          tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+\r
5801                        (XAdjust>>1)];\r
5802          tC2=(tC2>>((XAdjust&1)<<2))&0xf;\r
5803 \r
5804          GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
5805               psxVuw[clutP+tC1]|\r
5806               ((int)psxVuw[clutP+tC2])<<16,\r
5807               (cB1>>16)|((cB1+difB)&0xff0000),\r
5808               (cG1>>16)|((cG1+difG)&0xff0000),\r
5809               (cR1>>16)|((cR1+difR)&0xff0000));\r
5810          posX+=difX2;\r
5811          posY+=difY2;\r
5812          cR1+=difR2;\r
5813          cG1+=difG2;\r
5814          cB1+=difB2;\r
5815         }\r
5816        if(j==xmax)\r
5817         {\r
5818          XAdjust=(posX>>16);\r
5819          tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+\r
5820                       (XAdjust>>1)];\r
5821          tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
5822 \r
5823          GetTextureTransColGX_S(&psxVuw[(i<<10)+j], \r
5824              psxVuw[clutP+tC1],\r
5825              (cB1>>16),(cG1>>16),(cR1>>16));\r
5826         }\r
5827       }\r
5828      if(NextRow_GT4()) return;\r
5829     }\r
5830    return;\r
5831   }\r
5832 \r
5833 #endif\r
5834 \r
5835  for (i=ymin;i<=ymax;i++)\r
5836   {\r
5837    xmin=(left_x >> 16);\r
5838    xmax=(right_x >> 16);\r
5839 \r
5840    if(xmax>=xmin)\r
5841     {\r
5842      posX=left_u;\r
5843      posY=left_v;\r
5844 \r
5845      num=(xmax-xmin);\r
5846      if(num==0) num=1;\r
5847      difX=(right_u-posX)/num;\r
5848      difY=(right_v-posY)/num;\r
5849      difX2=difX<<1;\r
5850      difY2=difY<<1;\r
5851 \r
5852      cR1=left_R;\r
5853      cG1=left_G;\r
5854      cB1=left_B;\r
5855      difR=(right_R-cR1)/num;\r
5856      difG=(right_G-cG1)/num;\r
5857      difB=(right_B-cB1)/num;\r
5858      difR2=difR<<1;\r
5859      difG2=difG<<1;\r
5860      difB2=difB<<1;\r
5861 \r
5862      if(xmin<drawX)\r
5863       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
5864      xmax--;if(drawW<xmax) xmax=drawW;\r
5865 \r
5866      for(j=xmin;j<=xmax;j++)\r
5867       {\r
5868        XAdjust=(posX>>16);\r
5869        tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+\r
5870                     (XAdjust>>1)];\r
5871        tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
5872        if(iDither)\r
5873         GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j], \r
5874            psxVuw[clutP+tC1],\r
5875            (cB1>>16),(cG1>>16),(cR1>>16));\r
5876        else\r
5877         GetTextureTransColGX(&psxVuw[(i<<10)+j], \r
5878            psxVuw[clutP+tC1],\r
5879            (cB1>>16),(cG1>>16),(cR1>>16));\r
5880        posX+=difX;\r
5881        posY+=difY;\r
5882        cR1+=difR;\r
5883        cG1+=difG;\r
5884        cB1+=difB;\r
5885       }\r
5886     }\r
5887    if(NextRow_GT4()) return;\r
5888   }\r
5889 }\r
5890 \r
5891 ////////////////////////////////////////////////////////////////////////\r
5892 \r
5893 void drawPoly4TGEx4_TW(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, \r
5894                     short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4, \r
5895                     short clX, short clY,\r
5896                     int col1, int col2, int col3, int col4)\r
5897 {\r
5898  drawPoly3TGEx4_TW(x2,y2,x3,y3,x4,y4,\r
5899                    tx2,ty2,tx3,ty3,tx4,ty4,\r
5900                    clX,clY,\r
5901                    col2,col4,col3);\r
5902 \r
5903  drawPoly3TGEx4_TW(x1,y1,x2,y2,x4,y4,\r
5904                    tx1,ty1,tx2,ty2,tx4,ty4,\r
5905                    clX,clY,\r
5906                    col1,col2,col3);\r
5907 }\r
5908 \r
5909 ////////////////////////////////////////////////////////////////////////\r
5910 // POLY 3/4 G-SHADED TEX PAL8\r
5911 ////////////////////////////////////////////////////////////////////////\r
5912 \r
5913 void drawPoly3TGEx8(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short clX, short clY, int col1, int col2, int col3)\r
5914 {\r
5915  int i,j,xmin,xmax,ymin,ymax;\r
5916  int cR1,cG1,cB1;\r
5917  int difR,difB,difG,difR2,difB2,difG2;\r
5918  int difX, difY,difX2, difY2;\r
5919  int posX,posY,YAdjust,clutP;\r
5920  short tC1,tC2;\r
5921 \r
5922  if(x1>drawW && x2>drawW && x3>drawW) return;\r
5923  if(y1>drawH && y2>drawH && y3>drawH) return;\r
5924  if(x1<drawX && x2<drawX && x3<drawX) return;\r
5925  if(y1<drawY && y2<drawY && y3<drawY) return;\r
5926  if(drawY>=drawH) return;\r
5927  if(drawX>=drawW) return; \r
5928 \r
5929  if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;\r
5930 \r
5931  ymax=Ymax;\r
5932 \r
5933  for(ymin=Ymin;ymin<drawY;ymin++)\r
5934   if(NextRow_GT()) return;\r
5935 \r
5936  clutP=(clY<<10)+clX;\r
5937 \r
5938  YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
5939 \r
5940  difR=delta_right_R;\r
5941  difG=delta_right_G;\r
5942  difB=delta_right_B;\r
5943  difR2=difR<<1;\r
5944  difG2=difG<<1;\r
5945  difB2=difB<<1;\r
5946  difX=delta_right_u;difX2=difX<<1;\r
5947  difY=delta_right_v;difY2=difY<<1;\r
5948 \r
5949 #ifdef FASTSOLID\r
5950 \r
5951  if(!bCheckMask && !DrawSemiTrans && !iDither)\r
5952   {\r
5953    for (i=ymin;i<=ymax;i++)\r
5954     {\r
5955      xmin=(left_x >> 16);\r
5956      xmax=(right_x >> 16)-1; // !!!!!!!!!!!!!\r
5957      if(drawW<xmax) xmax=drawW;\r
5958 \r
5959      if(xmax>=xmin)\r
5960       {\r
5961        posX=left_u;\r
5962        posY=left_v;\r
5963        cR1=left_R;\r
5964        cG1=left_G;\r
5965        cB1=left_B;\r
5966 \r
5967        if(xmin<drawX)\r
5968         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
5969 \r
5970        for(j=xmin;j<xmax;j+=2)\r
5971         {\r
5972          tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+((posX>>16))];\r
5973          tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+\r
5974                       (((posX+difX)>>16))];\r
5975          GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
5976               psxVuw[clutP+tC1]|\r
5977               ((int)psxVuw[clutP+tC2])<<16,\r
5978               (cB1>>16)|((cB1+difB)&0xff0000),\r
5979               (cG1>>16)|((cG1+difG)&0xff0000),\r
5980               (cR1>>16)|((cR1+difR)&0xff0000));\r
5981          posX+=difX2;\r
5982          posY+=difY2;\r
5983          cR1+=difR2;\r
5984          cG1+=difG2;\r
5985          cB1+=difB2;\r
5986         }\r
5987        if(j==xmax)\r
5988         {\r
5989          tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+((posX>>16))];\r
5990          GetTextureTransColGX_S(&psxVuw[(i<<10)+j], \r
5991               psxVuw[clutP+tC1],\r
5992               (cB1>>16),(cG1>>16),(cR1>>16));\r
5993         }\r
5994       }\r
5995      if(NextRow_GT()) \r
5996       {\r
5997        return;\r
5998       }\r
5999     }\r
6000    return;\r
6001   }\r
6002 \r
6003 #endif\r
6004 \r
6005  for (i=ymin;i<=ymax;i++)\r
6006   {\r
6007    xmin=(left_x >> 16);\r
6008    xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!!!!!!\r
6009    if(drawW<xmax) xmax=drawW;\r
6010 \r
6011    if(xmax>=xmin)\r
6012     {\r
6013      posX=left_u;\r
6014      posY=left_v;\r
6015      cR1=left_R;\r
6016      cG1=left_G;\r
6017      cB1=left_B;\r
6018 \r
6019      if(xmin<drawX)\r
6020       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
6021 \r
6022      for(j=xmin;j<=xmax;j++)\r
6023       {\r
6024        tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+((posX>>16))];\r
6025        if(iDither)\r
6026         GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j], \r
6027             psxVuw[clutP+tC1],\r
6028             (cB1>>16),(cG1>>16),(cR1>>16));\r
6029        else\r
6030         GetTextureTransColGX(&psxVuw[(i<<10)+j], \r
6031             psxVuw[clutP+tC1],\r
6032             (cB1>>16),(cG1>>16),(cR1>>16));\r
6033        posX+=difX;\r
6034        posY+=difY;\r
6035        cR1+=difR;\r
6036        cG1+=difG;\r
6037        cB1+=difB;\r
6038       }\r
6039     }\r
6040    if(NextRow_GT()) \r
6041     {\r
6042      return;\r
6043     }\r
6044   }\r
6045 }\r
6046 \r
6047 ////////////////////////////////////////////////////////////////////////\r
6048 \r
6049 void drawPoly3TGEx8_IL(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short clX, short clY, int col1, int col2, int col3)\r
6050 {\r
6051  int i,j,xmin,xmax,ymin,ymax,n_xi,n_yi,TXV,TXU;\r
6052  int cR1,cG1,cB1;\r
6053  int difR,difB,difG,difR2,difB2,difG2;\r
6054  int difX, difY,difX2, difY2;\r
6055  int posX,posY,YAdjust,clutP;\r
6056  short tC1,tC2;\r
6057 \r
6058  if(x1>drawW && x2>drawW && x3>drawW) return;\r
6059  if(y1>drawH && y2>drawH && y3>drawH) return;\r
6060  if(x1<drawX && x2<drawX && x3<drawX) return;\r
6061  if(y1<drawY && y2<drawY && y3<drawY) return;\r
6062  if(drawY>=drawH) return;\r
6063  if(drawX>=drawW) return; \r
6064 \r
6065  if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;\r
6066 \r
6067  ymax=Ymax;\r
6068 \r
6069  for(ymin=Ymin;ymin<drawY;ymin++)\r
6070   if(NextRow_GT()) return;\r
6071 \r
6072  clutP=(clY<<10)+clX;\r
6073 \r
6074  YAdjust=(GlobalTextAddrY<<10)+GlobalTextAddrX;\r
6075 \r
6076  difR=delta_right_R;\r
6077  difG=delta_right_G;\r
6078  difB=delta_right_B;\r
6079  difR2=difR<<1;\r
6080  difG2=difG<<1;\r
6081  difB2=difB<<1;\r
6082  difX=delta_right_u;difX2=difX<<1;\r
6083  difY=delta_right_v;difY2=difY<<1;\r
6084 \r
6085 #ifdef FASTSOLID\r
6086 \r
6087  if(!bCheckMask && !DrawSemiTrans && !iDither)\r
6088   {\r
6089    for (i=ymin;i<=ymax;i++)\r
6090     {\r
6091      xmin=(left_x >> 16);\r
6092      xmax=(right_x >> 16)-1; // !!!!!!!!!!!!!\r
6093      if(drawW<xmax) xmax=drawW;\r
6094 \r
6095      if(xmax>=xmin)\r
6096       {\r
6097        posX=left_u;\r
6098        posY=left_v;\r
6099        cR1=left_R;\r
6100        cG1=left_G;\r
6101        cB1=left_B;\r
6102 \r
6103        if(xmin<drawX)\r
6104         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
6105 \r
6106        for(j=xmin;j<xmax;j+=2)\r
6107         {\r
6108          TXU=posX>>16;\r
6109          TXV=posY>>16;\r
6110          n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );\r
6111          n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );\r
6112 \r
6113          tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
6114 \r
6115          TXU=(posX+difX)>>16;\r
6116          TXV=(posY+difY)>>16;\r
6117          n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );\r
6118          n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );\r
6119 \r
6120          tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
6121 \r
6122          GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
6123               psxVuw[clutP+tC1]|\r
6124               ((int)psxVuw[clutP+tC2])<<16,\r
6125               (cB1>>16)|((cB1+difB)&0xff0000),\r
6126               (cG1>>16)|((cG1+difG)&0xff0000),\r
6127               (cR1>>16)|((cR1+difR)&0xff0000));\r
6128          posX+=difX2;\r
6129          posY+=difY2;\r
6130          cR1+=difR2;\r
6131          cG1+=difG2;\r
6132          cB1+=difB2;\r
6133         }\r
6134        if(j==xmax)\r
6135         {\r
6136          TXU=posX>>16;\r
6137          TXV=posY>>16;\r
6138          n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );\r
6139          n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );\r
6140 \r
6141          tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
6142 \r
6143          GetTextureTransColGX_S(&psxVuw[(i<<10)+j], \r
6144               psxVuw[clutP+tC1],\r
6145               (cB1>>16),(cG1>>16),(cR1>>16));\r
6146         }\r
6147       }\r
6148      if(NextRow_GT()) \r
6149       {\r
6150        return;\r
6151       }\r
6152     }\r
6153    return;\r
6154   }\r
6155 \r
6156 #endif\r
6157 \r
6158  for (i=ymin;i<=ymax;i++)\r
6159   {\r
6160    xmin=(left_x >> 16);\r
6161    xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!!!!!!\r
6162    if(drawW<xmax) xmax=drawW;\r
6163 \r
6164    if(xmax>=xmin)\r
6165     {\r
6166      posX=left_u;\r
6167      posY=left_v;\r
6168      cR1=left_R;\r
6169      cG1=left_G;\r
6170      cB1=left_B;\r
6171 \r
6172      if(xmin<drawX)\r
6173       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
6174 \r
6175      for(j=xmin;j<=xmax;j++)\r
6176       {\r
6177        TXU=posX>>16;\r
6178        TXV=posY>>16;\r
6179        n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );\r
6180        n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );\r
6181 \r
6182        tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
6183 \r
6184        if(iDither)\r
6185         GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j], \r
6186             psxVuw[clutP+tC1],\r
6187             (cB1>>16),(cG1>>16),(cR1>>16));\r
6188        else\r
6189         GetTextureTransColGX(&psxVuw[(i<<10)+j], \r
6190             psxVuw[clutP+tC1],\r
6191             (cB1>>16),(cG1>>16),(cR1>>16));\r
6192        posX+=difX;\r
6193        posY+=difY;\r
6194        cR1+=difR;\r
6195        cG1+=difG;\r
6196        cB1+=difB;\r
6197       }\r
6198     }\r
6199    if(NextRow_GT()) \r
6200     {\r
6201      return;\r
6202     }\r
6203   }\r
6204 }\r
6205 \r
6206 ////////////////////////////////////////////////////////////////////////\r
6207 \r
6208 void drawPoly3TGEx8_TW(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short clX, short clY, int col1, int col2, int col3)\r
6209 {\r
6210  int i,j,xmin,xmax,ymin,ymax;\r
6211  int cR1,cG1,cB1;\r
6212  int difR,difB,difG,difR2,difB2,difG2;\r
6213  int difX, difY,difX2, difY2;\r
6214  int posX,posY,YAdjust,clutP;\r
6215  short tC1,tC2;\r
6216 \r
6217  if(x1>drawW && x2>drawW && x3>drawW) return;\r
6218  if(y1>drawH && y2>drawH && y3>drawH) return;\r
6219  if(x1<drawX && x2<drawX && x3<drawX) return;\r
6220  if(y1<drawY && y2<drawY && y3<drawY) return;\r
6221  if(drawY>=drawH) return;\r
6222  if(drawX>=drawW) return; \r
6223 \r
6224  if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;\r
6225 \r
6226  ymax=Ymax;\r
6227 \r
6228  for(ymin=Ymin;ymin<drawY;ymin++)\r
6229   if(NextRow_GT()) return;\r
6230 \r
6231  clutP=(clY<<10)+clX;\r
6232 \r
6233  YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
6234  YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0);\r
6235 \r
6236  difR=delta_right_R;\r
6237  difG=delta_right_G;\r
6238  difB=delta_right_B;\r
6239  difR2=difR<<1;\r
6240  difG2=difG<<1;\r
6241  difB2=difB<<1;\r
6242  difX=delta_right_u;difX2=difX<<1;\r
6243  difY=delta_right_v;difY2=difY<<1;\r
6244 \r
6245 #ifdef FASTSOLID\r
6246 \r
6247  if(!bCheckMask && !DrawSemiTrans && !iDither)\r
6248   {\r
6249    for (i=ymin;i<=ymax;i++)\r
6250     {\r
6251      xmin=(left_x >> 16);\r
6252      xmax=(right_x >> 16)-1; // !!!!!!!!!!!!!\r
6253      if(drawW<xmax) xmax=drawW;\r
6254 \r
6255      if(xmax>=xmin)\r
6256       {\r
6257        posX=left_u;\r
6258        posY=left_v;\r
6259        cR1=left_R;\r
6260        cG1=left_G;\r
6261        cB1=left_B;\r
6262 \r
6263        if(xmin<drawX)\r
6264         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
6265 \r
6266        for(j=xmin;j<xmax;j+=2)\r
6267         {\r
6268          tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+\r
6269                       YAdjust+((posX>>16)%TWin.Position.x1)];\r
6270          tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+\r
6271                       YAdjust+(((posX+difX)>>16)%TWin.Position.x1)];\r
6272                       \r
6273          GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
6274               psxVuw[clutP+tC1]|\r
6275               ((int)psxVuw[clutP+tC2])<<16,\r
6276               (cB1>>16)|((cB1+difB)&0xff0000),\r
6277               (cG1>>16)|((cG1+difG)&0xff0000),\r
6278               (cR1>>16)|((cR1+difR)&0xff0000));\r
6279          posX+=difX2;\r
6280          posY+=difY2;\r
6281          cR1+=difR2;\r
6282          cG1+=difG2;\r
6283          cB1+=difB2;\r
6284         }\r
6285        if(j==xmax)\r
6286         {\r
6287          tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+\r
6288                       YAdjust+((posX>>16)%TWin.Position.x1)];\r
6289          GetTextureTransColGX_S(&psxVuw[(i<<10)+j], \r
6290               psxVuw[clutP+tC1],\r
6291               (cB1>>16),(cG1>>16),(cR1>>16));\r
6292         }\r
6293       }\r
6294      if(NextRow_GT()) \r
6295       {\r
6296        return;\r
6297       }\r
6298     }\r
6299    return;\r
6300   }\r
6301 \r
6302 #endif\r
6303 \r
6304  for (i=ymin;i<=ymax;i++)\r
6305   {\r
6306    xmin=(left_x >> 16);\r
6307    xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!!!!!!\r
6308    if(drawW<xmax) xmax=drawW;\r
6309 \r
6310    if(xmax>=xmin)\r
6311     {\r
6312      posX=left_u;\r
6313      posY=left_v;\r
6314      cR1=left_R;\r
6315      cG1=left_G;\r
6316      cB1=left_B;\r
6317 \r
6318      if(xmin<drawX)\r
6319       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
6320 \r
6321      for(j=xmin;j<=xmax;j++)\r
6322       {\r
6323        tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+\r
6324                     YAdjust+((posX>>16)%TWin.Position.x1)];\r
6325        if(iDither)\r
6326         GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j], \r
6327             psxVuw[clutP+tC1],\r
6328             (cB1>>16),(cG1>>16),(cR1>>16));\r
6329        else\r
6330         GetTextureTransColGX(&psxVuw[(i<<10)+j], \r
6331             psxVuw[clutP+tC1],\r
6332             (cB1>>16),(cG1>>16),(cR1>>16));\r
6333        posX+=difX;\r
6334        posY+=difY;\r
6335        cR1+=difR;\r
6336        cG1+=difG;\r
6337        cB1+=difB;\r
6338       }\r
6339     }\r
6340    if(NextRow_GT()) \r
6341     {\r
6342      return;\r
6343     }\r
6344   }\r
6345 }\r
6346 \r
6347 ////////////////////////////////////////////////////////////////////////\r
6348 \r
6349 // note: two g-shaded tris: small texture distortions can happen\r
6350 \r
6351 void drawPoly4TGEx8_TRI_IL(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, \r
6352                            short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4, \r
6353                            short clX, short clY,\r
6354                            int col1, int col2, int col3, int col4)\r
6355 {\r
6356  drawPoly3TGEx8_IL(x2,y2,x3,y3,x4,y4,\r
6357                    tx2,ty2,tx3,ty3,tx4,ty4,\r
6358                    clX,clY,\r
6359                    col2,col4,col3);\r
6360  drawPoly3TGEx8_IL(x1,y1,x2,y2,x4,y4,\r
6361                    tx1,ty1,tx2,ty2,tx4,ty4,\r
6362                    clX,clY,\r
6363                    col1,col2,col3);\r
6364 }\r
6365 \r
6366 #ifdef POLYQUAD3GT\r
6367                       \r
6368 void drawPoly4TGEx8_TRI(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, \r
6369                    short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4, \r
6370                    short clX, short clY,\r
6371                    int col1, int col2, int col3, int col4)\r
6372 {\r
6373  drawPoly3TGEx8(x2,y2,x3,y3,x4,y4,\r
6374                 tx2,ty2,tx3,ty3,tx4,ty4,\r
6375                 clX,clY,\r
6376                 col2,col4,col3);\r
6377  drawPoly3TGEx8(x1,y1,x2,y2,x4,y4,\r
6378                 tx1,ty1,tx2,ty2,tx4,ty4,\r
6379                 clX,clY,\r
6380                 col1,col2,col3);\r
6381 }\r
6382 \r
6383 #endif\r
6384 \r
6385 void drawPoly4TGEx8(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, \r
6386                    short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4, \r
6387                    short clX, short clY,\r
6388                    int col1, int col2, int col4, int col3)\r
6389 {\r
6390  int num; \r
6391  int i,j,xmin,xmax,ymin,ymax;\r
6392  int cR1,cG1,cB1;\r
6393  int difR,difB,difG,difR2,difB2,difG2;\r
6394  int difX, difY, difX2, difY2;\r
6395  int posX,posY,YAdjust,clutP;\r
6396  short tC1,tC2;\r
6397 \r
6398  if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;\r
6399  if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;\r
6400  if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;\r
6401  if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;\r
6402  if(drawY>=drawH) return;\r
6403  if(drawX>=drawW) return; \r
6404 \r
6405  if(!SetupSections_GT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4,col1,col2,col3,col4)) return;\r
6406 \r
6407  ymax=Ymax;\r
6408 \r
6409  for(ymin=Ymin;ymin<drawY;ymin++)\r
6410   if(NextRow_GT4()) return;\r
6411 \r
6412  clutP=(clY<<10)+clX;\r
6413 \r
6414  YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
6415 \r
6416 #ifdef FASTSOLID\r
6417 \r
6418  if(!bCheckMask && !DrawSemiTrans && !iDither)\r
6419   {\r
6420    for (i=ymin;i<=ymax;i++)\r
6421     {\r
6422      xmin=(left_x >> 16);\r
6423      xmax=(right_x >> 16);\r
6424 \r
6425      if(xmax>=xmin)\r
6426       {\r
6427        posX=left_u;\r
6428        posY=left_v;\r
6429 \r
6430        num=(xmax-xmin);\r
6431        if(num==0) num=1;\r
6432        difX=(right_u-posX)/num;\r
6433        difY=(right_v-posY)/num;\r
6434        difX2=difX<<1;\r
6435        difY2=difY<<1;\r
6436 \r
6437        cR1=left_R;\r
6438        cG1=left_G;\r
6439        cB1=left_B;\r
6440        difR=(right_R-cR1)/num;\r
6441        difG=(right_G-cG1)/num;\r
6442        difB=(right_B-cB1)/num;\r
6443        difR2=difR<<1;\r
6444        difG2=difG<<1;\r
6445        difB2=difB<<1;\r
6446 \r
6447        if(xmin<drawX)\r
6448         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
6449        xmax--;if(drawW<xmax) xmax=drawW;\r
6450 \r
6451        for(j=xmin;j<xmax;j+=2)\r
6452         {\r
6453          tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];\r
6454          tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+\r
6455                      ((posX+difX)>>16)];\r
6456 \r
6457          GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
6458               psxVuw[clutP+tC1]|\r
6459               ((int)psxVuw[clutP+tC2])<<16,\r
6460               (cB1>>16)|((cB1+difB)&0xff0000),\r
6461               (cG1>>16)|((cG1+difG)&0xff0000),\r
6462               (cR1>>16)|((cR1+difR)&0xff0000));\r
6463          posX+=difX2;\r
6464          posY+=difY2;\r
6465          cR1+=difR2;\r
6466          cG1+=difG2;\r
6467          cB1+=difB2;\r
6468         }\r
6469        if(j==xmax)\r
6470         {\r
6471          tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];\r
6472          GetTextureTransColGX_S(&psxVuw[(i<<10)+j], \r
6473              psxVuw[clutP+tC1],\r
6474              (cB1>>16),(cG1>>16),(cR1>>16));\r
6475         }\r
6476       }\r
6477      if(NextRow_GT4()) return;\r
6478     }\r
6479    return;\r
6480   }\r
6481 \r
6482 #endif\r
6483 \r
6484  for (i=ymin;i<=ymax;i++)\r
6485   {\r
6486    xmin=(left_x >> 16);\r
6487    xmax=(right_x >> 16);\r
6488 \r
6489    if(xmax>=xmin)\r
6490     {\r
6491      posX=left_u;\r
6492      posY=left_v;\r
6493 \r
6494      num=(xmax-xmin);\r
6495      if(num==0) num=1;\r
6496      difX=(right_u-posX)/num;\r
6497      difY=(right_v-posY)/num;\r
6498      difX2=difX<<1;\r
6499      difY2=difY<<1;\r
6500 \r
6501      cR1=left_R;\r
6502      cG1=left_G;\r
6503      cB1=left_B;\r
6504      difR=(right_R-cR1)/num;\r
6505      difG=(right_G-cG1)/num;\r
6506      difB=(right_B-cB1)/num;\r
6507      difR2=difR<<1;\r
6508      difG2=difG<<1;\r
6509      difB2=difB<<1;\r
6510 \r
6511      if(xmin<drawX)\r
6512       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
6513      xmax--;if(drawW<xmax) xmax=drawW;\r
6514 \r
6515      for(j=xmin;j<=xmax;j++)\r
6516       {\r
6517        tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];\r
6518        if(iDither)\r
6519         GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j], \r
6520            psxVuw[clutP+tC1],\r
6521            (cB1>>16),(cG1>>16),(cR1>>16));\r
6522        else\r
6523         GetTextureTransColGX(&psxVuw[(i<<10)+j], \r
6524            psxVuw[clutP+tC1],\r
6525            (cB1>>16),(cG1>>16),(cR1>>16));\r
6526        posX+=difX;\r
6527        posY+=difY;\r
6528        cR1+=difR;\r
6529        cG1+=difG;\r
6530        cB1+=difB;\r
6531       }\r
6532     }\r
6533    if(NextRow_GT4()) return;\r
6534   }\r
6535 }\r
6536 \r
6537 ////////////////////////////////////////////////////////////////////////\r
6538 \r
6539 void drawPoly4TGEx8_TW(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, \r
6540                    short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4, \r
6541                    short clX, short clY,\r
6542                    int col1, int col2, int col3, int col4)\r
6543 {\r
6544  drawPoly3TGEx8_TW(x2,y2,x3,y3,x4,y4,\r
6545                 tx2,ty2,tx3,ty3,tx4,ty4,\r
6546                 clX,clY,\r
6547                 col2,col4,col3);\r
6548  drawPoly3TGEx8_TW(x1,y1,x2,y2,x4,y4,\r
6549                 tx1,ty1,tx2,ty2,tx4,ty4,\r
6550                 clX,clY,\r
6551                 col1,col2,col3);\r
6552 }\r
6553 \r
6554 ////////////////////////////////////////////////////////////////////////\r
6555 // POLY 3 G-SHADED TEX 15 BIT\r
6556 ////////////////////////////////////////////////////////////////////////\r
6557 \r
6558 void drawPoly3TGD(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, int col1, int col2, int col3)\r
6559 {\r
6560  int i,j,xmin,xmax,ymin,ymax;\r
6561  int cR1,cG1,cB1;\r
6562  int difR,difB,difG,difR2,difB2,difG2;\r
6563  int difX, difY,difX2, difY2;\r
6564  int posX,posY;\r
6565 \r
6566  if(x1>drawW && x2>drawW && x3>drawW) return;\r
6567  if(y1>drawH && y2>drawH && y3>drawH) return;\r
6568  if(x1<drawX && x2<drawX && x3<drawX) return;\r
6569  if(y1<drawY && y2<drawY && y3<drawY) return;\r
6570  if(drawY>=drawH) return;\r
6571  if(drawX>=drawW) return; \r
6572 \r
6573  if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;\r
6574 \r
6575  ymax=Ymax;\r
6576 \r
6577  for(ymin=Ymin;ymin<drawY;ymin++)\r
6578   if(NextRow_GT()) return;\r
6579 \r
6580  difR=delta_right_R;\r
6581  difG=delta_right_G;\r
6582  difB=delta_right_B;\r
6583  difR2=difR<<1;\r
6584  difG2=difG<<1;\r
6585  difB2=difB<<1;\r
6586  difX=delta_right_u;difX2=difX<<1;\r
6587  difY=delta_right_v;difY2=difY<<1;\r
6588 \r
6589 #ifdef FASTSOLID\r
6590 \r
6591  if(!bCheckMask && !DrawSemiTrans && !iDither)\r
6592   {       \r
6593    for (i=ymin;i<=ymax;i++)\r
6594     {\r
6595      xmin=(left_x >> 16);\r
6596      xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!!!\r
6597      if(drawW<xmax) xmax=drawW;\r
6598 \r
6599      if(xmax>=xmin)\r
6600       {\r
6601        posX=left_u;\r
6602        posY=left_v;\r
6603        cR1=left_R;\r
6604        cG1=left_G;\r
6605        cB1=left_B;\r
6606 \r
6607        if(xmin<drawX)\r
6608         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
6609 \r
6610        for(j=xmin;j<xmax;j+=2)\r
6611         {\r
6612          GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
6613               (((int)psxVuw[((((posY+difY)>>16)+GlobalTextAddrY)<<10)+((posX+difX)>>16)+GlobalTextAddrX])<<16)|\r
6614               psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+((posX)>>16)+GlobalTextAddrX],\r
6615               (cB1>>16)|((cB1+difB)&0xff0000),\r
6616               (cG1>>16)|((cG1+difG)&0xff0000),\r
6617               (cR1>>16)|((cR1+difR)&0xff0000));\r
6618          posX+=difX2;\r
6619          posY+=difY2;\r
6620          cR1+=difR2;\r
6621          cG1+=difG2;\r
6622          cB1+=difB2;\r
6623         }\r
6624        if(j==xmax)\r
6625         GetTextureTransColGX_S(&psxVuw[(i<<10)+j],\r
6626             psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX],\r
6627             (cB1>>16),(cG1>>16),(cR1>>16));\r
6628       }\r
6629      if(NextRow_GT()) \r
6630       {\r
6631        return;\r
6632       }\r
6633     }\r
6634    return;\r
6635   }\r
6636 \r
6637 #endif\r
6638 \r
6639  for (i=ymin;i<=ymax;i++)\r
6640   {\r
6641    xmin=(left_x >> 16);\r
6642    xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!\r
6643    if(drawW<xmax) xmax=drawW;\r
6644 \r
6645    if(xmax>=xmin)\r
6646     {\r
6647      posX=left_u;\r
6648      posY=left_v;\r
6649      cR1=left_R;\r
6650      cG1=left_G;\r
6651      cB1=left_B;\r
6652 \r
6653      if(xmin<drawX)\r
6654       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
6655 \r
6656      for(j=xmin;j<=xmax;j++)\r
6657       {\r
6658        if(iDither)\r
6659         GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],\r
6660           psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX],\r
6661           (cB1>>16),(cG1>>16),(cR1>>16));\r
6662        else\r
6663         GetTextureTransColGX(&psxVuw[(i<<10)+j],\r
6664           psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX],\r
6665           (cB1>>16),(cG1>>16),(cR1>>16));\r
6666        posX+=difX;\r
6667        posY+=difY;\r
6668        cR1+=difR;\r
6669        cG1+=difG;\r
6670        cB1+=difB;\r
6671       }\r
6672     }\r
6673    if(NextRow_GT()) \r
6674     {\r
6675      return;\r
6676     }\r
6677   }\r
6678 }\r
6679 \r
6680 ////////////////////////////////////////////////////////////////////////\r
6681 \r
6682 void drawPoly3TGD_TW(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, int col1, int col2, int col3)\r
6683 {\r
6684  int i,j,xmin,xmax,ymin,ymax;\r
6685  int cR1,cG1,cB1;\r
6686  int difR,difB,difG,difR2,difB2,difG2;\r
6687  int difX, difY,difX2, difY2;\r
6688  int posX,posY;\r
6689 \r
6690  if (x1>drawW && x2>drawW && x3>drawW) return;\r
6691  if (y1>drawH && y2>drawH && y3>drawH) return;\r
6692  if (x1<drawX && x2<drawX && x3<drawX) return;\r
6693  if (y1<drawY && y2<drawY && y3<drawY) return;\r
6694  if (drawY >= drawH) return;\r
6695  if (drawX >= drawW) return; \r
6696 \r
6697  if (!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;\r
6698 \r
6699  ymax = Ymax;\r
6700 \r
6701  for(ymin = Ymin; ymin < drawY; ymin++)\r
6702   if(NextRow_GT()) return;\r
6703 \r
6704  difR = delta_right_R;\r
6705  difG = delta_right_G;\r
6706  difB = delta_right_B;\r
6707  difR2 = difR<<1;\r
6708  difG2 = difG<<1;\r
6709  difB2 = difB<<1;\r
6710  difX = delta_right_u; difX2 = difX<<1;\r
6711  difY = delta_right_v; difY2 = difY<<1;\r
6712 \r
6713 #ifdef FASTSOLID\r
6714 \r
6715  if (!bCheckMask && !DrawSemiTrans && !iDither)\r
6716   {       \r
6717    for (i = ymin; i <= ymax; i++)\r
6718     {\r
6719      xmin = (left_x >> 16);\r
6720      xmax = (right_x >> 16) - 1; //!!!!!!!!!!!!!!!!!!!!\r
6721      if(drawW<xmax) xmax=drawW;\r
6722 \r
6723      if(xmax>=xmin)\r
6724       {\r
6725        posX=left_u;\r
6726        posY=left_v;\r
6727        cR1=left_R;\r
6728        cG1=left_G;\r
6729        cB1=left_B;\r
6730 \r
6731        if(xmin<drawX)\r
6732         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
6733 \r
6734        for(j=xmin;j<xmax;j+=2)\r
6735         {\r
6736          GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
6737               (((int)psxVuw[(((((posY+difY)>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+\r
6738                              (((posX+difX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0])<<16)|\r
6739               psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+\r
6740                      (((posX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0],\r
6741               (cB1>>16)|((cB1+difB)&0xff0000),\r
6742               (cG1>>16)|((cG1+difG)&0xff0000),\r
6743               (cR1>>16)|((cR1+difR)&0xff0000));\r
6744          posX+=difX2;\r
6745          posY+=difY2;\r
6746          cR1+=difR2;\r
6747          cG1+=difG2;\r
6748          cB1+=difB2;\r
6749         }\r
6750        if(j==xmax)\r
6751         GetTextureTransColGX_S(&psxVuw[(i<<10)+j],\r
6752             psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+\r
6753                    ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0],\r
6754             (cB1>>16),(cG1>>16),(cR1>>16));\r
6755       }\r
6756      if(NextRow_GT()) \r
6757       {\r
6758        return;\r
6759       }\r
6760     }\r
6761    return;\r
6762   }\r
6763 \r
6764 #endif\r
6765 \r
6766  for (i=ymin;i<=ymax;i++)\r
6767   {\r
6768    xmin=(left_x >> 16);\r
6769    xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!\r
6770    if(drawW<xmax) xmax=drawW;\r
6771 \r
6772    if(xmax>=xmin)\r
6773     {\r
6774      posX=left_u;\r
6775      posY=left_v;\r
6776      cR1=left_R;\r
6777      cG1=left_G;\r
6778      cB1=left_B;\r
6779 \r
6780      if(xmin<drawX)\r
6781       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
6782 \r
6783      for(j=xmin;j<=xmax;j++)\r
6784       {\r
6785        if(iDither)\r
6786         GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],\r
6787           psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+\r
6788                  ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0],\r
6789           (cB1>>16),(cG1>>16),(cR1>>16));\r
6790        else\r
6791         GetTextureTransColGX(&psxVuw[(i<<10)+j],\r
6792           psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+\r
6793                  ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0],\r
6794           (cB1>>16),(cG1>>16),(cR1>>16));\r
6795        posX+=difX;\r
6796        posY+=difY;\r
6797        cR1+=difR;\r
6798        cG1+=difG;\r
6799        cB1+=difB;\r
6800       }\r
6801     }\r
6802    if(NextRow_GT()) \r
6803     {\r
6804      return;\r
6805     }\r
6806   }\r
6807 }\r
6808 \r
6809 ////////////////////////////////////////////////////////////////////////\r
6810 \r
6811 // note: two g-shaded tris: small texture distortions can happen\r
6812 \r
6813 #ifdef POLYQUAD3GT\r
6814 \r
6815 void drawPoly4TGD_TRI(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4, int col1, int col2, int col3, int col4)\r
6816 {\r
6817  drawPoly3TGD(x2,y2,x3,y3,x4,y4,\r
6818               tx2,ty2,tx3,ty3,tx4,ty4,\r
6819               col2,col4,col3);\r
6820  drawPoly3TGD(x1,y1,x2,y2,x4,y4,\r
6821               tx1,ty1,tx2,ty2,tx4,ty4,\r
6822               col1,col2,col3);\r
6823 }\r
6824 \r
6825 #endif\r
6826 \r
6827 void drawPoly4TGD(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4, int col1, int col2, int col4, int col3)\r
6828 {\r
6829  int num; \r
6830  int i,j,xmin,xmax,ymin,ymax;\r
6831  int cR1,cG1,cB1;\r
6832  int difR,difB,difG,difR2,difB2,difG2;\r
6833  int difX, difY, difX2, difY2;\r
6834  int posX,posY;\r
6835 \r
6836  if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;\r
6837  if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;\r
6838  if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;\r
6839  if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;\r
6840  if(drawY>=drawH) return;\r
6841  if(drawX>=drawW) return; \r
6842 \r
6843  if(!SetupSections_GT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4,col1,col2,col3,col4)) return;\r
6844 \r
6845  ymax = Ymax;\r
6846 \r
6847  for (ymin = Ymin; ymin < drawY; ymin++)\r
6848   if (NextRow_GT4()) return;\r
6849 \r
6850 #ifdef FASTSOLID\r
6851 \r
6852  if(!bCheckMask && !DrawSemiTrans && !iDither)\r
6853   {\r
6854    for (i = ymin; i <= ymax; i++)\r
6855     {\r
6856      xmin = (left_x >> 16);\r
6857      xmax = (right_x >> 16);\r
6858 \r
6859      if(xmax >= xmin)\r
6860       {\r
6861        posX = left_u;\r
6862        posY = left_v;\r
6863 \r
6864        num = (xmax-xmin);\r
6865        if(num==0) num=1;\r
6866        difX=(right_u-posX)/num;\r
6867        difY=(right_v-posY)/num;\r
6868        difX2=difX<<1;\r
6869        difY2=difY<<1;\r
6870 \r
6871        cR1=left_R;\r
6872        cG1=left_G;\r
6873        cB1=left_B;\r
6874        difR=(right_R-cR1)/num;\r
6875        difG=(right_G-cG1)/num;\r
6876        difB=(right_B-cB1)/num;\r
6877        difR2=difR<<1;\r
6878        difG2=difG<<1;\r
6879        difB2=difB<<1;\r
6880 \r
6881        if(xmin<drawX)\r
6882         {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
6883        xmax--;if(drawW<xmax) xmax=drawW;\r
6884 \r
6885        for(j=xmin;j<xmax;j+=2)\r
6886         {\r
6887          GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
6888               (((int)psxVuw[((((posY+difY)>>16)+GlobalTextAddrY)<<10)+((posX+difX)>>16)+GlobalTextAddrX])<<16)|\r
6889               psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+((posX)>>16)+GlobalTextAddrX],\r
6890               (cB1>>16)|((cB1+difB)&0xff0000),\r
6891               (cG1>>16)|((cG1+difG)&0xff0000),\r
6892               (cR1>>16)|((cR1+difR)&0xff0000));\r
6893          posX+=difX2;\r
6894          posY+=difY2;\r
6895          cR1+=difR2;\r
6896          cG1+=difG2;\r
6897          cB1+=difB2;\r
6898         }\r
6899        if(j==xmax)\r
6900         GetTextureTransColGX_S(&psxVuw[(i<<10)+j],\r
6901             psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX],\r
6902             (cB1>>16),(cG1>>16),(cR1>>16));\r
6903       }\r
6904      if(NextRow_GT4()) return;\r
6905     }\r
6906    return;\r
6907   }\r
6908 \r
6909 #endif\r
6910 \r
6911  for (i=ymin;i<=ymax;i++)\r
6912   {\r
6913    xmin=(left_x >> 16);\r
6914    xmax=(right_x >> 16);\r
6915 \r
6916    if(xmax>=xmin)\r
6917     {\r
6918      posX=left_u;\r
6919      posY=left_v;\r
6920 \r
6921      num=(xmax-xmin);\r
6922      if(num==0) num=1;\r
6923      difX=(right_u-posX)/num;\r
6924      difY=(right_v-posY)/num;\r
6925      difX2=difX<<1;\r
6926      difY2=difY<<1;\r
6927 \r
6928      cR1=left_R;\r
6929      cG1=left_G;\r
6930      cB1=left_B;\r
6931      difR=(right_R-cR1)/num;\r
6932      difG=(right_G-cG1)/num;\r
6933      difB=(right_B-cB1)/num;\r
6934      difR2=difR<<1;\r
6935      difG2=difG<<1;\r
6936      difB2=difB<<1;\r
6937 \r
6938      if(xmin<drawX)\r
6939       {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
6940      xmax--;if(drawW<xmax) xmax=drawW;\r
6941 \r
6942      for(j=xmin;j<=xmax;j++)\r
6943       {\r
6944        if(iDither)\r
6945         GetTextureTransColGX(&psxVuw[(i<<10)+j],\r
6946           psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX],\r
6947           (cB1>>16),(cG1>>16),(cR1>>16));\r
6948        else\r
6949         GetTextureTransColGX(&psxVuw[(i<<10)+j],\r
6950           psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX],\r
6951           (cB1>>16),(cG1>>16),(cR1>>16));\r
6952        posX+=difX;\r
6953        posY+=difY;\r
6954        cR1+=difR;\r
6955        cG1+=difG;\r
6956        cB1+=difB;\r
6957       }\r
6958     }\r
6959    if(NextRow_GT4()) return;\r
6960   }\r
6961 }\r
6962 \r
6963 ////////////////////////////////////////////////////////////////////////\r
6964 \r
6965 void drawPoly4TGD_TW(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4, int col1, int col2, int col3, int col4)\r
6966 {\r
6967  drawPoly3TGD_TW(x2,y2,x3,y3,x4,y4,\r
6968               tx2,ty2,tx3,ty3,tx4,ty4,\r
6969               col2,col4,col3);\r
6970  drawPoly3TGD_TW(x1,y1,x2,y2,x4,y4,\r
6971               tx1,ty1,tx2,ty2,tx4,ty4,\r
6972               col1,col2,col3);\r
6973 }\r
6974 \r
6975 ////////////////////////////////////////////////////////////////////////\r
6976 ////////////////////////////////////////////////////////////////////////\r
6977 ////////////////////////////////////////////////////////////////////////\r
6978 ////////////////////////////////////////////////////////////////////////\r
6979 ////////////////////////////////////////////////////////////////////////\r
6980 ////////////////////////////////////////////////////////////////////////\r
6981 \r
6982 \r
6983 /*\r
6984 // no real rect test, but it does its job the way I need it\r
6985 __inline BOOL IsNoRect(void)\r
6986 {\r
6987  if(lx0==lx1 && lx2==lx3) return FALSE;\r
6988  if(lx0==lx2 && lx1==lx3) return FALSE;\r
6989  if(lx0==lx3 && lx1==lx2) return FALSE;\r
6990  return TRUE;                      \r
6991 }\r
6992 */\r
6993 \r
6994 // real rect test\r
6995 __inline BOOL IsNoRect(void)\r
6996 {\r
6997  //if(!(dwActFixes&0x200)) return FALSE;\r
6998 \r
6999  if(ly0==ly1)\r
7000   {\r
7001    if(lx1==lx3 && ly3==ly2 && lx2==lx0) return FALSE;\r
7002    if(lx1==lx2 && ly2==ly3 && lx3==lx0) return FALSE;\r
7003    return TRUE;\r
7004   }\r
7005  \r
7006  if(ly0==ly2)\r
7007   {\r
7008    if(lx2==lx3 && ly3==ly1 && lx1==lx0) return FALSE;\r
7009    if(lx2==lx1 && ly1==ly3 && lx3==lx0) return FALSE;\r
7010    return TRUE;\r
7011   }\r
7012  \r
7013  if(ly0==ly3)\r
7014   {\r
7015    if(lx3==lx2 && ly2==ly1 && lx1==lx0) return FALSE;\r
7016    if(lx3==lx1 && ly1==ly2 && lx2==lx0) return FALSE;\r
7017    return TRUE;\r
7018   }\r
7019  return TRUE;\r
7020 }\r
7021 \r
7022 ////////////////////////////////////////////////////////////////////////\r
7023 \r
7024 void drawPoly3FT(unsigned char *baseAddr)\r
7025 {\r
7026  uint32_t *gpuData = ((uint32_t *) baseAddr);\r
7027 \r
7028  if(GlobalTextIL && GlobalTextTP<2)\r
7029   {\r
7030    if(GlobalTextTP==0)\r
7031     drawPoly3TEx4_IL(lx0,ly0,lx1,ly1,lx2,ly2,\r
7032                      (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff), \r
7033                      ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));\r
7034    else\r
7035     drawPoly3TEx8_IL(lx0,ly0,lx1,ly1,lx2,ly2,\r
7036                      (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff), \r
7037                      ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));\r
7038    return;\r
7039   }\r
7040 \r
7041  if(!bUsingTWin)// && !(dwActFixes&0x100))\r
7042   {\r
7043    switch(GlobalTextTP)   // depending on texture mode\r
7044     {\r
7045      case 0:\r
7046       drawPoly3TEx4(lx0,ly0,lx1,ly1,lx2,ly2,\r
7047                     (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff), \r
7048                     ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));\r
7049       return;\r
7050      case 1:\r
7051       drawPoly3TEx8(lx0,ly0,lx1,ly1,lx2,ly2,\r
7052                     (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff), \r
7053                     ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));\r
7054       return;\r
7055      case 2:\r
7056       drawPoly3TD(lx0,ly0,lx1,ly1,lx2,ly2,(gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff));\r
7057       return;\r
7058     }\r
7059    return;\r
7060   }\r
7061 \r
7062  switch(GlobalTextTP)   // depending on texture mode\r
7063   {\r
7064    case 0:\r
7065     drawPoly3TEx4_TW(lx0,ly0,lx1,ly1,lx2,ly2,\r
7066                      (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff), \r
7067                      ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));\r
7068     return;\r
7069    case 1:\r
7070     drawPoly3TEx8_TW(lx0,ly0,lx1,ly1,lx2,ly2,\r
7071                      (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff), \r
7072                      ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));\r
7073     return;\r
7074    case 2:\r
7075     drawPoly3TD_TW(lx0,ly0,lx1,ly1,lx2,ly2,(gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff));\r
7076     return;\r
7077   }\r
7078 }\r
7079 \r
7080 ////////////////////////////////////////////////////////////////////////\r
7081 \r
7082 void drawPoly4FT(unsigned char *baseAddr)\r
7083 {\r
7084  uint32_t *gpuData = ((uint32_t *) baseAddr);\r
7085 \r
7086  if(GlobalTextIL && GlobalTextTP<2)\r
7087   {\r
7088    if(GlobalTextTP==0)\r
7089     drawPoly4TEx4_IL(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,\r
7090                      (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff), ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));\r
7091    else\r
7092     drawPoly4TEx8_IL(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,\r
7093                   (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff), ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));\r
7094    return;\r
7095   }\r
7096 \r
7097  if(!bUsingTWin)\r
7098   {\r
7099 #ifdef POLYQUAD3GT\r
7100    if(IsNoRect())\r
7101     {\r
7102      switch (GlobalTextTP)\r
7103       {\r
7104        case 0:\r
7105         drawPoly4TEx4_TRI(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,\r
7106                       (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff), ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));\r
7107         return;\r
7108        case 1:\r
7109         drawPoly4TEx8_TRI(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,\r
7110                       (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff), ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));\r
7111         return;\r
7112        case 2:\r
7113         drawPoly4TD_TRI(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,(gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff));\r
7114         return;\r
7115       }\r
7116      return;\r
7117     }\r
7118 #endif\r
7119           \r
7120    switch (GlobalTextTP)\r
7121     {\r
7122      case 0: // grandia investigations needed\r
7123       drawPoly4TEx4(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,\r
7124                     (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff), ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));\r
7125       return;\r
7126      case 1:\r
7127       drawPoly4TEx8(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,\r
7128                   (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff), ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));\r
7129       return;\r
7130      case 2:\r
7131       drawPoly4TD(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,(gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff));\r
7132       return;\r
7133     }\r
7134    return;\r
7135   }\r
7136 \r
7137  switch (GlobalTextTP)\r
7138   {\r
7139    case 0:\r
7140     drawPoly4TEx4_TW(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,\r
7141                      (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff), ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));\r
7142     return;\r
7143    case 1:\r
7144     drawPoly4TEx8_TW(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,\r
7145                      (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff), ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));\r
7146     return;\r
7147    case 2:\r
7148     drawPoly4TD_TW(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,(gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff));\r
7149     return;\r
7150   }\r
7151 }\r
7152 \r
7153 ////////////////////////////////////////////////////////////////////////\r
7154 \r
7155 void drawPoly3GT(unsigned char * baseAddr)\r
7156 {\r
7157  uint32_t *gpuData = ((uint32_t *) baseAddr);\r
7158 \r
7159  if(GlobalTextIL && GlobalTextTP<2)\r
7160   {\r
7161    if(GlobalTextTP==0)\r
7162     drawPoly3TGEx4_IL(lx0,ly0,lx1,ly1,lx2,ly2,\r
7163                       (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff), \r
7164                       ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask),\r
7165                       gpuData[0],gpuData[3],gpuData[6]);\r
7166    else\r
7167     drawPoly3TGEx8_IL(lx0,ly0,lx1,ly1,lx2,ly2,\r
7168                       (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff), \r
7169                       ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask),\r
7170                       gpuData[0],gpuData[3],gpuData[6]);\r
7171    return;\r
7172   }\r
7173 \r
7174  if(!bUsingTWin)\r
7175   {\r
7176    switch (GlobalTextTP)\r
7177     {\r
7178      case 0:\r
7179       drawPoly3TGEx4(lx0,ly0,lx1,ly1,lx2,ly2,\r
7180                      (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff), \r
7181                      ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask),\r
7182                      gpuData[0],gpuData[3],gpuData[6]);\r
7183       return;\r
7184      case 1:\r
7185       drawPoly3TGEx8(lx0,ly0,lx1,ly1,lx2,ly2,\r
7186                      (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff), \r
7187                      ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask),\r
7188                      gpuData[0],gpuData[3],gpuData[6]);\r
7189       return;\r
7190      case 2:\r
7191       drawPoly3TGD(lx0,ly0,lx1,ly1,lx2,ly2,(gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),gpuData[0],gpuData[3],gpuData[6]);\r
7192       return;\r
7193     }\r
7194    return;\r
7195   }\r
7196 \r
7197  switch(GlobalTextTP)\r
7198   {\r
7199    case 0:\r
7200     drawPoly3TGEx4_TW(lx0,ly0,lx1,ly1,lx2,ly2,\r
7201                       (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff), \r
7202                       ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask),\r
7203                       gpuData[0],gpuData[3],gpuData[6]);\r
7204     return;\r
7205    case 1:\r
7206     drawPoly3TGEx8_TW(lx0,ly0,lx1,ly1,lx2,ly2,\r
7207                       (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff), \r
7208                       ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask),\r
7209                       gpuData[0],gpuData[3],gpuData[6]);\r
7210     return;\r
7211    case 2:\r
7212     drawPoly3TGD_TW(lx0,ly0,lx1,ly1,lx2,ly2,(gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),gpuData[0],gpuData[3],gpuData[6]);\r
7213     return;\r
7214   }\r
7215 }              \r
7216 \r
7217 ////////////////////////////////////////////////////////////////////////\r
7218 \r
7219 void drawPoly4GT(unsigned char *baseAddr)\r
7220 {\r
7221  uint32_t *gpuData = ((uint32_t *) baseAddr);\r
7222 \r
7223  if(GlobalTextIL && GlobalTextTP<2)\r
7224   {\r
7225    if(GlobalTextTP==0)\r
7226     drawPoly4TGEx4_TRI_IL(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,\r
7227                           (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[11] & 0x000000ff), ((gpuData[11]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),\r
7228                           ((gpuData[2]>>12) & 0x3f0),((gpuData[2]>>22) & iGPUHeightMask),\r
7229                           gpuData[0],gpuData[3],gpuData[6],gpuData[9]);\r
7230    else\r
7231     drawPoly4TGEx8_TRI_IL(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,\r
7232                           (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[11] & 0x000000ff), ((gpuData[11]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),\r
7233                           ((gpuData[2]>>12) & 0x3f0),((gpuData[2]>>22) & iGPUHeightMask),\r
7234                           gpuData[0],gpuData[3],gpuData[6],gpuData[9]);\r
7235    return;\r
7236   }\r
7237 \r
7238  if(!bUsingTWin)\r
7239   {\r
7240 #ifdef POLYQUAD3GT\r
7241    if(IsNoRect())\r
7242     {\r
7243      switch (GlobalTextTP)\r
7244       {\r
7245        case 0:\r
7246         drawPoly4TGEx4_TRI(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,\r
7247                       (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[11] & 0x000000ff), ((gpuData[11]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),\r
7248                       ((gpuData[2]>>12) & 0x3f0),((gpuData[2]>>22) & iGPUHeightMask),\r
7249                        gpuData[0],gpuData[3],gpuData[6],gpuData[9]);\r
7250 \r
7251         return;\r
7252        case 1:\r
7253         drawPoly4TGEx8_TRI(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,\r
7254                       (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[11] & 0x000000ff), ((gpuData[11]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),\r
7255                       ((gpuData[2]>>12) & 0x3f0),((gpuData[2]>>22) & iGPUHeightMask),\r
7256                       gpuData[0],gpuData[3],gpuData[6],gpuData[9]);\r
7257         return;\r
7258        case 2:\r
7259         drawPoly4TGD_TRI(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,(gpuData[2] & 0x000000ff),((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[11] & 0x000000ff), ((gpuData[11]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),gpuData[0],gpuData[3],gpuData[6],gpuData[9]);\r
7260         return;\r
7261       }\r
7262      return;\r
7263     }\r
7264 #endif\r
7265 \r
7266    switch (GlobalTextTP)\r
7267     {\r
7268      case 0:\r
7269       drawPoly4TGEx4(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,\r
7270                     (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[11] & 0x000000ff), ((gpuData[11]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),\r
7271                     ((gpuData[2]>>12) & 0x3f0),((gpuData[2]>>22) & iGPUHeightMask),\r
7272                      gpuData[0],gpuData[3],gpuData[6],gpuData[9]);\r
7273 \r
7274       return;\r
7275      case 1:\r
7276       drawPoly4TGEx8(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,\r
7277                     (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[11] & 0x000000ff), ((gpuData[11]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),\r
7278                     ((gpuData[2]>>12) & 0x3f0),((gpuData[2]>>22) & iGPUHeightMask),\r
7279                     gpuData[0],gpuData[3],gpuData[6],gpuData[9]);\r
7280       return;\r
7281      case 2:\r
7282       drawPoly4TGD(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,(gpuData[2] & 0x000000ff),((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[11] & 0x000000ff), ((gpuData[11]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),gpuData[0],gpuData[3],gpuData[6],gpuData[9]);\r
7283       return;\r
7284     }\r
7285    return;\r
7286   }\r
7287              \r
7288  switch (GlobalTextTP)\r
7289   {\r
7290    case 0:\r
7291     drawPoly4TGEx4_TW(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,\r
7292                       (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[11] & 0x000000ff), ((gpuData[11]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),\r
7293                       ((gpuData[2]>>12) & 0x3f0),((gpuData[2]>>22) & iGPUHeightMask),\r
7294                       gpuData[0],gpuData[3],gpuData[6],gpuData[9]);\r
7295     return;\r
7296    case 1:\r
7297     drawPoly4TGEx8_TW(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,\r
7298                       (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[11] & 0x000000ff), ((gpuData[11]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),\r
7299                       ((gpuData[2]>>12) & 0x3f0),((gpuData[2]>>22) & iGPUHeightMask),\r
7300                       gpuData[0],gpuData[3],gpuData[6],gpuData[9]);\r
7301     return;\r
7302    case 2:\r
7303     drawPoly4TGD_TW(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,(gpuData[2] & 0x000000ff),((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[11] & 0x000000ff), ((gpuData[11]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),gpuData[0],gpuData[3],gpuData[6],gpuData[9]);\r
7304     return;\r
7305   }\r
7306 }\r
7307                 \r
7308 ////////////////////////////////////////////////////////////////////////\r
7309 // SPRITE FUNCS\r
7310 ////////////////////////////////////////////////////////////////////////\r
7311 \r
7312 void DrawSoftwareSpriteTWin(unsigned char * baseAddr, int w, int h)\r
7313\r
7314  uint32_t *gpuData = (uint32_t *)baseAddr;\r
7315  short sx0,sy0,sx1,sy1,sx2,sy2,sx3,sy3;\r
7316  short tx0,ty0,tx1,ty1,tx2,ty2,tx3,ty3;\r
7317 \r
7318  sx0=lx0;\r
7319  sy0=ly0;\r
7320 \r
7321  sx0=sx3=sx0+PSXDisplay.DrawOffset.x;\r
7322  sx1=sx2=sx0+w;\r
7323  sy0=sy1=sy0+PSXDisplay.DrawOffset.y;\r
7324  sy2=sy3=sy0+h;\r
7325  \r
7326  tx0=tx3=gpuData[2]&0xff;\r
7327  tx1=tx2=tx0+w;\r
7328  ty0=ty1=(gpuData[2]>>8)&0xff;\r
7329  ty2=ty3=ty0+h;\r
7330 \r
7331  switch (GlobalTextTP)\r
7332   {\r
7333    case 0:\r
7334     drawPoly4TEx4_TW_S(sx0,sy0,sx1,sy1,sx2,sy2,sx3,sy3,\r
7335                      tx0,ty0,tx1,ty1,tx2,ty2,tx3,ty3, \r
7336                      ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));\r
7337     return;\r
7338    case 1:\r
7339     drawPoly4TEx8_TW_S(sx0,sy0,sx1,sy1,sx2,sy2,sx3,sy3,\r
7340                        tx0,ty0,tx1,ty1,tx2,ty2,tx3,ty3, \r
7341                        ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));\r
7342     return;\r
7343    case 2:\r
7344     drawPoly4TD_TW_S(sx0,sy0,sx1,sy1,sx2,sy2,sx3,sy3,\r
7345                      tx0,ty0,tx1,ty1,tx2,ty2,tx3,ty3);\r
7346     return;\r
7347   }\r
7348 }                                                   \r
7349 \r
7350 ////////////////////////////////////////////////////////////////////////\r
7351 \r
7352 void DrawSoftwareSpriteMirror(unsigned char * baseAddr, int w, int h)\r
7353 {\r
7354  int sprtY,sprtX,sprtW,sprtH,lXDir,lYDir;\r
7355  int clutY0,clutX0,clutP,textX0,textY0,sprtYa,sprCY,sprCX,sprA;\r
7356  short tC;\r
7357  uint32_t *gpuData = (uint32_t *)baseAddr;\r
7358  sprtY = ly0;\r
7359  sprtX = lx0;\r
7360  sprtH = h;\r
7361  sprtW = w;\r
7362  clutY0 = (gpuData[2]>>22) & iGPUHeightMask;\r
7363  clutX0 = (gpuData[2]>>12) & 0x3f0;\r
7364  clutP  = (clutY0<<11) + (clutX0<<1);\r
7365  textY0 = ((gpuData[2]>>8) & 0x000000ff) + GlobalTextAddrY;\r
7366  textX0 = (gpuData[2] & 0x000000ff);\r
7367 \r
7368  sprtX+=PSXDisplay.DrawOffset.x;\r
7369  sprtY+=PSXDisplay.DrawOffset.y;\r
7370 \r
7371 // while (sprtX>1023)             sprtX-=1024;\r
7372 // while (sprtY>MAXYLINESMIN1)    sprtY-=MAXYLINES;\r
7373 \r
7374  if(sprtX>drawW)\r
7375   {\r
7376 //   if((sprtX+sprtW)>1023) sprtX-=1024;\r
7377 //   else return;\r
7378    return;\r
7379   }\r
7380 \r
7381  if(sprtY>drawH)\r
7382   {\r
7383 //   if ((sprtY+sprtH)>MAXYLINESMIN1) sprtY-=MAXYLINES;\r
7384 //   else return;\r
7385    return;\r
7386   }\r
7387 \r
7388  if(sprtY<drawY)\r
7389   {\r
7390    if((sprtY+sprtH)<drawY) return;\r
7391    sprtH-=(drawY-sprtY);\r
7392    textY0+=(drawY-sprtY);\r
7393    sprtY=drawY;\r
7394   }\r
7395 \r
7396  if(sprtX<drawX)\r
7397   {\r
7398    if((sprtX+sprtW)<drawX) return;\r
7399    sprtW-=(drawX-sprtX);\r
7400    textX0+=(drawX-sprtX);\r
7401    sprtX=drawX;\r
7402   }\r
7403 \r
7404  if((sprtY+sprtH)>drawH) sprtH=drawH-sprtY+1;\r
7405  if((sprtX+sprtW)>drawW) sprtW=drawW-sprtX+1;\r
7406 \r
7407  if(usMirror&0x1000) lXDir=-1; else lXDir=1;\r
7408  if(usMirror&0x2000) lYDir=-1; else lYDir=1;\r
7409 \r
7410  switch (GlobalTextTP)\r
7411   {\r
7412    case 0: // texture is 4-bit\r
7413   \r
7414     sprtW=sprtW/2;\r
7415     textX0=(GlobalTextAddrX<<1)+(textX0>>1);\r
7416     sprtYa=(sprtY<<10);\r
7417     clutP=(clutY0<<10)+clutX0;\r
7418     for (sprCY=0;sprCY<sprtH;sprCY++)\r
7419      for (sprCX=0;sprCX<sprtW;sprCX++)\r
7420       {\r
7421        tC= psxVub[((textY0+(sprCY*lYDir))<<11) + textX0 +(sprCX*lXDir)];\r
7422        sprA=sprtYa+(sprCY<<10)+sprtX + (sprCX<<1);\r
7423        GetTextureTransColG_SPR(&psxVuw[sprA],psxVuw[clutP+((tC>>4)&0xf)]);\r
7424        GetTextureTransColG_SPR(&psxVuw[sprA+1],psxVuw[clutP+(tC&0xf)]);\r
7425       }\r
7426     return;\r
7427 \r
7428    case 1: \r
7429 \r
7430     clutP>>=1;\r
7431     for(sprCY=0;sprCY<sprtH;sprCY++)\r
7432      for(sprCX=0;sprCX<sprtW;sprCX++)\r
7433       { \r
7434        tC = psxVub[((textY0+(sprCY*lYDir))<<11)+(GlobalTextAddrX<<1) + textX0 + (sprCX*lXDir)] & 0xff;\r
7435        GetTextureTransColG_SPR(&psxVuw[((sprtY+sprCY)<<10)+sprtX + sprCX],psxVuw[clutP+tC]);\r
7436       }\r
7437      return;\r
7438 \r
7439 \r
7440    case 2:\r
7441 \r
7442     for (sprCY=0;sprCY<sprtH;sprCY++)\r
7443      for (sprCX=0;sprCX<sprtW;sprCX++)\r
7444       { \r
7445        GetTextureTransColG_SPR(&psxVuw[((sprtY+sprCY)<<10)+sprtX+sprCX],\r
7446            psxVuw[((textY0+(sprCY*lYDir))<<10)+GlobalTextAddrX + textX0 +(sprCX*lXDir)]);\r
7447       }\r
7448      return;\r
7449   }\r
7450 }\r
7451 \r
7452 ////////////////////////////////////////////////////////////////////////\r
7453 \r
7454 void DrawSoftwareSprite_IL(unsigned char * baseAddr,short w,short h,int tx,int ty)\r
7455 {\r
7456  int sprtY,sprtX,sprtW,sprtH,tdx,tdy;\r
7457  uint32_t *gpuData = (uint32_t *)baseAddr;\r
7458 \r
7459  sprtY = ly0;\r
7460  sprtX = lx0;\r
7461  sprtH = h;\r
7462  sprtW = w;\r
7463 \r
7464  sprtX+=PSXDisplay.DrawOffset.x;\r
7465  sprtY+=PSXDisplay.DrawOffset.y;\r
7466 \r
7467  if(sprtX>drawW) return;\r
7468  if(sprtY>drawH) return;\r
7469 \r
7470  tdx=tx+sprtW;\r
7471  tdy=ty+sprtH;\r
7472 \r
7473  sprtW+=sprtX;\r
7474  sprtH+=sprtY;\r
7475 \r
7476  // Pete is too lazy to make a faster version ;)\r
7477 \r
7478  if(GlobalTextTP==0)\r
7479   drawPoly4TEx4_IL(sprtX,sprtY,sprtX,sprtH,sprtW,sprtH,sprtW,sprtY,\r
7480                    tx,ty,      tx,tdy,     tdx,tdy,    tdx,ty,     \r
7481                    (gpuData[2]>>12) & 0x3f0, ((gpuData[2]>>22) & iGPUHeightMask));\r
7482 \r
7483 \r
7484  else\r
7485   drawPoly4TEx8_IL(sprtX,sprtY,sprtX,sprtH,sprtW,sprtH,sprtW,sprtY,\r
7486                    tx,ty,      tx,tdy,     tdx,tdy,    tdx,ty,     \r
7487                    (gpuData[2]>>12) & 0x3f0, ((gpuData[2]>>22) & iGPUHeightMask));\r
7488 }\r
7489 \r
7490 ////////////////////////////////////////////////////////////////////////\r
7491 \r
7492 void DrawSoftwareSprite(unsigned char *baseAddr, short w, short h, int tx, int ty)\r
7493 {\r
7494  int sprtY, sprtX, sprtW, sprtH;\r
7495  int clutY0, clutX0, clutP, textX0, textY0, sprtYa, sprCY, sprCX, sprA;\r
7496  short tC, tC2;\r
7497  uint32_t *gpuData = (uint32_t *)baseAddr;\r
7498  unsigned char *pV;\r
7499  BOOL bWT,bWS;\r
7500 \r
7501  if(GlobalTextIL && GlobalTextTP<2)\r
7502   {DrawSoftwareSprite_IL(baseAddr,w,h,tx,ty);return;}\r
7503 \r
7504  sprtY = ly0;\r
7505  sprtX = lx0;\r
7506  sprtH = h;\r
7507  sprtW = w;\r
7508  clutY0 = (gpuData[2]>>22) & iGPUHeightMask;\r
7509  clutX0 = (gpuData[2]>>12) & 0x3f0;\r
7510 \r
7511  clutP  = (clutY0<<11) + (clutX0<<1);\r
7512 \r
7513  textY0 =ty+ GlobalTextAddrY;\r
7514  textX0 =tx;\r
7515 \r
7516  sprtX+=PSXDisplay.DrawOffset.x;\r
7517  sprtY+=PSXDisplay.DrawOffset.y;\r
7518 \r
7519  //while (sprtX>1023)             sprtX-=1024;\r
7520  //while (sprtY>MAXYLINESMIN1)    sprtY-=MAXYLINES;\r
7521 \r
7522  if(sprtX>drawW)\r
7523   {\r
7524 //   if((sprtX+sprtW)>1023) sprtX-=1024;\r
7525 //   else return;\r
7526    return;\r
7527   }\r
7528 \r
7529  if(sprtY>drawH)\r
7530   {\r
7531 //   if ((sprtY+sprtH)>MAXYLINESMIN1) sprtY-=MAXYLINES;\r
7532 //   else return;\r
7533    return;\r
7534   }\r
7535 \r
7536  if(sprtY<drawY)\r
7537   {\r
7538    if((sprtY+sprtH)<drawY) return;\r
7539    sprtH-=(drawY-sprtY);\r
7540    textY0+=(drawY-sprtY);\r
7541    sprtY=drawY;\r
7542   }\r
7543 \r
7544  if(sprtX<drawX)\r
7545   {\r
7546    if((sprtX+sprtW)<drawX) return;\r
7547 \r
7548    sprtW-=(drawX-sprtX);\r
7549    textX0+=(drawX-sprtX);\r
7550    sprtX=drawX;\r
7551   }\r
7552 \r
7553  if((sprtY+sprtH)>drawH) sprtH=drawH-sprtY+1;\r
7554  if((sprtX+sprtW)>drawW) sprtW=drawW-sprtX+1;\r
7555 \r
7556 \r
7557  bWT=FALSE;\r
7558  bWS=FALSE;\r
7559 \r
7560  switch (GlobalTextTP)\r
7561   {\r
7562    case 0:\r
7563 \r
7564     if(textX0&1) {bWS=TRUE;sprtW--;}\r
7565     if(sprtW&1)  bWT=TRUE;\r
7566     \r
7567     sprtW=sprtW>>1;\r
7568     textX0=(GlobalTextAddrX<<1)+(textX0>>1)+(textY0<<11);\r
7569     sprtYa=(sprtY<<10)+sprtX;\r
7570     clutP=(clutY0<<10)+clutX0;\r
7571 \r
7572 #ifdef FASTSOLID\r
7573  \r
7574     if(!bCheckMask && !DrawSemiTrans)\r
7575      {\r
7576       for (sprCY=0;sprCY<sprtH;sprCY++)\r
7577        {\r
7578         sprA=sprtYa+(sprCY<<10);\r
7579         pV=&psxVub[(sprCY<<11)+textX0];\r
7580 \r
7581         if(bWS)\r
7582          {\r
7583           tC=*pV++;\r
7584           GetTextureTransColG_S(&psxVuw[sprA++],psxVuw[clutP+((tC>>4)&0xf)]);\r
7585          }\r
7586 \r
7587         for (sprCX=0;sprCX<sprtW;sprCX++,sprA+=2)\r
7588          { \r
7589           tC=*pV++;\r
7590 \r
7591           GetTextureTransColG32_S((uint32_t *)&psxVuw[sprA],\r
7592               (((int)psxVuw[clutP+((tC>>4)&0xf)])<<16)|\r
7593               psxVuw[clutP+(tC&0x0f)]);\r
7594          }\r
7595 \r
7596         if(bWT)\r
7597          {\r
7598           tC=*pV;\r
7599           GetTextureTransColG_S(&psxVuw[sprA],psxVuw[clutP+(tC&0x0f)]);\r
7600          }\r
7601        }\r
7602       return;\r
7603      }\r
7604 \r
7605 #endif\r
7606 \r
7607     for (sprCY=0;sprCY<sprtH;sprCY++)\r
7608      {\r
7609       sprA=sprtYa+(sprCY<<10);\r
7610       pV=&psxVub[(sprCY<<11)+textX0];\r
7611 \r
7612       if(bWS)\r
7613        {\r
7614         tC=*pV++;\r
7615         GetTextureTransColG_SPR(&psxVuw[sprA++],psxVuw[clutP+((tC>>4)&0xf)]);\r
7616        }\r
7617 \r
7618       for (sprCX=0;sprCX<sprtW;sprCX++,sprA+=2)\r
7619        { \r
7620         tC=*pV++;\r
7621 \r
7622         GetTextureTransColG32_SPR((uint32_t *)&psxVuw[sprA],\r
7623             (((int)psxVuw[clutP+((tC>>4)&0xf)])<<16)|\r
7624             psxVuw[clutP+(tC&0x0f)]);\r
7625        }\r
7626 \r
7627       if(bWT)\r
7628        {\r
7629         tC=*pV;\r
7630         GetTextureTransColG_SPR(&psxVuw[sprA],psxVuw[clutP+(tC&0x0f)]);\r
7631        }\r
7632      }\r
7633     return;\r
7634 \r
7635    case 1:\r
7636     clutP>>=1;sprtW--;\r
7637     textX0+=(GlobalTextAddrX<<1) + (textY0<<11);\r
7638 \r
7639 #ifdef FASTSOLID\r
7640 \r
7641     if(!bCheckMask && !DrawSemiTrans)\r
7642      {\r
7643       for(sprCY=0;sprCY<sprtH;sprCY++)\r
7644        {\r
7645         sprA=((sprtY+sprCY)<<10)+sprtX;\r
7646         pV=&psxVub[(sprCY<<11)+textX0];\r
7647         for(sprCX=0;sprCX<sprtW;sprCX+=2,sprA+=2)\r
7648          { \r
7649           tC = *pV++;tC2 = *pV++;\r
7650           GetTextureTransColG32_S((uint32_t *)&psxVuw[sprA],\r
7651               (((int)psxVuw[clutP+tC2])<<16)|\r
7652               psxVuw[clutP+tC]);\r
7653          }\r
7654         if(sprCX==sprtW)\r
7655          GetTextureTransColG_S(&psxVuw[sprA],psxVuw[clutP+(*pV)]);\r
7656        }\r
7657       return;\r
7658      }\r
7659 \r
7660 #endif\r
7661 \r
7662     for(sprCY=0;sprCY<sprtH;sprCY++)\r
7663      {\r
7664       sprA=((sprtY+sprCY)<<10)+sprtX;\r
7665       pV=&psxVub[(sprCY<<11)+textX0];\r
7666       for(sprCX=0;sprCX<sprtW;sprCX+=2,sprA+=2)\r
7667        { \r
7668         tC = *pV++;tC2 = *pV++;\r
7669         GetTextureTransColG32_SPR((uint32_t *)&psxVuw[sprA],\r
7670             (((int)psxVuw[clutP+tC2])<<16)|\r
7671             psxVuw[clutP+tC]);\r
7672        }\r
7673       if(sprCX==sprtW)\r
7674        GetTextureTransColG_SPR(&psxVuw[sprA],psxVuw[clutP+(*pV)]);\r
7675      }\r
7676     return;\r
7677 \r
7678    case 2:\r
7679 \r
7680     textX0+=(GlobalTextAddrX) + (textY0<<10);\r
7681     sprtW--;\r
7682 \r
7683 #ifdef FASTSOLID\r
7684 \r
7685     if(!bCheckMask && !DrawSemiTrans)\r
7686      {\r
7687       for (sprCY=0;sprCY<sprtH;sprCY++)\r
7688        {\r
7689         sprA=((sprtY+sprCY)<<10)+sprtX;\r
7690 \r
7691         for (sprCX=0;sprCX<sprtW;sprCX+=2,sprA+=2)\r
7692          { \r
7693           GetTextureTransColG32_S((uint32_t *)&psxVuw[sprA],\r
7694               (((int)psxVuw[(sprCY<<10) + textX0 + sprCX +1])<<16)|\r
7695               psxVuw[(sprCY<<10) + textX0 + sprCX]);\r
7696          }\r
7697         if(sprCX==sprtW)\r
7698          GetTextureTransColG_S(&psxVuw[sprA],\r
7699               psxVuw[(sprCY<<10) + textX0 + sprCX]);\r
7700 \r
7701        }\r
7702       return;\r
7703      }\r
7704 \r
7705 #endif\r
7706 \r
7707     for (sprCY=0;sprCY<sprtH;sprCY++)\r
7708      {\r
7709       sprA=((sprtY+sprCY)<<10)+sprtX;\r
7710 \r
7711       for (sprCX=0;sprCX<sprtW;sprCX+=2,sprA+=2)\r
7712        { \r
7713         GetTextureTransColG32_SPR((uint32_t *)&psxVuw[sprA],\r
7714             (((int)psxVuw[(sprCY<<10) + textX0 + sprCX +1])<<16)|\r
7715             psxVuw[(sprCY<<10) + textX0 + sprCX]);\r
7716        }\r
7717       if(sprCX==sprtW)\r
7718        GetTextureTransColG_SPR(&psxVuw[sprA],\r
7719             psxVuw[(sprCY<<10) + textX0 + sprCX]);\r
7720 \r
7721      }\r
7722     return;\r
7723    }                \r
7724 }\r
7725  \r
7726 ///////////////////////////////////////////////////////////////////////\r
7727 \r
7728 /////////////////////////////////////////////////////////////////\r
7729 /////////////////////////////////////////////////////////////////\r
7730 /////////////////////////////////////////////////////////////////\r
7731 // LINE FUNCS\r
7732 ////////////////////////////////////////////////////////////////////////\r
7733 /////////////////////////////////////////////////////////////////\r
7734 /////////////////////////////////////////////////////////////////\r
7735 \r
7736 \r
7737 ///////////////////////////////////////////////////////////////////////\r
7738 \r
7739 void Line_E_SE_Shade(int x0, int y0, int x1, int y1, uint32_t rgb0, uint32_t rgb1)\r
7740 {\r
7741     int dx, dy, incrE, incrSE, d;\r
7742                 uint32_t r0, g0, b0, r1, g1, b1;\r
7743                 int dr, dg, db;\r
7744 \r
7745                 r0 = (rgb0 & 0x00ff0000);\r
7746                 g0 = (rgb0 & 0x0000ff00) << 8;\r
7747                 b0 = (rgb0 & 0x000000ff) << 16;\r
7748                 r1 = (rgb1 & 0x00ff0000);\r
7749                 g1 = (rgb1 & 0x0000ff00) << 8;\r
7750                 b1 = (rgb1 & 0x000000ff) << 16;\r
7751 \r
7752     dx = x1 - x0;\r
7753     dy = y1 - y0;\r
7754 \r
7755                 if (dx > 0)\r
7756                 {\r
7757                         dr = ((int)r1 - (int)r0) / dx;\r
7758                         dg = ((int)g1 - (int)g0) / dx;\r
7759                         db = ((int)b1 - (int)b0) / dx;\r
7760                 }\r
7761                 else\r
7762                 {\r
7763                         dr = ((int)r1 - (int)r0);\r
7764                         dg = ((int)g1 - (int)g0);\r
7765                         db = ((int)b1 - (int)b0);\r
7766                 }\r
7767 \r
7768     d = 2*dy - dx;              /* Initial value of d */\r
7769     incrE = 2*dy;               /* incr. used for move to E */\r
7770     incrSE = 2*(dy - dx);       /* incr. used for move to SE */\r
7771 \r
7772                 if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))\r
7773                         GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));\r
7774     while(x0 < x1)\r
7775     {\r
7776         if (d <= 0)\r
7777         {\r
7778             d = d + incrE;              /* Choose E */\r
7779         }\r
7780         else\r
7781         {\r
7782             d = d + incrSE;             /* Choose SE */\r
7783             y0++;\r
7784         }\r
7785         x0++;\r
7786 \r
7787                                 r0+=dr;\r
7788                                 g0+=dg;\r
7789                                 b0+=db;\r
7790 \r
7791                                 if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))\r
7792                                         GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));\r
7793     }\r
7794 }\r
7795 \r
7796 ///////////////////////////////////////////////////////////////////////\r
7797 \r
7798 void Line_S_SE_Shade(int x0, int y0, int x1, int y1, uint32_t rgb0, uint32_t rgb1)\r
7799 {\r
7800     int dx, dy, incrS, incrSE, d;\r
7801                 uint32_t r0, g0, b0, r1, g1, b1;\r
7802                 int dr, dg, db;\r
7803 \r
7804                 r0 = (rgb0 & 0x00ff0000);\r
7805                 g0 = (rgb0 & 0x0000ff00) << 8;\r
7806                 b0 = (rgb0 & 0x000000ff) << 16;\r
7807                 r1 = (rgb1 & 0x00ff0000);\r
7808                 g1 = (rgb1 & 0x0000ff00) << 8;\r
7809                 b1 = (rgb1 & 0x000000ff) << 16;\r
7810 \r
7811     dx = x1 - x0;\r
7812     dy = y1 - y0;\r
7813 \r
7814                 if (dy > 0)\r
7815                 {\r
7816                         dr = ((int)r1 - (int)r0) / dy;\r
7817                         dg = ((int)g1 - (int)g0) / dy;\r
7818                         db = ((int)b1 - (int)b0) / dy;\r
7819                 }\r
7820                 else\r
7821                 {\r
7822                         dr = ((int)r1 - (int)r0);\r
7823                         dg = ((int)g1 - (int)g0);\r
7824                         db = ((int)b1 - (int)b0);\r
7825                 }\r
7826 \r
7827     d = 2*dx - dy;              /* Initial value of d */\r
7828     incrS = 2*dx;               /* incr. used for move to S */\r
7829     incrSE = 2*(dx - dy);       /* incr. used for move to SE */\r
7830 \r
7831                 if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))\r
7832                         GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));\r
7833     while(y0 < y1)\r
7834     {\r
7835         if (d <= 0)\r
7836         {\r
7837             d = d + incrS;              /* Choose S */\r
7838         }\r
7839         else\r
7840         {\r
7841             d = d + incrSE;             /* Choose SE */\r
7842             x0++;\r
7843         }\r
7844         y0++;\r
7845 \r
7846                                 r0+=dr;\r
7847                                 g0+=dg;\r
7848                                 b0+=db;\r
7849 \r
7850                                 if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))\r
7851                                         GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));\r
7852     }\r
7853 }\r
7854 \r
7855 ///////////////////////////////////////////////////////////////////////\r
7856 \r
7857 void Line_N_NE_Shade(int x0, int y0, int x1, int y1, uint32_t rgb0, uint32_t rgb1)\r
7858 {\r
7859     int dx, dy, incrN, incrNE, d;\r
7860                 uint32_t r0, g0, b0, r1, g1, b1;\r
7861                 int dr, dg, db;\r
7862 \r
7863                 r0 = (rgb0 & 0x00ff0000);\r
7864                 g0 = (rgb0 & 0x0000ff00) << 8;\r
7865                 b0 = (rgb0 & 0x000000ff) << 16;\r
7866                 r1 = (rgb1 & 0x00ff0000);\r
7867                 g1 = (rgb1 & 0x0000ff00) << 8;\r
7868                 b1 = (rgb1 & 0x000000ff) << 16;\r
7869 \r
7870     dx = x1 - x0;\r
7871     dy = -(y1 - y0);\r
7872 \r
7873                 if (dy > 0)\r
7874                 {\r
7875                         dr = ((uint32_t)r1 - (uint32_t)r0) / dy;\r
7876                         dg = ((uint32_t)g1 - (uint32_t)g0) / dy;\r
7877                         db = ((uint32_t)b1 - (uint32_t)b0) / dy;\r
7878                 }\r
7879                 else\r
7880                 {\r
7881                         dr = ((uint32_t)r1 - (uint32_t)r0);\r
7882                         dg = ((uint32_t)g1 - (uint32_t)g0);\r
7883                         db = ((uint32_t)b1 - (uint32_t)b0);\r
7884                 }\r
7885 \r
7886     d = 2*dx - dy;              /* Initial value of d */\r
7887     incrN = 2*dx;               /* incr. used for move to N */\r
7888     incrNE = 2*(dx - dy);       /* incr. used for move to NE */\r
7889 \r
7890                 if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))\r
7891                         GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));\r
7892     while(y0 > y1)\r
7893     {\r
7894         if (d <= 0)\r
7895         {\r
7896             d = d + incrN;              /* Choose N */\r
7897         }\r
7898         else\r
7899         {\r
7900             d = d + incrNE;             /* Choose NE */\r
7901             x0++;\r
7902         }\r
7903         y0--;\r
7904 \r
7905                                 r0+=dr;\r
7906                                 g0+=dg;\r
7907                                 b0+=db;\r
7908 \r
7909                                 if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))\r
7910                                         GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));\r
7911     }\r
7912 }\r
7913 \r
7914 ///////////////////////////////////////////////////////////////////////\r
7915 \r
7916 void Line_E_NE_Shade(int x0, int y0, int x1, int y1, uint32_t rgb0, uint32_t rgb1)\r
7917 {\r
7918     int dx, dy, incrE, incrNE, d;\r
7919                 uint32_t r0, g0, b0, r1, g1, b1;\r
7920                 int dr, dg, db;\r
7921 \r
7922                 r0 = (rgb0 & 0x00ff0000);\r
7923                 g0 = (rgb0 & 0x0000ff00) << 8;\r
7924                 b0 = (rgb0 & 0x000000ff) << 16;\r
7925                 r1 = (rgb1 & 0x00ff0000);\r
7926                 g1 = (rgb1 & 0x0000ff00) << 8;\r
7927                 b1 = (rgb1 & 0x000000ff) << 16;\r
7928 \r
7929     dx = x1 - x0;\r
7930     dy = -(y1 - y0);\r
7931 \r
7932                 if (dx > 0)\r
7933                 {\r
7934                         dr = ((int)r1 - (int)r0) / dx;\r
7935                         dg = ((int)g1 - (int)g0) / dx;\r
7936                         db = ((int)b1 - (int)b0) / dx;\r
7937                 }\r
7938                 else\r
7939                 {\r
7940                         dr = ((int)r1 - (int)r0);\r
7941                         dg = ((int)g1 - (int)g0);\r
7942                         db = ((int)b1 - (int)b0);\r
7943                 }\r
7944 \r
7945     d = 2*dy - dx;              /* Initial value of d */\r
7946     incrE = 2*dy;               /* incr. used for move to E */\r
7947     incrNE = 2*(dy - dx);       /* incr. used for move to NE */\r
7948 \r
7949                 if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))\r
7950                         GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));\r
7951     while(x0 < x1)\r
7952     {\r
7953         if (d <= 0)\r
7954         {\r
7955             d = d + incrE;              /* Choose E */\r
7956         }\r
7957         else\r
7958         {\r
7959             d = d + incrNE;             /* Choose NE */\r
7960             y0--;\r
7961         }\r
7962         x0++;\r
7963 \r
7964                                 r0+=dr;\r
7965                                 g0+=dg;\r
7966                                 b0+=db;\r
7967 \r
7968                                 if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))\r
7969                                         GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));\r
7970     }\r
7971 }\r
7972 \r
7973 ///////////////////////////////////////////////////////////////////////\r
7974 \r
7975 void VertLineShade(int x, int y0, int y1, uint32_t rgb0, uint32_t rgb1)\r
7976 {\r
7977   int y, dy;\r
7978         uint32_t r0, g0, b0, r1, g1, b1;\r
7979         int dr, dg, db;\r
7980 \r
7981         r0 = (rgb0 & 0x00ff0000);\r
7982         g0 = (rgb0 & 0x0000ff00) << 8;\r
7983         b0 = (rgb0 & 0x000000ff) << 16;\r
7984         r1 = (rgb1 & 0x00ff0000);\r
7985         g1 = (rgb1 & 0x0000ff00) << 8;\r
7986         b1 = (rgb1 & 0x000000ff) << 16;\r
7987 \r
7988         dy = (y1 - y0);\r
7989 \r
7990         if (dy > 0)\r
7991         {\r
7992                 dr = ((int)r1 - (int)r0) / dy;\r
7993                 dg = ((int)g1 - (int)g0) / dy;\r
7994                 db = ((int)b1 - (int)b0) / dy;\r
7995         }\r
7996         else\r
7997         {\r
7998                 dr = ((int)r1 - (int)r0);\r
7999                 dg = ((int)g1 - (int)g0);\r
8000                 db = ((int)b1 - (int)b0);\r
8001         }\r
8002 \r
8003         if (y0 < drawY)\r
8004         {\r
8005                 r0+=dr*(drawY - y0);\r
8006                 g0+=dg*(drawY - y0);\r
8007                 b0+=db*(drawY - y0);\r
8008                 y0 = drawY;\r
8009         }\r
8010 \r
8011         if (y1 > drawH)\r
8012                 y1 = drawH;\r
8013 \r
8014   for (y = y0; y <= y1; y++)\r
8015         {\r
8016                 GetShadeTransCol(&psxVuw[(y<<10)+x],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));\r
8017                 r0+=dr;\r
8018                 g0+=dg;\r
8019                 b0+=db;\r
8020         }\r
8021 }\r
8022 \r
8023 ///////////////////////////////////////////////////////////////////////\r
8024 \r
8025 void HorzLineShade(int y, int x0, int x1, uint32_t rgb0, uint32_t rgb1)\r
8026 {\r
8027   int x, dx;\r
8028         uint32_t r0, g0, b0, r1, g1, b1;\r
8029         int dr, dg, db;\r
8030 \r
8031         r0 = (rgb0 & 0x00ff0000);\r
8032         g0 = (rgb0 & 0x0000ff00) << 8;\r
8033         b0 = (rgb0 & 0x000000ff) << 16;\r
8034         r1 = (rgb1 & 0x00ff0000);\r
8035         g1 = (rgb1 & 0x0000ff00) << 8;\r
8036         b1 = (rgb1 & 0x000000ff) << 16;\r
8037 \r
8038         dx = (x1 - x0);\r
8039 \r
8040         if (dx > 0)\r
8041         {\r
8042                 dr = ((int)r1 - (int)r0) / dx;\r
8043                 dg = ((int)g1 - (int)g0) / dx;\r
8044                 db = ((int)b1 - (int)b0) / dx;\r
8045         }\r
8046         else\r
8047         {\r
8048                 dr = ((int)r1 - (int)r0);\r
8049                 dg = ((int)g1 - (int)g0);\r
8050                 db = ((int)b1 - (int)b0);\r
8051         }\r
8052 \r
8053         if (x0 < drawX)\r
8054         {\r
8055                 r0+=dr*(drawX - x0);\r
8056                 g0+=dg*(drawX - x0);\r
8057                 b0+=db*(drawX - x0);\r
8058                 x0 = drawX;\r
8059         }\r
8060 \r
8061         if (x1 > drawW)\r
8062                 x1 = drawW;\r
8063 \r
8064   for (x = x0; x <= x1; x++)\r
8065         {\r
8066                 GetShadeTransCol(&psxVuw[(y<<10)+x],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));\r
8067                 r0+=dr;\r
8068                 g0+=dg;\r
8069                 b0+=db;\r
8070         }\r
8071 }\r
8072 \r
8073 ///////////////////////////////////////////////////////////////////////\r
8074 \r
8075 void Line_E_SE_Flat(int x0, int y0, int x1, int y1, unsigned short colour)\r
8076 {\r
8077     int dx, dy, incrE, incrSE, d, x, y;\r
8078 \r
8079     dx = x1 - x0;\r
8080     dy = y1 - y0;\r
8081     d = 2*dy - dx;              /* Initial value of d */\r
8082     incrE = 2*dy;               /* incr. used for move to E */\r
8083     incrSE = 2*(dy - dx);       /* incr. used for move to SE */\r
8084     x = x0;\r
8085     y = y0;\r
8086                 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))\r
8087                         GetShadeTransCol(&psxVuw[(y<<10)+x], colour);\r
8088     while(x < x1)\r
8089     {\r
8090         if (d <= 0)\r
8091         {\r
8092             d = d + incrE;              /* Choose E */\r
8093             x++;\r
8094         }\r
8095         else\r
8096         {\r
8097             d = d + incrSE;             /* Choose SE */\r
8098             x++;\r
8099             y++;\r
8100         }\r
8101                                 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))\r
8102                                         GetShadeTransCol(&psxVuw[(y<<10)+x], colour);\r
8103     }\r
8104 }\r
8105 \r
8106 ///////////////////////////////////////////////////////////////////////\r
8107 \r
8108 void Line_S_SE_Flat(int x0, int y0, int x1, int y1, unsigned short colour)\r
8109 {\r
8110     int dx, dy, incrS, incrSE, d, x, y;\r
8111 \r
8112     dx = x1 - x0;\r
8113     dy = y1 - y0;\r
8114     d = 2*dx - dy;              /* Initial value of d */\r
8115     incrS = 2*dx;               /* incr. used for move to S */\r
8116     incrSE = 2*(dx - dy);       /* incr. used for move to SE */\r
8117     x = x0;\r
8118     y = y0;\r
8119                 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))\r
8120                         GetShadeTransCol(&psxVuw[(y<<10)+x], colour);\r
8121     while(y < y1)\r
8122     {\r
8123         if (d <= 0)\r
8124         {\r
8125             d = d + incrS;              /* Choose S */\r
8126             y++;\r
8127         }\r
8128         else\r
8129         {\r
8130             d = d + incrSE;             /* Choose SE */\r
8131             x++;\r
8132             y++;\r
8133         }\r
8134                                 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))\r
8135                                         GetShadeTransCol(&psxVuw[(y<<10)+x], colour);\r
8136     }\r
8137 }\r
8138 \r
8139 ///////////////////////////////////////////////////////////////////////\r
8140 \r
8141 void Line_N_NE_Flat(int x0, int y0, int x1, int y1, unsigned short colour)\r
8142 {\r
8143     int dx, dy, incrN, incrNE, d, x, y;\r
8144 \r
8145     dx = x1 - x0;\r
8146     dy = -(y1 - y0);\r
8147     d = 2*dx - dy;              /* Initial value of d */\r
8148     incrN = 2*dx;               /* incr. used for move to N */\r
8149     incrNE = 2*(dx - dy);       /* incr. used for move to NE */\r
8150     x = x0;\r
8151     y = y0;\r
8152                 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))\r
8153                         GetShadeTransCol(&psxVuw[(y<<10)+x], colour);\r
8154     while(y > y1)\r
8155     {\r
8156         if (d <= 0)\r
8157         {\r
8158             d = d + incrN;              /* Choose N */\r
8159             y--;\r
8160         }\r
8161         else\r
8162         {\r
8163             d = d + incrNE;             /* Choose NE */\r
8164             x++;\r
8165             y--;\r
8166         }\r
8167                                 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))\r
8168                                         GetShadeTransCol(&psxVuw[(y<<10)+x], colour);\r
8169     }\r
8170 }\r
8171 \r
8172 ///////////////////////////////////////////////////////////////////////\r
8173 \r
8174 void Line_E_NE_Flat(int x0, int y0, int x1, int y1, unsigned short colour)\r
8175 {\r
8176     int dx, dy, incrE, incrNE, d, x, y;\r
8177 \r
8178     dx = x1 - x0;\r
8179     dy = -(y1 - y0);\r
8180     d = 2*dy - dx;              /* Initial value of d */\r
8181     incrE = 2*dy;               /* incr. used for move to E */\r
8182     incrNE = 2*(dy - dx);       /* incr. used for move to NE */\r
8183     x = x0;\r
8184     y = y0;\r
8185                 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))\r
8186                         GetShadeTransCol(&psxVuw[(y<<10)+x], colour);\r
8187     while(x < x1)\r
8188     {\r
8189         if (d <= 0)\r
8190         {\r
8191             d = d + incrE;              /* Choose E */\r
8192             x++;\r
8193         }\r
8194         else\r
8195         {\r
8196             d = d + incrNE;             /* Choose NE */\r
8197             x++;\r
8198             y--;\r
8199         }\r
8200                                 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))\r
8201                                         GetShadeTransCol(&psxVuw[(y<<10)+x], colour);\r
8202     }\r
8203 }\r
8204 \r
8205 ///////////////////////////////////////////////////////////////////////\r
8206 \r
8207 void VertLineFlat(int x, int y0, int y1, unsigned short colour)\r
8208 {\r
8209         int y;\r
8210 \r
8211         if (y0 < drawY)\r
8212                 y0 = drawY;\r
8213 \r
8214         if (y1 > drawH)\r
8215                 y1 = drawH;\r
8216 \r
8217   for (y = y0; y <= y1; y++)\r
8218                 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);\r
8219 }\r
8220 \r
8221 ///////////////////////////////////////////////////////////////////////\r
8222 \r
8223 void HorzLineFlat(int y, int x0, int x1, unsigned short colour)\r
8224 {\r
8225         int x;\r
8226 \r
8227         if (x0 < drawX)\r
8228                 x0 = drawX;\r
8229 \r
8230         if (x1 > drawW)\r
8231                 x1 = drawW;\r
8232 \r
8233         for (x = x0; x <= x1; x++)\r
8234                 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);\r
8235 }\r
8236 \r
8237 ///////////////////////////////////////////////////////////////////////\r
8238 \r
8239 /* Bresenham Line drawing function */\r
8240 void DrawSoftwareLineShade(int rgb0, int rgb1)\r
8241 {\r
8242         short x0, y0, x1, y1, xt, yt;\r
8243         int rgbt;\r
8244         double m, dy, dx;\r
8245 \r
8246         if(lx0>drawW && lx1>drawW) return;\r
8247         if(ly0>drawH && ly1>drawH) return;\r
8248         if(lx0<drawX && lx1<drawX) return;\r
8249         if(ly0<drawY && ly1<drawY) return;\r
8250         if(drawY>=drawH) return;\r
8251         if(drawX>=drawW) return; \r
8252 \r
8253         x0 = lx0;\r
8254         y0 = ly0;\r
8255         x1 = lx1;\r
8256         y1 = ly1;\r
8257 \r
8258         dx = x1 - x0;\r
8259         dy = y1 - y0;\r
8260 \r
8261         if (dx == 0)\r
8262         {\r
8263                 if (dy > 0)\r
8264                         VertLineShade(x0, y0, y1, rgb0, rgb1);\r
8265                 else\r
8266                         VertLineShade(x0, y1, y0, rgb1, rgb0);\r
8267         }\r
8268         else\r
8269                 if (dy == 0)\r
8270                 {\r
8271                         if (dx > 0)\r
8272                                 HorzLineShade(y0, x0, x1, rgb0, rgb1);\r
8273                         else\r
8274                                 HorzLineShade(y0, x1, x0, rgb1, rgb0);\r
8275                 }\r
8276                 else\r
8277                 {\r
8278                         if (dx < 0)\r
8279                         {\r
8280                                 xt = x0;\r
8281                                 yt = y0;\r
8282                                 rgbt = rgb0;\r
8283                                 x0 = x1;\r
8284                                 y0 = y1;\r
8285                                 rgb0 = rgb1;\r
8286                                 x1 = xt;\r
8287                                 y1 = yt;\r
8288                                 rgb1 = rgbt;\r
8289 \r
8290                                 dx = x1 - x0;\r
8291                                 dy = y1 - y0;\r
8292                         }\r
8293 \r
8294                         m = dy/dx;\r
8295 \r
8296                         if (m >= 0)\r
8297                         {\r
8298                                 if (m > 1)\r
8299                                         Line_S_SE_Shade(x0, y0, x1, y1, rgb0, rgb1);\r
8300                                 else\r
8301                                         Line_E_SE_Shade(x0, y0, x1, y1, rgb0, rgb1);\r
8302                         }\r
8303                         else\r
8304                                 if (m < -1)\r
8305                                         Line_N_NE_Shade(x0, y0, x1, y1, rgb0, rgb1);\r
8306                                 else\r
8307                                         Line_E_NE_Shade(x0, y0, x1, y1, rgb0, rgb1);\r
8308                 }\r
8309 }\r
8310 \r
8311 ///////////////////////////////////////////////////////////////////////\r
8312 \r
8313 void DrawSoftwareLineFlat(int rgb)\r
8314 {\r
8315         short x0, y0, x1, y1, xt, yt;\r
8316         double m, dy, dx;\r
8317         unsigned short colour = 0;\r
8318  \r
8319         if(lx0>drawW && lx1>drawW) return;\r
8320         if(ly0>drawH && ly1>drawH) return;\r
8321         if(lx0<drawX && lx1<drawX) return;\r
8322         if(ly0<drawY && ly1<drawY) return;\r
8323         if(drawY>=drawH) return;\r
8324         if(drawX>=drawW) return; \r
8325 \r
8326         colour = ((rgb & 0x00f80000)>>9) | ((rgb & 0x0000f800)>>6) | ((rgb & 0x000000f8)>>3);\r
8327 \r
8328         x0 = lx0;\r
8329         y0 = ly0;\r
8330         x1 = lx1;\r
8331         y1 = ly1;\r
8332 \r
8333         dx = x1 - x0;\r
8334         dy = y1 - y0;\r
8335 \r
8336         if (dx == 0)\r
8337         {\r
8338                 if (dy == 0)\r
8339                         return; // Nothing to draw\r
8340                 else if (dy > 0)\r
8341                         VertLineFlat(x0, y0, y1, colour);\r
8342                 else\r
8343                         VertLineFlat(x0, y1, y0, colour);\r
8344         }\r
8345         else\r
8346                 if (dy == 0)\r
8347                 {\r
8348                         if (dx > 0)\r
8349                                 HorzLineFlat(y0, x0, x1, colour);\r
8350                         else\r
8351                                 HorzLineFlat(y0, x1, x0, colour);\r
8352                 }\r
8353                 else\r
8354                 {\r
8355                         if (dx < 0)\r
8356                         {\r
8357                                 xt = x0;\r
8358                                 yt = y0;\r
8359                                 x0 = x1;\r
8360                                 y0 = y1;\r
8361                                 x1 = xt;\r
8362                                 y1 = yt;\r
8363 \r
8364                                 dx = x1 - x0;\r
8365                                 dy = y1 - y0;\r
8366                         }\r
8367 \r
8368                         m = dy/dx;\r
8369 \r
8370                         if (m >= 0)\r
8371                         {\r
8372                                 if (m > 1)\r
8373                                         Line_S_SE_Flat(x0, y0, x1, y1, colour);\r
8374                                 else\r
8375                                         Line_E_SE_Flat(x0, y0, x1, y1, colour);\r
8376                         }\r
8377                         else\r
8378                                 if (m < -1)\r
8379                                         Line_N_NE_Flat(x0, y0, x1, y1, colour);\r
8380                                 else\r
8381                                         Line_E_NE_Flat(x0, y0, x1, y1, colour);\r
8382                 }\r
8383 }\r
8384 \r
8385 ///////////////////////////////////////////////////////////////////////\r