1 /***************************************************************************
4 begin : Sun Oct 28 2001
5 copyright : (C) 2001 by Pete Bernert
6 email : BlackDove@addcom.de
7 ***************************************************************************/
8 /***************************************************************************
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. See also the license.txt file for *
14 * additional informations. *
16 ***************************************************************************/
18 // switches for painting textured quads as 2 triangles (small glitches, but better shading!)
19 // can be toggled by game fix 0x200 in version 1.17 anyway, so let the defines enabled!
23 // fast solid loops... a bit more additional code, of course
26 // psx blending mode 3 with 25% incoming color (instead 50% without the define)
27 #define HALFBRIGHTMODE3
29 // color decode defines
31 #define XCOL1(x) (x & 0x1f)
32 #define XCOL2(x) (x & 0x3e0)
33 #define XCOL3(x) (x & 0x7c00)
35 #define XCOL1D(x) (x & 0x1f)
36 #define XCOL2D(x) ((x>>5) & 0x1f)
37 #define XCOL3D(x) ((x>>10) & 0x1f)
39 #define X32TCOL1(x) ((x & 0x001f001f)<<7)
40 #define X32TCOL2(x) ((x & 0x03e003e0)<<2)
41 #define X32TCOL3(x) ((x & 0x7c007c00)>>3)
43 #define X32COL1(x) (x & 0x001f001f)
44 #define X32COL2(x) ((x>>5) & 0x001f001f)
45 #define X32COL3(x) ((x>>10) & 0x001f001f)
47 #define X32ACOL1(x) (x & 0x001e001e)
48 #define X32ACOL2(x) ((x>>5) & 0x001e001e)
49 #define X32ACOL3(x) ((x>>10) & 0x001e001e)
51 #define X32BCOL1(x) (x & 0x001c001c)
52 #define X32BCOL2(x) ((x>>5) & 0x001c001c)
53 #define X32BCOL3(x) ((x>>10) & 0x001c001c)
55 #define X32PSXCOL(r,g,b) ((g<<10)|(b<<5)|r)
57 #define XPSXCOL(r,g,b) ((g&0x7c00)|(b&0x3e0)|(r&0x1f))
60 short g_m1=255,g_m2=255,g_m3=255;
61 short DrawSemiTrans=FALSE;
64 short ly0,lx0,ly1,lx1,ly2,lx2,ly3,lx3; // global psx vertex coords
65 int32_t GlobalTextAddrX,GlobalTextAddrY,GlobalTextTP;
66 int32_t GlobalTextABR,GlobalTextPAGE;
68 ////////////////////////////////////////////////////////////////////////
69 // POLYGON OFFSET FUNCS
70 ////////////////////////////////////////////////////////////////////////
72 static void offsetPSX2(void)
74 lx0 += PSXDisplay.DrawOffset.x;
75 ly0 += PSXDisplay.DrawOffset.y;
76 lx1 += PSXDisplay.DrawOffset.x;
77 ly1 += PSXDisplay.DrawOffset.y;
80 static void offsetPSX3(void)
82 lx0 += PSXDisplay.DrawOffset.x;
83 ly0 += PSXDisplay.DrawOffset.y;
84 lx1 += PSXDisplay.DrawOffset.x;
85 ly1 += PSXDisplay.DrawOffset.y;
86 lx2 += PSXDisplay.DrawOffset.x;
87 ly2 += PSXDisplay.DrawOffset.y;
90 static void offsetPSX4(void)
92 lx0 += PSXDisplay.DrawOffset.x;
93 ly0 += PSXDisplay.DrawOffset.y;
94 lx1 += PSXDisplay.DrawOffset.x;
95 ly1 += PSXDisplay.DrawOffset.y;
96 lx2 += PSXDisplay.DrawOffset.x;
97 ly2 += PSXDisplay.DrawOffset.y;
98 lx3 += PSXDisplay.DrawOffset.x;
99 ly3 += PSXDisplay.DrawOffset.y;
102 /////////////////////////////////////////////////////////////////
103 /////////////////////////////////////////////////////////////////
104 /////////////////////////////////////////////////////////////////
106 ////////////////////////////////////////////////////////////////////////
107 /////////////////////////////////////////////////////////////////
108 /////////////////////////////////////////////////////////////////
111 unsigned char dithertable[16] =
119 static inline void Dither16(unsigned short * pdest,uint32_t r,uint32_t g,uint32_t b,unsigned short sM)
122 unsigned char rlow, glow, blow;
129 coeff = dithertable[(y&3)*4+(x&3)];
131 rlow = r&7; glow = g&7; blow = b&7;
135 if ((r < 0x1F) && rlow > coeff) r++;
136 if ((g < 0x1F) && glow > coeff) g++;
137 if ((b < 0x1F) && blow > coeff) b++;
139 PUTLE16(pdest, ((unsigned short)b<<10) |
140 ((unsigned short)g<<5) |
141 (unsigned short)r | sM);
144 /////////////////////////////////////////////////////////////////
145 /////////////////////////////////////////////////////////////////
146 /////////////////////////////////////////////////////////////////
148 static inline void GetShadeTransCol_Dither(unsigned short * pdest, int32_t m1, int32_t m2, int32_t m3)
152 if(bCheckMask && (*pdest & HOST2LE16(0x8000))) return;
156 r=((XCOL1D(GETLE16(pdest)))<<3);
157 b=((XCOL2D(GETLE16(pdest)))<<3);
158 g=((XCOL3D(GETLE16(pdest)))<<3);
179 if(r&0x80000000) r=0;
180 if(b&0x80000000) b=0;
181 if(g&0x80000000) g=0;
185 #ifdef HALFBRIGHTMODE3
203 if(r&0x7FFFFF00) r=0xff;
204 if(b&0x7FFFFF00) b=0xff;
205 if(g&0x7FFFFF00) g=0xff;
207 Dither16(pdest,r,b,g,sSetMask);
210 ////////////////////////////////////////////////////////////////////////
212 static inline void GetShadeTransCol(unsigned short * pdest,unsigned short color)
214 if(bCheckMask && (*pdest & HOST2LE16(0x8000))) return;
222 PUTLE16(pdest, (((GETLE16(pdest)&0x7bde)>>1)+(((color)&0x7bde)>>1))|sSetMask);//0x8000;
228 r=(XCOL1(GETLE16(pdest)))+((XCOL1(color)));
229 b=(XCOL2(GETLE16(pdest)))+((XCOL2(color)));
230 g=(XCOL3(GETLE16(pdest)))+((XCOL3(color)));
235 r=(XCOL1(GETLE16(pdest)))-((XCOL1(color)));
236 b=(XCOL2(GETLE16(pdest)))-((XCOL2(color)));
237 g=(XCOL3(GETLE16(pdest)))-((XCOL3(color)));
238 if(r&0x80000000) r=0;
239 if(b&0x80000000) b=0;
240 if(g&0x80000000) g=0;
244 #ifdef HALFBRIGHTMODE3
245 r=(XCOL1(GETLE16(pdest)))+((XCOL1(color))>>2);
246 b=(XCOL2(GETLE16(pdest)))+((XCOL2(color))>>2);
247 g=(XCOL3(GETLE16(pdest)))+((XCOL3(color))>>2);
249 r=(XCOL1(GETLE16(pdest)))+((XCOL1(color))>>1);
250 b=(XCOL2(GETLE16(pdest)))+((XCOL2(color))>>1);
251 g=(XCOL3(GETLE16(pdest)))+((XCOL3(color))>>1);
255 if(r&0x7FFFFFE0) r=0x1f;
256 if(b&0x7FFFFC00) b=0x3e0;
257 if(g&0x7FFF8000) g=0x7c00;
259 PUTLE16(pdest, (XPSXCOL(r,g,b))|sSetMask);//0x8000;
261 else PUTLE16(pdest, color|sSetMask);
264 ////////////////////////////////////////////////////////////////////////
266 static inline void GetShadeTransCol32(uint32_t * pdest,uint32_t color)
276 PUTLE32(pdest, (((GETLE32(pdest)&0x7bde7bde)>>1)+(((color)&0x7bde7bde)>>1))|lSetMask);//0x80008000;
279 r=(X32ACOL1(GETLE32(pdest))>>1)+((X32ACOL1(color))>>1);
280 b=(X32ACOL2(GETLE32(pdest))>>1)+((X32ACOL2(color))>>1);
281 g=(X32ACOL3(GETLE32(pdest))>>1)+((X32ACOL3(color))>>1);
286 r=(X32COL1(GETLE32(pdest)))+((X32COL1(color)));
287 b=(X32COL2(GETLE32(pdest)))+((X32COL2(color)));
288 g=(X32COL3(GETLE32(pdest)))+((X32COL3(color)));
293 int32_t sr,sb,sg,src,sbc,sgc,c;
294 src=XCOL1(color);sbc=XCOL2(color);sgc=XCOL3(color);
295 c=HIWORD(GETLE32(pdest));
296 sr=(XCOL1(c))-src; if(sr&0x8000) sr=0;
297 sb=(XCOL2(c))-sbc; if(sb&0x8000) sb=0;
298 sg=(XCOL3(c))-sgc; if(sg&0x8000) sg=0;
299 r=((int32_t)sr)<<16;b=((int32_t)sb)<<11;g=((int32_t)sg)<<6;
300 c=LOWORD(GETLE32(pdest));
301 sr=(XCOL1(c))-src; if(sr&0x8000) sr=0;
302 sb=(XCOL2(c))-sbc; if(sb&0x8000) sb=0;
303 sg=(XCOL3(c))-sgc; if(sg&0x8000) sg=0;
304 r|=sr;b|=sb>>5;g|=sg>>10;
308 #ifdef HALFBRIGHTMODE3
309 r=(X32COL1(GETLE32(pdest)))+((X32BCOL1(color))>>2);
310 b=(X32COL2(GETLE32(pdest)))+((X32BCOL2(color))>>2);
311 g=(X32COL3(GETLE32(pdest)))+((X32BCOL3(color))>>2);
313 r=(X32COL1(GETLE32(pdest)))+((X32ACOL1(color))>>1);
314 b=(X32COL2(GETLE32(pdest)))+((X32ACOL2(color))>>1);
315 g=(X32COL3(GETLE32(pdest)))+((X32ACOL3(color))>>1);
319 if(r&0x7FE00000) r=0x1f0000|(r&0xFFFF);
320 if(r&0x7FE0) r=0x1f |(r&0xFFFF0000);
321 if(b&0x7FE00000) b=0x1f0000|(b&0xFFFF);
322 if(b&0x7FE0) b=0x1f |(b&0xFFFF0000);
323 if(g&0x7FE00000) g=0x1f0000|(g&0xFFFF);
324 if(g&0x7FE0) g=0x1f |(g&0xFFFF0000);
328 uint32_t ma=GETLE32(pdest);
329 PUTLE32(pdest, (X32PSXCOL(r,g,b))|lSetMask);//0x80008000;
330 if(ma&0x80000000) PUTLE32(pdest, (ma&0xFFFF0000)|(GETLE32(pdest)&0xFFFF));
331 if(ma&0x00008000) PUTLE32(pdest, (ma&0xFFFF) |(GETLE32(pdest)&0xFFFF0000));
334 PUTLE32(pdest, (X32PSXCOL(r,g,b))|lSetMask);//0x80008000;
340 uint32_t ma=GETLE32(pdest);
341 PUTLE32(pdest, color|lSetMask);//0x80008000;
342 if(ma&0x80000000) PUTLE32(pdest, (ma&0xFFFF0000)|(GETLE32(pdest)&0xFFFF));
343 if(ma&0x00008000) PUTLE32(pdest, (ma&0xFFFF) |(GETLE32(pdest)&0xFFFF0000));
347 PUTLE32(pdest, color|lSetMask);//0x80008000;
351 ////////////////////////////////////////////////////////////////////////
353 static inline void GetTextureTransColG(unsigned short * pdest,unsigned short color)
355 int32_t r,g,b;unsigned short l;
359 if(bCheckMask && (*pdest & HOST2LE16(0x8000))) return;
361 l=sSetMask|(color&0x8000);
363 if(DrawSemiTrans && (color&0x8000))
368 d =(GETLE16(pdest)&0x7bde)>>1;
369 color =((color) &0x7bde)>>1;
370 r=(XCOL1(d))+((((XCOL1(color)))* g_m1)>>7);
371 b=(XCOL2(d))+((((XCOL2(color)))* g_m2)>>7);
372 g=(XCOL3(d))+((((XCOL3(color)))* g_m3)>>7);
377 r=(XCOL1(GETLE16(pdest)))+((((XCOL1(color)))* g_m1)>>7);
378 b=(XCOL2(GETLE16(pdest)))+((((XCOL2(color)))* g_m2)>>7);
379 g=(XCOL3(GETLE16(pdest)))+((((XCOL3(color)))* g_m3)>>7);
384 r=(XCOL1(GETLE16(pdest)))-((((XCOL1(color)))* g_m1)>>7);
385 b=(XCOL2(GETLE16(pdest)))-((((XCOL2(color)))* g_m2)>>7);
386 g=(XCOL3(GETLE16(pdest)))-((((XCOL3(color)))* g_m3)>>7);
387 if(r&0x80000000) r=0;
388 if(b&0x80000000) b=0;
389 if(g&0x80000000) g=0;
393 #ifdef HALFBRIGHTMODE3
394 r=(XCOL1(GETLE16(pdest)))+((((XCOL1(color))>>2)* g_m1)>>7);
395 b=(XCOL2(GETLE16(pdest)))+((((XCOL2(color))>>2)* g_m2)>>7);
396 g=(XCOL3(GETLE16(pdest)))+((((XCOL3(color))>>2)* g_m3)>>7);
398 r=(XCOL1(GETLE16(pdest)))+((((XCOL1(color))>>1)* g_m1)>>7);
399 b=(XCOL2(GETLE16(pdest)))+((((XCOL2(color))>>1)* g_m2)>>7);
400 g=(XCOL3(GETLE16(pdest)))+((((XCOL3(color))>>1)* g_m3)>>7);
406 r=((XCOL1(color))* g_m1)>>7;
407 b=((XCOL2(color))* g_m2)>>7;
408 g=((XCOL3(color))* g_m3)>>7;
411 if(r&0x7FFFFFE0) r=0x1f;
412 if(b&0x7FFFFC00) b=0x3e0;
413 if(g&0x7FFF8000) g=0x7c00;
415 PUTLE16(pdest, (XPSXCOL(r,g,b))|l);
418 ////////////////////////////////////////////////////////////////////////
420 static inline void GetTextureTransColG_S(unsigned short * pdest,unsigned short color)
422 int32_t r,g,b;unsigned short l;
426 l=sSetMask|(color&0x8000);
428 r=((XCOL1(color))* g_m1)>>7;
429 b=((XCOL2(color))* g_m2)>>7;
430 g=((XCOL3(color))* g_m3)>>7;
432 if(r&0x7FFFFFE0) r=0x1f;
433 if(b&0x7FFFFC00) b=0x3e0;
434 if(g&0x7FFF8000) g=0x7c00;
436 PUTLE16(pdest, (XPSXCOL(r,g,b))|l);
439 ////////////////////////////////////////////////////////////////////////
441 static inline void GetTextureTransColG_SPR(unsigned short * pdest,unsigned short color)
443 int32_t r,g,b;unsigned short l;
447 if(bCheckMask && (GETLE16(pdest) & 0x8000)) return;
449 l=sSetMask|(color&0x8000);
451 if(DrawSemiTrans && (color&0x8000))
456 d =(GETLE16(pdest)&0x7bde)>>1;
457 color =((color) &0x7bde)>>1;
458 r=(XCOL1(d))+((((XCOL1(color)))* g_m1)>>7);
459 b=(XCOL2(d))+((((XCOL2(color)))* g_m2)>>7);
460 g=(XCOL3(d))+((((XCOL3(color)))* g_m3)>>7);
465 r=(XCOL1(GETLE16(pdest)))+((((XCOL1(color)))* g_m1)>>7);
466 b=(XCOL2(GETLE16(pdest)))+((((XCOL2(color)))* g_m2)>>7);
467 g=(XCOL3(GETLE16(pdest)))+((((XCOL3(color)))* g_m3)>>7);
472 r=(XCOL1(GETLE16(pdest)))-((((XCOL1(color)))* g_m1)>>7);
473 b=(XCOL2(GETLE16(pdest)))-((((XCOL2(color)))* g_m2)>>7);
474 g=(XCOL3(GETLE16(pdest)))-((((XCOL3(color)))* g_m3)>>7);
475 if(r&0x80000000) r=0;
476 if(b&0x80000000) b=0;
477 if(g&0x80000000) g=0;
481 #ifdef HALFBRIGHTMODE3
482 r=(XCOL1(GETLE16(pdest)))+((((XCOL1(color))>>2)* g_m1)>>7);
483 b=(XCOL2(GETLE16(pdest)))+((((XCOL2(color))>>2)* g_m2)>>7);
484 g=(XCOL3(GETLE16(pdest)))+((((XCOL3(color))>>2)* g_m3)>>7);
486 r=(XCOL1(GETLE16(pdest)))+((((XCOL1(color))>>1)* g_m1)>>7);
487 b=(XCOL2(GETLE16(pdest)))+((((XCOL2(color))>>1)* g_m2)>>7);
488 g=(XCOL3(GETLE16(pdest)))+((((XCOL3(color))>>1)* g_m3)>>7);
494 r=((XCOL1(color))* g_m1)>>7;
495 b=((XCOL2(color))* g_m2)>>7;
496 g=((XCOL3(color))* g_m3)>>7;
499 if(r&0x7FFFFFE0) r=0x1f;
500 if(b&0x7FFFFC00) b=0x3e0;
501 if(g&0x7FFF8000) g=0x7c00;
503 PUTLE16(pdest, (XPSXCOL(r,g,b))|l);
506 ////////////////////////////////////////////////////////////////////////
508 static inline void GetTextureTransColG32(uint32_t * pdest,uint32_t color)
514 l=lSetMask|(color&0x80008000);
516 if(DrawSemiTrans && (color&0x80008000))
520 r=((((X32TCOL1(GETLE32(pdest)))+((X32COL1(color)) * g_m1))&0xFF00FF00)>>8);
521 b=((((X32TCOL2(GETLE32(pdest)))+((X32COL2(color)) * g_m2))&0xFF00FF00)>>8);
522 g=((((X32TCOL3(GETLE32(pdest)))+((X32COL3(color)) * g_m3))&0xFF00FF00)>>8);
527 r=(X32COL1(GETLE32(pdest)))+(((((X32COL1(color)))* g_m1)&0xFF80FF80)>>7);
528 b=(X32COL2(GETLE32(pdest)))+(((((X32COL2(color)))* g_m2)&0xFF80FF80)>>7);
529 g=(X32COL3(GETLE32(pdest)))+(((((X32COL3(color)))* g_m3)&0xFF80FF80)>>7);
535 r=(((((X32COL1(color)))* g_m1)&0xFF80FF80)>>7);
536 t=(GETLE32(pdest)&0x001f0000)-(r&0x003f0000); if(t&0x80000000) t=0;
537 r=(GETLE32(pdest)&0x0000001f)-(r&0x0000003f); if(r&0x80000000) r=0;
540 b=(((((X32COL2(color)))* g_m2)&0xFF80FF80)>>7);
541 t=((GETLE32(pdest)>>5)&0x001f0000)-(b&0x003f0000); if(t&0x80000000) t=0;
542 b=((GETLE32(pdest)>>5)&0x0000001f)-(b&0x0000003f); if(b&0x80000000) b=0;
545 g=(((((X32COL3(color)))* g_m3)&0xFF80FF80)>>7);
546 t=((GETLE32(pdest)>>10)&0x001f0000)-(g&0x003f0000); if(t&0x80000000) t=0;
547 g=((GETLE32(pdest)>>10)&0x0000001f)-(g&0x0000003f); if(g&0x80000000) g=0;
552 #ifdef HALFBRIGHTMODE3
553 r=(X32COL1(GETLE32(pdest)))+(((((X32BCOL1(color))>>2)* g_m1)&0xFF80FF80)>>7);
554 b=(X32COL2(GETLE32(pdest)))+(((((X32BCOL2(color))>>2)* g_m2)&0xFF80FF80)>>7);
555 g=(X32COL3(GETLE32(pdest)))+(((((X32BCOL3(color))>>2)* g_m3)&0xFF80FF80)>>7);
557 r=(X32COL1(GETLE32(pdest)))+(((((X32ACOL1(color))>>1)* g_m1)&0xFF80FF80)>>7);
558 b=(X32COL2(GETLE32(pdest)))+(((((X32ACOL2(color))>>1)* g_m2)&0xFF80FF80)>>7);
559 g=(X32COL3(GETLE32(pdest)))+(((((X32ACOL3(color))>>1)* g_m3)&0xFF80FF80)>>7);
565 r=(r&0xffff0000)|((((X32COL1(color))* g_m1)&0x0000FF80)>>7);
566 b=(b&0xffff0000)|((((X32COL2(color))* g_m2)&0x0000FF80)>>7);
567 g=(g&0xffff0000)|((((X32COL3(color))* g_m3)&0x0000FF80)>>7);
569 if(!(color&0x80000000))
571 r=(r&0xffff)|((((X32COL1(color))* g_m1)&0xFF800000)>>7);
572 b=(b&0xffff)|((((X32COL2(color))* g_m2)&0xFF800000)>>7);
573 g=(g&0xffff)|((((X32COL3(color))* g_m3)&0xFF800000)>>7);
579 r=(((X32COL1(color))* g_m1)&0xFF80FF80)>>7;
580 b=(((X32COL2(color))* g_m2)&0xFF80FF80)>>7;
581 g=(((X32COL3(color))* g_m3)&0xFF80FF80)>>7;
584 if(r&0x7FE00000) r=0x1f0000|(r&0xFFFF);
585 if(r&0x7FE0) r=0x1f |(r&0xFFFF0000);
586 if(b&0x7FE00000) b=0x1f0000|(b&0xFFFF);
587 if(b&0x7FE0) b=0x1f |(b&0xFFFF0000);
588 if(g&0x7FE00000) g=0x1f0000|(g&0xFFFF);
589 if(g&0x7FE0) g=0x1f |(g&0xFFFF0000);
593 uint32_t ma=GETLE32(pdest);
595 PUTLE32(pdest, (X32PSXCOL(r,g,b))|l);
597 if((color&0xffff)==0 ) PUTLE32(pdest, (ma&0xffff)|(GETLE32(pdest)&0xffff0000));
598 if((color&0xffff0000)==0) PUTLE32(pdest, (ma&0xffff0000)|(GETLE32(pdest)&0xffff));
599 if(ma&0x80000000) PUTLE32(pdest, (ma&0xFFFF0000)|(GETLE32(pdest)&0xFFFF));
600 if(ma&0x00008000) PUTLE32(pdest, (ma&0xFFFF) |(GETLE32(pdest)&0xFFFF0000));
604 if((color&0xffff)==0 ) {PUTLE32(pdest, (GETLE32(pdest)&0xffff)|(((X32PSXCOL(r,g,b))|l)&0xffff0000));return;}
605 if((color&0xffff0000)==0) {PUTLE32(pdest, (GETLE32(pdest)&0xffff0000)|(((X32PSXCOL(r,g,b))|l)&0xffff));return;}
607 PUTLE32(pdest, (X32PSXCOL(r,g,b))|l);
610 ////////////////////////////////////////////////////////////////////////
612 static inline void GetTextureTransColG32_S(uint32_t * pdest,uint32_t color)
618 r=(((X32COL1(color))* g_m1)&0xFF80FF80)>>7;
619 b=(((X32COL2(color))* g_m2)&0xFF80FF80)>>7;
620 g=(((X32COL3(color))* g_m3)&0xFF80FF80)>>7;
622 if(r&0x7FE00000) r=0x1f0000|(r&0xFFFF);
623 if(r&0x7FE0) r=0x1f |(r&0xFFFF0000);
624 if(b&0x7FE00000) b=0x1f0000|(b&0xFFFF);
625 if(b&0x7FE0) b=0x1f |(b&0xFFFF0000);
626 if(g&0x7FE00000) g=0x1f0000|(g&0xFFFF);
627 if(g&0x7FE0) g=0x1f |(g&0xFFFF0000);
629 if((color&0xffff)==0) {PUTLE32(pdest, (GETLE32(pdest)&0xffff)|(((X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000))&0xffff0000));return;}
630 if((color&0xffff0000)==0) {PUTLE32(pdest, (GETLE32(pdest)&0xffff0000)|(((X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000))&0xffff));return;}
632 PUTLE32(pdest, (X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000));
635 ////////////////////////////////////////////////////////////////////////
637 static inline void GetTextureTransColG32_SPR(uint32_t * pdest,uint32_t color)
643 if(DrawSemiTrans && (color&0x80008000))
647 r=((((X32TCOL1(GETLE32(pdest)))+((X32COL1(color)) * g_m1))&0xFF00FF00)>>8);
648 b=((((X32TCOL2(GETLE32(pdest)))+((X32COL2(color)) * g_m2))&0xFF00FF00)>>8);
649 g=((((X32TCOL3(GETLE32(pdest)))+((X32COL3(color)) * g_m3))&0xFF00FF00)>>8);
654 r=(X32COL1(GETLE32(pdest)))+(((((X32COL1(color)))* g_m1)&0xFF80FF80)>>7);
655 b=(X32COL2(GETLE32(pdest)))+(((((X32COL2(color)))* g_m2)&0xFF80FF80)>>7);
656 g=(X32COL3(GETLE32(pdest)))+(((((X32COL3(color)))* g_m3)&0xFF80FF80)>>7);
662 r=(((((X32COL1(color)))* g_m1)&0xFF80FF80)>>7);
663 t=(GETLE32(pdest)&0x001f0000)-(r&0x003f0000); if(t&0x80000000) t=0;
664 r=(GETLE32(pdest)&0x0000001f)-(r&0x0000003f); if(r&0x80000000) r=0;
667 b=(((((X32COL2(color)))* g_m2)&0xFF80FF80)>>7);
668 t=((GETLE32(pdest)>>5)&0x001f0000)-(b&0x003f0000); if(t&0x80000000) t=0;
669 b=((GETLE32(pdest)>>5)&0x0000001f)-(b&0x0000003f); if(b&0x80000000) b=0;
672 g=(((((X32COL3(color)))* g_m3)&0xFF80FF80)>>7);
673 t=((GETLE32(pdest)>>10)&0x001f0000)-(g&0x003f0000); if(t&0x80000000) t=0;
674 g=((GETLE32(pdest)>>10)&0x0000001f)-(g&0x0000003f); if(g&0x80000000) g=0;
679 #ifdef HALFBRIGHTMODE3
680 r=(X32COL1(GETLE32(pdest)))+(((((X32BCOL1(color))>>2)* g_m1)&0xFF80FF80)>>7);
681 b=(X32COL2(GETLE32(pdest)))+(((((X32BCOL2(color))>>2)* g_m2)&0xFF80FF80)>>7);
682 g=(X32COL3(GETLE32(pdest)))+(((((X32BCOL3(color))>>2)* g_m3)&0xFF80FF80)>>7);
684 r=(X32COL1(GETLE32(pdest)))+(((((X32ACOL1(color))>>1)* g_m1)&0xFF80FF80)>>7);
685 b=(X32COL2(GETLE32(pdest)))+(((((X32ACOL2(color))>>1)* g_m2)&0xFF80FF80)>>7);
686 g=(X32COL3(GETLE32(pdest)))+(((((X32ACOL3(color))>>1)* g_m3)&0xFF80FF80)>>7);
692 r=(r&0xffff0000)|((((X32COL1(color))* g_m1)&0x0000FF80)>>7);
693 b=(b&0xffff0000)|((((X32COL2(color))* g_m2)&0x0000FF80)>>7);
694 g=(g&0xffff0000)|((((X32COL3(color))* g_m3)&0x0000FF80)>>7);
696 if(!(color&0x80000000))
698 r=(r&0xffff)|((((X32COL1(color))* g_m1)&0xFF800000)>>7);
699 b=(b&0xffff)|((((X32COL2(color))* g_m2)&0xFF800000)>>7);
700 g=(g&0xffff)|((((X32COL3(color))* g_m3)&0xFF800000)>>7);
706 r=(((X32COL1(color))* g_m1)&0xFF80FF80)>>7;
707 b=(((X32COL2(color))* g_m2)&0xFF80FF80)>>7;
708 g=(((X32COL3(color))* g_m3)&0xFF80FF80)>>7;
711 if(r&0x7FE00000) r=0x1f0000|(r&0xFFFF);
712 if(r&0x7FE0) r=0x1f |(r&0xFFFF0000);
713 if(b&0x7FE00000) b=0x1f0000|(b&0xFFFF);
714 if(b&0x7FE0) b=0x1f |(b&0xFFFF0000);
715 if(g&0x7FE00000) g=0x1f0000|(g&0xFFFF);
716 if(g&0x7FE0) g=0x1f |(g&0xFFFF0000);
720 uint32_t ma=GETLE32(pdest);
722 PUTLE32(pdest, (X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000));
724 if((color&0xffff)==0 ) PUTLE32(pdest, (ma&0xffff)|(GETLE32(pdest)&0xffff0000));
725 if((color&0xffff0000)==0) PUTLE32(pdest, (ma&0xffff0000)|(GETLE32(pdest)&0xffff));
726 if(ma&0x80000000) PUTLE32(pdest, (ma&0xFFFF0000)|(GETLE32(pdest)&0xFFFF));
727 if(ma&0x00008000) PUTLE32(pdest, (ma&0xFFFF) |(GETLE32(pdest)&0xFFFF0000));
731 if((color&0xffff)==0 ) {PUTLE32(pdest, (GETLE32(pdest)&0xffff)|(((X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000))&0xffff0000));return;}
732 if((color&0xffff0000)==0) {PUTLE32(pdest, (GETLE32(pdest)&0xffff0000)|(((X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000))&0xffff));return;}
734 PUTLE32(pdest, (X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000));
737 ////////////////////////////////////////////////////////////////////////
739 static inline void GetTextureTransColGX_Dither(unsigned short * pdest,unsigned short color,int32_t m1,int32_t m2,int32_t m3)
745 if(bCheckMask && (*pdest & HOST2LE16(0x8000))) return;
747 m1=(((XCOL1D(color)))*m1)>>4;
748 m2=(((XCOL2D(color)))*m2)>>4;
749 m3=(((XCOL3D(color)))*m3)>>4;
751 if(DrawSemiTrans && (color&0x8000))
753 r=((XCOL1D(GETLE16(pdest)))<<3);
754 b=((XCOL2D(GETLE16(pdest)))<<3);
755 g=((XCOL3D(GETLE16(pdest)))<<3);
776 if(r&0x80000000) r=0;
777 if(b&0x80000000) b=0;
778 if(g&0x80000000) g=0;
782 #ifdef HALFBRIGHTMODE3
800 if(r&0x7FFFFF00) r=0xff;
801 if(b&0x7FFFFF00) b=0xff;
802 if(g&0x7FFFFF00) g=0xff;
804 Dither16(pdest,r,b,g,sSetMask|(color&0x8000));
808 ////////////////////////////////////////////////////////////////////////
810 static inline void GetTextureTransColGX(unsigned short * pdest,unsigned short color,short m1,short m2,short m3)
812 int32_t r,g,b;unsigned short l;
816 if(bCheckMask && (*pdest & HOST2LE16(0x8000))) return;
818 l=sSetMask|(color&0x8000);
820 if(DrawSemiTrans && (color&0x8000))
825 d =(GETLE16(pdest)&0x7bde)>>1;
826 color =((color) &0x7bde)>>1;
827 r=(XCOL1(d))+((((XCOL1(color)))* m1)>>7);
828 b=(XCOL2(d))+((((XCOL2(color)))* m2)>>7);
829 g=(XCOL3(d))+((((XCOL3(color)))* m3)>>7);
834 r=(XCOL1(GETLE16(pdest)))+((((XCOL1(color)))* m1)>>7);
835 b=(XCOL2(GETLE16(pdest)))+((((XCOL2(color)))* m2)>>7);
836 g=(XCOL3(GETLE16(pdest)))+((((XCOL3(color)))* m3)>>7);
841 r=(XCOL1(GETLE16(pdest)))-((((XCOL1(color)))* m1)>>7);
842 b=(XCOL2(GETLE16(pdest)))-((((XCOL2(color)))* m2)>>7);
843 g=(XCOL3(GETLE16(pdest)))-((((XCOL3(color)))* m3)>>7);
844 if(r&0x80000000) r=0;
845 if(b&0x80000000) b=0;
846 if(g&0x80000000) g=0;
850 #ifdef HALFBRIGHTMODE3
851 r=(XCOL1(GETLE16(pdest)))+((((XCOL1(color))>>2)* m1)>>7);
852 b=(XCOL2(GETLE16(pdest)))+((((XCOL2(color))>>2)* m2)>>7);
853 g=(XCOL3(GETLE16(pdest)))+((((XCOL3(color))>>2)* m3)>>7);
855 r=(XCOL1(GETLE16(pdest)))+((((XCOL1(color))>>1)* m1)>>7);
856 b=(XCOL2(GETLE16(pdest)))+((((XCOL2(color))>>1)* m2)>>7);
857 g=(XCOL3(GETLE16(pdest)))+((((XCOL3(color))>>1)* m3)>>7);
863 r=((XCOL1(color))* m1)>>7;
864 b=((XCOL2(color))* m2)>>7;
865 g=((XCOL3(color))* m3)>>7;
868 if(r&0x7FFFFFE0) r=0x1f;
869 if(b&0x7FFFFC00) b=0x3e0;
870 if(g&0x7FFF8000) g=0x7c00;
872 PUTLE16(pdest, (XPSXCOL(r,g,b))|l);
875 ////////////////////////////////////////////////////////////////////////
877 static inline void GetTextureTransColGX_S(unsigned short * pdest,unsigned short color,short m1,short m2,short m3)
883 r=((XCOL1(color))* m1)>>7;
884 b=((XCOL2(color))* m2)>>7;
885 g=((XCOL3(color))* m3)>>7;
887 if(r&0x7FFFFFE0) r=0x1f;
888 if(b&0x7FFFFC00) b=0x3e0;
889 if(g&0x7FFF8000) g=0x7c00;
891 PUTLE16(pdest, (XPSXCOL(r,g,b))|sSetMask|(color&0x8000));
894 ////////////////////////////////////////////////////////////////////////
896 static inline void GetTextureTransColGX32_S(uint32_t * pdest,uint32_t color,short m1,short m2,short m3)
902 r=(((X32COL1(color))* m1)&0xFF80FF80)>>7;
903 b=(((X32COL2(color))* m2)&0xFF80FF80)>>7;
904 g=(((X32COL3(color))* m3)&0xFF80FF80)>>7;
906 if(r&0x7FE00000) r=0x1f0000|(r&0xFFFF);
907 if(r&0x7FE0) r=0x1f |(r&0xFFFF0000);
908 if(b&0x7FE00000) b=0x1f0000|(b&0xFFFF);
909 if(b&0x7FE0) b=0x1f |(b&0xFFFF0000);
910 if(g&0x7FE00000) g=0x1f0000|(g&0xFFFF);
911 if(g&0x7FE0) g=0x1f |(g&0xFFFF0000);
913 if((color&0xffff)==0) {PUTLE32(pdest, (GETLE32(pdest)&0xffff)|(((X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000))&0xffff0000));return;}
914 if((color&0xffff0000)==0) {PUTLE32(pdest, (GETLE32(pdest)&0xffff0000)|(((X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000))&0xffff));return;}
916 PUTLE32(pdest, (X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000));
919 ////////////////////////////////////////////////////////////////////////
921 ////////////////////////////////////////////////////////////////////////
923 static void FillSoftwareAreaTrans(short x0,short y0,short x1, // FILL AREA TRANS
924 short y1,unsigned short col)
949 if(dx==1 && dy==1 && x0==1020 && y0==511) // special fix for pinball game... emu protection???
957 if(dx&1) // slow fill
959 unsigned short *DSTPtr;
960 unsigned short LineOffset;
961 DSTPtr = psxVuw + (1024*y0) + x0;
962 LineOffset = 1024 - dx;
966 GetShadeTransCol(DSTPtr++,col);
967 DSTPtr += LineOffset;
973 unsigned short LineOffset;
974 uint32_t lcol = lSetMask | ((uint32_t)col << 16) | col;
976 DSTPtr = (uint32_t *)(psxVuw + (1024*y0) + x0);
977 LineOffset = 512 - dx;
979 if(!bCheckMask && !DrawSemiTrans)
981 lcol = HOST2LE32(lcol);
984 for(j=0;j<dx;j++) { *DSTPtr++ = lcol; }
985 DSTPtr += LineOffset;
993 GetShadeTransCol32(DSTPtr++,lcol);
994 DSTPtr += LineOffset;
1000 ////////////////////////////////////////////////////////////////////////
1002 static void FillSoftwareArea(short x0,short y0,short x1, // FILL AREA (BLK FILL)
1003 short y1,unsigned short col) // no draw area check here!
1007 // ?? ff9 pal hooligan crack sets nonsense x0
1018 if(x1>1024) x1=1024;
1023 unsigned short *DSTPtr;
1024 unsigned short LineOffset;
1026 DSTPtr = psxVuw + (1024*y0) + x0;
1027 LineOffset = 1024 - dx;
1031 for(j=0;j<dx;j++) { PUTLE16(DSTPtr, col); DSTPtr++; }
1032 DSTPtr += LineOffset;
1038 unsigned short LineOffset;
1039 uint32_t lcol = HOST2LE32((((uint32_t)(col)) << 16) | col);
1041 DSTPtr = (uint32_t *)(psxVuw + (1024*y0) + x0);
1042 LineOffset = 512 - dx;
1046 for(j=0;j<dx;j++) { *DSTPtr++ = lcol; }
1047 DSTPtr += LineOffset;
1052 ////////////////////////////////////////////////////////////////////////
1053 ////////////////////////////////////////////////////////////////////////
1054 ////////////////////////////////////////////////////////////////////////
1055 // EDGE INTERPOLATION
1056 ////////////////////////////////////////////////////////////////////////
1057 ////////////////////////////////////////////////////////////////////////
1058 ////////////////////////////////////////////////////////////////////////
1060 typedef struct SOFTVTAG
1067 static soft_vertex vtx[4];
1068 static soft_vertex * left_array[4], * right_array[4];
1069 static int left_section, right_section;
1070 static int left_section_height, right_section_height;
1071 static int left_x, delta_left_x, right_x, delta_right_x;
1072 static int left_u, delta_left_u, left_v, delta_left_v;
1073 static int right_u, delta_right_u, right_v, delta_right_v;
1074 static int left_R, delta_left_R, right_R, delta_right_R;
1075 static int left_G, delta_left_G, right_G, delta_right_G;
1076 static int left_B, delta_left_B, right_B, delta_right_B;
1079 static inline int shl10idiv(int x, int y)
1081 #ifdef __ARM_ARCH_7A__
1082 // rearmed: let's use VFP divider instead
1083 float r = 1024.0f * (float)x / (float)y;
1092 ////////////////////////////////////////////////////////////////////////
1093 ////////////////////////////////////////////////////////////////////////
1094 ////////////////////////////////////////////////////////////////////////
1096 static inline int RightSection_F(void)
1098 soft_vertex * v1 = right_array[ right_section ];
1099 soft_vertex * v2 = right_array[ right_section-1 ];
1101 int height = v2->y - v1->y;
1102 if(height == 0) return 0;
1103 delta_right_x = (v2->x - v1->x) / height;
1106 right_section_height = height;
1110 ////////////////////////////////////////////////////////////////////////
1112 static inline int LeftSection_F(void)
1114 soft_vertex * v1 = left_array[ left_section ];
1115 soft_vertex * v2 = left_array[ left_section-1 ];
1117 int height = v2->y - v1->y;
1118 if(height == 0) return 0;
1119 delta_left_x = (v2->x - v1->x) / height;
1122 left_section_height = height;
1126 ////////////////////////////////////////////////////////////////////////
1128 static inline BOOL NextRow_F(void)
1130 if(--left_section_height<=0)
1132 if(--left_section <= 0) {return TRUE;}
1133 if(LeftSection_F() <= 0) {return TRUE;}
1137 left_x += delta_left_x;
1140 if(--right_section_height<=0)
1142 if(--right_section<=0) {return TRUE;}
1143 if(RightSection_F() <=0) {return TRUE;}
1147 right_x += delta_right_x;
1152 ////////////////////////////////////////////////////////////////////////
1154 static inline BOOL SetupSections_F(short x1, short y1, short x2, short y2, short x3, short y3)
1156 soft_vertex * v1, * v2, * v3;
1159 v1 = vtx; v1->x=x1<<16;v1->y=y1;
1160 v2 = vtx+1; v2->x=x2<<16;v2->y=y2;
1161 v3 = vtx+2; v3->x=x3<<16;v3->y=y3;
1163 if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }
1164 if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }
1165 if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }
1167 height = v3->y - v1->y;
1168 if(height == 0) {return FALSE;}
1169 longest = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
1170 if(longest == 0) {return FALSE;}
1174 right_array[0] = v3;
1175 right_array[1] = v2;
1176 right_array[2] = v1;
1182 if(LeftSection_F() <= 0) return FALSE;
1183 if(RightSection_F() <= 0)
1186 if(RightSection_F() <= 0) return FALSE;
1195 right_array[0] = v3;
1196 right_array[1] = v1;
1199 if(RightSection_F() <= 0) return FALSE;
1200 if(LeftSection_F() <= 0)
1203 if(LeftSection_F() <= 0) return FALSE;
1208 Ymax=min(v3->y-1,drawH);
1213 ////////////////////////////////////////////////////////////////////////
1214 ////////////////////////////////////////////////////////////////////////
1216 static inline int RightSection_G(void)
1218 soft_vertex * v1 = right_array[ right_section ];
1219 soft_vertex * v2 = right_array[ right_section-1 ];
1221 int height = v2->y - v1->y;
1222 if(height == 0) return 0;
1223 delta_right_x = (v2->x - v1->x) / height;
1226 right_section_height = height;
1230 ////////////////////////////////////////////////////////////////////////
1232 static inline int LeftSection_G(void)
1234 soft_vertex * v1 = left_array[ left_section ];
1235 soft_vertex * v2 = left_array[ left_section-1 ];
1237 int height = v2->y - v1->y;
1238 if(height == 0) return 0;
1239 delta_left_x = (v2->x - v1->x) / height;
1242 delta_left_R = ((v2->R - v1->R)) / height;
1244 delta_left_G = ((v2->G - v1->G)) / height;
1246 delta_left_B = ((v2->B - v1->B)) / height;
1249 left_section_height = height;
1253 ////////////////////////////////////////////////////////////////////////
1255 static inline BOOL NextRow_G(void)
1257 if(--left_section_height<=0)
1259 if(--left_section <= 0) {return TRUE;}
1260 if(LeftSection_G() <= 0) {return TRUE;}
1264 left_x += delta_left_x;
1265 left_R += delta_left_R;
1266 left_G += delta_left_G;
1267 left_B += delta_left_B;
1270 if(--right_section_height<=0)
1272 if(--right_section<=0) {return TRUE;}
1273 if(RightSection_G() <=0) {return TRUE;}
1277 right_x += delta_right_x;
1282 ////////////////////////////////////////////////////////////////////////
1284 static inline BOOL SetupSections_G(short x1,short y1,short x2,short y2,short x3,short y3,int32_t rgb1, int32_t rgb2, int32_t rgb3)
1286 soft_vertex * v1, * v2, * v3;
1287 int height,longest,temp;
1289 v1 = vtx; v1->x=x1<<16;v1->y=y1;
1290 v1->R=(rgb1) & 0x00ff0000;
1291 v1->G=(rgb1<<8) & 0x00ff0000;
1292 v1->B=(rgb1<<16) & 0x00ff0000;
1293 v2 = vtx+1; v2->x=x2<<16;v2->y=y2;
1294 v2->R=(rgb2) & 0x00ff0000;
1295 v2->G=(rgb2<<8) & 0x00ff0000;
1296 v2->B=(rgb2<<16) & 0x00ff0000;
1297 v3 = vtx+2; v3->x=x3<<16;v3->y=y3;
1298 v3->R=(rgb3) & 0x00ff0000;
1299 v3->G=(rgb3<<8) & 0x00ff0000;
1300 v3->B=(rgb3<<16) & 0x00ff0000;
1302 if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }
1303 if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }
1304 if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }
1306 height = v3->y - v1->y;
1307 if(height == 0) {return FALSE;}
1308 temp=(((v2->y - v1->y) << 16) / height);
1309 longest = temp * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
1310 if(longest == 0) {return FALSE;}
1314 right_array[0] = v3;
1315 right_array[1] = v2;
1316 right_array[2] = v1;
1322 if(LeftSection_G() <= 0) return FALSE;
1323 if(RightSection_G() <= 0)
1326 if(RightSection_G() <= 0) return FALSE;
1328 if(longest > -0x1000) longest = -0x1000;
1336 right_array[0] = v3;
1337 right_array[1] = v1;
1340 if(RightSection_G() <= 0) return FALSE;
1341 if(LeftSection_G() <= 0)
1344 if(LeftSection_G() <= 0) return FALSE;
1346 if(longest < 0x1000) longest = 0x1000;
1350 Ymax=min(v3->y-1,drawH);
1352 delta_right_R=shl10idiv(temp*((v3->R - v1->R)>>10)+((v1->R - v2->R)<<6),longest);
1353 delta_right_G=shl10idiv(temp*((v3->G - v1->G)>>10)+((v1->G - v2->G)<<6),longest);
1354 delta_right_B=shl10idiv(temp*((v3->B - v1->B)>>10)+((v1->B - v2->B)<<6),longest);
1359 ////////////////////////////////////////////////////////////////////////
1360 ////////////////////////////////////////////////////////////////////////
1362 static inline int RightSection_FT(void)
1364 soft_vertex * v1 = right_array[ right_section ];
1365 soft_vertex * v2 = right_array[ right_section-1 ];
1367 int height = v2->y - v1->y;
1368 if(height == 0) return 0;
1369 delta_right_x = (v2->x - v1->x) / height;
1372 right_section_height = height;
1376 ////////////////////////////////////////////////////////////////////////
1378 static inline int LeftSection_FT(void)
1380 soft_vertex * v1 = left_array[ left_section ];
1381 soft_vertex * v2 = left_array[ left_section-1 ];
1383 int height = v2->y - v1->y;
1384 if(height == 0) return 0;
1385 delta_left_x = (v2->x - v1->x) / height;
1388 delta_left_u = ((v2->u - v1->u)) / height;
1390 delta_left_v = ((v2->v - v1->v)) / height;
1393 left_section_height = height;
1397 ////////////////////////////////////////////////////////////////////////
1399 static inline BOOL NextRow_FT(void)
1401 if(--left_section_height<=0)
1403 if(--left_section <= 0) {return TRUE;}
1404 if(LeftSection_FT() <= 0) {return TRUE;}
1408 left_x += delta_left_x;
1409 left_u += delta_left_u;
1410 left_v += delta_left_v;
1413 if(--right_section_height<=0)
1415 if(--right_section<=0) {return TRUE;}
1416 if(RightSection_FT() <=0) {return TRUE;}
1420 right_x += delta_right_x;
1425 ////////////////////////////////////////////////////////////////////////
1427 static 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)
1429 soft_vertex * v1, * v2, * v3;
1430 int height,longest,temp;
1432 v1 = vtx; v1->x=x1<<16;v1->y=y1;
1433 v1->u=tx1<<16;v1->v=ty1<<16;
1434 v2 = vtx+1; v2->x=x2<<16;v2->y=y2;
1435 v2->u=tx2<<16;v2->v=ty2<<16;
1436 v3 = vtx+2; v3->x=x3<<16;v3->y=y3;
1437 v3->u=tx3<<16;v3->v=ty3<<16;
1439 if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }
1440 if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }
1441 if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }
1443 height = v3->y - v1->y;
1444 if(height == 0) {return FALSE;}
1446 temp=(((v2->y - v1->y) << 16) / height);
1447 longest = temp * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
1449 if(longest == 0) {return FALSE;}
1453 right_array[0] = v3;
1454 right_array[1] = v2;
1455 right_array[2] = v1;
1461 if(LeftSection_FT() <= 0) return FALSE;
1462 if(RightSection_FT() <= 0)
1465 if(RightSection_FT() <= 0) return FALSE;
1467 if(longest > -0x1000) longest = -0x1000;
1475 right_array[0] = v3;
1476 right_array[1] = v1;
1479 if(RightSection_FT() <= 0) return FALSE;
1480 if(LeftSection_FT() <= 0)
1483 if(LeftSection_FT() <= 0) return FALSE;
1485 if(longest < 0x1000) longest = 0x1000;
1489 Ymax=min(v3->y-1,drawH);
1491 delta_right_u=shl10idiv(temp*((v3->u - v1->u)>>10)+((v1->u - v2->u)<<6),longest);
1492 delta_right_v=shl10idiv(temp*((v3->v - v1->v)>>10)+((v1->v - v2->v)<<6),longest);
1497 ////////////////////////////////////////////////////////////////////////
1498 ////////////////////////////////////////////////////////////////////////
1500 static inline int RightSection_GT(void)
1502 soft_vertex * v1 = right_array[ right_section ];
1503 soft_vertex * v2 = right_array[ right_section-1 ];
1505 int height = v2->y - v1->y;
1506 if(height == 0) return 0;
1507 delta_right_x = (v2->x - v1->x) / height;
1510 right_section_height = height;
1514 ////////////////////////////////////////////////////////////////////////
1516 static inline int LeftSection_GT(void)
1518 soft_vertex * v1 = left_array[ left_section ];
1519 soft_vertex * v2 = left_array[ left_section-1 ];
1521 int height = v2->y - v1->y;
1522 if(height == 0) return 0;
1523 delta_left_x = (v2->x - v1->x) / height;
1526 delta_left_u = ((v2->u - v1->u)) / height;
1528 delta_left_v = ((v2->v - v1->v)) / height;
1531 delta_left_R = ((v2->R - v1->R)) / height;
1533 delta_left_G = ((v2->G - v1->G)) / height;
1535 delta_left_B = ((v2->B - v1->B)) / height;
1538 left_section_height = height;
1542 ////////////////////////////////////////////////////////////////////////
1544 static inline BOOL NextRow_GT(void)
1546 if(--left_section_height<=0)
1548 if(--left_section <= 0) {return TRUE;}
1549 if(LeftSection_GT() <= 0) {return TRUE;}
1553 left_x += delta_left_x;
1554 left_u += delta_left_u;
1555 left_v += delta_left_v;
1556 left_R += delta_left_R;
1557 left_G += delta_left_G;
1558 left_B += delta_left_B;
1561 if(--right_section_height<=0)
1563 if(--right_section<=0) {return TRUE;}
1564 if(RightSection_GT() <=0) {return TRUE;}
1568 right_x += delta_right_x;
1573 ////////////////////////////////////////////////////////////////////////
1575 static 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, int32_t rgb1, int32_t rgb2, int32_t rgb3)
1577 soft_vertex * v1, * v2, * v3;
1578 int height,longest,temp;
1580 v1 = vtx; v1->x=x1<<16;v1->y=y1;
1581 v1->u=tx1<<16;v1->v=ty1<<16;
1582 v1->R=(rgb1) & 0x00ff0000;
1583 v1->G=(rgb1<<8) & 0x00ff0000;
1584 v1->B=(rgb1<<16) & 0x00ff0000;
1586 v2 = vtx+1; v2->x=x2<<16;v2->y=y2;
1587 v2->u=tx2<<16;v2->v=ty2<<16;
1588 v2->R=(rgb2) & 0x00ff0000;
1589 v2->G=(rgb2<<8) & 0x00ff0000;
1590 v2->B=(rgb2<<16) & 0x00ff0000;
1592 v3 = vtx+2; v3->x=x3<<16;v3->y=y3;
1593 v3->u=tx3<<16;v3->v=ty3<<16;
1594 v3->R=(rgb3) & 0x00ff0000;
1595 v3->G=(rgb3<<8) & 0x00ff0000;
1596 v3->B=(rgb3<<16) & 0x00ff0000;
1598 if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }
1599 if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }
1600 if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }
1602 height = v3->y - v1->y;
1603 if(height == 0) {return FALSE;}
1605 temp=(((v2->y - v1->y) << 16) / height);
1606 longest = temp * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
1608 if(longest == 0) {return FALSE;}
1612 right_array[0] = v3;
1613 right_array[1] = v2;
1614 right_array[2] = v1;
1620 if(LeftSection_GT() <= 0) return FALSE;
1621 if(RightSection_GT() <= 0)
1624 if(RightSection_GT() <= 0) return FALSE;
1627 if(longest > -0x1000) longest = -0x1000;
1635 right_array[0] = v3;
1636 right_array[1] = v1;
1639 if(RightSection_GT() <= 0) return FALSE;
1640 if(LeftSection_GT() <= 0)
1643 if(LeftSection_GT() <= 0) return FALSE;
1645 if(longest < 0x1000) longest = 0x1000;
1649 Ymax=min(v3->y-1,drawH);
1651 delta_right_R=shl10idiv(temp*((v3->R - v1->R)>>10)+((v1->R - v2->R)<<6),longest);
1652 delta_right_G=shl10idiv(temp*((v3->G - v1->G)>>10)+((v1->G - v2->G)<<6),longest);
1653 delta_right_B=shl10idiv(temp*((v3->B - v1->B)>>10)+((v1->B - v2->B)<<6),longest);
1655 delta_right_u=shl10idiv(temp*((v3->u - v1->u)>>10)+((v1->u - v2->u)<<6),longest);
1656 delta_right_v=shl10idiv(temp*((v3->v - v1->v)>>10)+((v1->v - v2->v)<<6),longest);
1661 ////////////////////////////////////////////////////////////////////////
1662 ////////////////////////////////////////////////////////////////////////
1664 static inline int RightSection_F4(void)
1666 soft_vertex * v1 = right_array[ right_section ];
1667 soft_vertex * v2 = right_array[ right_section-1 ];
1669 int height = v2->y - v1->y;
1670 right_section_height = height;
1676 delta_right_x = (v2->x - v1->x) / height;
1681 ////////////////////////////////////////////////////////////////////////
1683 static inline int LeftSection_F4(void)
1685 soft_vertex * v1 = left_array[ left_section ];
1686 soft_vertex * v2 = left_array[ left_section-1 ];
1688 int height = v2->y - v1->y;
1689 left_section_height = height;
1695 delta_left_x = (v2->x - v1->x) / height;
1700 ////////////////////////////////////////////////////////////////////////
1702 static inline BOOL NextRow_F4(void)
1704 if(--left_section_height<=0)
1706 if(--left_section > 0)
1707 while(LeftSection_F4()<=0)
1709 if(--left_section <= 0) break;
1714 left_x += delta_left_x;
1717 if(--right_section_height<=0)
1719 if(--right_section > 0)
1720 while(RightSection_F4()<=0)
1722 if(--right_section<=0) break;
1727 right_x += delta_right_x;
1732 ////////////////////////////////////////////////////////////////////////
1734 static inline BOOL SetupSections_F4(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4)
1736 soft_vertex * v1, * v2, * v3, * v4;
1737 int height,width,longest1,longest2;
1739 v1 = vtx; v1->x=x1<<16;v1->y=y1;
1740 v2 = vtx+1; v2->x=x2<<16;v2->y=y2;
1741 v3 = vtx+2; v3->x=x3<<16;v3->y=y3;
1742 v4 = vtx+3; v4->x=x4<<16;v4->y=y4;
1744 if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }
1745 if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }
1746 if(v1->y > v4->y) { soft_vertex * v = v1; v1 = v4; v4 = v; }
1747 if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }
1748 if(v2->y > v4->y) { soft_vertex * v = v2; v2 = v4; v4 = v; }
1749 if(v3->y > v4->y) { soft_vertex * v = v3; v3 = v4; v4 = v; }
1751 height = v4->y - v1->y; if(height == 0) height =1;
1752 width = (v4->x - v1->x)>>16;
1753 longest1 = (((v2->y - v1->y) << 16) / height) * width + (v1->x - v2->x);
1754 longest2 = (((v3->y - v1->y) << 16) / height) * width + (v1->x - v3->x);
1756 if(longest1 < 0) // 2 is right
1758 if(longest2 < 0) // 3 is right
1764 height = v3->y - v1->y; if(height == 0) height=1;
1765 longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
1768 right_array[0] = v4; // 1
1769 right_array[1] = v3; // 3
1770 right_array[2] = v1; // 4
1775 height = v4->y - v2->y; if(height == 0) height=1;
1776 longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);
1779 right_array[0] = v4; // 1
1780 right_array[1] = v2; // 2
1781 right_array[2] = v1; // 4
1786 right_array[0] = v4; // 1
1787 right_array[1] = v3; // 2
1788 right_array[2] = v2; // 3
1789 right_array[3] = v1; // 4
1797 left_array[1] = v3; // 1
1798 left_array[2] = v1; // 2
1799 left_section = 2; // 3
1800 right_array[0] = v4; // 4
1801 right_array[1] = v2;
1802 right_array[2] = v1;
1810 left_array[0] = v4; // 1
1811 left_array[1] = v2; // 2
1812 left_array[2] = v1; // 3
1813 left_section = 2; // 4
1814 right_array[0] = v4;
1815 right_array[1] = v3;
1816 right_array[2] = v1;
1821 right_array[0] = v4;
1822 right_array[1] = v1;
1825 height = v3->y - v1->y; if(height == 0) height=1;
1826 longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
1829 left_array[0] = v4; // 1
1830 left_array[1] = v3; // 3
1831 left_array[2] = v1; // 4
1836 height = v4->y - v2->y; if(height == 0) height=1;
1837 longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);
1840 left_array[0] = v4; // 1
1841 left_array[1] = v2; // 2
1842 left_array[2] = v1; // 4
1847 left_array[0] = v4; // 1
1848 left_array[1] = v3; // 2
1849 left_array[2] = v2; // 3
1850 left_array[3] = v1; // 4
1857 while(LeftSection_F4()<=0)
1859 if(--left_section <= 0) break;
1862 while(RightSection_F4()<=0)
1864 if(--right_section <= 0) break;
1868 Ymax=min(v4->y-1,drawH);
1873 ////////////////////////////////////////////////////////////////////////
1874 ////////////////////////////////////////////////////////////////////////
1876 static inline int RightSection_FT4(void)
1878 soft_vertex * v1 = right_array[ right_section ];
1879 soft_vertex * v2 = right_array[ right_section-1 ];
1881 int height = v2->y - v1->y;
1882 right_section_height = height;
1890 delta_right_x = (v2->x - v1->x) / height;
1891 delta_right_u = (v2->u - v1->u) / height;
1892 delta_right_v = (v2->v - v1->v) / height;
1897 ////////////////////////////////////////////////////////////////////////
1899 static inline int LeftSection_FT4(void)
1901 soft_vertex * v1 = left_array[ left_section ];
1902 soft_vertex * v2 = left_array[ left_section-1 ];
1904 int height = v2->y - v1->y;
1905 left_section_height = height;
1913 delta_left_x = (v2->x - v1->x) / height;
1914 delta_left_u = (v2->u - v1->u) / height;
1915 delta_left_v = (v2->v - v1->v) / height;
1920 ////////////////////////////////////////////////////////////////////////
1922 static inline BOOL NextRow_FT4(void)
1924 if(--left_section_height<=0)
1926 if(--left_section > 0)
1927 while(LeftSection_FT4()<=0)
1929 if(--left_section <= 0) break;
1934 left_x += delta_left_x;
1935 left_u += delta_left_u;
1936 left_v += delta_left_v;
1939 if(--right_section_height<=0)
1941 if(--right_section > 0)
1942 while(RightSection_FT4()<=0)
1944 if(--right_section<=0) break;
1949 right_x += delta_right_x;
1950 right_u += delta_right_u;
1951 right_v += delta_right_v;
1956 ////////////////////////////////////////////////////////////////////////
1958 static 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)
1960 soft_vertex * v1, * v2, * v3, * v4;
1961 int height,width,longest1,longest2;
1963 v1 = vtx; v1->x=x1<<16;v1->y=y1;
1964 v1->u=tx1<<16;v1->v=ty1<<16;
1966 v2 = vtx+1; v2->x=x2<<16;v2->y=y2;
1967 v2->u=tx2<<16;v2->v=ty2<<16;
1969 v3 = vtx+2; v3->x=x3<<16;v3->y=y3;
1970 v3->u=tx3<<16;v3->v=ty3<<16;
1972 v4 = vtx+3; v4->x=x4<<16;v4->y=y4;
1973 v4->u=tx4<<16;v4->v=ty4<<16;
1975 if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }
1976 if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }
1977 if(v1->y > v4->y) { soft_vertex * v = v1; v1 = v4; v4 = v; }
1978 if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }
1979 if(v2->y > v4->y) { soft_vertex * v = v2; v2 = v4; v4 = v; }
1980 if(v3->y > v4->y) { soft_vertex * v = v3; v3 = v4; v4 = v; }
1982 height = v4->y - v1->y; if(height == 0) height =1;
1983 width = (v4->x - v1->x)>>16;
1984 longest1 = (((v2->y - v1->y) << 16) / height) * width + (v1->x - v2->x);
1985 longest2 = (((v3->y - v1->y) << 16) / height) * width + (v1->x - v3->x);
1987 if(longest1 < 0) // 2 is right
1989 if(longest2 < 0) // 3 is right
1995 height = v3->y - v1->y; if(height == 0) height=1;
1996 longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
1999 right_array[0] = v4; // 1
2000 right_array[1] = v3; // 3
2001 right_array[2] = v1; // 4
2006 height = v4->y - v2->y; if(height == 0) height=1;
2007 longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);
2010 right_array[0] = v4; // 1
2011 right_array[1] = v2; // 2
2012 right_array[2] = v1; // 4
2017 right_array[0] = v4; // 1
2018 right_array[1] = v3; // 2
2019 right_array[2] = v2; // 3
2020 right_array[3] = v1; // 4
2028 left_array[1] = v3; // 1
2029 left_array[2] = v1; // 2
2030 left_section = 2; // 3
2031 right_array[0] = v4; // 4
2032 right_array[1] = v2;
2033 right_array[2] = v1;
2041 left_array[0] = v4; // 1
2042 left_array[1] = v2; // 2
2043 left_array[2] = v1; // 3
2044 left_section = 2; // 4
2045 right_array[0] = v4;
2046 right_array[1] = v3;
2047 right_array[2] = v1;
2052 right_array[0] = v4;
2053 right_array[1] = v1;
2056 height = v3->y - v1->y; if(height == 0) height=1;
2057 longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
2060 left_array[0] = v4; // 1
2061 left_array[1] = v3; // 3
2062 left_array[2] = v1; // 4
2067 height = v4->y - v2->y; if(height == 0) height=1;
2068 longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);
2071 left_array[0] = v4; // 1
2072 left_array[1] = v2; // 2
2073 left_array[2] = v1; // 4
2078 left_array[0] = v4; // 1
2079 left_array[1] = v3; // 2
2080 left_array[2] = v2; // 3
2081 left_array[3] = v1; // 4
2088 while(LeftSection_FT4()<=0)
2090 if(--left_section <= 0) break;
2093 while(RightSection_FT4()<=0)
2095 if(--right_section <= 0) break;
2099 Ymax=min(v4->y-1,drawH);
2104 ////////////////////////////////////////////////////////////////////////
2105 ////////////////////////////////////////////////////////////////////////
2107 static inline int RightSection_GT4(void)
2109 soft_vertex * v1 = right_array[ right_section ];
2110 soft_vertex * v2 = right_array[ right_section-1 ];
2112 int height = v2->y - v1->y;
2113 right_section_height = height;
2125 delta_right_x = (v2->x - v1->x) / height;
2126 delta_right_u = (v2->u - v1->u) / height;
2127 delta_right_v = (v2->v - v1->v) / height;
2128 delta_right_R = (v2->R - v1->R) / height;
2129 delta_right_G = (v2->G - v1->G) / height;
2130 delta_right_B = (v2->B - v1->B) / height;
2135 ////////////////////////////////////////////////////////////////////////
2137 static inline int LeftSection_GT4(void)
2139 soft_vertex * v1 = left_array[ left_section ];
2140 soft_vertex * v2 = left_array[ left_section-1 ];
2142 int height = v2->y - v1->y;
2143 left_section_height = height;
2155 delta_left_x = (v2->x - v1->x) / height;
2156 delta_left_u = (v2->u - v1->u) / height;
2157 delta_left_v = (v2->v - v1->v) / height;
2158 delta_left_R = (v2->R - v1->R) / height;
2159 delta_left_G = (v2->G - v1->G) / height;
2160 delta_left_B = (v2->B - v1->B) / height;
2165 ////////////////////////////////////////////////////////////////////////
2167 static inline BOOL NextRow_GT4(void)
2169 if(--left_section_height<=0)
2171 if(--left_section > 0)
2172 while(LeftSection_GT4()<=0)
2174 if(--left_section <= 0) break;
2179 left_x += delta_left_x;
2180 left_u += delta_left_u;
2181 left_v += delta_left_v;
2182 left_R += delta_left_R;
2183 left_G += delta_left_G;
2184 left_B += delta_left_B;
2187 if(--right_section_height<=0)
2189 if(--right_section > 0)
2190 while(RightSection_GT4()<=0)
2192 if(--right_section<=0) break;
2197 right_x += delta_right_x;
2198 right_u += delta_right_u;
2199 right_v += delta_right_v;
2200 right_R += delta_right_R;
2201 right_G += delta_right_G;
2202 right_B += delta_right_B;
2207 ////////////////////////////////////////////////////////////////////////
2209 static 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,int32_t rgb1,int32_t rgb2,int32_t rgb3,int32_t rgb4)
2211 soft_vertex * v1, * v2, * v3, * v4;
2212 int height,width,longest1,longest2;
2214 v1 = vtx; v1->x=x1<<16;v1->y=y1;
2215 v1->u=tx1<<16;v1->v=ty1<<16;
2216 v1->R=(rgb1) & 0x00ff0000;
2217 v1->G=(rgb1<<8) & 0x00ff0000;
2218 v1->B=(rgb1<<16) & 0x00ff0000;
2220 v2 = vtx+1; v2->x=x2<<16;v2->y=y2;
2221 v2->u=tx2<<16;v2->v=ty2<<16;
2222 v2->R=(rgb2) & 0x00ff0000;
2223 v2->G=(rgb2<<8) & 0x00ff0000;
2224 v2->B=(rgb2<<16) & 0x00ff0000;
2226 v3 = vtx+2; v3->x=x3<<16;v3->y=y3;
2227 v3->u=tx3<<16;v3->v=ty3<<16;
2228 v3->R=(rgb3) & 0x00ff0000;
2229 v3->G=(rgb3<<8) & 0x00ff0000;
2230 v3->B=(rgb3<<16) & 0x00ff0000;
2232 v4 = vtx+3; v4->x=x4<<16;v4->y=y4;
2233 v4->u=tx4<<16;v4->v=ty4<<16;
2234 v4->R=(rgb4) & 0x00ff0000;
2235 v4->G=(rgb4<<8) & 0x00ff0000;
2236 v4->B=(rgb4<<16) & 0x00ff0000;
2238 if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }
2239 if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }
2240 if(v1->y > v4->y) { soft_vertex * v = v1; v1 = v4; v4 = v; }
2241 if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }
2242 if(v2->y > v4->y) { soft_vertex * v = v2; v2 = v4; v4 = v; }
2243 if(v3->y > v4->y) { soft_vertex * v = v3; v3 = v4; v4 = v; }
2245 height = v4->y - v1->y; if(height == 0) height =1;
2246 width = (v4->x - v1->x)>>16;
2247 longest1 = (((v2->y - v1->y) << 16) / height) * width + (v1->x - v2->x);
2248 longest2 = (((v3->y - v1->y) << 16) / height) * width + (v1->x - v3->x);
2250 if(longest1 < 0) // 2 is right
2252 if(longest2 < 0) // 3 is right
2258 height = v3->y - v1->y; if(height == 0) height=1;
2259 longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
2262 right_array[0] = v4; // 1
2263 right_array[1] = v3; // 3
2264 right_array[2] = v1; // 4
2269 height = v4->y - v2->y; if(height == 0) height=1;
2270 longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);
2273 right_array[0] = v4; // 1
2274 right_array[1] = v2; // 2
2275 right_array[2] = v1; // 4
2280 right_array[0] = v4; // 1
2281 right_array[1] = v3; // 2
2282 right_array[2] = v2; // 3
2283 right_array[3] = v1; // 4
2291 left_array[1] = v3; // 1
2292 left_array[2] = v1; // 2
2293 left_section = 2; // 3
2294 right_array[0] = v4; // 4
2295 right_array[1] = v2;
2296 right_array[2] = v1;
2304 left_array[0] = v4; // 1
2305 left_array[1] = v2; // 2
2306 left_array[2] = v1; // 3
2307 left_section = 2; // 4
2308 right_array[0] = v4;
2309 right_array[1] = v3;
2310 right_array[2] = v1;
2315 right_array[0] = v4;
2316 right_array[1] = v1;
2319 height = v3->y - v1->y; if(height == 0) height=1;
2320 longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
2323 left_array[0] = v4; // 1
2324 left_array[1] = v3; // 3
2325 left_array[2] = v1; // 4
2330 height = v4->y - v2->y; if(height == 0) height=1;
2331 longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);
2334 left_array[0] = v4; // 1
2335 left_array[1] = v2; // 2
2336 left_array[2] = v1; // 4
2341 left_array[0] = v4; // 1
2342 left_array[1] = v3; // 2
2343 left_array[2] = v2; // 3
2344 left_array[3] = v1; // 4
2351 while(LeftSection_GT4()<=0)
2353 if(--left_section <= 0) break;
2356 while(RightSection_GT4()<=0)
2358 if(--right_section <= 0) break;
2362 Ymax=min(v4->y-1,drawH);
2367 ////////////////////////////////////////////////////////////////////////
2368 ////////////////////////////////////////////////////////////////////////
2369 ////////////////////////////////////////////////////////////////////////
2371 ////////////////////////////////////////////////////////////////////////
2372 ////////////////////////////////////////////////////////////////////////
2373 ////////////////////////////////////////////////////////////////////////
2375 ////////////////////////////////////////////////////////////////////////
2376 // POLY 3/4 FLAT SHADED
2377 ////////////////////////////////////////////////////////////////////////
2379 static inline void drawPoly3Fi(short x1,short y1,short x2,short y2,short x3,short y3,int32_t rgb)
2381 int i,j,xmin,xmax,ymin,ymax;
2382 unsigned short color;uint32_t lcolor;
2384 if(x1>drawW && x2>drawW && x3>drawW) return;
2385 if(y1>drawH && y2>drawH && y3>drawH) return;
2386 if(x1<drawX && x2<drawX && x3<drawX) return;
2387 if(y1<drawY && y2<drawY && y3<drawY) return;
2388 if(drawY>=drawH) return;
2389 if(drawX>=drawW) return;
2391 if(!SetupSections_F(x1,y1,x2,y2,x3,y3)) return;
2395 color = ((rgb & 0x00f80000)>>9) | ((rgb & 0x0000f800)>>6) | ((rgb & 0x000000f8)>>3);
2396 lcolor=lSetMask|(((uint32_t)(color))<<16)|color;
2398 for(ymin=Ymin;ymin<drawY;ymin++)
2399 if(NextRow_F()) return;
2403 if(!bCheckMask && !DrawSemiTrans)
2405 lcolor = HOST2LE32(lcolor);
2406 for (i=ymin;i<=ymax;i++)
2408 xmin=left_x >> 16; if(drawX>xmin) xmin=drawX;
2409 xmax=(right_x >> 16)-1; if(drawW<xmax) xmax=drawW;
2411 for(j=xmin;j<xmax;j+=2)
2413 *(uint32_t *)&psxVuw[(i<<10)+j] = lcolor;
2415 if(j==xmax) psxVuw[(i<<10)+j] = lcolor;
2417 if(NextRow_F()) return;
2424 for (i=ymin;i<=ymax;i++)
2426 xmin=left_x >> 16; if(drawX>xmin) xmin=drawX;
2427 xmax=(right_x >> 16)-1; if(drawW<xmax) xmax=drawW;
2429 for(j=xmin;j<xmax;j+=2)
2431 GetShadeTransCol32((uint32_t *)&psxVuw[(i<<10)+j],lcolor);
2434 GetShadeTransCol(&psxVuw[(i<<10)+j],color);
2436 if(NextRow_F()) return;
2440 ////////////////////////////////////////////////////////////////////////
2442 static void drawPoly3F(int32_t rgb)
2444 drawPoly3Fi(lx0,ly0,lx1,ly1,lx2,ly2,rgb);
2449 static void drawPoly4F_TRI(int32_t rgb)
2451 drawPoly3Fi(lx1,ly1,lx3,ly3,lx2,ly2,rgb);
2452 drawPoly3Fi(lx0,ly0,lx1,ly1,lx2,ly2,rgb);
2459 static void drawPoly4F(int32_t rgb)
2461 int i,j,xmin,xmax,ymin,ymax;
2462 unsigned short color;uint32_t lcolor;
2464 if(lx0>drawW && lx1>drawW && lx2>drawW && lx3>drawW) return;
2465 if(ly0>drawH && ly1>drawH && ly2>drawH && ly3>drawH) return;
2466 if(lx0<drawX && lx1<drawX && lx2<drawX && lx3<drawX) return;
2467 if(ly0<drawY && ly1<drawY && ly2<drawY && ly3<drawY) return;
2468 if(drawY>=drawH) return;
2469 if(drawX>=drawW) return;
2471 if(!SetupSections_F4(lx0,ly0,lx1,ly1,lx2,ly2,lx3,ly3)) return;
2475 for(ymin=Ymin;ymin<drawY;ymin++)
2476 if(NextRow_F4()) return;
2478 color = ((rgb & 0x00f80000)>>9) | ((rgb & 0x0000f800)>>6) | ((rgb & 0x000000f8)>>3);
2479 lcolor= lSetMask|(((uint32_t)(color))<<16)|color;
2483 if(!bCheckMask && !DrawSemiTrans)
2485 lcolor = HOST2LE32(lcolor);
2486 for (i=ymin;i<=ymax;i++)
2488 xmin=left_x >> 16; if(drawX>xmin) xmin=drawX;
2489 xmax=(right_x >> 16)-1; if(drawW<xmax) xmax=drawW;
2491 for(j=xmin;j<xmax;j+=2)
2493 *(uint32_t *)&psxVuw[(i<<10)+j] = lcolor;
2495 if(j==xmax) psxVuw[(i<<10)+j] = lcolor;
2497 if(NextRow_F4()) return;
2504 for (i=ymin;i<=ymax;i++)
2506 xmin=left_x >> 16; if(drawX>xmin) xmin=drawX;
2507 xmax=(right_x >> 16)-1; if(drawW<xmax) xmax=drawW;
2509 for(j=xmin;j<xmax;j+=2)
2511 GetShadeTransCol32((uint32_t *)&psxVuw[(i<<10)+j],lcolor);
2513 if(j==xmax) GetShadeTransCol(&psxVuw[(i<<10)+j],color);
2515 if(NextRow_F4()) return;
2519 ////////////////////////////////////////////////////////////////////////
2520 // POLY 3/4 F-SHADED TEX PAL 4
2521 ////////////////////////////////////////////////////////////////////////
2523 static 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)
2525 int i,j,xmin,xmax,ymin,ymax;
2526 int32_t difX, difY,difX2, difY2;
2527 int32_t posX,posY,YAdjust,XAdjust;
2531 if(x1>drawW && x2>drawW && x3>drawW) return;
2532 if(y1>drawH && y2>drawH && y3>drawH) return;
2533 if(x1<drawX && x2<drawX && x3<drawX) return;
2534 if(y1<drawY && y2<drawY && y3<drawY) return;
2535 if(drawY>=drawH) return;
2536 if(drawX>=drawW) return;
2538 if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;
2542 for(ymin=Ymin;ymin<drawY;ymin++)
2543 if(NextRow_FT()) return;
2545 clutP=(clY<<10)+clX;
2547 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
2549 difX=delta_right_u;difX2=difX<<1;
2550 difY=delta_right_v;difY2=difY<<1;
2554 if(!bCheckMask && !DrawSemiTrans)
2556 for (i=ymin;i<=ymax;i++)
2558 xmin=(left_x >> 16);
2559 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!
2560 if(drawW<xmax) xmax=drawW;
2568 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
2570 for(j=xmin;j<xmax;j+=2)
2573 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(XAdjust>>1)];
2574 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
2575 XAdjust=((posX+difX)>>16);
2576 tC2 = psxVub[(((posY+difY)>>5)&(int32_t)0xFFFFF800)+YAdjust+
2578 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
2580 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
2581 GETLE16(&psxVuw[clutP+tC1])|
2582 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
2590 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+
2592 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
2593 GetTextureTransColG_S(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
2606 for (i=ymin;i<=ymax;i++)
2608 xmin=(left_x >> 16);
2609 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!
2610 if(drawW<xmax) xmax=drawW;
2618 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
2620 for(j=xmin;j<xmax;j+=2)
2623 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(XAdjust>>1)];
2624 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
2625 XAdjust=((posX+difX)>>16);
2626 tC2 = psxVub[(((posY+difY)>>5)&(int32_t)0xFFFFF800)+YAdjust+
2628 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
2630 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
2631 GETLE16(&psxVuw[clutP+tC1])|
2632 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
2640 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+
2642 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
2643 GetTextureTransColG(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
2653 ////////////////////////////////////////////////////////////////////////
2655 static 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)
2657 int i,j,xmin,xmax,ymin,ymax;
2658 int32_t difX, difY,difX2, difY2;
2659 int32_t posX,posY,YAdjust,XAdjust;
2663 if(x1>drawW && x2>drawW && x3>drawW) return;
2664 if(y1>drawH && y2>drawH && y3>drawH) return;
2665 if(x1<drawX && x2<drawX && x3<drawX) return;
2666 if(y1<drawY && y2<drawY && y3<drawY) return;
2667 if(drawY>=drawH) return;
2668 if(drawX>=drawW) return;
2670 if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;
2674 for(ymin=Ymin;ymin<drawY;ymin++)
2675 if(NextRow_FT()) return;
2677 clutP=(clY<<10)+clX;
2679 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
2680 YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0>>1);
2682 difX=delta_right_u;difX2=difX<<1;
2683 difY=delta_right_v;difY2=difY<<1;
2687 if(!bCheckMask && !DrawSemiTrans)
2689 for (i=ymin;i<=ymax;i++)
2691 xmin=(left_x >> 16);
2692 xmax=(right_x >> 16);//-1; //!!!!!!!!!!!!!!!!
2693 if(xmax>xmin) xmax--;
2695 if(drawW<xmax) xmax=drawW;
2703 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
2705 for(j=xmin;j<xmax;j+=2)
2707 XAdjust=(posX>>16)&TWin.xmask;
2708 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
2709 YAdjust+(XAdjust>>1)];
2710 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
2711 XAdjust=((posX+difX)>>16)&TWin.xmask;
2712 tC2 = psxVub[((((posY+difY)>>16)&TWin.ymask)<<11)+
2713 YAdjust+(XAdjust>>1)];
2714 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
2716 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
2717 GETLE16(&psxVuw[clutP+tC1])|
2718 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
2725 XAdjust=(posX>>16)&TWin.xmask;
2726 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
2727 YAdjust+(XAdjust>>1)];
2728 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
2729 GetTextureTransColG_S(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
2742 for (i=ymin;i<=ymax;i++)
2744 xmin=(left_x >> 16);
2745 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!
2746 if(drawW<xmax) xmax=drawW;
2754 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
2756 for(j=xmin;j<xmax;j+=2)
2758 XAdjust=(posX>>16)&TWin.xmask;
2759 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
2760 YAdjust+(XAdjust>>1)];
2761 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
2762 XAdjust=((posX+difX)>>16)&TWin.xmask;
2763 tC2 = psxVub[((((posY+difY)>>16)&TWin.ymask)<<11)+
2764 YAdjust+(XAdjust>>1)];
2765 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
2767 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
2768 GETLE16(&psxVuw[clutP+tC1])|
2769 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
2776 XAdjust=(posX>>16)&TWin.xmask;
2777 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
2778 YAdjust+(XAdjust>>1)];
2779 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
2780 GetTextureTransColG(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
2790 ////////////////////////////////////////////////////////////////////////
2794 static 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)
2796 drawPoly3TEx4(x2,y2,x3,y3,x4,y4,
2797 tx2,ty2,tx3,ty3,tx4,ty4,
2799 drawPoly3TEx4(x1,y1,x2,y2,x4,y4,
2800 tx1,ty1,tx2,ty2,tx4,ty4,
2808 static 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)
2811 int32_t i,j,xmin,xmax,ymin,ymax;
2812 int32_t difX, difY, difX2, difY2;
2813 int32_t posX,posY,YAdjust,clutP,XAdjust;
2816 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
2817 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
2818 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
2819 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
2820 if(drawY>=drawH) return;
2821 if(drawX>=drawW) return;
2823 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
2827 for(ymin=Ymin;ymin<drawY;ymin++)
2828 if(NextRow_FT4()) return;
2830 clutP=(clY<<10)+clX;
2832 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
2836 if(!bCheckMask && !DrawSemiTrans)
2838 for (i=ymin;i<=ymax;i++)
2840 xmin=(left_x >> 16);
2841 xmax=(right_x >> 16);
2850 difX=(right_u-posX)/num;
2851 difY=(right_v-posY)/num;
2856 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
2857 xmax--;if(drawW<xmax) xmax=drawW;
2859 for(j=xmin;j<xmax;j+=2)
2862 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(XAdjust>>1)];
2863 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
2864 XAdjust=((posX+difX)>>16);
2865 tC2 = psxVub[(((posY+difY)>>5)&(int32_t)0xFFFFF800)+YAdjust+
2867 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
2869 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
2870 GETLE16(&psxVuw[clutP+tC1])|
2871 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
2878 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+
2880 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
2881 GetTextureTransColG_S(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
2885 if(NextRow_FT4()) return;
2892 for (i=ymin;i<=ymax;i++)
2894 xmin=(left_x >> 16);
2895 xmax=(right_x >> 16);
2904 difX=(right_u-posX)/num;
2905 difY=(right_v-posY)/num;
2910 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
2911 xmax--;if(drawW<xmax) xmax=drawW;
2913 for(j=xmin;j<xmax;j+=2)
2916 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(XAdjust>>1)];
2917 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
2918 XAdjust=((posX+difX)>>16);
2919 tC2 = psxVub[(((posY+difY)>>5)&(int32_t)0xFFFFF800)+YAdjust+
2921 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
2923 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
2924 GETLE16(&psxVuw[clutP+tC1])|
2925 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
2932 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+
2934 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
2935 GetTextureTransColG(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
2938 if(NextRow_FT4()) return;
2942 ////////////////////////////////////////////////////////////////////////
2944 static 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)
2947 int32_t i,j,xmin,xmax,ymin,ymax;
2948 int32_t difX, difY, difX2, difY2;
2949 int32_t posX,posY,YAdjust,clutP,XAdjust;
2952 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
2953 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
2954 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
2955 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
2956 if(drawY>=drawH) return;
2957 if(drawX>=drawW) return;
2959 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
2963 for(ymin=Ymin;ymin<drawY;ymin++)
2964 if(NextRow_FT4()) return;
2966 clutP=(clY<<10)+clX;
2968 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
2969 YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0>>1);
2973 if(!bCheckMask && !DrawSemiTrans)
2975 for (i=ymin;i<=ymax;i++)
2977 xmin=(left_x >> 16);
2978 xmax=(right_x >> 16);
2987 difX=(right_u-posX)/num;
2988 difY=(right_v-posY)/num;
2993 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
2994 xmax--;if(drawW<xmax) xmax=drawW;
2996 for(j=xmin;j<xmax;j+=2)
2998 XAdjust=(posX>>16)&TWin.xmask;
2999 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
3000 YAdjust+(XAdjust>>1)];
3001 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
3002 XAdjust=((posX+difX)>>16)&TWin.xmask;
3003 tC2 = psxVub[((((posY+difY)>>16)&TWin.ymask)<<11)+
3004 YAdjust+(XAdjust>>1)];
3005 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
3007 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
3008 GETLE16(&psxVuw[clutP+tC1])|
3009 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
3015 XAdjust=(posX>>16)&TWin.xmask;
3016 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
3017 YAdjust+(XAdjust>>1)];
3018 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
3019 GetTextureTransColG_S(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
3022 if(NextRow_FT4()) return;
3029 for (i=ymin;i<=ymax;i++)
3031 xmin=(left_x >> 16);
3032 xmax=(right_x >> 16);
3041 difX=(right_u-posX)/num;
3042 difY=(right_v-posY)/num;
3047 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3048 xmax--;if(drawW<xmax) xmax=drawW;
3050 for(j=xmin;j<xmax;j+=2)
3052 XAdjust=(posX>>16)&TWin.xmask;
3053 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
3054 YAdjust+(XAdjust>>1)];
3055 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
3056 XAdjust=((posX+difX)>>16)&TWin.xmask;
3057 tC2 = psxVub[((((posY+difY)>>16)&TWin.ymask)<<11)+
3058 YAdjust+(XAdjust>>1)];
3059 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
3061 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
3062 GETLE16(&psxVuw[clutP+tC1])|
3063 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
3069 XAdjust=(posX>>16)&TWin.xmask;
3070 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
3071 YAdjust+(XAdjust>>1)];
3072 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
3073 GetTextureTransColG(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
3076 if(NextRow_FT4()) return;
3080 ////////////////////////////////////////////////////////////////////////
3082 static 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)
3085 int32_t i,j,xmin,xmax,ymin,ymax;
3086 int32_t difX, difY, difX2, difY2;
3087 int32_t posX,posY,YAdjust,clutP,XAdjust;
3090 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
3091 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
3092 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
3093 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
3094 if(drawY>=drawH) return;
3095 if(drawX>=drawW) return;
3097 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
3101 for(ymin=Ymin;ymin<drawY;ymin++)
3102 if(NextRow_FT4()) return;
3104 clutP=(clY<<10)+clX;
3106 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
3107 YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0>>1);
3111 if(!bCheckMask && !DrawSemiTrans)
3113 for (i=ymin;i<=ymax;i++)
3115 xmin=(left_x >> 16);
3116 xmax=(right_x >> 16);
3125 difX=(right_u-posX)/num;
3126 difY=(right_v-posY)/num;
3131 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3132 xmax--;if(drawW<xmax) xmax=drawW;
3134 for(j=xmin;j<xmax;j+=2)
3136 XAdjust=(posX>>16)&TWin.xmask;
3137 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
3138 YAdjust+(XAdjust>>1)];
3139 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
3140 XAdjust=((posX+difX)>>16)&TWin.xmask;
3141 tC2 = psxVub[((((posY+difY)>>16)&TWin.ymask)<<11)+
3142 YAdjust+(XAdjust>>1)];
3143 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
3145 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
3146 GETLE16(&psxVuw[clutP+tC1])|
3147 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
3153 XAdjust=(posX>>16)&TWin.xmask;
3154 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
3155 YAdjust+(XAdjust>>1)];
3156 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
3157 GetTextureTransColG_S(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
3160 if(NextRow_FT4()) return;
3167 for (i=ymin;i<=ymax;i++)
3169 xmin=(left_x >> 16);
3170 xmax=(right_x >> 16);
3179 difX=(right_u-posX)/num;
3180 difY=(right_v-posY)/num;
3185 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3186 xmax--;if(drawW<xmax) xmax=drawW;
3188 for(j=xmin;j<xmax;j+=2)
3190 XAdjust=(posX>>16)&TWin.xmask;
3191 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
3192 YAdjust+(XAdjust>>1)];
3193 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
3194 XAdjust=((posX+difX)>>16)&TWin.xmask;
3195 tC2 = psxVub[((((posY+difY)>>16)&TWin.ymask)<<11)+
3196 YAdjust+(XAdjust>>1)];
3197 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
3199 GetTextureTransColG32_SPR((uint32_t *)&psxVuw[(i<<10)+j],
3200 GETLE16(&psxVuw[clutP+tC1])|
3201 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
3207 XAdjust=(posX>>16)&TWin.xmask;
3208 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
3209 YAdjust+(XAdjust>>1)];
3210 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
3211 GetTextureTransColG_SPR(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
3214 if(NextRow_FT4()) return;
3217 ////////////////////////////////////////////////////////////////////////
3218 // POLY 3 F-SHADED TEX PAL 8
3219 ////////////////////////////////////////////////////////////////////////
3221 static 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)
3223 int i,j,xmin,xmax,ymin,ymax;
3224 int32_t difX, difY,difX2, difY2;
3225 int32_t posX,posY,YAdjust,clutP;
3228 if(x1>drawW && x2>drawW && x3>drawW) return;
3229 if(y1>drawH && y2>drawH && y3>drawH) return;
3230 if(x1<drawX && x2<drawX && x3<drawX) return;
3231 if(y1<drawY && y2<drawY && y3<drawY) return;
3232 if(drawY>=drawH) return;
3233 if(drawX>=drawW) return;
3235 if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;
3239 for(ymin=Ymin;ymin<drawY;ymin++)
3240 if(NextRow_FT()) return;
3242 clutP=(clY<<10)+clX;
3244 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
3246 difX=delta_right_u;difX2=difX<<1;
3247 difY=delta_right_v;difY2=difY<<1;
3251 if(!bCheckMask && !DrawSemiTrans)
3253 for (i=ymin;i<=ymax;i++)
3255 xmin=(left_x >> 16);
3256 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!
3257 if(drawW<xmax) xmax=drawW;
3265 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3267 for(j=xmin;j<xmax;j+=2)
3269 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(posX>>16)];
3270 tC2 = psxVub[(((posY+difY)>>5)&(int32_t)0xFFFFF800)+YAdjust+
3272 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
3273 GETLE16(&psxVuw[clutP+tC1])|
3274 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
3281 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(posX>>16)];
3282 GetTextureTransColG_S(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
3295 for (i=ymin;i<=ymax;i++)
3297 xmin=(left_x >> 16);
3298 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!
3299 if(drawW<xmax) xmax=drawW;
3307 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3309 for(j=xmin;j<xmax;j+=2)
3311 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(posX>>16)];
3312 tC2 = psxVub[(((posY+difY)>>5)&(int32_t)0xFFFFF800)+YAdjust+
3314 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
3315 GETLE16(&psxVuw[clutP+tC1])|
3316 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
3323 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(posX>>16)];
3324 GetTextureTransColG(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
3335 ////////////////////////////////////////////////////////////////////////
3337 static 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)
3339 int i,j,xmin,xmax,ymin,ymax;
3340 int32_t difX, difY,difX2, difY2;
3341 int32_t posX,posY,YAdjust,clutP;
3344 if(x1>drawW && x2>drawW && x3>drawW) return;
3345 if(y1>drawH && y2>drawH && y3>drawH) return;
3346 if(x1<drawX && x2<drawX && x3<drawX) return;
3347 if(y1<drawY && y2<drawY && y3<drawY) return;
3348 if(drawY>=drawH) return;
3349 if(drawX>=drawW) return;
3351 if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;
3355 for(ymin=Ymin;ymin<drawY;ymin++)
3356 if(NextRow_FT()) return;
3358 clutP=(clY<<10)+clX;
3360 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
3361 YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0);
3363 difX=delta_right_u;difX2=difX<<1;
3364 difY=delta_right_v;difY2=difY<<1;
3368 if(!bCheckMask && !DrawSemiTrans)
3370 for (i=ymin;i<=ymax;i++)
3372 xmin=(left_x >> 16);
3373 xmax=(right_x >> 16);//-1; //!!!!!!!!!!!!!!!!
3374 if(xmax>xmin) xmax--;
3376 if(drawW<xmax) xmax=drawW;
3384 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3386 for(j=xmin;j<xmax;j+=2)
3388 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
3389 YAdjust+((posX>>16)&TWin.xmask)];
3390 tC2 = psxVub[((((posY+difY)>>16)&TWin.ymask)<<11)+
3391 YAdjust+(((posX+difX)>>16)&TWin.xmask)];
3392 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
3393 GETLE16(&psxVuw[clutP+tC1])|
3394 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
3401 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
3402 YAdjust+((posX>>16)&TWin.xmask)];
3403 GetTextureTransColG_S(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
3416 for (i=ymin;i<=ymax;i++)
3418 xmin=(left_x >> 16);
3419 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!
3420 if(drawW<xmax) xmax=drawW;
3428 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3430 for(j=xmin;j<xmax;j+=2)
3432 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
3433 YAdjust+((posX>>16)&TWin.xmask)];
3434 tC2 = psxVub[((((posY+difY)>>16)&TWin.ymask)<<11)+
3435 YAdjust+(((posX+difX)>>16)&TWin.xmask)];
3436 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
3437 GETLE16(&psxVuw[clutP+tC1])|
3438 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
3445 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
3446 YAdjust+((posX>>16)&TWin.xmask)];
3447 GetTextureTransColG(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
3458 ////////////////////////////////////////////////////////////////////////
3462 static 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)
3464 drawPoly3TEx8(x2,y2,x3,y3,x4,y4,
3465 tx2,ty2,tx3,ty3,tx4,ty4,
3468 drawPoly3TEx8(x1,y1,x2,y2,x4,y4,
3469 tx1,ty1,tx2,ty2,tx4,ty4,
3477 static 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)
3480 int32_t i,j,xmin,xmax,ymin,ymax;
3481 int32_t difX, difY, difX2, difY2;
3482 int32_t posX,posY,YAdjust,clutP;
3485 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
3486 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
3487 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
3488 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
3489 if(drawY>=drawH) return;
3490 if(drawX>=drawW) return;
3492 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
3496 for(ymin=Ymin;ymin<drawY;ymin++)
3497 if(NextRow_FT4()) return;
3499 clutP=(clY<<10)+clX;
3501 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
3505 if(!bCheckMask && !DrawSemiTrans)
3507 for (i=ymin;i<=ymax;i++)
3509 xmin=(left_x >> 16);
3510 xmax=(right_x >> 16);
3519 difX=(right_u-posX)/num;
3520 difY=(right_v-posY)/num;
3525 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3526 xmax--;if(drawW<xmax) xmax=drawW;
3528 for(j=xmin;j<xmax;j+=2)
3530 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(posX>>16)];
3531 tC2 = psxVub[(((posY+difY)>>5)&(int32_t)0xFFFFF800)+YAdjust+
3533 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
3534 GETLE16(&psxVuw[clutP+tC1])|
3535 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
3541 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(posX>>16)];
3542 GetTextureTransColG_S(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
3545 if(NextRow_FT4()) return;
3552 for (i=ymin;i<=ymax;i++)
3554 xmin=(left_x >> 16);
3555 xmax=(right_x >> 16);
3564 difX=(right_u-posX)/num;
3565 difY=(right_v-posY)/num;
3570 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3571 xmax--;if(drawW<xmax) xmax=drawW;
3573 for(j=xmin;j<xmax;j+=2)
3575 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(posX>>16)];
3576 tC2 = psxVub[(((posY+difY)>>5)&(int32_t)0xFFFFF800)+YAdjust+
3578 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
3579 GETLE16(&psxVuw[clutP+tC1])|
3580 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
3586 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(posX>>16)];
3587 GetTextureTransColG(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
3590 if(NextRow_FT4()) return;
3594 ////////////////////////////////////////////////////////////////////////
3596 static 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)
3599 int32_t i,j,xmin,xmax,ymin,ymax;
3600 int32_t difX, difY, difX2, difY2;
3601 int32_t posX,posY,YAdjust,clutP;
3604 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
3605 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
3606 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
3607 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
3608 if(drawY>=drawH) return;
3609 if(drawX>=drawW) return;
3611 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
3615 for(ymin=Ymin;ymin<drawY;ymin++)
3616 if(NextRow_FT4()) return;
3618 clutP=(clY<<10)+clX;
3620 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
3621 YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0);
3625 if(!bCheckMask && !DrawSemiTrans)
3627 for (i=ymin;i<=ymax;i++)
3629 xmin=(left_x >> 16);
3630 xmax=(right_x >> 16);
3639 difX=(right_u-posX)/num;
3640 difY=(right_v-posY)/num;
3645 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3646 xmax--;if(drawW<xmax) xmax=drawW;
3648 for(j=xmin;j<xmax;j+=2)
3650 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
3651 YAdjust+((posX>>16)&TWin.xmask)];
3652 tC2 = psxVub[((((posY+difY)>>16)&TWin.ymask)<<11)+
3653 YAdjust+(((posX+difX)>>16)&TWin.xmask)];
3654 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
3655 GETLE16(&psxVuw[clutP+tC1])|
3656 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
3662 tC1 = psxVub[((((posY+difY)>>16)&TWin.ymask)<<11)+
3663 YAdjust+((posX>>16)&TWin.xmask)];
3664 GetTextureTransColG_S(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
3667 if(NextRow_FT4()) return;
3675 for (i=ymin;i<=ymax;i++)
3677 xmin=(left_x >> 16);
3678 xmax=(right_x >> 16);
3687 difX=(right_u-posX)/num;
3688 difY=(right_v-posY)/num;
3693 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3694 xmax--;if(drawW<xmax) xmax=drawW;
3696 for(j=xmin;j<xmax;j+=2)
3698 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
3699 YAdjust+((posX>>16)&TWin.xmask)];
3700 tC2 = psxVub[((((posY+difY)>>16)&TWin.ymask)<<11)+
3701 YAdjust+(((posX+difX)>>16)&TWin.xmask)];
3702 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
3703 GETLE16(&psxVuw[clutP+tC1])|
3704 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
3710 tC1 = psxVub[((((posY+difY)>>16)&TWin.ymask)<<11)+
3711 YAdjust+((posX>>16)&TWin.xmask)];
3712 GetTextureTransColG(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
3715 if(NextRow_FT4()) return;
3719 ////////////////////////////////////////////////////////////////////////
3721 static 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)
3724 int32_t i,j,xmin,xmax,ymin,ymax;
3725 int32_t difX, difY, difX2, difY2;
3726 int32_t posX,posY,YAdjust,clutP;
3729 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
3730 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
3731 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
3732 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
3733 if(drawY>=drawH) return;
3734 if(drawX>=drawW) return;
3736 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
3740 for(ymin=Ymin;ymin<drawY;ymin++)
3741 if(NextRow_FT4()) return;
3743 clutP=(clY<<10)+clX;
3745 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
3746 YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0);
3750 if(!bCheckMask && !DrawSemiTrans)
3752 for (i=ymin;i<=ymax;i++)
3754 xmin=(left_x >> 16);
3755 xmax=(right_x >> 16);
3764 difX=(right_u-posX)/num;
3765 difY=(right_v-posY)/num;
3770 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3771 xmax--;if(drawW<xmax) xmax=drawW;
3773 for(j=xmin;j<xmax;j+=2)
3775 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
3776 YAdjust+((posX>>16)&TWin.xmask)];
3777 tC2 = psxVub[((((posY+difY)>>16)&TWin.ymask)<<11)+
3778 YAdjust+(((posX+difX)>>16)&TWin.xmask)];
3779 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
3780 GETLE16(&psxVuw[clutP+tC1])|
3781 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
3787 tC1 = psxVub[((((posY+difY)>>16)&TWin.ymask)<<11)+
3788 YAdjust+((posX>>16)&TWin.xmask)];
3789 GetTextureTransColG_S(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
3792 if(NextRow_FT4()) return;
3800 for (i=ymin;i<=ymax;i++)
3802 xmin=(left_x >> 16);
3803 xmax=(right_x >> 16);
3812 difX=(right_u-posX)/num;
3813 difY=(right_v-posY)/num;
3818 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3819 xmax--;if(drawW<xmax) xmax=drawW;
3821 for(j=xmin;j<xmax;j+=2)
3823 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
3824 YAdjust+((posX>>16)&TWin.xmask)];
3825 tC2 = psxVub[((((posY+difY)>>16)&TWin.ymask)<<11)+
3826 YAdjust+(((posX+difX)>>16)&TWin.xmask)];
3827 GetTextureTransColG32_SPR((uint32_t *)&psxVuw[(i<<10)+j],
3828 GETLE16(&psxVuw[clutP+tC1])|
3829 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
3835 tC1 = psxVub[((((posY+difY)>>16)&TWin.ymask)<<11)+
3836 YAdjust+((posX>>16)&TWin.xmask)];
3837 GetTextureTransColG_SPR(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
3840 if(NextRow_FT4()) return;
3844 ////////////////////////////////////////////////////////////////////////
3845 // POLY 3 F-SHADED TEX 15 BIT
3846 ////////////////////////////////////////////////////////////////////////
3848 static 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)
3850 int i,j,xmin,xmax,ymin,ymax;
3851 int32_t difX, difY,difX2, difY2;
3854 if(x1>drawW && x2>drawW && x3>drawW) return;
3855 if(y1>drawH && y2>drawH && y3>drawH) return;
3856 if(x1<drawX && x2<drawX && x3<drawX) return;
3857 if(y1<drawY && y2<drawY && y3<drawY) return;
3858 if(drawY>=drawH) return;
3859 if(drawX>=drawW) return;
3861 if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;
3865 for(ymin=Ymin;ymin<drawY;ymin++)
3866 if(NextRow_FT()) return;
3868 difX=delta_right_u;difX2=difX<<1;
3869 difY=delta_right_v;difY2=difY<<1;
3873 if(!bCheckMask && !DrawSemiTrans)
3875 for (i=ymin;i<=ymax;i++)
3877 xmin=(left_x >> 16);
3878 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!
3879 if(drawW<xmax) xmax=drawW;
3887 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3889 for(j=xmin;j<xmax;j+=2)
3891 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
3892 (((int32_t)GETLE16(&psxVuw[((((posY+difY)>>16)+GlobalTextAddrY)<<10)+((posX+difX)>>16)+GlobalTextAddrX]))<<16)|
3893 GETLE16(&psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+((posX)>>16)+GlobalTextAddrX]));
3899 GetTextureTransColG_S(&psxVuw[(i<<10)+j],
3900 GETLE16(&psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX]));
3912 for (i=ymin;i<=ymax;i++)
3914 xmin=(left_x >> 16);
3915 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!
3916 if(drawW<xmax) xmax=drawW;
3924 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3926 for(j=xmin;j<xmax;j+=2)
3928 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
3929 (((int32_t)GETLE16(&psxVuw[((((posY+difY)>>16)+GlobalTextAddrY)<<10)+((posX+difX)>>16)+GlobalTextAddrX]))<<16)|
3930 GETLE16(&psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+((posX)>>16)+GlobalTextAddrX]));
3936 GetTextureTransColG(&psxVuw[(i<<10)+j],
3937 GETLE16(&psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX]));
3946 ////////////////////////////////////////////////////////////////////////
3948 static 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)
3950 int i,j,xmin,xmax,ymin,ymax;
3951 int32_t difX, difY,difX2, difY2;
3954 if(x1>drawW && x2>drawW && x3>drawW) return;
3955 if(y1>drawH && y2>drawH && y3>drawH) return;
3956 if(x1<drawX && x2<drawX && x3<drawX) return;
3957 if(y1<drawY && y2<drawY && y3<drawY) return;
3958 if(drawY>=drawH) return;
3959 if(drawX>=drawW) return;
3961 if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;
3965 for(ymin=Ymin;ymin<drawY;ymin++)
3966 if(NextRow_FT()) return;
3968 difX=delta_right_u;difX2=difX<<1;
3969 difY=delta_right_v;difY2=difY<<1;
3973 if(!bCheckMask && !DrawSemiTrans)
3975 for (i=ymin;i<=ymax;i++)
3977 xmin=(left_x >> 16);
3978 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!
3979 if(drawW<xmax) xmax=drawW;
3987 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3989 for(j=xmin;j<xmax;j+=2)
3991 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
3992 (((int32_t)GETLE16(&psxVuw[(((((posY+difY)>>16)&TWin.ymask)+GlobalTextAddrY+TWin.Position.y0)<<10)+
3993 (((posX+difX)>>16)&TWin.xmask)+GlobalTextAddrX+TWin.Position.x0]))<<16)|
3994 GETLE16(&psxVuw[((((posY>>16)&TWin.ymask)+GlobalTextAddrY+TWin.Position.y0)<<10)+
3995 (((posX)>>16)&TWin.xmask)+GlobalTextAddrX+TWin.Position.x0]));
4001 GetTextureTransColG_S(&psxVuw[(i<<10)+j],
4002 GETLE16(&psxVuw[((((posY>>16)&TWin.ymask)+GlobalTextAddrY+TWin.Position.y0)<<10)+
4003 ((posX>>16)&TWin.xmask)+GlobalTextAddrX+TWin.Position.x0]));
4015 for (i=ymin;i<=ymax;i++)
4017 xmin=(left_x >> 16);
4018 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!
4019 if(drawW<xmax) xmax=drawW;
4027 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
4029 for(j=xmin;j<xmax;j+=2)
4031 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
4032 (((int32_t)GETLE16(&psxVuw[(((((posY+difY)>>16)&TWin.ymask)+GlobalTextAddrY+TWin.Position.y0)<<10)+
4033 (((posX+difX)>>16)&TWin.xmask)+GlobalTextAddrX+TWin.Position.x0]))<<16)|
4034 GETLE16(&psxVuw[((((posY>>16)&TWin.ymask)+GlobalTextAddrY+TWin.Position.y0)<<10)+
4035 (((posX)>>16)&TWin.xmask)+GlobalTextAddrX+TWin.Position.x0]));
4041 GetTextureTransColG(&psxVuw[(i<<10)+j],
4042 GETLE16(&psxVuw[((((posY>>16)&TWin.ymask)+GlobalTextAddrY+TWin.Position.y0)<<10)+
4043 ((posX>>16)&TWin.xmask)+GlobalTextAddrX+TWin.Position.x0]));
4053 ////////////////////////////////////////////////////////////////////////
4057 static 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)
4059 drawPoly3TD(x2,y2,x3,y3,x4,y4,
4060 tx2,ty2,tx3,ty3,tx4,ty4);
4061 drawPoly3TD(x1,y1,x2,y2,x4,y4,
4062 tx1,ty1,tx2,ty2,tx4,ty4);
4069 static 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)
4072 int32_t i,j,xmin,xmax,ymin,ymax;
4073 int32_t difX, difY, difX2, difY2;
4076 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
4077 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
4078 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
4079 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
4080 if(drawY>=drawH) return;
4081 if(drawX>=drawW) return;
4083 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
4087 for(ymin=Ymin;ymin<drawY;ymin++)
4088 if(NextRow_FT4()) return;
4092 if(!bCheckMask && !DrawSemiTrans)
4094 for (i=ymin;i<=ymax;i++)
4096 xmin=(left_x >> 16);
4097 xmax=(right_x >> 16);
4106 difX=(right_u-posX)/num;
4107 difY=(right_v-posY)/num;
4112 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
4113 xmax--;if(drawW<xmax) xmax=drawW;
4115 for(j=xmin;j<xmax;j+=2)
4117 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
4118 (((int32_t)GETLE16(&psxVuw[((((posY+difY)>>16)+GlobalTextAddrY)<<10)+((posX+difX)>>16)+GlobalTextAddrX]))<<16)|
4119 GETLE16(&psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+((posX)>>16)+GlobalTextAddrX]));
4125 GetTextureTransColG_S(&psxVuw[(i<<10)+j],
4126 GETLE16(&psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX]));
4128 if(NextRow_FT4()) return;
4135 for (i=ymin;i<=ymax;i++)
4137 xmin=(left_x >> 16);
4138 xmax=(right_x >> 16);
4147 difX=(right_u-posX)/num;
4148 difY=(right_v-posY)/num;
4153 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
4154 xmax--;if(drawW<xmax) xmax=drawW;
4156 for(j=xmin;j<xmax;j+=2)
4158 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
4159 (((int32_t)GETLE16(&psxVuw[((((posY+difY)>>16)+GlobalTextAddrY)<<10)+((posX+difX)>>16)+GlobalTextAddrX]))<<16)|
4160 GETLE16(&psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+((posX)>>16)+GlobalTextAddrX]));
4166 GetTextureTransColG(&psxVuw[(i<<10)+j],
4167 GETLE16(&psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX]));
4169 if(NextRow_FT4()) return;
4173 ////////////////////////////////////////////////////////////////////////
4175 static 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)
4178 int32_t i,j,xmin,xmax,ymin,ymax;
4179 int32_t difX, difY, difX2, difY2;
4182 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
4183 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
4184 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
4185 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
4186 if(drawY>=drawH) return;
4187 if(drawX>=drawW) return;
4189 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
4193 for(ymin=Ymin;ymin<drawY;ymin++)
4194 if(NextRow_FT4()) return;
4198 if(!bCheckMask && !DrawSemiTrans)
4200 for (i=ymin;i<=ymax;i++)
4202 xmin=(left_x >> 16);
4203 xmax=(right_x >> 16);
4212 difX=(right_u-posX)/num;
4213 difY=(right_v-posY)/num;
4218 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
4219 xmax--;if(drawW<xmax) xmax=drawW;
4221 for(j=xmin;j<xmax;j+=2)
4223 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
4224 (((int32_t)GETLE16(&psxVuw[(((((posY+difY)>>16)&TWin.ymask)+GlobalTextAddrY+TWin.Position.y0)<<10)+
4225 (((posX+difX)>>16)&TWin.xmask)+GlobalTextAddrX+TWin.Position.x0]))<<16)|
4226 GETLE16(&psxVuw[((((posY>>16)&TWin.ymask)+GlobalTextAddrY)<<10)+TWin.Position.y0+
4227 ((posX>>16)&TWin.xmask)+GlobalTextAddrX+TWin.Position.x0]));
4233 GetTextureTransColG_S(&psxVuw[(i<<10)+j],
4234 GETLE16(&psxVuw[((((posY>>16)&TWin.ymask)+GlobalTextAddrY+TWin.Position.y0)<<10)+
4235 ((posX>>16)&TWin.xmask)+GlobalTextAddrX+TWin.Position.x0]));
4237 if(NextRow_FT4()) return;
4244 for (i=ymin;i<=ymax;i++)
4246 xmin=(left_x >> 16);
4247 xmax=(right_x >> 16);
4256 difX=(right_u-posX)/num;
4257 difY=(right_v-posY)/num;
4262 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
4263 xmax--;if(drawW<xmax) xmax=drawW;
4265 for(j=xmin;j<xmax;j+=2)
4267 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
4268 (((int32_t)GETLE16(&psxVuw[(((((posY+difY)>>16)&TWin.ymask)+GlobalTextAddrY+TWin.Position.y0)<<10)+
4269 (((posX+difX)>>16)&TWin.xmask)+GlobalTextAddrX+TWin.Position.x0]))<<16)|
4270 GETLE16(&psxVuw[((((posY>>16)&TWin.ymask)+GlobalTextAddrY+TWin.Position.y0)<<10)+
4271 ((posX>>16)&TWin.xmask)+GlobalTextAddrX+TWin.Position.x0]));
4277 GetTextureTransColG(&psxVuw[(i<<10)+j],
4278 GETLE16(&psxVuw[((((posY>>16)&TWin.ymask)+GlobalTextAddrY+TWin.Position.y0)<<10)+
4279 ((posX>>16)&TWin.xmask)+GlobalTextAddrX+TWin.Position.x0]));
4281 if(NextRow_FT4()) return;
4285 ////////////////////////////////////////////////////////////////////////
4287 static 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)
4290 int32_t i,j,xmin,xmax,ymin,ymax;
4291 int32_t difX, difY, difX2, difY2;
4294 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
4295 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
4296 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
4297 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
4298 if(drawY>=drawH) return;
4299 if(drawX>=drawW) return;
4301 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
4305 for(ymin=Ymin;ymin<drawY;ymin++)
4306 if(NextRow_FT4()) return;
4310 if(!bCheckMask && !DrawSemiTrans)
4312 for (i=ymin;i<=ymax;i++)
4314 xmin=(left_x >> 16);
4315 xmax=(right_x >> 16);
4324 difX=(right_u-posX)/num;
4325 difY=(right_v-posY)/num;
4330 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
4331 xmax--;if(drawW<xmax) xmax=drawW;
4333 for(j=xmin;j<xmax;j+=2)
4335 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
4336 (((int32_t)GETLE16(&psxVuw[(((((posY+difY)>>16)&TWin.ymask)+GlobalTextAddrY+TWin.Position.y0)<<10)+
4337 (((posX+difX)>>16)&TWin.xmask)+GlobalTextAddrX+TWin.Position.x0]))<<16)|
4338 GETLE16(&psxVuw[((((posY>>16)&TWin.ymask)+GlobalTextAddrY)<<10)+TWin.Position.y0+
4339 ((posX>>16)&TWin.xmask)+GlobalTextAddrX+TWin.Position.x0]));
4345 GetTextureTransColG_S(&psxVuw[(i<<10)+j],
4346 GETLE16(&psxVuw[((((posY>>16)&TWin.ymask)+GlobalTextAddrY+TWin.Position.y0)<<10)+
4347 ((posX>>16)&TWin.xmask)+GlobalTextAddrX+TWin.Position.x0]));
4349 if(NextRow_FT4()) return;
4356 for (i=ymin;i<=ymax;i++)
4358 xmin=(left_x >> 16);
4359 xmax=(right_x >> 16);
4368 difX=(right_u-posX)/num;
4369 difY=(right_v-posY)/num;
4374 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
4375 xmax--;if(drawW<xmax) xmax=drawW;
4377 for(j=xmin;j<xmax;j+=2)
4379 GetTextureTransColG32_SPR((uint32_t *)&psxVuw[(i<<10)+j],
4380 (((int32_t)GETLE16(&psxVuw[(((((posY+difY)>>16)&TWin.ymask)+GlobalTextAddrY+TWin.Position.y0)<<10)+
4381 (((posX+difX)>>16)&TWin.xmask)+GlobalTextAddrX+TWin.Position.x0]))<<16)|
4382 GETLE16(&psxVuw[((((posY>>16)&TWin.ymask)+GlobalTextAddrY+TWin.Position.y0)<<10)+
4383 ((posX>>16)&TWin.xmask)+GlobalTextAddrX+TWin.Position.x0]));
4389 GetTextureTransColG_SPR(&psxVuw[(i<<10)+j],
4390 GETLE16(&psxVuw[((((posY>>16)&TWin.ymask)+GlobalTextAddrY+TWin.Position.y0)<<10)+
4391 ((posX>>16)&TWin.xmask)+GlobalTextAddrX+TWin.Position.x0]));
4393 if(NextRow_FT4()) return;
4397 ////////////////////////////////////////////////////////////////////////
4398 // POLY 3/4 G-SHADED
4399 ////////////////////////////////////////////////////////////////////////
4401 static inline void drawPoly3Gi(short x1,short y1,short x2,short y2,short x3,short y3,int32_t rgb1, int32_t rgb2, int32_t rgb3)
4403 int i,j,xmin,xmax,ymin,ymax;
4404 int32_t cR1,cG1,cB1;
4405 int32_t difR,difB,difG,difR2,difB2,difG2;
4407 if(x1>drawW && x2>drawW && x3>drawW) return;
4408 if(y1>drawH && y2>drawH && y3>drawH) return;
4409 if(x1<drawX && x2<drawX && x3<drawX) return;
4410 if(y1<drawY && y2<drawY && y3<drawY) return;
4411 if(drawY>=drawH) return;
4412 if(drawX>=drawW) return;
4414 if(!SetupSections_G(x1,y1,x2,y2,x3,y3,rgb1,rgb2,rgb3)) return;
4418 for(ymin=Ymin;ymin<drawY;ymin++)
4419 if(NextRow_G()) return;
4430 if(!bCheckMask && !DrawSemiTrans && iDither!=2)
4432 for (i=ymin;i<=ymax;i++)
4434 xmin=(left_x >> 16);
4435 xmax=(right_x >> 16)-1;if(drawW<xmax) xmax=drawW;
4444 {j=drawX-xmin;xmin=drawX;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
4446 for(j=xmin;j<xmax;j+=2)
4448 PUTLE32(((uint32_t *)&psxVuw[(i<<10)+j]),
4449 ((((cR1+difR) <<7)&0x7c000000)|(((cG1+difG) << 2)&0x03e00000)|(((cB1+difB)>>3)&0x001f0000)|
4450 (((cR1) >> 9)&0x7c00)|(((cG1) >> 14)&0x03e0)|(((cB1) >> 19)&0x001f))|lSetMask);
4457 PUTLE16(&psxVuw[(i<<10)+j], (((cR1 >> 9)&0x7c00)|((cG1 >> 14)&0x03e0)|((cB1 >> 19)&0x001f))|sSetMask);
4459 if(NextRow_G()) return;
4467 for (i=ymin;i<=ymax;i++)
4469 xmin=(left_x >> 16);
4470 xmax=(right_x >> 16)-1;if(drawW<xmax) xmax=drawW;
4479 {j=drawX-xmin;xmin=drawX;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
4481 for(j=xmin;j<=xmax;j++)
4483 GetShadeTransCol_Dither(&psxVuw[(i<<10)+j],(cB1>>16),(cG1>>16),(cR1>>16));
4490 if(NextRow_G()) return;
4493 for (i=ymin;i<=ymax;i++)
4495 xmin=(left_x >> 16);
4496 xmax=(right_x >> 16)-1;if(drawW<xmax) xmax=drawW;
4505 {j=drawX-xmin;xmin=drawX;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
4507 for(j=xmin;j<=xmax;j++)
4509 GetShadeTransCol(&psxVuw[(i<<10)+j],((cR1 >> 9)&0x7c00)|((cG1 >> 14)&0x03e0)|((cB1 >> 19)&0x001f));
4516 if(NextRow_G()) return;
4521 ////////////////////////////////////////////////////////////////////////
4523 static void drawPoly3G(int32_t rgb1, int32_t rgb2, int32_t rgb3)
4525 drawPoly3Gi(lx0,ly0,lx1,ly1,lx2,ly2,rgb1,rgb2,rgb3);
4528 // draw two g-shaded tris for right psx shading emulation
4530 static void drawPoly4G(int32_t rgb1, int32_t rgb2, int32_t rgb3, int32_t rgb4)
4532 drawPoly3Gi(lx1,ly1,lx3,ly3,lx2,ly2,
4534 drawPoly3Gi(lx0,ly0,lx1,ly1,lx2,ly2,
4538 ////////////////////////////////////////////////////////////////////////
4539 // POLY 3/4 G-SHADED TEX PAL4
4540 ////////////////////////////////////////////////////////////////////////
4542 static 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,int32_t col1, int32_t col2, int32_t col3)
4544 int i,j,xmin,xmax,ymin,ymax;
4545 int32_t cR1,cG1,cB1;
4546 int32_t difR,difB,difG,difR2,difB2,difG2;
4547 int32_t difX, difY,difX2, difY2;
4548 int32_t posX,posY,YAdjust,clutP,XAdjust;
4551 if(x1>drawW && x2>drawW && x3>drawW) return;
4552 if(y1>drawH && y2>drawH && y3>drawH) return;
4553 if(x1<drawX && x2<drawX && x3<drawX) return;
4554 if(y1<drawY && y2<drawY && y3<drawY) return;
4555 if(drawY>=drawH) return;
4556 if(drawX>=drawW) return;
4558 if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;
4562 for(ymin=Ymin;ymin<drawY;ymin++)
4563 if(NextRow_GT()) return;
4565 clutP=(clY<<10)+clX;
4567 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
4576 difX=delta_right_u;difX2=difX<<1;
4577 difY=delta_right_v;difY2=difY<<1;
4581 if(!bCheckMask && !DrawSemiTrans && !iDither)
4583 for (i=ymin;i<=ymax;i++)
4585 xmin=((left_x) >> 16);
4586 xmax=((right_x) >> 16)-1; //!!!!!!!!!!!!!
4587 if(drawW<xmax) xmax=drawW;
4598 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
4600 for(j=xmin;j<xmax;j+=2)
4603 tC1 = psxVub[((posY>>5)&0xFFFFF800)+YAdjust+(XAdjust>>1)];
4604 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
4605 XAdjust=((posX+difX)>>16);
4606 tC2 = psxVub[(((posY+difY)>>5)&(int32_t)0xFFFFF800)+YAdjust+
4608 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
4610 GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
4611 GETLE16(&psxVuw[clutP+tC1])|
4612 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16,
4613 (cB1>>16)|((cB1+difB)&0xff0000),
4614 (cG1>>16)|((cG1+difG)&0xff0000),
4615 (cR1>>16)|((cR1+difR)&0xff0000));
4625 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(XAdjust>>1)];
4626 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
4627 GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
4628 GETLE16(&psxVuw[clutP+tC1]),
4629 (cB1>>16),(cG1>>16),(cR1>>16));
4642 for (i=ymin;i<=ymax;i++)
4644 xmin=(left_x >> 16);
4645 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!
4646 if(drawW<xmax) xmax=drawW;
4657 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
4659 for(j=xmin;j<=xmax;j++)
4662 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(XAdjust>>1)];
4663 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
4665 GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],
4666 GETLE16(&psxVuw[clutP+tC1]),
4667 (cB1>>16),(cG1>>16),(cR1>>16));
4669 GetTextureTransColGX(&psxVuw[(i<<10)+j],
4670 GETLE16(&psxVuw[clutP+tC1]),
4671 (cB1>>16),(cG1>>16),(cR1>>16));
4686 ////////////////////////////////////////////////////////////////////////
4688 static 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,int32_t col1, int32_t col2, int32_t col3)
4690 int i,j,xmin,xmax,ymin,ymax;
4691 int32_t cR1,cG1,cB1;
4692 int32_t difR,difB,difG,difR2,difB2,difG2;
4693 int32_t difX, difY,difX2, difY2;
4694 int32_t posX,posY,YAdjust,clutP,XAdjust;
4697 if(x1>drawW && x2>drawW && x3>drawW) return;
4698 if(y1>drawH && y2>drawH && y3>drawH) return;
4699 if(x1<drawX && x2<drawX && x3<drawX) return;
4700 if(y1<drawY && y2<drawY && y3<drawY) return;
4701 if(drawY>=drawH) return;
4702 if(drawX>=drawW) return;
4704 if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;
4708 for(ymin=Ymin;ymin<drawY;ymin++)
4709 if(NextRow_GT()) return;
4711 clutP=(clY<<10)+clX;
4713 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
4714 YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0>>1);
4723 difX=delta_right_u;difX2=difX<<1;
4724 difY=delta_right_v;difY2=difY<<1;
4728 if(!bCheckMask && !DrawSemiTrans && !iDither)
4730 for (i=ymin;i<=ymax;i++)
4732 xmin=((left_x) >> 16);
4733 xmax=((right_x) >> 16)-1; //!!!!!!!!!!!!!
4734 if(drawW<xmax) xmax=drawW;
4745 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
4747 for(j=xmin;j<xmax;j+=2)
4749 XAdjust=(posX>>16)&TWin.xmask;
4750 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
4751 YAdjust+(XAdjust>>1)];
4752 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
4753 XAdjust=((posX+difX)>>16)&TWin.xmask;
4754 tC2 = psxVub[((((posY+difY)>>16)&TWin.ymask)<<11)+
4755 YAdjust+(XAdjust>>1)];
4756 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
4757 GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
4758 GETLE16(&psxVuw[clutP+tC1])|
4759 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16,
4760 (cB1>>16)|((cB1+difB)&0xff0000),
4761 (cG1>>16)|((cG1+difG)&0xff0000),
4762 (cR1>>16)|((cR1+difR)&0xff0000));
4771 XAdjust=(posX>>16)&TWin.xmask;
4772 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
4773 YAdjust+(XAdjust>>1)];
4774 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
4775 GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
4776 GETLE16(&psxVuw[clutP+tC1]),
4777 (cB1>>16),(cG1>>16),(cR1>>16));
4790 for (i=ymin;i<=ymax;i++)
4792 xmin=(left_x >> 16);
4793 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!
4794 if(drawW<xmax) xmax=drawW;
4805 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
4807 for(j=xmin;j<=xmax;j++)
4809 XAdjust=(posX>>16)&TWin.xmask;
4810 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
4811 YAdjust+(XAdjust>>1)];
4812 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
4814 GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],
4815 GETLE16(&psxVuw[clutP+tC1]),
4816 (cB1>>16),(cG1>>16),(cR1>>16));
4818 GetTextureTransColGX(&psxVuw[(i<<10)+j],
4819 GETLE16(&psxVuw[clutP+tC1]),
4820 (cB1>>16),(cG1>>16),(cR1>>16));
4835 ////////////////////////////////////////////////////////////////////////
4837 // note: the psx is doing g-shaded quads as two g-shaded tris,
4838 // like the following func... sadly texturing is not 100%
4839 // correct that way, so small texture distortions can
4844 static void drawPoly4TGEx4_TRI(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4,
4845 short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,
4846 short clX, short clY,
4847 int32_t col1, int32_t col2, int32_t col3, int32_t col4)
4849 drawPoly3TGEx4(x2,y2,x3,y3,x4,y4,
4850 tx2,ty2,tx3,ty3,tx4,ty4,
4853 drawPoly3TGEx4(x1,y1,x2,y2,x4,y4,
4854 tx1,ty1,tx2,ty2,tx4,ty4,
4861 ////////////////////////////////////////////////////////////////////////
4863 static void drawPoly4TGEx4(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4,
4864 short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,
4865 short clX, short clY,
4866 int32_t col1, int32_t col2, int32_t col4, int32_t col3)
4869 int32_t i,j,xmin,xmax,ymin,ymax;
4870 int32_t cR1,cG1,cB1;
4871 int32_t difR,difB,difG,difR2,difB2,difG2;
4872 int32_t difX, difY, difX2, difY2;
4873 int32_t posX,posY,YAdjust,clutP,XAdjust;
4876 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
4877 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
4878 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
4879 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
4880 if(drawY>=drawH) return;
4881 if(drawX>=drawW) return;
4883 if(!SetupSections_GT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4,col1,col2,col3,col4)) return;
4887 for(ymin=Ymin;ymin<drawY;ymin++)
4888 if(NextRow_GT4()) return;
4890 clutP=(clY<<10)+clX;
4892 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
4897 if(!bCheckMask && !DrawSemiTrans && !iDither)
4899 for (i=ymin;i<=ymax;i++)
4901 xmin=(left_x >> 16);
4902 xmax=(right_x >> 16);
4911 difX=(right_u-posX)/num;
4912 difY=(right_v-posY)/num;
4919 difR=(right_R-cR1)/num;
4920 difG=(right_G-cG1)/num;
4921 difB=(right_B-cB1)/num;
4927 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
4928 xmax--;if(drawW<xmax) xmax=drawW;
4930 for(j=xmin;j<xmax;j+=2)
4933 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(XAdjust>>1)];
4934 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
4935 XAdjust=((posX+difX)>>16);
4936 tC2 = psxVub[(((posY+difY)>>5)&(int32_t)0xFFFFF800)+YAdjust+
4938 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
4940 GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
4941 GETLE16(&psxVuw[clutP+tC1])|
4942 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16,
4943 (cB1>>16)|((cB1+difB)&0xff0000),
4944 (cG1>>16)|((cG1+difG)&0xff0000),
4945 (cR1>>16)|((cR1+difR)&0xff0000));
4955 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+
4957 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
4959 GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
4960 GETLE16(&psxVuw[clutP+tC1]),
4961 (cB1>>16),(cG1>>16),(cR1>>16));
4964 if(NextRow_GT4()) return;
4971 for (i=ymin;i<=ymax;i++)
4973 xmin=(left_x >> 16);
4974 xmax=(right_x >> 16);
4983 difX=(right_u-posX)/num;
4984 difY=(right_v-posY)/num;
4991 difR=(right_R-cR1)/num;
4992 difG=(right_G-cG1)/num;
4993 difB=(right_B-cB1)/num;
4999 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
5000 xmax--;if(drawW<xmax) xmax=drawW;
5002 for(j=xmin;j<=xmax;j++)
5005 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+
5007 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
5009 GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],
5010 GETLE16(&psxVuw[clutP+tC1]),
5011 (cB1>>16),(cG1>>16),(cR1>>16));
5013 GetTextureTransColGX(&psxVuw[(i<<10)+j],
5014 GETLE16(&psxVuw[clutP+tC1]),
5015 (cB1>>16),(cG1>>16),(cR1>>16));
5023 if(NextRow_GT4()) return;
5027 ////////////////////////////////////////////////////////////////////////
5029 static void drawPoly4TGEx4_TW(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4,
5030 short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,
5031 short clX, short clY,
5032 int32_t col1, int32_t col2, int32_t col3, int32_t col4)
5034 drawPoly3TGEx4_TW(x2,y2,x3,y3,x4,y4,
5035 tx2,ty2,tx3,ty3,tx4,ty4,
5039 drawPoly3TGEx4_TW(x1,y1,x2,y2,x4,y4,
5040 tx1,ty1,tx2,ty2,tx4,ty4,
5045 ////////////////////////////////////////////////////////////////////////
5046 // POLY 3/4 G-SHADED TEX PAL8
5047 ////////////////////////////////////////////////////////////////////////
5049 static 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,int32_t col1, int32_t col2, int32_t col3)
5051 int i,j,xmin,xmax,ymin,ymax;
5052 int32_t cR1,cG1,cB1;
5053 int32_t difR,difB,difG,difR2,difB2,difG2;
5054 int32_t difX, difY,difX2, difY2;
5055 int32_t posX,posY,YAdjust,clutP;
5058 if(x1>drawW && x2>drawW && x3>drawW) return;
5059 if(y1>drawH && y2>drawH && y3>drawH) return;
5060 if(x1<drawX && x2<drawX && x3<drawX) return;
5061 if(y1<drawY && y2<drawY && y3<drawY) return;
5062 if(drawY>=drawH) return;
5063 if(drawX>=drawW) return;
5065 if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;
5069 for(ymin=Ymin;ymin<drawY;ymin++)
5070 if(NextRow_GT()) return;
5072 clutP=(clY<<10)+clX;
5074 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
5082 difX=delta_right_u;difX2=difX<<1;
5083 difY=delta_right_v;difY2=difY<<1;
5087 if(!bCheckMask && !DrawSemiTrans && !iDither)
5089 for (i=ymin;i<=ymax;i++)
5091 xmin=(left_x >> 16);
5092 xmax=(right_x >> 16)-1; // !!!!!!!!!!!!!
5093 if(drawW<xmax) xmax=drawW;
5104 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
5106 for(j=xmin;j<xmax;j+=2)
5108 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+((posX>>16))];
5109 tC2 = psxVub[(((posY+difY)>>5)&(int32_t)0xFFFFF800)+YAdjust+
5110 (((posX+difX)>>16))];
5111 GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
5112 GETLE16(&psxVuw[clutP+tC1])|
5113 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16,
5114 (cB1>>16)|((cB1+difB)&0xff0000),
5115 (cG1>>16)|((cG1+difG)&0xff0000),
5116 (cR1>>16)|((cR1+difR)&0xff0000));
5125 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+((posX>>16))];
5126 GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
5127 GETLE16(&psxVuw[clutP+tC1]),
5128 (cB1>>16),(cG1>>16),(cR1>>16));
5141 for (i=ymin;i<=ymax;i++)
5143 xmin=(left_x >> 16);
5144 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!!!!!!
5145 if(drawW<xmax) xmax=drawW;
5156 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
5158 for(j=xmin;j<=xmax;j++)
5160 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+((posX>>16))];
5162 GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],
5163 GETLE16(&psxVuw[clutP+tC1]),
5164 (cB1>>16),(cG1>>16),(cR1>>16));
5166 GetTextureTransColGX(&psxVuw[(i<<10)+j],
5167 GETLE16(&psxVuw[clutP+tC1]),
5168 (cB1>>16),(cG1>>16),(cR1>>16));
5183 ////////////////////////////////////////////////////////////////////////
5185 static 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,int32_t col1, int32_t col2, int32_t col3)
5187 int i,j,xmin,xmax,ymin,ymax;
5188 int32_t cR1,cG1,cB1;
5189 int32_t difR,difB,difG,difR2,difB2,difG2;
5190 int32_t difX, difY,difX2, difY2;
5191 int32_t posX,posY,YAdjust,clutP;
5194 if(x1>drawW && x2>drawW && x3>drawW) return;
5195 if(y1>drawH && y2>drawH && y3>drawH) return;
5196 if(x1<drawX && x2<drawX && x3<drawX) return;
5197 if(y1<drawY && y2<drawY && y3<drawY) return;
5198 if(drawY>=drawH) return;
5199 if(drawX>=drawW) return;
5201 if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;
5205 for(ymin=Ymin;ymin<drawY;ymin++)
5206 if(NextRow_GT()) return;
5208 clutP=(clY<<10)+clX;
5210 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
5211 YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0);
5219 difX=delta_right_u;difX2=difX<<1;
5220 difY=delta_right_v;difY2=difY<<1;
5224 if(!bCheckMask && !DrawSemiTrans && !iDither)
5226 for (i=ymin;i<=ymax;i++)
5228 xmin=(left_x >> 16);
5229 xmax=(right_x >> 16)-1; // !!!!!!!!!!!!!
5230 if(drawW<xmax) xmax=drawW;
5241 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
5243 for(j=xmin;j<xmax;j+=2)
5245 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
5246 YAdjust+((posX>>16)&TWin.xmask)];
5247 tC2 = psxVub[((((posY+difY)>>16)&TWin.ymask)<<11)+
5248 YAdjust+(((posX+difX)>>16)&TWin.xmask)];
5250 GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
5251 GETLE16(&psxVuw[clutP+tC1])|
5252 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16,
5253 (cB1>>16)|((cB1+difB)&0xff0000),
5254 (cG1>>16)|((cG1+difG)&0xff0000),
5255 (cR1>>16)|((cR1+difR)&0xff0000));
5264 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
5265 YAdjust+((posX>>16)&TWin.xmask)];
5266 GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
5267 GETLE16(&psxVuw[clutP+tC1]),
5268 (cB1>>16),(cG1>>16),(cR1>>16));
5281 for (i=ymin;i<=ymax;i++)
5283 xmin=(left_x >> 16);
5284 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!!!!!!
5285 if(drawW<xmax) xmax=drawW;
5296 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
5298 for(j=xmin;j<=xmax;j++)
5300 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
5301 YAdjust+((posX>>16)&TWin.xmask)];
5303 GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],
5304 GETLE16(&psxVuw[clutP+tC1]),
5305 (cB1>>16),(cG1>>16),(cR1>>16));
5307 GetTextureTransColGX(&psxVuw[(i<<10)+j],
5308 GETLE16(&psxVuw[clutP+tC1]),
5309 (cB1>>16),(cG1>>16),(cR1>>16));
5324 ////////////////////////////////////////////////////////////////////////
5326 // note: two g-shaded tris: small texture distortions can happen
5330 static void drawPoly4TGEx8_TRI(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4,
5331 short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,
5332 short clX, short clY,
5333 int32_t col1, int32_t col2, int32_t col3, int32_t col4)
5335 drawPoly3TGEx8(x2,y2,x3,y3,x4,y4,
5336 tx2,ty2,tx3,ty3,tx4,ty4,
5339 drawPoly3TGEx8(x1,y1,x2,y2,x4,y4,
5340 tx1,ty1,tx2,ty2,tx4,ty4,
5347 static void drawPoly4TGEx8(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4,
5348 short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,
5349 short clX, short clY,
5350 int32_t col1, int32_t col2, int32_t col4, int32_t col3)
5353 int32_t i,j,xmin,xmax,ymin,ymax;
5354 int32_t cR1,cG1,cB1;
5355 int32_t difR,difB,difG,difR2,difB2,difG2;
5356 int32_t difX, difY, difX2, difY2;
5357 int32_t posX,posY,YAdjust,clutP;
5360 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
5361 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
5362 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
5363 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
5364 if(drawY>=drawH) return;
5365 if(drawX>=drawW) return;
5367 if(!SetupSections_GT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4,col1,col2,col3,col4)) return;
5371 for(ymin=Ymin;ymin<drawY;ymin++)
5372 if(NextRow_GT4()) return;
5374 clutP=(clY<<10)+clX;
5376 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
5380 if(!bCheckMask && !DrawSemiTrans && !iDither)
5382 for (i=ymin;i<=ymax;i++)
5384 xmin=(left_x >> 16);
5385 xmax=(right_x >> 16);
5394 difX=(right_u-posX)/num;
5395 difY=(right_v-posY)/num;
5402 difR=(right_R-cR1)/num;
5403 difG=(right_G-cG1)/num;
5404 difB=(right_B-cB1)/num;
5410 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
5411 xmax--;if(drawW<xmax) xmax=drawW;
5413 for(j=xmin;j<xmax;j+=2)
5415 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(posX>>16)];
5416 tC2 = psxVub[(((posY+difY)>>5)&(int32_t)0xFFFFF800)+YAdjust+
5419 GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
5420 GETLE16(&psxVuw[clutP+tC1])|
5421 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16,
5422 (cB1>>16)|((cB1+difB)&0xff0000),
5423 (cG1>>16)|((cG1+difG)&0xff0000),
5424 (cR1>>16)|((cR1+difR)&0xff0000));
5433 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(posX>>16)];
5434 GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
5435 GETLE16(&psxVuw[clutP+tC1]),
5436 (cB1>>16),(cG1>>16),(cR1>>16));
5439 if(NextRow_GT4()) return;
5446 for (i=ymin;i<=ymax;i++)
5448 xmin=(left_x >> 16);
5449 xmax=(right_x >> 16);
5458 difX=(right_u-posX)/num;
5459 difY=(right_v-posY)/num;
5466 difR=(right_R-cR1)/num;
5467 difG=(right_G-cG1)/num;
5468 difB=(right_B-cB1)/num;
5474 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
5475 xmax--;if(drawW<xmax) xmax=drawW;
5477 for(j=xmin;j<=xmax;j++)
5479 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(posX>>16)];
5481 GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],
5482 GETLE16(&psxVuw[clutP+tC1]),
5483 (cB1>>16),(cG1>>16),(cR1>>16));
5485 GetTextureTransColGX(&psxVuw[(i<<10)+j],
5486 GETLE16(&psxVuw[clutP+tC1]),
5487 (cB1>>16),(cG1>>16),(cR1>>16));
5495 if(NextRow_GT4()) return;
5499 ////////////////////////////////////////////////////////////////////////
5501 static void drawPoly4TGEx8_TW(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4,
5502 short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,
5503 short clX, short clY,
5504 int32_t col1, int32_t col2, int32_t col3, int32_t col4)
5506 drawPoly3TGEx8_TW(x2,y2,x3,y3,x4,y4,
5507 tx2,ty2,tx3,ty3,tx4,ty4,
5510 drawPoly3TGEx8_TW(x1,y1,x2,y2,x4,y4,
5511 tx1,ty1,tx2,ty2,tx4,ty4,
5516 ////////////////////////////////////////////////////////////////////////
5517 // POLY 3 G-SHADED TEX 15 BIT
5518 ////////////////////////////////////////////////////////////////////////
5520 static 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,int32_t col1, int32_t col2, int32_t col3)
5522 int i,j,xmin,xmax,ymin,ymax;
5523 int32_t cR1,cG1,cB1;
5524 int32_t difR,difB,difG,difR2,difB2,difG2;
5525 int32_t difX, difY,difX2, difY2;
5528 if(x1>drawW && x2>drawW && x3>drawW) return;
5529 if(y1>drawH && y2>drawH && y3>drawH) return;
5530 if(x1<drawX && x2<drawX && x3<drawX) return;
5531 if(y1<drawY && y2<drawY && y3<drawY) return;
5532 if(drawY>=drawH) return;
5533 if(drawX>=drawW) return;
5535 if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;
5539 for(ymin=Ymin;ymin<drawY;ymin++)
5540 if(NextRow_GT()) return;
5548 difX=delta_right_u;difX2=difX<<1;
5549 difY=delta_right_v;difY2=difY<<1;
5553 if(!bCheckMask && !DrawSemiTrans && !iDither)
5555 for (i=ymin;i<=ymax;i++)
5557 xmin=(left_x >> 16);
5558 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!!!
5559 if(drawW<xmax) xmax=drawW;
5570 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
5572 for(j=xmin;j<xmax;j+=2)
5574 GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
5575 (((int32_t)GETLE16(&psxVuw[((((posY+difY)>>16)+GlobalTextAddrY)<<10)+((posX+difX)>>16)+GlobalTextAddrX]))<<16)|
5576 GETLE16(&psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+((posX)>>16)+GlobalTextAddrX]),
5577 (cB1>>16)|((cB1+difB)&0xff0000),
5578 (cG1>>16)|((cG1+difG)&0xff0000),
5579 (cR1>>16)|((cR1+difR)&0xff0000));
5587 GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
5588 GETLE16(&psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX]),
5589 (cB1>>16),(cG1>>16),(cR1>>16));
5601 for (i=ymin;i<=ymax;i++)
5603 xmin=(left_x >> 16);
5604 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!
5605 if(drawW<xmax) xmax=drawW;
5616 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
5618 for(j=xmin;j<=xmax;j++)
5621 GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],
5622 GETLE16(&psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX]),
5623 (cB1>>16),(cG1>>16),(cR1>>16));
5625 GetTextureTransColGX(&psxVuw[(i<<10)+j],
5626 GETLE16(&psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX]),
5627 (cB1>>16),(cG1>>16),(cR1>>16));
5642 ////////////////////////////////////////////////////////////////////////
5644 static 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,int32_t col1, int32_t col2, int32_t col3)
5646 int i,j,xmin,xmax,ymin,ymax;
5647 int32_t cR1,cG1,cB1;
5648 int32_t difR,difB,difG,difR2,difB2,difG2;
5649 int32_t difX, difY,difX2, difY2;
5652 if(x1>drawW && x2>drawW && x3>drawW) return;
5653 if(y1>drawH && y2>drawH && y3>drawH) return;
5654 if(x1<drawX && x2<drawX && x3<drawX) return;
5655 if(y1<drawY && y2<drawY && y3<drawY) return;
5656 if(drawY>=drawH) return;
5657 if(drawX>=drawW) return;
5659 if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;
5663 for(ymin=Ymin;ymin<drawY;ymin++)
5664 if(NextRow_GT()) return;
5672 difX=delta_right_u;difX2=difX<<1;
5673 difY=delta_right_v;difY2=difY<<1;
5677 if(!bCheckMask && !DrawSemiTrans && !iDither)
5679 for (i=ymin;i<=ymax;i++)
5681 xmin=(left_x >> 16);
5682 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!!!
5683 if(drawW<xmax) xmax=drawW;
5694 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
5696 for(j=xmin;j<xmax;j+=2)
5698 GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
5699 (((int32_t)GETLE16(&psxVuw[(((((posY+difY)>>16)&TWin.ymask)+GlobalTextAddrY+TWin.Position.y0)<<10)+
5700 (((posX+difX)>>16)&TWin.xmask)+GlobalTextAddrX+TWin.Position.x0]))<<16)|
5701 GETLE16(&psxVuw[((((posY>>16)&TWin.ymask)+GlobalTextAddrY+TWin.Position.y0)<<10)+
5702 (((posX)>>16)&TWin.xmask)+GlobalTextAddrX+TWin.Position.x0]),
5703 (cB1>>16)|((cB1+difB)&0xff0000),
5704 (cG1>>16)|((cG1+difG)&0xff0000),
5705 (cR1>>16)|((cR1+difR)&0xff0000));
5713 GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
5714 GETLE16(&psxVuw[((((posY>>16)&TWin.ymask)+GlobalTextAddrY+TWin.Position.y0)<<10)+
5715 ((posX>>16)&TWin.xmask)+GlobalTextAddrX+TWin.Position.x0]),
5716 (cB1>>16),(cG1>>16),(cR1>>16));
5728 for (i=ymin;i<=ymax;i++)
5730 xmin=(left_x >> 16);
5731 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!
5732 if(drawW<xmax) xmax=drawW;
5743 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
5745 for(j=xmin;j<=xmax;j++)
5748 GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],
5749 GETLE16(&psxVuw[((((posY>>16)&TWin.ymask)+GlobalTextAddrY+TWin.Position.y0)<<10)+
5750 ((posX>>16)&TWin.xmask)+GlobalTextAddrX+TWin.Position.x0]),
5751 (cB1>>16),(cG1>>16),(cR1>>16));
5753 GetTextureTransColGX(&psxVuw[(i<<10)+j],
5754 GETLE16(&psxVuw[((((posY>>16)&TWin.ymask)+GlobalTextAddrY+TWin.Position.y0)<<10)+
5755 ((posX>>16)&TWin.xmask)+GlobalTextAddrX+TWin.Position.x0]),
5756 (cB1>>16),(cG1>>16),(cR1>>16));
5771 ////////////////////////////////////////////////////////////////////////
5773 // note: two g-shaded tris: small texture distortions can happen
5777 static 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, int32_t col1, int32_t col2, int32_t col3, int32_t col4)
5779 drawPoly3TGD(x2,y2,x3,y3,x4,y4,
5780 tx2,ty2,tx3,ty3,tx4,ty4,
5782 drawPoly3TGD(x1,y1,x2,y2,x4,y4,
5783 tx1,ty1,tx2,ty2,tx4,ty4,
5789 static 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, int32_t col1, int32_t col2, int32_t col4, int32_t col3)
5792 int32_t i,j,xmin,xmax,ymin,ymax;
5793 int32_t cR1,cG1,cB1;
5794 int32_t difR,difB,difG,difR2,difB2,difG2;
5795 int32_t difX, difY, difX2, difY2;
5798 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
5799 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
5800 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
5801 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
5802 if(drawY>=drawH) return;
5803 if(drawX>=drawW) return;
5805 if(!SetupSections_GT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4,col1,col2,col3,col4)) return;
5809 for(ymin=Ymin;ymin<drawY;ymin++)
5810 if(NextRow_GT4()) return;
5814 if(!bCheckMask && !DrawSemiTrans && !iDither)
5816 for (i=ymin;i<=ymax;i++)
5818 xmin=(left_x >> 16);
5819 xmax=(right_x >> 16);
5828 difX=(right_u-posX)/num;
5829 difY=(right_v-posY)/num;
5836 difR=(right_R-cR1)/num;
5837 difG=(right_G-cG1)/num;
5838 difB=(right_B-cB1)/num;
5844 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
5845 xmax--;if(drawW<xmax) xmax=drawW;
5847 for(j=xmin;j<xmax;j+=2)
5849 GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
5850 (((int32_t)GETLE16(&psxVuw[((((posY+difY)>>16)+GlobalTextAddrY)<<10)+((posX+difX)>>16)+GlobalTextAddrX]))<<16)|
5851 GETLE16(&psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+((posX)>>16)+GlobalTextAddrX]),
5852 (cB1>>16)|((cB1+difB)&0xff0000),
5853 (cG1>>16)|((cG1+difG)&0xff0000),
5854 (cR1>>16)|((cR1+difR)&0xff0000));
5862 GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
5863 GETLE16(&psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX]),
5864 (cB1>>16),(cG1>>16),(cR1>>16));
5866 if(NextRow_GT4()) return;
5873 for (i=ymin;i<=ymax;i++)
5875 xmin=(left_x >> 16);
5876 xmax=(right_x >> 16);
5885 difX=(right_u-posX)/num;
5886 difY=(right_v-posY)/num;
5893 difR=(right_R-cR1)/num;
5894 difG=(right_G-cG1)/num;
5895 difB=(right_B-cB1)/num;
5901 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
5902 xmax--;if(drawW<xmax) xmax=drawW;
5904 for(j=xmin;j<=xmax;j++)
5907 GetTextureTransColGX(&psxVuw[(i<<10)+j],
5908 GETLE16(&psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX]),
5909 (cB1>>16),(cG1>>16),(cR1>>16));
5911 GetTextureTransColGX(&psxVuw[(i<<10)+j],
5912 GETLE16(&psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX]),
5913 (cB1>>16),(cG1>>16),(cR1>>16));
5921 if(NextRow_GT4()) return;
5925 ////////////////////////////////////////////////////////////////////////
5927 static 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, int32_t col1, int32_t col2, int32_t col3, int32_t col4)
5929 drawPoly3TGD_TW(x2,y2,x3,y3,x4,y4,
5930 tx2,ty2,tx3,ty3,tx4,ty4,
5932 drawPoly3TGD_TW(x1,y1,x2,y2,x4,y4,
5933 tx1,ty1,tx2,ty2,tx4,ty4,
5937 ////////////////////////////////////////////////////////////////////////
5938 ////////////////////////////////////////////////////////////////////////
5939 ////////////////////////////////////////////////////////////////////////
5940 ////////////////////////////////////////////////////////////////////////
5941 ////////////////////////////////////////////////////////////////////////
5942 ////////////////////////////////////////////////////////////////////////
5946 // no real rect test, but it does its job the way I need it
5947 static inline BOOL IsNoRect(void)
5949 if(lx0==lx1 && lx2==lx3) return FALSE;
5950 if(lx0==lx2 && lx1==lx3) return FALSE;
5951 if(lx0==lx3 && lx1==lx2) return FALSE;
5957 static inline BOOL IsNoRect(void)
5959 if(!(dwActFixes&0x200)) return FALSE;
5963 if(lx1==lx3 && ly3==ly2 && lx2==lx0) return FALSE;
5964 if(lx1==lx2 && ly2==ly3 && lx3==lx0) return FALSE;
5970 if(lx2==lx3 && ly3==ly1 && lx1==lx0) return FALSE;
5971 if(lx2==lx1 && ly1==ly3 && lx3==lx0) return FALSE;
5977 if(lx3==lx2 && ly2==ly1 && lx1==lx0) return FALSE;
5978 if(lx3==lx1 && ly1==ly2 && lx2==lx0) return FALSE;
5984 ////////////////////////////////////////////////////////////////////////
5986 static void drawPoly3FT(unsigned char * baseAddr)
5988 uint32_t *gpuData = ((uint32_t *) baseAddr);
5990 if(!bUsingTWin && !(dwActFixes&0x100))
5992 switch(GlobalTextTP) // depending on texture mode
5995 drawPoly3TEx4(lx0,ly0,lx1,ly1,lx2,ly2,
5996 (GETLE32(&gpuData[2]) & 0x000000ff), ((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[4]) & 0x000000ff), ((GETLE32(&gpuData[4])>>8) & 0x000000ff),(GETLE32(&gpuData[6]) & 0x000000ff), ((GETLE32(&gpuData[6])>>8) & 0x000000ff),
5997 ((GETLE32(&gpuData[2])>>12) & 0x3f0), ((GETLE32(&gpuData[2])>>22) & 511));
6000 drawPoly3TEx8(lx0,ly0,lx1,ly1,lx2,ly2,
6001 (GETLE32(&gpuData[2]) & 0x000000ff), ((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[4]) & 0x000000ff), ((GETLE32(&gpuData[4])>>8) & 0x000000ff),(GETLE32(&gpuData[6]) & 0x000000ff), ((GETLE32(&gpuData[6])>>8) & 0x000000ff),
6002 ((GETLE32(&gpuData[2])>>12) & 0x3f0), ((GETLE32(&gpuData[2])>>22) & 511));
6005 drawPoly3TD(lx0,ly0,lx1,ly1,lx2,ly2,(GETLE32(&gpuData[2]) & 0x000000ff), ((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[4]) & 0x000000ff), ((GETLE32(&gpuData[4])>>8) & 0x000000ff),(GETLE32(&gpuData[6]) & 0x000000ff), ((GETLE32(&gpuData[6])>>8) & 0x000000ff));
6011 switch(GlobalTextTP) // depending on texture mode
6014 drawPoly3TEx4_TW(lx0,ly0,lx1,ly1,lx2,ly2,
6015 (GETLE32(&gpuData[2]) & 0x000000ff), ((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[4]) & 0x000000ff), ((GETLE32(&gpuData[4])>>8) & 0x000000ff),(GETLE32(&gpuData[6]) & 0x000000ff), ((GETLE32(&gpuData[6])>>8) & 0x000000ff),
6016 ((GETLE32(&gpuData[2])>>12) & 0x3f0), ((GETLE32(&gpuData[2])>>22) & 511));
6019 drawPoly3TEx8_TW(lx0,ly0,lx1,ly1,lx2,ly2,
6020 (GETLE32(&gpuData[2]) & 0x000000ff), ((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[4]) & 0x000000ff), ((GETLE32(&gpuData[4])>>8) & 0x000000ff),(GETLE32(&gpuData[6]) & 0x000000ff), ((GETLE32(&gpuData[6])>>8) & 0x000000ff),
6021 ((GETLE32(&gpuData[2])>>12) & 0x3f0), ((GETLE32(&gpuData[2])>>22) & 511));
6024 drawPoly3TD_TW(lx0,ly0,lx1,ly1,lx2,ly2,(GETLE32(&gpuData[2]) & 0x000000ff), ((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[4]) & 0x000000ff), ((GETLE32(&gpuData[4])>>8) & 0x000000ff),(GETLE32(&gpuData[6]) & 0x000000ff), ((GETLE32(&gpuData[6])>>8) & 0x000000ff));
6029 ////////////////////////////////////////////////////////////////////////
6031 static void drawPoly4FT(unsigned char * baseAddr)
6033 uint32_t *gpuData = ((uint32_t *) baseAddr);
6040 switch (GlobalTextTP)
6043 drawPoly4TEx4_TRI(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
6044 (GETLE32(&gpuData[2]) & 0x000000ff), ((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[4]) & 0x000000ff), ((GETLE32(&gpuData[4])>>8) & 0x000000ff),(GETLE32(&gpuData[8]) & 0x000000ff), ((GETLE32(&gpuData[8])>>8) & 0x000000ff),(GETLE32(&gpuData[6]) & 0x000000ff), ((GETLE32(&gpuData[6])>>8) & 0x000000ff), ((GETLE32(&gpuData[2])>>12) & 0x3f0), ((GETLE32(&gpuData[2])>>22) & 511));
6047 drawPoly4TEx8_TRI(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
6048 (GETLE32(&gpuData[2]) & 0x000000ff), ((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[4]) & 0x000000ff), ((GETLE32(&gpuData[4])>>8) & 0x000000ff),(GETLE32(&gpuData[8]) & 0x000000ff), ((GETLE32(&gpuData[8])>>8) & 0x000000ff),(GETLE32(&gpuData[6]) & 0x000000ff), ((GETLE32(&gpuData[6])>>8) & 0x000000ff), ((GETLE32(&gpuData[2])>>12) & 0x3f0), ((GETLE32(&gpuData[2])>>22) & 511));
6051 drawPoly4TD_TRI(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,(GETLE32(&gpuData[2]) & 0x000000ff), ((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[4]) & 0x000000ff), ((GETLE32(&gpuData[4])>>8) & 0x000000ff),(GETLE32(&gpuData[8]) & 0x000000ff), ((GETLE32(&gpuData[8])>>8) & 0x000000ff),(GETLE32(&gpuData[6]) & 0x000000ff), ((GETLE32(&gpuData[6])>>8) & 0x000000ff));
6058 switch (GlobalTextTP)
6060 case 0: // grandia investigations needed
6061 drawPoly4TEx4(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
6062 (GETLE32(&gpuData[2]) & 0x000000ff), ((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[4]) & 0x000000ff), ((GETLE32(&gpuData[4])>>8) & 0x000000ff),(GETLE32(&gpuData[8]) & 0x000000ff), ((GETLE32(&gpuData[8])>>8) & 0x000000ff),(GETLE32(&gpuData[6]) & 0x000000ff), ((GETLE32(&gpuData[6])>>8) & 0x000000ff), ((GETLE32(&gpuData[2])>>12) & 0x3f0), ((GETLE32(&gpuData[2])>>22) & 511));
6065 drawPoly4TEx8(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
6066 (GETLE32(&gpuData[2]) & 0x000000ff), ((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[4]) & 0x000000ff), ((GETLE32(&gpuData[4])>>8) & 0x000000ff),(GETLE32(&gpuData[8]) & 0x000000ff), ((GETLE32(&gpuData[8])>>8) & 0x000000ff),(GETLE32(&gpuData[6]) & 0x000000ff), ((GETLE32(&gpuData[6])>>8) & 0x000000ff), ((GETLE32(&gpuData[2])>>12) & 0x3f0), ((GETLE32(&gpuData[2])>>22) & 511));
6069 drawPoly4TD(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,(GETLE32(&gpuData[2]) & 0x000000ff), ((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[4]) & 0x000000ff), ((GETLE32(&gpuData[4])>>8) & 0x000000ff),(GETLE32(&gpuData[8]) & 0x000000ff), ((GETLE32(&gpuData[8])>>8) & 0x000000ff),(GETLE32(&gpuData[6]) & 0x000000ff), ((GETLE32(&gpuData[6])>>8) & 0x000000ff));
6075 switch (GlobalTextTP)
6078 drawPoly4TEx4_TW(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
6079 (GETLE32(&gpuData[2]) & 0x000000ff), ((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[4]) & 0x000000ff), ((GETLE32(&gpuData[4])>>8) & 0x000000ff),(GETLE32(&gpuData[8]) & 0x000000ff), ((GETLE32(&gpuData[8])>>8) & 0x000000ff),(GETLE32(&gpuData[6]) & 0x000000ff), ((GETLE32(&gpuData[6])>>8) & 0x000000ff), ((GETLE32(&gpuData[2])>>12) & 0x3f0), ((GETLE32(&gpuData[2])>>22) & 511));
6082 drawPoly4TEx8_TW(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
6083 (GETLE32(&gpuData[2]) & 0x000000ff), ((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[4]) & 0x000000ff), ((GETLE32(&gpuData[4])>>8) & 0x000000ff),(GETLE32(&gpuData[8]) & 0x000000ff), ((GETLE32(&gpuData[8])>>8) & 0x000000ff),(GETLE32(&gpuData[6]) & 0x000000ff), ((GETLE32(&gpuData[6])>>8) & 0x000000ff), ((GETLE32(&gpuData[2])>>12) & 0x3f0), ((GETLE32(&gpuData[2])>>22) & 511));
6086 drawPoly4TD_TW(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,(GETLE32(&gpuData[2]) & 0x000000ff), ((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[4]) & 0x000000ff), ((GETLE32(&gpuData[4])>>8) & 0x000000ff),(GETLE32(&gpuData[8]) & 0x000000ff), ((GETLE32(&gpuData[8])>>8) & 0x000000ff),(GETLE32(&gpuData[6]) & 0x000000ff), ((GETLE32(&gpuData[6])>>8) & 0x000000ff));
6091 ////////////////////////////////////////////////////////////////////////
6093 static void drawPoly3GT(unsigned char * baseAddr)
6095 uint32_t *gpuData = ((uint32_t *) baseAddr);
6099 switch (GlobalTextTP)
6102 drawPoly3TGEx4(lx0,ly0,lx1,ly1,lx2,ly2,
6103 (GETLE32(&gpuData[2]) & 0x000000ff), ((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[5]) & 0x000000ff), ((GETLE32(&gpuData[5])>>8) & 0x000000ff),(GETLE32(&gpuData[8]) & 0x000000ff), ((GETLE32(&gpuData[8])>>8) & 0x000000ff),
6104 ((GETLE32(&gpuData[2])>>12) & 0x3f0), ((GETLE32(&gpuData[2])>>22) & 511),
6105 GETLE32(&gpuData[0]),GETLE32(&gpuData[3]),GETLE32(&gpuData[6]));
6108 drawPoly3TGEx8(lx0,ly0,lx1,ly1,lx2,ly2,
6109 (GETLE32(&gpuData[2]) & 0x000000ff), ((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[5]) & 0x000000ff), ((GETLE32(&gpuData[5])>>8) & 0x000000ff),(GETLE32(&gpuData[8]) & 0x000000ff), ((GETLE32(&gpuData[8])>>8) & 0x000000ff),
6110 ((GETLE32(&gpuData[2])>>12) & 0x3f0), ((GETLE32(&gpuData[2])>>22) & 511),
6111 GETLE32(&gpuData[0]),GETLE32(&gpuData[3]),GETLE32(&gpuData[6]));
6114 drawPoly3TGD(lx0,ly0,lx1,ly1,lx2,ly2,(GETLE32(&gpuData[2]) & 0x000000ff), ((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[5]) & 0x000000ff), ((GETLE32(&gpuData[5])>>8) & 0x000000ff),(GETLE32(&gpuData[8]) & 0x000000ff), ((GETLE32(&gpuData[8])>>8) & 0x000000ff),GETLE32(&gpuData[0]),GETLE32(&gpuData[3]),GETLE32(&gpuData[6]));
6120 switch(GlobalTextTP)
6123 drawPoly3TGEx4_TW(lx0,ly0,lx1,ly1,lx2,ly2,
6124 (GETLE32(&gpuData[2]) & 0x000000ff), ((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[5]) & 0x000000ff), ((GETLE32(&gpuData[5])>>8) & 0x000000ff),(GETLE32(&gpuData[8]) & 0x000000ff), ((GETLE32(&gpuData[8])>>8) & 0x000000ff),
6125 ((GETLE32(&gpuData[2])>>12) & 0x3f0), ((GETLE32(&gpuData[2])>>22) & 511),
6126 GETLE32(&gpuData[0]),GETLE32(&gpuData[3]),GETLE32(&gpuData[6]));
6129 drawPoly3TGEx8_TW(lx0,ly0,lx1,ly1,lx2,ly2,
6130 (GETLE32(&gpuData[2]) & 0x000000ff), ((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[5]) & 0x000000ff), ((GETLE32(&gpuData[5])>>8) & 0x000000ff),(GETLE32(&gpuData[8]) & 0x000000ff), ((GETLE32(&gpuData[8])>>8) & 0x000000ff),
6131 ((GETLE32(&gpuData[2])>>12) & 0x3f0), ((GETLE32(&gpuData[2])>>22) & 511),
6132 GETLE32(&gpuData[0]),GETLE32(&gpuData[3]),GETLE32(&gpuData[6]));
6135 drawPoly3TGD_TW(lx0,ly0,lx1,ly1,lx2,ly2,(GETLE32(&gpuData[2]) & 0x000000ff), ((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[5]) & 0x000000ff), ((GETLE32(&gpuData[5])>>8) & 0x000000ff),(GETLE32(&gpuData[8]) & 0x000000ff), ((GETLE32(&gpuData[8])>>8) & 0x000000ff),GETLE32(&gpuData[0]),GETLE32(&gpuData[3]),GETLE32(&gpuData[6]));
6140 ////////////////////////////////////////////////////////////////////////
6142 static void drawPoly4GT(unsigned char *baseAddr)
6144 uint32_t *gpuData = ((uint32_t *) baseAddr);
6151 switch (GlobalTextTP)
6154 drawPoly4TGEx4_TRI(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
6155 (GETLE32(&gpuData[2]) & 0x000000ff), ((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[5]) & 0x000000ff), ((GETLE32(&gpuData[5])>>8) & 0x000000ff),(GETLE32(&gpuData[11]) & 0x000000ff), ((GETLE32(&gpuData[11])>>8) & 0x000000ff),(GETLE32(&gpuData[8]) & 0x000000ff), ((GETLE32(&gpuData[8])>>8) & 0x000000ff),
6156 ((GETLE32(&gpuData[2])>>12) & 0x3f0),((GETLE32(&gpuData[2])>>22) & 511),
6157 GETLE32(&gpuData[0]),GETLE32(&gpuData[3]),GETLE32(&gpuData[6]),GETLE32(&gpuData[9]));
6161 drawPoly4TGEx8_TRI(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
6162 (GETLE32(&gpuData[2]) & 0x000000ff), ((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[5]) & 0x000000ff), ((GETLE32(&gpuData[5])>>8) & 0x000000ff),(GETLE32(&gpuData[11]) & 0x000000ff), ((GETLE32(&gpuData[11])>>8) & 0x000000ff),(GETLE32(&gpuData[8]) & 0x000000ff), ((GETLE32(&gpuData[8])>>8) & 0x000000ff),
6163 ((GETLE32(&gpuData[2])>>12) & 0x3f0),((GETLE32(&gpuData[2])>>22) & 511),
6164 GETLE32(&gpuData[0]),GETLE32(&gpuData[3]),GETLE32(&gpuData[6]),GETLE32(&gpuData[9]));
6167 drawPoly4TGD_TRI(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,(GETLE32(&gpuData[2]) & 0x000000ff),((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[5]) & 0x000000ff), ((GETLE32(&gpuData[5])>>8) & 0x000000ff),(GETLE32(&gpuData[11]) & 0x000000ff), ((GETLE32(&gpuData[11])>>8) & 0x000000ff),(GETLE32(&gpuData[8]) & 0x000000ff), ((GETLE32(&gpuData[8])>>8) & 0x000000ff),GETLE32(&gpuData[0]),GETLE32(&gpuData[3]),GETLE32(&gpuData[6]),GETLE32(&gpuData[9]));
6174 switch (GlobalTextTP)
6177 drawPoly4TGEx4(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
6178 (GETLE32(&gpuData[2]) & 0x000000ff), ((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[5]) & 0x000000ff), ((GETLE32(&gpuData[5])>>8) & 0x000000ff),(GETLE32(&gpuData[11]) & 0x000000ff), ((GETLE32(&gpuData[11])>>8) & 0x000000ff),(GETLE32(&gpuData[8]) & 0x000000ff), ((GETLE32(&gpuData[8])>>8) & 0x000000ff),
6179 ((GETLE32(&gpuData[2])>>12) & 0x3f0),((GETLE32(&gpuData[2])>>22) & 511),
6180 GETLE32(&gpuData[0]),GETLE32(&gpuData[3]),GETLE32(&gpuData[6]),GETLE32(&gpuData[9]));
6184 drawPoly4TGEx8(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
6185 (GETLE32(&gpuData[2]) & 0x000000ff), ((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[5]) & 0x000000ff), ((GETLE32(&gpuData[5])>>8) & 0x000000ff),(GETLE32(&gpuData[11]) & 0x000000ff), ((GETLE32(&gpuData[11])>>8) & 0x000000ff),(GETLE32(&gpuData[8]) & 0x000000ff), ((GETLE32(&gpuData[8])>>8) & 0x000000ff),
6186 ((GETLE32(&gpuData[2])>>12) & 0x3f0),((GETLE32(&gpuData[2])>>22) & 511),
6187 GETLE32(&gpuData[0]),GETLE32(&gpuData[3]),GETLE32(&gpuData[6]),GETLE32(&gpuData[9]));
6190 drawPoly4TGD(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,(GETLE32(&gpuData[2]) & 0x000000ff),((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[5]) & 0x000000ff), ((GETLE32(&gpuData[5])>>8) & 0x000000ff),(GETLE32(&gpuData[11]) & 0x000000ff), ((GETLE32(&gpuData[11])>>8) & 0x000000ff),(GETLE32(&gpuData[8]) & 0x000000ff), ((GETLE32(&gpuData[8])>>8) & 0x000000ff),GETLE32(&gpuData[0]),GETLE32(&gpuData[3]),GETLE32(&gpuData[6]),GETLE32(&gpuData[9]));
6196 switch (GlobalTextTP)
6199 drawPoly4TGEx4_TW(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
6200 (GETLE32(&gpuData[2]) & 0x000000ff), ((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[5]) & 0x000000ff), ((GETLE32(&gpuData[5])>>8) & 0x000000ff),(GETLE32(&gpuData[11]) & 0x000000ff), ((GETLE32(&gpuData[11])>>8) & 0x000000ff),(GETLE32(&gpuData[8]) & 0x000000ff), ((GETLE32(&gpuData[8])>>8) & 0x000000ff),
6201 ((GETLE32(&gpuData[2])>>12) & 0x3f0),((GETLE32(&gpuData[2])>>22) & 511),
6202 GETLE32(&gpuData[0]),GETLE32(&gpuData[3]),GETLE32(&gpuData[6]),GETLE32(&gpuData[9]));
6205 drawPoly4TGEx8_TW(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
6206 (GETLE32(&gpuData[2]) & 0x000000ff), ((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[5]) & 0x000000ff), ((GETLE32(&gpuData[5])>>8) & 0x000000ff),(GETLE32(&gpuData[11]) & 0x000000ff), ((GETLE32(&gpuData[11])>>8) & 0x000000ff),(GETLE32(&gpuData[8]) & 0x000000ff), ((GETLE32(&gpuData[8])>>8) & 0x000000ff),
6207 ((GETLE32(&gpuData[2])>>12) & 0x3f0),((GETLE32(&gpuData[2])>>22) & 511),
6208 GETLE32(&gpuData[0]),GETLE32(&gpuData[3]),GETLE32(&gpuData[6]),GETLE32(&gpuData[9]));
6211 drawPoly4TGD_TW(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,(GETLE32(&gpuData[2]) & 0x000000ff),((GETLE32(&gpuData[2])>>8) & 0x000000ff), (GETLE32(&gpuData[5]) & 0x000000ff), ((GETLE32(&gpuData[5])>>8) & 0x000000ff),(GETLE32(&gpuData[11]) & 0x000000ff), ((GETLE32(&gpuData[11])>>8) & 0x000000ff),(GETLE32(&gpuData[8]) & 0x000000ff), ((GETLE32(&gpuData[8])>>8) & 0x000000ff),GETLE32(&gpuData[0]),GETLE32(&gpuData[3]),GETLE32(&gpuData[6]),GETLE32(&gpuData[9]));
6216 ////////////////////////////////////////////////////////////////////////
6218 ////////////////////////////////////////////////////////////////////////
6220 static void DrawSoftwareSpriteTWin(unsigned char * baseAddr,int32_t w,int32_t h)
6222 uint32_t *gpuData = (uint32_t *)baseAddr;
6223 short sx0,sy0,sx1,sy1,sx2,sy2,sx3,sy3;
6224 short tx0,ty0,tx1,ty1,tx2,ty2,tx3,ty3;
6229 sx0=sx3=sx0+PSXDisplay.DrawOffset.x;
6231 sy0=sy1=sy0+PSXDisplay.DrawOffset.y;
6234 tx0=tx3=GETLE32(&gpuData[2])&0xff;
6236 ty0=ty1=(GETLE32(&gpuData[2])>>8)&0xff;
6239 switch (GlobalTextTP)
6242 drawPoly4TEx4_TW_S(sx0,sy0,sx1,sy1,sx2,sy2,sx3,sy3,
6243 tx0,ty0,tx1,ty1,tx2,ty2,tx3,ty3,
6244 ((GETLE32(&gpuData[2])>>12) & 0x3f0), ((GETLE32(&gpuData[2])>>22) & 511));
6247 drawPoly4TEx8_TW_S(sx0,sy0,sx1,sy1,sx2,sy2,sx3,sy3,
6248 tx0,ty0,tx1,ty1,tx2,ty2,tx3,ty3,
6249 ((GETLE32(&gpuData[2])>>12) & 0x3f0), ((GETLE32(&gpuData[2])>>22) & 511));
6252 drawPoly4TD_TW_S(sx0,sy0,sx1,sy1,sx2,sy2,sx3,sy3,
6253 tx0,ty0,tx1,ty1,tx2,ty2,tx3,ty3);
6258 ////////////////////////////////////////////////////////////////////////
6260 static void DrawSoftwareSpriteMirror(unsigned char * baseAddr,int32_t w,int32_t h)
6262 int32_t sprtY,sprtX,sprtW,sprtH,lXDir,lYDir;
6263 int32_t clutY0,clutX0,clutP,textX0,textY0,sprtYa,sprCY,sprCX,sprA;
6265 uint32_t *gpuData = (uint32_t *)baseAddr;
6270 clutY0 = (GETLE32(&gpuData[2])>>22) & 511;
6271 clutX0 = (GETLE32(&gpuData[2])>>12) & 0x3f0;
6272 clutP = (clutY0<<11) + (clutX0<<1);
6273 textY0 = ((GETLE32(&gpuData[2])>>8) & 0x000000ff) + GlobalTextAddrY;
6274 textX0 = (GETLE32(&gpuData[2]) & 0x000000ff);
6276 sprtX+=PSXDisplay.DrawOffset.x;
6277 sprtY+=PSXDisplay.DrawOffset.y;
6291 if((sprtY+sprtH)<drawY) return;
6292 sprtH-=(drawY-sprtY);
6293 textY0+=(drawY-sprtY);
6299 if((sprtX+sprtW)<drawX) return;
6300 sprtW-=(drawX-sprtX);
6301 textX0+=(drawX-sprtX);
6305 if((sprtY+sprtH)>drawH) sprtH=drawH-sprtY+1;
6306 if((sprtX+sprtW)>drawW) sprtW=drawW-sprtX+1;
6308 if(usMirror&0x1000) lXDir=-1; else lXDir=1;
6309 if(usMirror&0x2000) lYDir=-1; else lYDir=1;
6311 switch (GlobalTextTP)
6313 case 0: // texture is 4-bit
6316 textX0=(GlobalTextAddrX<<1)+(textX0>>1);
6318 clutP=(clutY0<<10)+clutX0;
6319 for (sprCY=0;sprCY<sprtH;sprCY++)
6321 for (sprCX=0;sprCX<sprtW;sprCX++)
6323 tC= psxVub[((textY0+(sprCY*lYDir))<<11) + textX0 +(sprCX*lXDir)];
6324 sprA=sprtYa+(sprCY<<10)+sprtX + (sprCX<<1);
6325 GetTextureTransColG_SPR(&psxVuw[sprA],GETLE16(&psxVuw[clutP+((tC>>4)&0xf)]));
6326 GetTextureTransColG_SPR(&psxVuw[sprA+1],GETLE16(&psxVuw[clutP+(tC&0xf)]));
6334 for(sprCY=0;sprCY<sprtH;sprCY++)
6336 for(sprCX=0;sprCX<sprtW;sprCX++)
6338 tC = psxVub[((textY0+(sprCY*lYDir))<<11)+(GlobalTextAddrX<<1) + textX0 + (sprCX*lXDir)] & 0xff;
6339 GetTextureTransColG_SPR(&psxVuw[((sprtY+sprCY)<<10)+sprtX + sprCX],psxVuw[clutP+tC]);
6346 for (sprCY=0;sprCY<sprtH;sprCY++)
6348 for (sprCX=0;sprCX<sprtW;sprCX++)
6350 GetTextureTransColG_SPR(&psxVuw[((sprtY+sprCY)<<10)+sprtX+sprCX],
6351 GETLE16(&psxVuw[((textY0+(sprCY*lYDir))<<10)+GlobalTextAddrX + textX0 +(sprCX*lXDir)]));
6358 ////////////////////////////////////////////////////////////////////////
6360 static void DrawSoftwareSprite(unsigned char * baseAddr,short w,short h,int32_t tx,int32_t ty)
6362 int32_t sprtY,sprtX,sprtW,sprtH;
6363 int32_t clutY0,clutX0,clutP,textX0,textY0,sprtYa,sprCY,sprCX,sprA;
6365 uint32_t *gpuData = (uint32_t *)baseAddr;
6373 clutY0 = (GETLE32(&gpuData[2])>>22) & 511;
6374 clutX0 = (GETLE32(&gpuData[2])>>12) & 0x3f0;
6376 clutP = (clutY0<<11) + (clutX0<<1);
6378 textY0 =ty+ GlobalTextAddrY;
6381 sprtX+=PSXDisplay.DrawOffset.x;
6382 sprtY+=PSXDisplay.DrawOffset.y;
6396 if((sprtY+sprtH)<drawY) return;
6397 sprtH-=(drawY-sprtY);
6398 textY0+=(drawY-sprtY);
6404 if((sprtX+sprtW)<drawX) return;
6406 sprtW-=(drawX-sprtX);
6407 textX0+=(drawX-sprtX);
6411 if((sprtY+sprtH)>drawH) sprtH=drawH-sprtY+1;
6412 if((sprtX+sprtW)>drawW) sprtW=drawW-sprtX+1;
6418 switch (GlobalTextTP)
6422 if(textX0&1) {bWS=TRUE;sprtW--;}
6423 if(sprtW&1) bWT=TRUE;
6426 textX0=(GlobalTextAddrX<<1)+(textX0>>1)+(textY0<<11);
6427 sprtYa=(sprtY<<10)+sprtX;
6428 clutP=(clutY0<<10)+clutX0;
6432 if(!bCheckMask && !DrawSemiTrans)
6434 for (sprCY=0;sprCY<sprtH;sprCY++)
6436 sprA=sprtYa+(sprCY<<10);
6437 pV=&psxVub[(sprCY<<11)+textX0];
6442 GetTextureTransColG_S(&psxVuw[sprA++],GETLE16(&psxVuw[clutP+((tC>>4)&0xf)]));
6445 for (sprCX=0;sprCX<sprtW;sprCX++,sprA+=2)
6449 GetTextureTransColG32_S((uint32_t *)&psxVuw[sprA],
6450 (((int32_t)GETLE16(&psxVuw[clutP+((tC>>4)&0xf)]))<<16)|
6451 GETLE16(&psxVuw[clutP+(tC&0x0f)]));
6457 GetTextureTransColG_S(&psxVuw[sprA],GETLE16(&psxVuw[clutP+(tC&0x0f)]));
6465 for (sprCY=0;sprCY<sprtH;sprCY++)
6467 sprA=sprtYa+(sprCY<<10);
6468 pV=&psxVub[(sprCY<<11)+textX0];
6473 GetTextureTransColG_SPR(&psxVuw[sprA++],GETLE16(&psxVuw[clutP+((tC>>4)&0xf)]));
6476 for (sprCX=0;sprCX<sprtW;sprCX++,sprA+=2)
6480 GetTextureTransColG32_SPR((uint32_t *)&psxVuw[sprA],
6481 (((int32_t)GETLE16(&psxVuw[clutP+((tC>>4)&0xf)])<<16))|
6482 GETLE16(&psxVuw[clutP+(tC&0x0f)]));
6488 GetTextureTransColG_SPR(&psxVuw[sprA],GETLE16(&psxVuw[clutP+(tC&0x0f)]));
6495 textX0+=(GlobalTextAddrX<<1) + (textY0<<11);
6499 if(!bCheckMask && !DrawSemiTrans)
6501 for(sprCY=0;sprCY<sprtH;sprCY++)
6503 sprA=((sprtY+sprCY)<<10)+sprtX;
6504 pV=&psxVub[(sprCY<<11)+textX0];
6505 for(sprCX=0;sprCX<sprtW;sprCX+=2,sprA+=2)
6507 tC = *pV++;tC2 = *pV++;
6508 GetTextureTransColG32_S((uint32_t *)&psxVuw[sprA],
6509 (((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16)|
6510 GETLE16(&psxVuw[clutP+tC]));
6513 GetTextureTransColG_S(&psxVuw[sprA],GETLE16(&psxVuw[clutP+(*pV)]));
6520 for(sprCY=0;sprCY<sprtH;sprCY++)
6522 sprA=((sprtY+sprCY)<<10)+sprtX;
6523 pV=&psxVub[(sprCY<<11)+textX0];
6524 for(sprCX=0;sprCX<sprtW;sprCX+=2,sprA+=2)
6526 tC = *pV++;tC2 = *pV++;
6527 GetTextureTransColG32_SPR((uint32_t *)&psxVuw[sprA],
6528 (((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16)|
6529 GETLE16(&psxVuw[clutP+tC]));
6532 GetTextureTransColG_SPR(&psxVuw[sprA],GETLE16(&psxVuw[clutP+(*pV)]));
6538 textX0+=(GlobalTextAddrX) + (textY0<<10);
6543 if(!bCheckMask && !DrawSemiTrans)
6545 for (sprCY=0;sprCY<sprtH;sprCY++)
6547 sprA=((sprtY+sprCY)<<10)+sprtX;
6549 for (sprCX=0;sprCX<sprtW;sprCX+=2,sprA+=2)
6551 GetTextureTransColG32_S((uint32_t *)&psxVuw[sprA],
6552 (((int32_t)GETLE16(&psxVuw[(sprCY<<10) + textX0 + sprCX +1]))<<16)|
6553 GETLE16(&psxVuw[(sprCY<<10) + textX0 + sprCX]));
6556 GetTextureTransColG_S(&psxVuw[sprA],
6557 GETLE16(&psxVuw[(sprCY<<10) + textX0 + sprCX]));
6565 for (sprCY=0;sprCY<sprtH;sprCY++)
6567 sprA=((sprtY+sprCY)<<10)+sprtX;
6569 for (sprCX=0;sprCX<sprtW;sprCX+=2,sprA+=2)
6571 GetTextureTransColG32_SPR((uint32_t *)&psxVuw[sprA],
6572 (((int32_t)GETLE16(&psxVuw[(sprCY<<10) + textX0 + sprCX +1]))<<16)|
6573 GETLE16(&psxVuw[(sprCY<<10) + textX0 + sprCX]));
6576 GetTextureTransColG_SPR(&psxVuw[sprA],
6577 GETLE16(&psxVuw[(sprCY<<10) + textX0 + sprCX]));
6584 ///////////////////////////////////////////////////////////////////////
6586 /////////////////////////////////////////////////////////////////
6587 /////////////////////////////////////////////////////////////////
6588 /////////////////////////////////////////////////////////////////
6590 ////////////////////////////////////////////////////////////////////////
6591 /////////////////////////////////////////////////////////////////
6592 /////////////////////////////////////////////////////////////////
6595 ///////////////////////////////////////////////////////////////////////
6597 static void Line_E_SE_Shade(int x0, int y0, int x1, int y1, uint32_t rgb0, uint32_t rgb1)
6599 int dx, dy, incrE, incrSE, d;
6600 uint32_t r0, g0, b0, r1, g1, b1;
6603 r0 = (rgb0 & 0x00ff0000);
6604 g0 = (rgb0 & 0x0000ff00) << 8;
6605 b0 = (rgb0 & 0x000000ff) << 16;
6606 r1 = (rgb1 & 0x00ff0000);
6607 g1 = (rgb1 & 0x0000ff00) << 8;
6608 b1 = (rgb1 & 0x000000ff) << 16;
6615 dr = ((int32_t)r1 - (int32_t)r0) / dx;
6616 dg = ((int32_t)g1 - (int32_t)g0) / dx;
6617 db = ((int32_t)b1 - (int32_t)b0) / dx;
6621 dr = ((int32_t)r1 - (int32_t)r0);
6622 dg = ((int32_t)g1 - (int32_t)g0);
6623 db = ((int32_t)b1 - (int32_t)b0);
6626 d = 2*dy - dx; /* Initial value of d */
6627 incrE = 2*dy; /* incr. used for move to E */
6628 incrSE = 2*(dy - dx); /* incr. used for move to SE */
6630 if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))
6631 GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
6636 d = d + incrE; /* Choose E */
6640 d = d + incrSE; /* Choose SE */
6649 if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))
6650 GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
6654 ///////////////////////////////////////////////////////////////////////
6656 static void Line_S_SE_Shade(int x0, int y0, int x1, int y1, uint32_t rgb0, uint32_t rgb1)
6658 int dx, dy, incrS, incrSE, d;
6659 uint32_t r0, g0, b0, r1, g1, b1;
6662 r0 = (rgb0 & 0x00ff0000);
6663 g0 = (rgb0 & 0x0000ff00) << 8;
6664 b0 = (rgb0 & 0x000000ff) << 16;
6665 r1 = (rgb1 & 0x00ff0000);
6666 g1 = (rgb1 & 0x0000ff00) << 8;
6667 b1 = (rgb1 & 0x000000ff) << 16;
6674 dr = ((int32_t)r1 - (int32_t)r0) / dy;
6675 dg = ((int32_t)g1 - (int32_t)g0) / dy;
6676 db = ((int32_t)b1 - (int32_t)b0) / dy;
6680 dr = ((int32_t)r1 - (int32_t)r0);
6681 dg = ((int32_t)g1 - (int32_t)g0);
6682 db = ((int32_t)b1 - (int32_t)b0);
6685 d = 2*dx - dy; /* Initial value of d */
6686 incrS = 2*dx; /* incr. used for move to S */
6687 incrSE = 2*(dx - dy); /* incr. used for move to SE */
6689 if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))
6690 GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
6695 d = d + incrS; /* Choose S */
6699 d = d + incrSE; /* Choose SE */
6708 if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))
6709 GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
6713 ///////////////////////////////////////////////////////////////////////
6715 static void Line_N_NE_Shade(int x0, int y0, int x1, int y1, uint32_t rgb0, uint32_t rgb1)
6717 int dx, dy, incrN, incrNE, d;
6718 uint32_t r0, g0, b0, r1, g1, b1;
6721 r0 = (rgb0 & 0x00ff0000);
6722 g0 = (rgb0 & 0x0000ff00) << 8;
6723 b0 = (rgb0 & 0x000000ff) << 16;
6724 r1 = (rgb1 & 0x00ff0000);
6725 g1 = (rgb1 & 0x0000ff00) << 8;
6726 b1 = (rgb1 & 0x000000ff) << 16;
6733 dr = ((int32_t)r1 - (int32_t)r0) / dy;
6734 dg = ((int32_t)g1 - (int32_t)g0) / dy;
6735 db = ((int32_t)b1 - (int32_t)b0) / dy;
6739 dr = ((int32_t)r1 - (int32_t)r0);
6740 dg = ((int32_t)g1 - (int32_t)g0);
6741 db = ((int32_t)b1 - (int32_t)b0);
6744 d = 2*dx - dy; /* Initial value of d */
6745 incrN = 2*dx; /* incr. used for move to N */
6746 incrNE = 2*(dx - dy); /* incr. used for move to NE */
6748 if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))
6749 GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
6754 d = d + incrN; /* Choose N */
6758 d = d + incrNE; /* Choose NE */
6767 if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))
6768 GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
6772 ///////////////////////////////////////////////////////////////////////
6774 static void Line_E_NE_Shade(int x0, int y0, int x1, int y1, uint32_t rgb0, uint32_t rgb1)
6776 int dx, dy, incrE, incrNE, d;
6777 uint32_t r0, g0, b0, r1, g1, b1;
6780 r0 = (rgb0 & 0x00ff0000);
6781 g0 = (rgb0 & 0x0000ff00) << 8;
6782 b0 = (rgb0 & 0x000000ff) << 16;
6783 r1 = (rgb1 & 0x00ff0000);
6784 g1 = (rgb1 & 0x0000ff00) << 8;
6785 b1 = (rgb1 & 0x000000ff) << 16;
6792 dr = ((int32_t)r1 - (int32_t)r0) / dx;
6793 dg = ((int32_t)g1 - (int32_t)g0) / dx;
6794 db = ((int32_t)b1 - (int32_t)b0) / dx;
6798 dr = ((int32_t)r1 - (int32_t)r0);
6799 dg = ((int32_t)g1 - (int32_t)g0);
6800 db = ((int32_t)b1 - (int32_t)b0);
6803 d = 2*dy - dx; /* Initial value of d */
6804 incrE = 2*dy; /* incr. used for move to E */
6805 incrNE = 2*(dy - dx); /* incr. used for move to NE */
6807 if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))
6808 GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
6813 d = d + incrE; /* Choose E */
6817 d = d + incrNE; /* Choose NE */
6826 if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))
6827 GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
6831 ///////////////////////////////////////////////////////////////////////
6833 static void VertLineShade(int x, int y0, int y1, uint32_t rgb0, uint32_t rgb1)
6836 uint32_t r0, g0, b0, r1, g1, b1;
6839 r0 = (rgb0 & 0x00ff0000);
6840 g0 = (rgb0 & 0x0000ff00) << 8;
6841 b0 = (rgb0 & 0x000000ff) << 16;
6842 r1 = (rgb1 & 0x00ff0000);
6843 g1 = (rgb1 & 0x0000ff00) << 8;
6844 b1 = (rgb1 & 0x000000ff) << 16;
6850 dr = ((int32_t)r1 - (int32_t)r0) / dy;
6851 dg = ((int32_t)g1 - (int32_t)g0) / dy;
6852 db = ((int32_t)b1 - (int32_t)b0) / dy;
6856 dr = ((int32_t)r1 - (int32_t)r0);
6857 dg = ((int32_t)g1 - (int32_t)g0);
6858 db = ((int32_t)b1 - (int32_t)b0);
6863 r0+=dr*(drawY - y0);
6864 g0+=dg*(drawY - y0);
6865 b0+=db*(drawY - y0);
6872 for (y = y0; y <= y1; y++)
6874 GetShadeTransCol(&psxVuw[(y<<10)+x],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
6881 ///////////////////////////////////////////////////////////////////////
6883 static void HorzLineShade(int y, int x0, int x1, uint32_t rgb0, uint32_t rgb1)
6886 uint32_t r0, g0, b0, r1, g1, b1;
6889 r0 = (rgb0 & 0x00ff0000);
6890 g0 = (rgb0 & 0x0000ff00) << 8;
6891 b0 = (rgb0 & 0x000000ff) << 16;
6892 r1 = (rgb1 & 0x00ff0000);
6893 g1 = (rgb1 & 0x0000ff00) << 8;
6894 b1 = (rgb1 & 0x000000ff) << 16;
6900 dr = ((int32_t)r1 - (int32_t)r0) / dx;
6901 dg = ((int32_t)g1 - (int32_t)g0) / dx;
6902 db = ((int32_t)b1 - (int32_t)b0) / dx;
6906 dr = ((int32_t)r1 - (int32_t)r0);
6907 dg = ((int32_t)g1 - (int32_t)g0);
6908 db = ((int32_t)b1 - (int32_t)b0);
6913 r0+=dr*(drawX - x0);
6914 g0+=dg*(drawX - x0);
6915 b0+=db*(drawX - x0);
6922 for (x = x0; x <= x1; x++)
6924 GetShadeTransCol(&psxVuw[(y<<10)+x],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
6931 ///////////////////////////////////////////////////////////////////////
6933 static void Line_E_SE_Flat(int x0, int y0, int x1, int y1, unsigned short colour)
6935 int dx, dy, incrE, incrSE, d, x, y;
6939 d = 2*dy - dx; /* Initial value of d */
6940 incrE = 2*dy; /* incr. used for move to E */
6941 incrSE = 2*(dy - dx); /* incr. used for move to SE */
6944 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))
6945 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);
6950 d = d + incrE; /* Choose E */
6955 d = d + incrSE; /* Choose SE */
6959 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))
6960 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);
6964 ///////////////////////////////////////////////////////////////////////
6966 static void Line_S_SE_Flat(int x0, int y0, int x1, int y1, unsigned short colour)
6968 int dx, dy, incrS, incrSE, d, x, y;
6972 d = 2*dx - dy; /* Initial value of d */
6973 incrS = 2*dx; /* incr. used for move to S */
6974 incrSE = 2*(dx - dy); /* incr. used for move to SE */
6977 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))
6978 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);
6983 d = d + incrS; /* Choose S */
6988 d = d + incrSE; /* Choose SE */
6992 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))
6993 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);
6997 ///////////////////////////////////////////////////////////////////////
6999 static void Line_N_NE_Flat(int x0, int y0, int x1, int y1, unsigned short colour)
7001 int dx, dy, incrN, incrNE, d, x, y;
7005 d = 2*dx - dy; /* Initial value of d */
7006 incrN = 2*dx; /* incr. used for move to N */
7007 incrNE = 2*(dx - dy); /* incr. used for move to NE */
7010 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))
7011 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);
7016 d = d + incrN; /* Choose N */
7021 d = d + incrNE; /* Choose NE */
7025 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))
7026 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);
7030 ///////////////////////////////////////////////////////////////////////
7032 static void Line_E_NE_Flat(int x0, int y0, int x1, int y1, unsigned short colour)
7034 int dx, dy, incrE, incrNE, d, x, y;
7038 d = 2*dy - dx; /* Initial value of d */
7039 incrE = 2*dy; /* incr. used for move to E */
7040 incrNE = 2*(dy - dx); /* incr. used for move to NE */
7043 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))
7044 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);
7049 d = d + incrE; /* Choose E */
7054 d = d + incrNE; /* Choose NE */
7058 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))
7059 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);
7063 ///////////////////////////////////////////////////////////////////////
7065 static void VertLineFlat(int x, int y0, int y1, unsigned short colour)
7075 for (y = y0; y <= y1; y++)
7076 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);
7079 ///////////////////////////////////////////////////////////////////////
7081 static void HorzLineFlat(int y, int x0, int x1, unsigned short colour)
7091 for (x = x0; x <= x1; x++)
7092 GetShadeTransCol(&psxVuw[(y << 10) + x], colour);
7095 ///////////////////////////////////////////////////////////////////////
7097 /* Bresenham Line drawing function */
7098 static void DrawSoftwareLineShade(int32_t rgb0, int32_t rgb1)
7100 short x0, y0, x1, y1, xt, yt;
7104 if (lx0 > drawW && lx1 > drawW) return;
7105 if (ly0 > drawH && ly1 > drawH) return;
7106 if (lx0 < drawX && lx1 < drawX) return;
7107 if (ly0 < drawY && ly1 < drawY) return;
7108 if (drawY >= drawH) return;
7109 if (drawX >= drawW) return;
7122 VertLineShade(x0, y0, y1, rgb0, rgb1);
7124 VertLineShade(x0, y1, y0, rgb1, rgb0);
7130 HorzLineShade(y0, x0, x1, rgb0, rgb1);
7132 HorzLineShade(y0, x1, x0, rgb1, rgb0);
7152 if ((dx >= 0 && dy >= 0) || (dx < 0 && dy < 0))
7154 if (abs(dy) > abs(dx))
7155 Line_S_SE_Shade(x0, y0, x1, y1, rgb0, rgb1);
7157 Line_E_SE_Shade(x0, y0, x1, y1, rgb0, rgb1);
7160 if (abs(dy) > abs(dx))
7161 Line_N_NE_Shade(x0, y0, x1, y1, rgb0, rgb1);
7163 Line_E_NE_Shade(x0, y0, x1, y1, rgb0, rgb1);
7167 ///////////////////////////////////////////////////////////////////////
7169 static void DrawSoftwareLineFlat(int32_t rgb)
7171 short x0, y0, x1, y1, xt, yt;
7173 unsigned short colour = 0;
7175 if (lx0 > drawW && lx1 > drawW) return;
7176 if (ly0 > drawH && ly1 > drawH) return;
7177 if (lx0 < drawX && lx1 < drawX) return;
7178 if (ly0 < drawY && ly1 < drawY) return;
7179 if (drawY >= drawH) return;
7180 if (drawX >= drawW) return;
7182 colour = ((rgb & 0x00f80000) >> 9) | ((rgb & 0x0000f800) >> 6) | ((rgb & 0x000000f8) >> 3);
7195 return; // Nothing to draw
7197 VertLineFlat(x0, y0, y1, colour);
7199 VertLineFlat(x0, y1, y0, colour);
7205 HorzLineFlat(y0, x0, x1, colour);
7207 HorzLineFlat(y0, x1, x0, colour);
7224 if ((dx >= 0 && dy >= 0) || (dx < 0 && dy < 0))
7226 if (abs(dy) > abs(dx))
7227 Line_S_SE_Flat(x0, y0, x1, y1, colour);
7229 Line_E_SE_Flat(x0, y0, x1, y1, colour);
7232 if (abs(dy) > abs(dx))
7233 Line_N_NE_Flat(x0, y0, x1, y1, colour);
7235 Line_E_NE_Flat(x0, y0, x1, y1, colour);
7239 ///////////////////////////////////////////////////////////////////////