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,GlobalTextIL;
66 int32_t GlobalTextREST,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=GETLE32(pdest)>>16;
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)|(*pdest&0xFFFF));
331 if(ma&0x00008000) PUTLE32(pdest, (ma&0xFFFF) |(*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???
953 if(iCheat==1) iCheat=0; else iCheat=1;
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)
983 for(j=0;j<dx;j++) { PUTLE32(DSTPtr, lcol); DSTPtr++; }
984 DSTPtr += LineOffset;
992 GetShadeTransCol32(DSTPtr++,lcol);
993 DSTPtr += LineOffset;
999 ////////////////////////////////////////////////////////////////////////
1001 static void FillSoftwareArea(short x0,short y0,short x1, // FILL AREA (BLK FILL)
1002 short y1,unsigned short col) // no draw area check here!
1006 // ?? ff9 pal hooligan crack sets nonsense x0
1017 if(x1>1024) x1=1024;
1022 unsigned short *DSTPtr;
1023 unsigned short LineOffset;
1025 DSTPtr = psxVuw + (1024*y0) + x0;
1026 LineOffset = 1024 - dx;
1030 for(j=0;j<dx;j++) { PUTLE16(DSTPtr, col); DSTPtr++; }
1031 DSTPtr += LineOffset;
1037 unsigned short LineOffset;
1038 uint32_t lcol=(((int32_t)col)<<16)|col;
1040 DSTPtr = (uint32_t *)(psxVuw + (1024*y0) + x0);
1041 LineOffset = 512 - dx;
1045 for(j=0;j<dx;j++) { PUTLE32(DSTPtr, lcol); DSTPtr++; }
1046 DSTPtr += LineOffset;
1051 ////////////////////////////////////////////////////////////////////////
1052 ////////////////////////////////////////////////////////////////////////
1053 ////////////////////////////////////////////////////////////////////////
1054 // EDGE INTERPOLATION
1055 ////////////////////////////////////////////////////////////////////////
1056 ////////////////////////////////////////////////////////////////////////
1057 ////////////////////////////////////////////////////////////////////////
1059 typedef struct SOFTVTAG
1066 static soft_vertex vtx[4];
1067 static soft_vertex * left_array[4], * right_array[4];
1068 static int left_section, right_section;
1069 static int left_section_height, right_section_height;
1070 static int left_x, delta_left_x, right_x, delta_right_x;
1071 static int left_u, delta_left_u, left_v, delta_left_v;
1072 static int right_u, delta_right_u, right_v, delta_right_v;
1073 static int left_R, delta_left_R, right_R, delta_right_R;
1074 static int left_G, delta_left_G, right_G, delta_right_G;
1075 static int left_B, delta_left_B, right_B, delta_right_B;
1078 static inline int shl10idiv(int x, int y)
1081 // rearmed: let's use VFP divider instead
1082 float r = 1024.0f * (float)x / (float)y;
1091 ////////////////////////////////////////////////////////////////////////
1092 ////////////////////////////////////////////////////////////////////////
1093 ////////////////////////////////////////////////////////////////////////
1095 static inline int RightSection_F(void)
1097 soft_vertex * v1 = right_array[ right_section ];
1098 soft_vertex * v2 = right_array[ right_section-1 ];
1100 int height = v2->y - v1->y;
1101 if(height == 0) return 0;
1102 delta_right_x = (v2->x - v1->x) / height;
1105 right_section_height = height;
1109 ////////////////////////////////////////////////////////////////////////
1111 static inline int LeftSection_F(void)
1113 soft_vertex * v1 = left_array[ left_section ];
1114 soft_vertex * v2 = left_array[ left_section-1 ];
1116 int height = v2->y - v1->y;
1117 if(height == 0) return 0;
1118 delta_left_x = (v2->x - v1->x) / height;
1121 left_section_height = height;
1125 ////////////////////////////////////////////////////////////////////////
1127 static inline BOOL NextRow_F(void)
1129 if(--left_section_height<=0)
1131 if(--left_section <= 0) {return TRUE;}
1132 if(LeftSection_F() <= 0) {return TRUE;}
1136 left_x += delta_left_x;
1139 if(--right_section_height<=0)
1141 if(--right_section<=0) {return TRUE;}
1142 if(RightSection_F() <=0) {return TRUE;}
1146 right_x += delta_right_x;
1151 ////////////////////////////////////////////////////////////////////////
1153 static inline BOOL SetupSections_F(short x1, short y1, short x2, short y2, short x3, short y3)
1155 soft_vertex * v1, * v2, * v3;
1158 v1 = vtx; v1->x=x1<<16;v1->y=y1;
1159 v2 = vtx+1; v2->x=x2<<16;v2->y=y2;
1160 v3 = vtx+2; v3->x=x3<<16;v3->y=y3;
1162 if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }
1163 if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }
1164 if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }
1166 height = v3->y - v1->y;
1167 if(height == 0) {return FALSE;}
1168 longest = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
1169 if(longest == 0) {return FALSE;}
1173 right_array[0] = v3;
1174 right_array[1] = v2;
1175 right_array[2] = v1;
1181 if(LeftSection_F() <= 0) return FALSE;
1182 if(RightSection_F() <= 0)
1185 if(RightSection_F() <= 0) return FALSE;
1194 right_array[0] = v3;
1195 right_array[1] = v1;
1198 if(RightSection_F() <= 0) return FALSE;
1199 if(LeftSection_F() <= 0)
1202 if(LeftSection_F() <= 0) return FALSE;
1207 Ymax=min(v3->y-1,drawH);
1212 ////////////////////////////////////////////////////////////////////////
1213 ////////////////////////////////////////////////////////////////////////
1215 static inline int RightSection_G(void)
1217 soft_vertex * v1 = right_array[ right_section ];
1218 soft_vertex * v2 = right_array[ right_section-1 ];
1220 int height = v2->y - v1->y;
1221 if(height == 0) return 0;
1222 delta_right_x = (v2->x - v1->x) / height;
1225 right_section_height = height;
1229 ////////////////////////////////////////////////////////////////////////
1231 static inline int LeftSection_G(void)
1233 soft_vertex * v1 = left_array[ left_section ];
1234 soft_vertex * v2 = left_array[ left_section-1 ];
1236 int height = v2->y - v1->y;
1237 if(height == 0) return 0;
1238 delta_left_x = (v2->x - v1->x) / height;
1241 delta_left_R = ((v2->R - v1->R)) / height;
1243 delta_left_G = ((v2->G - v1->G)) / height;
1245 delta_left_B = ((v2->B - v1->B)) / height;
1248 left_section_height = height;
1252 ////////////////////////////////////////////////////////////////////////
1254 static inline BOOL NextRow_G(void)
1256 if(--left_section_height<=0)
1258 if(--left_section <= 0) {return TRUE;}
1259 if(LeftSection_G() <= 0) {return TRUE;}
1263 left_x += delta_left_x;
1264 left_R += delta_left_R;
1265 left_G += delta_left_G;
1266 left_B += delta_left_B;
1269 if(--right_section_height<=0)
1271 if(--right_section<=0) {return TRUE;}
1272 if(RightSection_G() <=0) {return TRUE;}
1276 right_x += delta_right_x;
1281 ////////////////////////////////////////////////////////////////////////
1283 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)
1285 soft_vertex * v1, * v2, * v3;
1286 int height,longest,temp;
1288 v1 = vtx; v1->x=x1<<16;v1->y=y1;
1289 v1->R=(rgb1) & 0x00ff0000;
1290 v1->G=(rgb1<<8) & 0x00ff0000;
1291 v1->B=(rgb1<<16) & 0x00ff0000;
1292 v2 = vtx+1; v2->x=x2<<16;v2->y=y2;
1293 v2->R=(rgb2) & 0x00ff0000;
1294 v2->G=(rgb2<<8) & 0x00ff0000;
1295 v2->B=(rgb2<<16) & 0x00ff0000;
1296 v3 = vtx+2; v3->x=x3<<16;v3->y=y3;
1297 v3->R=(rgb3) & 0x00ff0000;
1298 v3->G=(rgb3<<8) & 0x00ff0000;
1299 v3->B=(rgb3<<16) & 0x00ff0000;
1301 if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }
1302 if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }
1303 if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }
1305 height = v3->y - v1->y;
1306 if(height == 0) {return FALSE;}
1307 temp=(((v2->y - v1->y) << 16) / height);
1308 longest = temp * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
1309 if(longest == 0) {return FALSE;}
1313 right_array[0] = v3;
1314 right_array[1] = v2;
1315 right_array[2] = v1;
1321 if(LeftSection_G() <= 0) return FALSE;
1322 if(RightSection_G() <= 0)
1325 if(RightSection_G() <= 0) return FALSE;
1327 if(longest > -0x1000) longest = -0x1000;
1335 right_array[0] = v3;
1336 right_array[1] = v1;
1339 if(RightSection_G() <= 0) return FALSE;
1340 if(LeftSection_G() <= 0)
1343 if(LeftSection_G() <= 0) return FALSE;
1345 if(longest < 0x1000) longest = 0x1000;
1349 Ymax=min(v3->y-1,drawH);
1351 delta_right_R=shl10idiv(temp*((v3->R - v1->R)>>10)+((v1->R - v2->R)<<6),longest);
1352 delta_right_G=shl10idiv(temp*((v3->G - v1->G)>>10)+((v1->G - v2->G)<<6),longest);
1353 delta_right_B=shl10idiv(temp*((v3->B - v1->B)>>10)+((v1->B - v2->B)<<6),longest);
1358 ////////////////////////////////////////////////////////////////////////
1359 ////////////////////////////////////////////////////////////////////////
1361 static inline int RightSection_FT(void)
1363 soft_vertex * v1 = right_array[ right_section ];
1364 soft_vertex * v2 = right_array[ right_section-1 ];
1366 int height = v2->y - v1->y;
1367 if(height == 0) return 0;
1368 delta_right_x = (v2->x - v1->x) / height;
1371 right_section_height = height;
1375 ////////////////////////////////////////////////////////////////////////
1377 static inline int LeftSection_FT(void)
1379 soft_vertex * v1 = left_array[ left_section ];
1380 soft_vertex * v2 = left_array[ left_section-1 ];
1382 int height = v2->y - v1->y;
1383 if(height == 0) return 0;
1384 delta_left_x = (v2->x - v1->x) / height;
1387 delta_left_u = ((v2->u - v1->u)) / height;
1389 delta_left_v = ((v2->v - v1->v)) / height;
1392 left_section_height = height;
1396 ////////////////////////////////////////////////////////////////////////
1398 static inline BOOL NextRow_FT(void)
1400 if(--left_section_height<=0)
1402 if(--left_section <= 0) {return TRUE;}
1403 if(LeftSection_FT() <= 0) {return TRUE;}
1407 left_x += delta_left_x;
1408 left_u += delta_left_u;
1409 left_v += delta_left_v;
1412 if(--right_section_height<=0)
1414 if(--right_section<=0) {return TRUE;}
1415 if(RightSection_FT() <=0) {return TRUE;}
1419 right_x += delta_right_x;
1424 ////////////////////////////////////////////////////////////////////////
1426 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)
1428 soft_vertex * v1, * v2, * v3;
1429 int height,longest,temp;
1431 v1 = vtx; v1->x=x1<<16;v1->y=y1;
1432 v1->u=tx1<<16;v1->v=ty1<<16;
1433 v2 = vtx+1; v2->x=x2<<16;v2->y=y2;
1434 v2->u=tx2<<16;v2->v=ty2<<16;
1435 v3 = vtx+2; v3->x=x3<<16;v3->y=y3;
1436 v3->u=tx3<<16;v3->v=ty3<<16;
1438 if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }
1439 if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }
1440 if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }
1442 height = v3->y - v1->y;
1443 if(height == 0) {return FALSE;}
1445 temp=(((v2->y - v1->y) << 16) / height);
1446 longest = temp * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
1448 if(longest == 0) {return FALSE;}
1452 right_array[0] = v3;
1453 right_array[1] = v2;
1454 right_array[2] = v1;
1460 if(LeftSection_FT() <= 0) return FALSE;
1461 if(RightSection_FT() <= 0)
1464 if(RightSection_FT() <= 0) return FALSE;
1466 if(longest > -0x1000) longest = -0x1000;
1474 right_array[0] = v3;
1475 right_array[1] = v1;
1478 if(RightSection_FT() <= 0) return FALSE;
1479 if(LeftSection_FT() <= 0)
1482 if(LeftSection_FT() <= 0) return FALSE;
1484 if(longest < 0x1000) longest = 0x1000;
1488 Ymax=min(v3->y-1,drawH);
1490 delta_right_u=shl10idiv(temp*((v3->u - v1->u)>>10)+((v1->u - v2->u)<<6),longest);
1491 delta_right_v=shl10idiv(temp*((v3->v - v1->v)>>10)+((v1->v - v2->v)<<6),longest);
1496 ////////////////////////////////////////////////////////////////////////
1497 ////////////////////////////////////////////////////////////////////////
1499 static inline int RightSection_GT(void)
1501 soft_vertex * v1 = right_array[ right_section ];
1502 soft_vertex * v2 = right_array[ right_section-1 ];
1504 int height = v2->y - v1->y;
1505 if(height == 0) return 0;
1506 delta_right_x = (v2->x - v1->x) / height;
1509 right_section_height = height;
1513 ////////////////////////////////////////////////////////////////////////
1515 static inline int LeftSection_GT(void)
1517 soft_vertex * v1 = left_array[ left_section ];
1518 soft_vertex * v2 = left_array[ left_section-1 ];
1520 int height = v2->y - v1->y;
1521 if(height == 0) return 0;
1522 delta_left_x = (v2->x - v1->x) / height;
1525 delta_left_u = ((v2->u - v1->u)) / height;
1527 delta_left_v = ((v2->v - v1->v)) / height;
1530 delta_left_R = ((v2->R - v1->R)) / height;
1532 delta_left_G = ((v2->G - v1->G)) / height;
1534 delta_left_B = ((v2->B - v1->B)) / height;
1537 left_section_height = height;
1541 ////////////////////////////////////////////////////////////////////////
1543 static inline BOOL NextRow_GT(void)
1545 if(--left_section_height<=0)
1547 if(--left_section <= 0) {return TRUE;}
1548 if(LeftSection_GT() <= 0) {return TRUE;}
1552 left_x += delta_left_x;
1553 left_u += delta_left_u;
1554 left_v += delta_left_v;
1555 left_R += delta_left_R;
1556 left_G += delta_left_G;
1557 left_B += delta_left_B;
1560 if(--right_section_height<=0)
1562 if(--right_section<=0) {return TRUE;}
1563 if(RightSection_GT() <=0) {return TRUE;}
1567 right_x += delta_right_x;
1572 ////////////////////////////////////////////////////////////////////////
1574 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)
1576 soft_vertex * v1, * v2, * v3;
1577 int height,longest,temp;
1579 v1 = vtx; v1->x=x1<<16;v1->y=y1;
1580 v1->u=tx1<<16;v1->v=ty1<<16;
1581 v1->R=(rgb1) & 0x00ff0000;
1582 v1->G=(rgb1<<8) & 0x00ff0000;
1583 v1->B=(rgb1<<16) & 0x00ff0000;
1585 v2 = vtx+1; v2->x=x2<<16;v2->y=y2;
1586 v2->u=tx2<<16;v2->v=ty2<<16;
1587 v2->R=(rgb2) & 0x00ff0000;
1588 v2->G=(rgb2<<8) & 0x00ff0000;
1589 v2->B=(rgb2<<16) & 0x00ff0000;
1591 v3 = vtx+2; v3->x=x3<<16;v3->y=y3;
1592 v3->u=tx3<<16;v3->v=ty3<<16;
1593 v3->R=(rgb3) & 0x00ff0000;
1594 v3->G=(rgb3<<8) & 0x00ff0000;
1595 v3->B=(rgb3<<16) & 0x00ff0000;
1597 if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }
1598 if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }
1599 if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }
1601 height = v3->y - v1->y;
1602 if(height == 0) {return FALSE;}
1604 temp=(((v2->y - v1->y) << 16) / height);
1605 longest = temp * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
1607 if(longest == 0) {return FALSE;}
1611 right_array[0] = v3;
1612 right_array[1] = v2;
1613 right_array[2] = v1;
1619 if(LeftSection_GT() <= 0) return FALSE;
1620 if(RightSection_GT() <= 0)
1623 if(RightSection_GT() <= 0) return FALSE;
1626 if(longest > -0x1000) longest = -0x1000;
1634 right_array[0] = v3;
1635 right_array[1] = v1;
1638 if(RightSection_GT() <= 0) return FALSE;
1639 if(LeftSection_GT() <= 0)
1642 if(LeftSection_GT() <= 0) return FALSE;
1644 if(longest < 0x1000) longest = 0x1000;
1648 Ymax=min(v3->y-1,drawH);
1650 delta_right_R=shl10idiv(temp*((v3->R - v1->R)>>10)+((v1->R - v2->R)<<6),longest);
1651 delta_right_G=shl10idiv(temp*((v3->G - v1->G)>>10)+((v1->G - v2->G)<<6),longest);
1652 delta_right_B=shl10idiv(temp*((v3->B - v1->B)>>10)+((v1->B - v2->B)<<6),longest);
1654 delta_right_u=shl10idiv(temp*((v3->u - v1->u)>>10)+((v1->u - v2->u)<<6),longest);
1655 delta_right_v=shl10idiv(temp*((v3->v - v1->v)>>10)+((v1->v - v2->v)<<6),longest);
1660 ////////////////////////////////////////////////////////////////////////
1661 ////////////////////////////////////////////////////////////////////////
1663 static inline int RightSection_F4(void)
1665 soft_vertex * v1 = right_array[ right_section ];
1666 soft_vertex * v2 = right_array[ right_section-1 ];
1668 int height = v2->y - v1->y;
1669 right_section_height = height;
1675 delta_right_x = (v2->x - v1->x) / height;
1680 ////////////////////////////////////////////////////////////////////////
1682 static inline int LeftSection_F4(void)
1684 soft_vertex * v1 = left_array[ left_section ];
1685 soft_vertex * v2 = left_array[ left_section-1 ];
1687 int height = v2->y - v1->y;
1688 left_section_height = height;
1694 delta_left_x = (v2->x - v1->x) / height;
1699 ////////////////////////////////////////////////////////////////////////
1701 static inline BOOL NextRow_F4(void)
1703 if(--left_section_height<=0)
1705 if(--left_section > 0)
1706 while(LeftSection_F4()<=0)
1708 if(--left_section <= 0) break;
1713 left_x += delta_left_x;
1716 if(--right_section_height<=0)
1718 if(--right_section > 0)
1719 while(RightSection_F4()<=0)
1721 if(--right_section<=0) break;
1726 right_x += delta_right_x;
1731 ////////////////////////////////////////////////////////////////////////
1733 static inline BOOL SetupSections_F4(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4)
1735 soft_vertex * v1, * v2, * v3, * v4;
1736 int height,width,longest1,longest2;
1738 v1 = vtx; v1->x=x1<<16;v1->y=y1;
1739 v2 = vtx+1; v2->x=x2<<16;v2->y=y2;
1740 v3 = vtx+2; v3->x=x3<<16;v3->y=y3;
1741 v4 = vtx+3; v4->x=x4<<16;v4->y=y4;
1743 if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }
1744 if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }
1745 if(v1->y > v4->y) { soft_vertex * v = v1; v1 = v4; v4 = v; }
1746 if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }
1747 if(v2->y > v4->y) { soft_vertex * v = v2; v2 = v4; v4 = v; }
1748 if(v3->y > v4->y) { soft_vertex * v = v3; v3 = v4; v4 = v; }
1750 height = v4->y - v1->y; if(height == 0) height =1;
1751 width = (v4->x - v1->x)>>16;
1752 longest1 = (((v2->y - v1->y) << 16) / height) * width + (v1->x - v2->x);
1753 longest2 = (((v3->y - v1->y) << 16) / height) * width + (v1->x - v3->x);
1755 if(longest1 < 0) // 2 is right
1757 if(longest2 < 0) // 3 is right
1763 height = v3->y - v1->y; if(height == 0) height=1;
1764 longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
1767 right_array[0] = v4; // 1
1768 right_array[1] = v3; // 3
1769 right_array[2] = v1; // 4
1774 height = v4->y - v2->y; if(height == 0) height=1;
1775 longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);
1778 right_array[0] = v4; // 1
1779 right_array[1] = v2; // 2
1780 right_array[2] = v1; // 4
1785 right_array[0] = v4; // 1
1786 right_array[1] = v3; // 2
1787 right_array[2] = v2; // 3
1788 right_array[3] = v1; // 4
1796 left_array[1] = v3; // 1
1797 left_array[2] = v1; // 2
1798 left_section = 2; // 3
1799 right_array[0] = v4; // 4
1800 right_array[1] = v2;
1801 right_array[2] = v1;
1809 left_array[0] = v4; // 1
1810 left_array[1] = v2; // 2
1811 left_array[2] = v1; // 3
1812 left_section = 2; // 4
1813 right_array[0] = v4;
1814 right_array[1] = v3;
1815 right_array[2] = v1;
1820 right_array[0] = v4;
1821 right_array[1] = v1;
1824 height = v3->y - v1->y; if(height == 0) height=1;
1825 longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
1828 left_array[0] = v4; // 1
1829 left_array[1] = v3; // 3
1830 left_array[2] = v1; // 4
1835 height = v4->y - v2->y; if(height == 0) height=1;
1836 longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);
1839 left_array[0] = v4; // 1
1840 left_array[1] = v2; // 2
1841 left_array[2] = v1; // 4
1846 left_array[0] = v4; // 1
1847 left_array[1] = v3; // 2
1848 left_array[2] = v2; // 3
1849 left_array[3] = v1; // 4
1856 while(LeftSection_F4()<=0)
1858 if(--left_section <= 0) break;
1861 while(RightSection_F4()<=0)
1863 if(--right_section <= 0) break;
1867 Ymax=min(v4->y-1,drawH);
1872 ////////////////////////////////////////////////////////////////////////
1873 ////////////////////////////////////////////////////////////////////////
1875 static inline int RightSection_FT4(void)
1877 soft_vertex * v1 = right_array[ right_section ];
1878 soft_vertex * v2 = right_array[ right_section-1 ];
1880 int height = v2->y - v1->y;
1881 right_section_height = height;
1889 delta_right_x = (v2->x - v1->x) / height;
1890 delta_right_u = (v2->u - v1->u) / height;
1891 delta_right_v = (v2->v - v1->v) / height;
1896 ////////////////////////////////////////////////////////////////////////
1898 static inline int LeftSection_FT4(void)
1900 soft_vertex * v1 = left_array[ left_section ];
1901 soft_vertex * v2 = left_array[ left_section-1 ];
1903 int height = v2->y - v1->y;
1904 left_section_height = height;
1912 delta_left_x = (v2->x - v1->x) / height;
1913 delta_left_u = (v2->u - v1->u) / height;
1914 delta_left_v = (v2->v - v1->v) / height;
1919 ////////////////////////////////////////////////////////////////////////
1921 static inline BOOL NextRow_FT4(void)
1923 if(--left_section_height<=0)
1925 if(--left_section > 0)
1926 while(LeftSection_FT4()<=0)
1928 if(--left_section <= 0) break;
1933 left_x += delta_left_x;
1934 left_u += delta_left_u;
1935 left_v += delta_left_v;
1938 if(--right_section_height<=0)
1940 if(--right_section > 0)
1941 while(RightSection_FT4()<=0)
1943 if(--right_section<=0) break;
1948 right_x += delta_right_x;
1949 right_u += delta_right_u;
1950 right_v += delta_right_v;
1955 ////////////////////////////////////////////////////////////////////////
1957 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)
1959 soft_vertex * v1, * v2, * v3, * v4;
1960 int height,width,longest1,longest2;
1962 v1 = vtx; v1->x=x1<<16;v1->y=y1;
1963 v1->u=tx1<<16;v1->v=ty1<<16;
1965 v2 = vtx+1; v2->x=x2<<16;v2->y=y2;
1966 v2->u=tx2<<16;v2->v=ty2<<16;
1968 v3 = vtx+2; v3->x=x3<<16;v3->y=y3;
1969 v3->u=tx3<<16;v3->v=ty3<<16;
1971 v4 = vtx+3; v4->x=x4<<16;v4->y=y4;
1972 v4->u=tx4<<16;v4->v=ty4<<16;
1974 if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }
1975 if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }
1976 if(v1->y > v4->y) { soft_vertex * v = v1; v1 = v4; v4 = v; }
1977 if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }
1978 if(v2->y > v4->y) { soft_vertex * v = v2; v2 = v4; v4 = v; }
1979 if(v3->y > v4->y) { soft_vertex * v = v3; v3 = v4; v4 = v; }
1981 height = v4->y - v1->y; if(height == 0) height =1;
1982 width = (v4->x - v1->x)>>16;
1983 longest1 = (((v2->y - v1->y) << 16) / height) * width + (v1->x - v2->x);
1984 longest2 = (((v3->y - v1->y) << 16) / height) * width + (v1->x - v3->x);
1986 if(longest1 < 0) // 2 is right
1988 if(longest2 < 0) // 3 is right
1994 height = v3->y - v1->y; if(height == 0) height=1;
1995 longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
1998 right_array[0] = v4; // 1
1999 right_array[1] = v3; // 3
2000 right_array[2] = v1; // 4
2005 height = v4->y - v2->y; if(height == 0) height=1;
2006 longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);
2009 right_array[0] = v4; // 1
2010 right_array[1] = v2; // 2
2011 right_array[2] = v1; // 4
2016 right_array[0] = v4; // 1
2017 right_array[1] = v3; // 2
2018 right_array[2] = v2; // 3
2019 right_array[3] = v1; // 4
2027 left_array[1] = v3; // 1
2028 left_array[2] = v1; // 2
2029 left_section = 2; // 3
2030 right_array[0] = v4; // 4
2031 right_array[1] = v2;
2032 right_array[2] = v1;
2040 left_array[0] = v4; // 1
2041 left_array[1] = v2; // 2
2042 left_array[2] = v1; // 3
2043 left_section = 2; // 4
2044 right_array[0] = v4;
2045 right_array[1] = v3;
2046 right_array[2] = v1;
2051 right_array[0] = v4;
2052 right_array[1] = v1;
2055 height = v3->y - v1->y; if(height == 0) height=1;
2056 longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
2059 left_array[0] = v4; // 1
2060 left_array[1] = v3; // 3
2061 left_array[2] = v1; // 4
2066 height = v4->y - v2->y; if(height == 0) height=1;
2067 longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);
2070 left_array[0] = v4; // 1
2071 left_array[1] = v2; // 2
2072 left_array[2] = v1; // 4
2077 left_array[0] = v4; // 1
2078 left_array[1] = v3; // 2
2079 left_array[2] = v2; // 3
2080 left_array[3] = v1; // 4
2087 while(LeftSection_FT4()<=0)
2089 if(--left_section <= 0) break;
2092 while(RightSection_FT4()<=0)
2094 if(--right_section <= 0) break;
2098 Ymax=min(v4->y-1,drawH);
2103 ////////////////////////////////////////////////////////////////////////
2104 ////////////////////////////////////////////////////////////////////////
2106 static inline int RightSection_GT4(void)
2108 soft_vertex * v1 = right_array[ right_section ];
2109 soft_vertex * v2 = right_array[ right_section-1 ];
2111 int height = v2->y - v1->y;
2112 right_section_height = height;
2124 delta_right_x = (v2->x - v1->x) / height;
2125 delta_right_u = (v2->u - v1->u) / height;
2126 delta_right_v = (v2->v - v1->v) / height;
2127 delta_right_R = (v2->R - v1->R) / height;
2128 delta_right_G = (v2->G - v1->G) / height;
2129 delta_right_B = (v2->B - v1->B) / height;
2134 ////////////////////////////////////////////////////////////////////////
2136 static inline int LeftSection_GT4(void)
2138 soft_vertex * v1 = left_array[ left_section ];
2139 soft_vertex * v2 = left_array[ left_section-1 ];
2141 int height = v2->y - v1->y;
2142 left_section_height = height;
2154 delta_left_x = (v2->x - v1->x) / height;
2155 delta_left_u = (v2->u - v1->u) / height;
2156 delta_left_v = (v2->v - v1->v) / height;
2157 delta_left_R = (v2->R - v1->R) / height;
2158 delta_left_G = (v2->G - v1->G) / height;
2159 delta_left_B = (v2->B - v1->B) / height;
2164 ////////////////////////////////////////////////////////////////////////
2166 static inline BOOL NextRow_GT4(void)
2168 if(--left_section_height<=0)
2170 if(--left_section > 0)
2171 while(LeftSection_GT4()<=0)
2173 if(--left_section <= 0) break;
2178 left_x += delta_left_x;
2179 left_u += delta_left_u;
2180 left_v += delta_left_v;
2181 left_R += delta_left_R;
2182 left_G += delta_left_G;
2183 left_B += delta_left_B;
2186 if(--right_section_height<=0)
2188 if(--right_section > 0)
2189 while(RightSection_GT4()<=0)
2191 if(--right_section<=0) break;
2196 right_x += delta_right_x;
2197 right_u += delta_right_u;
2198 right_v += delta_right_v;
2199 right_R += delta_right_R;
2200 right_G += delta_right_G;
2201 right_B += delta_right_B;
2206 ////////////////////////////////////////////////////////////////////////
2208 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)
2210 soft_vertex * v1, * v2, * v3, * v4;
2211 int height,width,longest1,longest2;
2213 v1 = vtx; v1->x=x1<<16;v1->y=y1;
2214 v1->u=tx1<<16;v1->v=ty1<<16;
2215 v1->R=(rgb1) & 0x00ff0000;
2216 v1->G=(rgb1<<8) & 0x00ff0000;
2217 v1->B=(rgb1<<16) & 0x00ff0000;
2219 v2 = vtx+1; v2->x=x2<<16;v2->y=y2;
2220 v2->u=tx2<<16;v2->v=ty2<<16;
2221 v2->R=(rgb2) & 0x00ff0000;
2222 v2->G=(rgb2<<8) & 0x00ff0000;
2223 v2->B=(rgb2<<16) & 0x00ff0000;
2225 v3 = vtx+2; v3->x=x3<<16;v3->y=y3;
2226 v3->u=tx3<<16;v3->v=ty3<<16;
2227 v3->R=(rgb3) & 0x00ff0000;
2228 v3->G=(rgb3<<8) & 0x00ff0000;
2229 v3->B=(rgb3<<16) & 0x00ff0000;
2231 v4 = vtx+3; v4->x=x4<<16;v4->y=y4;
2232 v4->u=tx4<<16;v4->v=ty4<<16;
2233 v4->R=(rgb4) & 0x00ff0000;
2234 v4->G=(rgb4<<8) & 0x00ff0000;
2235 v4->B=(rgb4<<16) & 0x00ff0000;
2237 if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }
2238 if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }
2239 if(v1->y > v4->y) { soft_vertex * v = v1; v1 = v4; v4 = v; }
2240 if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }
2241 if(v2->y > v4->y) { soft_vertex * v = v2; v2 = v4; v4 = v; }
2242 if(v3->y > v4->y) { soft_vertex * v = v3; v3 = v4; v4 = v; }
2244 height = v4->y - v1->y; if(height == 0) height =1;
2245 width = (v4->x - v1->x)>>16;
2246 longest1 = (((v2->y - v1->y) << 16) / height) * width + (v1->x - v2->x);
2247 longest2 = (((v3->y - v1->y) << 16) / height) * width + (v1->x - v3->x);
2249 if(longest1 < 0) // 2 is right
2251 if(longest2 < 0) // 3 is right
2257 height = v3->y - v1->y; if(height == 0) height=1;
2258 longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
2261 right_array[0] = v4; // 1
2262 right_array[1] = v3; // 3
2263 right_array[2] = v1; // 4
2268 height = v4->y - v2->y; if(height == 0) height=1;
2269 longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);
2272 right_array[0] = v4; // 1
2273 right_array[1] = v2; // 2
2274 right_array[2] = v1; // 4
2279 right_array[0] = v4; // 1
2280 right_array[1] = v3; // 2
2281 right_array[2] = v2; // 3
2282 right_array[3] = v1; // 4
2290 left_array[1] = v3; // 1
2291 left_array[2] = v1; // 2
2292 left_section = 2; // 3
2293 right_array[0] = v4; // 4
2294 right_array[1] = v2;
2295 right_array[2] = v1;
2303 left_array[0] = v4; // 1
2304 left_array[1] = v2; // 2
2305 left_array[2] = v1; // 3
2306 left_section = 2; // 4
2307 right_array[0] = v4;
2308 right_array[1] = v3;
2309 right_array[2] = v1;
2314 right_array[0] = v4;
2315 right_array[1] = v1;
2318 height = v3->y - v1->y; if(height == 0) height=1;
2319 longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
2322 left_array[0] = v4; // 1
2323 left_array[1] = v3; // 3
2324 left_array[2] = v1; // 4
2329 height = v4->y - v2->y; if(height == 0) height=1;
2330 longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);
2333 left_array[0] = v4; // 1
2334 left_array[1] = v2; // 2
2335 left_array[2] = v1; // 4
2340 left_array[0] = v4; // 1
2341 left_array[1] = v3; // 2
2342 left_array[2] = v2; // 3
2343 left_array[3] = v1; // 4
2350 while(LeftSection_GT4()<=0)
2352 if(--left_section <= 0) break;
2355 while(RightSection_GT4()<=0)
2357 if(--right_section <= 0) break;
2361 Ymax=min(v4->y-1,drawH);
2366 ////////////////////////////////////////////////////////////////////////
2367 ////////////////////////////////////////////////////////////////////////
2368 ////////////////////////////////////////////////////////////////////////
2370 ////////////////////////////////////////////////////////////////////////
2371 ////////////////////////////////////////////////////////////////////////
2372 ////////////////////////////////////////////////////////////////////////
2374 ////////////////////////////////////////////////////////////////////////
2375 // POLY 3/4 FLAT SHADED
2376 ////////////////////////////////////////////////////////////////////////
2378 static inline void drawPoly3Fi(short x1,short y1,short x2,short y2,short x3,short y3,int32_t rgb)
2380 int i,j,xmin,xmax,ymin,ymax;
2381 unsigned short color;uint32_t lcolor;
2383 if(x1>drawW && x2>drawW && x3>drawW) return;
2384 if(y1>drawH && y2>drawH && y3>drawH) return;
2385 if(x1<drawX && x2<drawX && x3<drawX) return;
2386 if(y1<drawY && y2<drawY && y3<drawY) return;
2387 if(drawY>=drawH) return;
2388 if(drawX>=drawW) return;
2390 if(!SetupSections_F(x1,y1,x2,y2,x3,y3)) return;
2394 color = ((rgb & 0x00f80000)>>9) | ((rgb & 0x0000f800)>>6) | ((rgb & 0x000000f8)>>3);
2395 lcolor=lSetMask|(((uint32_t)(color))<<16)|color;
2397 for(ymin=Ymin;ymin<drawY;ymin++)
2398 if(NextRow_F()) return;
2402 if(!bCheckMask && !DrawSemiTrans)
2405 for (i=ymin;i<=ymax;i++)
2407 xmin=left_x >> 16; if(drawX>xmin) xmin=drawX;
2408 xmax=(right_x >> 16)-1; if(drawW<xmax) xmax=drawW;
2410 for(j=xmin;j<xmax;j+=2)
2412 PUTLE32(((uint32_t *)&psxVuw[(i<<10)+j]), lcolor);
2414 if(j==xmax) PUTLE16(&psxVuw[(i<<10)+j], color);
2416 if(NextRow_F()) return;
2423 for (i=ymin;i<=ymax;i++)
2425 xmin=left_x >> 16; if(drawX>xmin) xmin=drawX;
2426 xmax=(right_x >> 16)-1; if(drawW<xmax) xmax=drawW;
2428 for(j=xmin;j<xmax;j+=2)
2430 GetShadeTransCol32((uint32_t *)&psxVuw[(i<<10)+j],lcolor);
2433 GetShadeTransCol(&psxVuw[(i<<10)+j],color);
2435 if(NextRow_F()) return;
2439 ////////////////////////////////////////////////////////////////////////
2441 static void drawPoly3F(int32_t rgb)
2443 drawPoly3Fi(lx0,ly0,lx1,ly1,lx2,ly2,rgb);
2448 static void drawPoly4F_TRI(int32_t rgb)
2450 drawPoly3Fi(lx1,ly1,lx3,ly3,lx2,ly2,rgb);
2451 drawPoly3Fi(lx0,ly0,lx1,ly1,lx2,ly2,rgb);
2458 static void drawPoly4F(int32_t rgb)
2460 int i,j,xmin,xmax,ymin,ymax;
2461 unsigned short color;uint32_t lcolor;
2463 if(lx0>drawW && lx1>drawW && lx2>drawW && lx3>drawW) return;
2464 if(ly0>drawH && ly1>drawH && ly2>drawH && ly3>drawH) return;
2465 if(lx0<drawX && lx1<drawX && lx2<drawX && lx3<drawX) return;
2466 if(ly0<drawY && ly1<drawY && ly2<drawY && ly3<drawY) return;
2467 if(drawY>=drawH) return;
2468 if(drawX>=drawW) return;
2470 if(!SetupSections_F4(lx0,ly0,lx1,ly1,lx2,ly2,lx3,ly3)) return;
2474 for(ymin=Ymin;ymin<drawY;ymin++)
2475 if(NextRow_F4()) return;
2477 color = ((rgb & 0x00f80000)>>9) | ((rgb & 0x0000f800)>>6) | ((rgb & 0x000000f8)>>3);
2478 lcolor= lSetMask|(((uint32_t)(color))<<16)|color;
2482 if(!bCheckMask && !DrawSemiTrans)
2485 for (i=ymin;i<=ymax;i++)
2487 xmin=left_x >> 16; if(drawX>xmin) xmin=drawX;
2488 xmax=(right_x >> 16)-1; if(drawW<xmax) xmax=drawW;
2490 for(j=xmin;j<xmax;j+=2)
2492 PUTLE32(((uint32_t *)&psxVuw[(i<<10)+j]), lcolor);
2494 if(j==xmax) PUTLE16(&psxVuw[(i<<10)+j], color);
2496 if(NextRow_F4()) return;
2503 for (i=ymin;i<=ymax;i++)
2505 xmin=left_x >> 16; if(drawX>xmin) xmin=drawX;
2506 xmax=(right_x >> 16)-1; if(drawW<xmax) xmax=drawW;
2508 for(j=xmin;j<xmax;j+=2)
2510 GetShadeTransCol32((uint32_t *)&psxVuw[(i<<10)+j],lcolor);
2512 if(j==xmax) GetShadeTransCol(&psxVuw[(i<<10)+j],color);
2514 if(NextRow_F4()) return;
2518 ////////////////////////////////////////////////////////////////////////
2519 // POLY 3/4 F-SHADED TEX PAL 4
2520 ////////////////////////////////////////////////////////////////////////
2522 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)
2524 int i,j,xmin,xmax,ymin,ymax;
2525 int32_t difX, difY,difX2, difY2;
2526 int32_t posX,posY,YAdjust,XAdjust;
2530 if(x1>drawW && x2>drawW && x3>drawW) return;
2531 if(y1>drawH && y2>drawH && y3>drawH) return;
2532 if(x1<drawX && x2<drawX && x3<drawX) return;
2533 if(y1<drawY && y2<drawY && y3<drawY) return;
2534 if(drawY>=drawH) return;
2535 if(drawX>=drawW) return;
2537 if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;
2541 for(ymin=Ymin;ymin<drawY;ymin++)
2542 if(NextRow_FT()) return;
2544 clutP=(clY<<10)+clX;
2546 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
2548 difX=delta_right_u;difX2=difX<<1;
2549 difY=delta_right_v;difY2=difY<<1;
2553 if(!bCheckMask && !DrawSemiTrans)
2555 for (i=ymin;i<=ymax;i++)
2557 xmin=(left_x >> 16);
2558 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!
2559 if(drawW<xmax) xmax=drawW;
2567 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
2569 for(j=xmin;j<xmax;j+=2)
2572 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(XAdjust>>1)];
2573 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
2574 XAdjust=((posX+difX)>>16);
2575 tC2 = psxVub[(((posY+difY)>>5)&(int32_t)0xFFFFF800)+YAdjust+
2577 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
2579 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
2580 GETLE16(&psxVuw[clutP+tC1])|
2581 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
2589 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+
2591 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
2592 GetTextureTransColG_S(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
2605 for (i=ymin;i<=ymax;i++)
2607 xmin=(left_x >> 16);
2608 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!
2609 if(drawW<xmax) xmax=drawW;
2617 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
2619 for(j=xmin;j<xmax;j+=2)
2622 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(XAdjust>>1)];
2623 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
2624 XAdjust=((posX+difX)>>16);
2625 tC2 = psxVub[(((posY+difY)>>5)&(int32_t)0xFFFFF800)+YAdjust+
2627 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
2629 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
2630 GETLE16(&psxVuw[clutP+tC1])|
2631 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
2639 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+
2641 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
2642 GetTextureTransColG(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
2652 ////////////////////////////////////////////////////////////////////////
2654 static void drawPoly3TEx4_IL(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3,short clX, short clY)
2656 int i,j,xmin,xmax,ymin,ymax,n_xi,n_yi,TXV;
2657 int32_t difX, difY,difX2, difY2;
2658 int32_t posX,posY,YAdjust,XAdjust;
2662 if(x1>drawW && x2>drawW && x3>drawW) return;
2663 if(y1>drawH && y2>drawH && y3>drawH) return;
2664 if(x1<drawX && x2<drawX && x3<drawX) return;
2665 if(y1<drawY && y2<drawY && y3<drawY) return;
2666 if(drawY>=drawH) return;
2667 if(drawX>=drawW) return;
2669 if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;
2673 for(ymin=Ymin;ymin<drawY;ymin++)
2674 if(NextRow_FT()) return;
2676 clutP=(clY<<10)+clX;
2678 YAdjust=(GlobalTextAddrY<<10)+GlobalTextAddrX;
2680 difX=delta_right_u;difX2=difX<<1;
2681 difY=delta_right_v;difY2=difY<<1;
2685 if(!bCheckMask && !DrawSemiTrans)
2687 for (i=ymin;i<=ymax;i++)
2689 xmin=(left_x >> 16);
2690 xmax=(right_x >> 16)-1;
2691 if(drawW<xmax) xmax=drawW;
2699 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
2701 for(j=xmin;j<xmax;j+=2)
2706 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
2707 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
2709 tC1= (GETLE16(&psxVuw[(n_yi<<10)+YAdjust+n_xi]) >> ((XAdjust & 0x03)<<2)) & 0x0f ;
2711 XAdjust=((posX+difX)>>16);
2713 TXV=(posY+difY)>>16;
2714 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
2715 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
2717 tC2= (GETLE16(&psxVuw[(n_yi<<10)+YAdjust+n_xi]) >> ((XAdjust & 0x03)<<2)) & 0x0f ;
2719 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
2720 GETLE16(&psxVuw[clutP+tC1])|
2721 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
2731 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
2732 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
2734 tC1= (GETLE16(&psxVuw[(n_yi<<10)+YAdjust+n_xi]) >> ((XAdjust & 0x03)<<2)) & 0x0f ;
2736 GetTextureTransColG_S(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
2749 for (i=ymin;i<=ymax;i++)
2751 xmin=(left_x >> 16);
2752 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!
2753 if(drawW<xmax) xmax=drawW;
2761 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
2763 for(j=xmin;j<xmax;j+=2)
2768 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
2769 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
2771 tC1= (GETLE16(&psxVuw[(n_yi<<10)+YAdjust+n_xi]) >> ((XAdjust & 0x03)<<2)) & 0x0f ;
2773 XAdjust=((posX+difX)>>16);
2775 TXV=(posY+difY)>>16;
2776 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
2777 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
2779 tC2= (GETLE16(&psxVuw[(n_yi<<10)+YAdjust+n_xi]) >> ((XAdjust & 0x03)<<2)) & 0x0f ;
2781 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
2782 GETLE16(&psxVuw[clutP+tC1])|
2783 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
2793 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
2794 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
2796 tC1= (GETLE16(&psxVuw[(n_yi<<10)+YAdjust+n_xi]) >> ((XAdjust & 0x03)<<2)) & 0x0f ;
2798 GetTextureTransColG(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
2808 ////////////////////////////////////////////////////////////////////////
2810 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)
2812 int i,j,xmin,xmax,ymin,ymax;
2813 int32_t difX, difY,difX2, difY2;
2814 int32_t posX,posY,YAdjust,XAdjust;
2818 if(x1>drawW && x2>drawW && x3>drawW) return;
2819 if(y1>drawH && y2>drawH && y3>drawH) return;
2820 if(x1<drawX && x2<drawX && x3<drawX) return;
2821 if(y1<drawY && y2<drawY && y3<drawY) return;
2822 if(drawY>=drawH) return;
2823 if(drawX>=drawW) return;
2825 if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;
2829 for(ymin=Ymin;ymin<drawY;ymin++)
2830 if(NextRow_FT()) return;
2832 clutP=(clY<<10)+clX;
2834 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
2835 YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0>>1);
2837 difX=delta_right_u;difX2=difX<<1;
2838 difY=delta_right_v;difY2=difY<<1;
2842 if(!bCheckMask && !DrawSemiTrans)
2844 for (i=ymin;i<=ymax;i++)
2846 xmin=(left_x >> 16);
2847 xmax=(right_x >> 16);//-1; //!!!!!!!!!!!!!!!!
2848 if(xmax>xmin) xmax--;
2850 if(drawW<xmax) xmax=drawW;
2858 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
2860 for(j=xmin;j<xmax;j+=2)
2862 XAdjust=(posX>>16)&TWin.xmask;
2863 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
2864 YAdjust+(XAdjust>>1)];
2865 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
2866 XAdjust=((posX+difX)>>16)&TWin.xmask;
2867 tC2 = psxVub[((((posY+difY)>>16)&TWin.ymask)<<11)+
2868 YAdjust+(XAdjust>>1)];
2869 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
2871 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
2872 GETLE16(&psxVuw[clutP+tC1])|
2873 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
2880 XAdjust=(posX>>16)&TWin.xmask;
2881 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
2882 YAdjust+(XAdjust>>1)];
2883 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
2884 GetTextureTransColG_S(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
2897 for (i=ymin;i<=ymax;i++)
2899 xmin=(left_x >> 16);
2900 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!
2901 if(drawW<xmax) xmax=drawW;
2909 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
2911 for(j=xmin;j<xmax;j+=2)
2913 XAdjust=(posX>>16)&TWin.xmask;
2914 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
2915 YAdjust+(XAdjust>>1)];
2916 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
2917 XAdjust=((posX+difX)>>16)&TWin.xmask;
2918 tC2 = psxVub[((((posY+difY)>>16)&TWin.ymask)<<11)+
2919 YAdjust+(XAdjust>>1)];
2920 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
2922 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
2923 GETLE16(&psxVuw[clutP+tC1])|
2924 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
2931 XAdjust=(posX>>16)&TWin.xmask;
2932 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
2933 YAdjust+(XAdjust>>1)];
2934 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
2935 GetTextureTransColG(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
2945 ////////////////////////////////////////////////////////////////////////
2949 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)
2951 drawPoly3TEx4(x2,y2,x3,y3,x4,y4,
2952 tx2,ty2,tx3,ty3,tx4,ty4,
2954 drawPoly3TEx4(x1,y1,x2,y2,x4,y4,
2955 tx1,ty1,tx2,ty2,tx4,ty4,
2963 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)
2966 int32_t i,j,xmin,xmax,ymin,ymax;
2967 int32_t difX, difY, difX2, difY2;
2968 int32_t posX,posY,YAdjust,clutP,XAdjust;
2971 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
2972 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
2973 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
2974 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
2975 if(drawY>=drawH) return;
2976 if(drawX>=drawW) return;
2978 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
2982 for(ymin=Ymin;ymin<drawY;ymin++)
2983 if(NextRow_FT4()) return;
2985 clutP=(clY<<10)+clX;
2987 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
2991 if(!bCheckMask && !DrawSemiTrans)
2993 for (i=ymin;i<=ymax;i++)
2995 xmin=(left_x >> 16);
2996 xmax=(right_x >> 16);
3005 difX=(right_u-posX)/num;
3006 difY=(right_v-posY)/num;
3011 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3012 xmax--;if(drawW<xmax) xmax=drawW;
3014 for(j=xmin;j<xmax;j+=2)
3017 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(XAdjust>>1)];
3018 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
3019 XAdjust=((posX+difX)>>16);
3020 tC2 = psxVub[(((posY+difY)>>5)&(int32_t)0xFFFFF800)+YAdjust+
3022 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
3024 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
3025 GETLE16(&psxVuw[clutP+tC1])|
3026 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
3033 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+
3035 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
3036 GetTextureTransColG_S(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
3040 if(NextRow_FT4()) return;
3047 for (i=ymin;i<=ymax;i++)
3049 xmin=(left_x >> 16);
3050 xmax=(right_x >> 16);
3059 difX=(right_u-posX)/num;
3060 difY=(right_v-posY)/num;
3065 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3066 xmax--;if(drawW<xmax) xmax=drawW;
3068 for(j=xmin;j<xmax;j+=2)
3071 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(XAdjust>>1)];
3072 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
3073 XAdjust=((posX+difX)>>16);
3074 tC2 = psxVub[(((posY+difY)>>5)&(int32_t)0xFFFFF800)+YAdjust+
3076 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
3078 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
3079 GETLE16(&psxVuw[clutP+tC1])|
3080 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
3087 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+
3089 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
3090 GetTextureTransColG(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
3093 if(NextRow_FT4()) return;
3097 ////////////////////////////////////////////////////////////////////////
3099 static void drawPoly4TEx4_IL(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,short clX, short clY)
3102 int32_t i,j=0,xmin,xmax,ymin,ymax,n_xi,n_yi,TXV;
3103 int32_t difX, difY, difX2, difY2;
3104 int32_t posX=0,posY=0,YAdjust,clutP,XAdjust;
3107 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
3108 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
3109 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
3110 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
3111 if(drawY>=drawH) return;
3112 if(drawX>=drawW) return;
3114 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
3118 for(ymin=Ymin;ymin<drawY;ymin++)
3119 if(NextRow_FT4()) return;
3121 clutP=(clY<<10)+clX;
3123 YAdjust=((GlobalTextAddrY)<<10)+GlobalTextAddrX;
3127 if(!bCheckMask && !DrawSemiTrans)
3129 for (i=ymin;i<=ymax;i++)
3131 xmin=(left_x >> 16);
3132 xmax=(right_x >> 16);
3141 difX=(right_u-posX)/num;
3142 difY=(right_v-posY)/num;
3147 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3148 xmax--;if(drawW<xmax) xmax=drawW;
3150 for(j=xmin;j<xmax;j+=2)
3155 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
3156 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
3158 tC1= (GETLE16(&psxVuw[(n_yi<<10)+YAdjust+n_xi]) >> ((XAdjust & 0x03)<<2)) & 0x0f ;
3160 XAdjust=((posX+difX)>>16);
3162 TXV=(posY+difY)>>16;
3163 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
3164 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
3166 tC2= (GETLE16(&psxVuw[(n_yi<<10)+YAdjust+n_xi]) >> ((XAdjust & 0x03)<<2)) & 0x0f ;
3168 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
3169 GETLE16(&psxVuw[clutP+tC1])|
3170 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
3182 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
3183 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
3185 tC1= (GETLE16(&psxVuw[(n_yi<<10)+YAdjust+n_xi]) >> ((XAdjust & 0x03)<<2)) & 0x0f ;
3187 GetTextureTransColG_S(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
3191 if(NextRow_FT4()) return;
3195 for (i=ymin;i<=ymax;i++)
3197 xmin=(left_x >> 16);
3198 xmax=(right_x >> 16);
3207 difX=(right_u-posX)/num;
3208 difY=(right_v-posY)/num;
3213 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3214 xmax--;if(drawW<xmax) xmax=drawW;
3216 for(j=xmin;j<xmax;j+=2)
3221 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
3222 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
3224 tC1= (GETLE16(&psxVuw[(n_yi<<10)+YAdjust+n_xi]) >> ((XAdjust & 0x03)<<2)) & 0x0f ;
3226 XAdjust=((posX+difX)>>16);
3228 TXV=(posY+difY)>>16;
3229 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
3230 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
3232 tC2= (GETLE16(&psxVuw[(n_yi<<10)+YAdjust+n_xi]) >> ((XAdjust & 0x03)<<2)) & 0x0f ;
3234 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
3235 GETLE16(&psxVuw[clutP+tC1])|
3236 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
3244 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
3245 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
3247 tC1= (GETLE16(&psxVuw[(n_yi<<10)+YAdjust+n_xi]) >> ((XAdjust & 0x03)<<2)) & 0x0f ;
3249 GetTextureTransColG(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
3252 if(NextRow_FT4()) return;
3256 ////////////////////////////////////////////////////////////////////////
3258 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)
3261 int32_t i,j,xmin,xmax,ymin,ymax;
3262 int32_t difX, difY, difX2, difY2;
3263 int32_t posX,posY,YAdjust,clutP,XAdjust;
3266 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
3267 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
3268 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
3269 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
3270 if(drawY>=drawH) return;
3271 if(drawX>=drawW) return;
3273 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
3277 for(ymin=Ymin;ymin<drawY;ymin++)
3278 if(NextRow_FT4()) return;
3280 clutP=(clY<<10)+clX;
3282 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
3283 YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0>>1);
3287 if(!bCheckMask && !DrawSemiTrans)
3289 for (i=ymin;i<=ymax;i++)
3291 xmin=(left_x >> 16);
3292 xmax=(right_x >> 16);
3301 difX=(right_u-posX)/num;
3302 difY=(right_v-posY)/num;
3307 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3308 xmax--;if(drawW<xmax) xmax=drawW;
3310 for(j=xmin;j<xmax;j+=2)
3312 XAdjust=(posX>>16)&TWin.xmask;
3313 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
3314 YAdjust+(XAdjust>>1)];
3315 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
3316 XAdjust=((posX+difX)>>16)&TWin.xmask;
3317 tC2 = psxVub[((((posY+difY)>>16)&TWin.ymask)<<11)+
3318 YAdjust+(XAdjust>>1)];
3319 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
3321 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
3322 GETLE16(&psxVuw[clutP+tC1])|
3323 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
3329 XAdjust=(posX>>16)&TWin.xmask;
3330 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
3331 YAdjust+(XAdjust>>1)];
3332 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
3333 GetTextureTransColG_S(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
3336 if(NextRow_FT4()) return;
3343 for (i=ymin;i<=ymax;i++)
3345 xmin=(left_x >> 16);
3346 xmax=(right_x >> 16);
3355 difX=(right_u-posX)/num;
3356 difY=(right_v-posY)/num;
3361 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3362 xmax--;if(drawW<xmax) xmax=drawW;
3364 for(j=xmin;j<xmax;j+=2)
3366 XAdjust=(posX>>16)&TWin.xmask;
3367 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
3368 YAdjust+(XAdjust>>1)];
3369 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
3370 XAdjust=((posX+difX)>>16)&TWin.xmask;
3371 tC2 = psxVub[((((posY+difY)>>16)&TWin.ymask)<<11)+
3372 YAdjust+(XAdjust>>1)];
3373 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
3375 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
3376 GETLE16(&psxVuw[clutP+tC1])|
3377 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
3383 XAdjust=(posX>>16)&TWin.xmask;
3384 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
3385 YAdjust+(XAdjust>>1)];
3386 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
3387 GetTextureTransColG(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
3390 if(NextRow_FT4()) return;
3394 ////////////////////////////////////////////////////////////////////////
3396 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)
3399 int32_t i,j,xmin,xmax,ymin,ymax;
3400 int32_t difX, difY, difX2, difY2;
3401 int32_t posX,posY,YAdjust,clutP,XAdjust;
3404 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
3405 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
3406 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
3407 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
3408 if(drawY>=drawH) return;
3409 if(drawX>=drawW) return;
3411 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
3415 for(ymin=Ymin;ymin<drawY;ymin++)
3416 if(NextRow_FT4()) return;
3418 clutP=(clY<<10)+clX;
3420 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
3421 YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0>>1);
3425 if(!bCheckMask && !DrawSemiTrans)
3427 for (i=ymin;i<=ymax;i++)
3429 xmin=(left_x >> 16);
3430 xmax=(right_x >> 16);
3439 difX=(right_u-posX)/num;
3440 difY=(right_v-posY)/num;
3445 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3446 xmax--;if(drawW<xmax) xmax=drawW;
3448 for(j=xmin;j<xmax;j+=2)
3450 XAdjust=(posX>>16)&TWin.xmask;
3451 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
3452 YAdjust+(XAdjust>>1)];
3453 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
3454 XAdjust=((posX+difX)>>16)&TWin.xmask;
3455 tC2 = psxVub[((((posY+difY)>>16)&TWin.ymask)<<11)+
3456 YAdjust+(XAdjust>>1)];
3457 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
3459 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
3460 GETLE16(&psxVuw[clutP+tC1])|
3461 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
3467 XAdjust=(posX>>16)&TWin.xmask;
3468 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
3469 YAdjust+(XAdjust>>1)];
3470 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
3471 GetTextureTransColG_S(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
3474 if(NextRow_FT4()) return;
3481 for (i=ymin;i<=ymax;i++)
3483 xmin=(left_x >> 16);
3484 xmax=(right_x >> 16);
3493 difX=(right_u-posX)/num;
3494 difY=(right_v-posY)/num;
3499 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3500 xmax--;if(drawW<xmax) xmax=drawW;
3502 for(j=xmin;j<xmax;j+=2)
3504 XAdjust=(posX>>16)&TWin.xmask;
3505 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
3506 YAdjust+(XAdjust>>1)];
3507 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
3508 XAdjust=((posX+difX)>>16)&TWin.xmask;
3509 tC2 = psxVub[((((posY+difY)>>16)&TWin.ymask)<<11)+
3510 YAdjust+(XAdjust>>1)];
3511 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
3513 GetTextureTransColG32_SPR((uint32_t *)&psxVuw[(i<<10)+j],
3514 GETLE16(&psxVuw[clutP+tC1])|
3515 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
3521 XAdjust=(posX>>16)&TWin.xmask;
3522 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
3523 YAdjust+(XAdjust>>1)];
3524 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
3525 GetTextureTransColG_SPR(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
3528 if(NextRow_FT4()) return;
3531 ////////////////////////////////////////////////////////////////////////
3532 // POLY 3 F-SHADED TEX PAL 8
3533 ////////////////////////////////////////////////////////////////////////
3535 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)
3537 int i,j,xmin,xmax,ymin,ymax;
3538 int32_t difX, difY,difX2, difY2;
3539 int32_t posX,posY,YAdjust,clutP;
3542 if(x1>drawW && x2>drawW && x3>drawW) return;
3543 if(y1>drawH && y2>drawH && y3>drawH) return;
3544 if(x1<drawX && x2<drawX && x3<drawX) return;
3545 if(y1<drawY && y2<drawY && y3<drawY) return;
3546 if(drawY>=drawH) return;
3547 if(drawX>=drawW) return;
3549 if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;
3553 for(ymin=Ymin;ymin<drawY;ymin++)
3554 if(NextRow_FT()) return;
3556 clutP=(clY<<10)+clX;
3558 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
3560 difX=delta_right_u;difX2=difX<<1;
3561 difY=delta_right_v;difY2=difY<<1;
3565 if(!bCheckMask && !DrawSemiTrans)
3567 for (i=ymin;i<=ymax;i++)
3569 xmin=(left_x >> 16);
3570 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!
3571 if(drawW<xmax) xmax=drawW;
3579 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3581 for(j=xmin;j<xmax;j+=2)
3583 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(posX>>16)];
3584 tC2 = psxVub[(((posY+difY)>>5)&(int32_t)0xFFFFF800)+YAdjust+
3586 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
3587 GETLE16(&psxVuw[clutP+tC1])|
3588 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
3595 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(posX>>16)];
3596 GetTextureTransColG_S(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
3609 for (i=ymin;i<=ymax;i++)
3611 xmin=(left_x >> 16);
3612 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!
3613 if(drawW<xmax) xmax=drawW;
3621 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3623 for(j=xmin;j<xmax;j+=2)
3625 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(posX>>16)];
3626 tC2 = psxVub[(((posY+difY)>>5)&(int32_t)0xFFFFF800)+YAdjust+
3628 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
3629 GETLE16(&psxVuw[clutP+tC1])|
3630 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
3637 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(posX>>16)];
3638 GetTextureTransColG(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
3649 ////////////////////////////////////////////////////////////////////////
3651 static void drawPoly3TEx8_IL(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3,short clX, short clY)
3653 int i,j,xmin,xmax,ymin,ymax,n_xi,n_yi,TXV,TXU;
3654 int32_t difX, difY,difX2, difY2;
3655 int32_t posX,posY,YAdjust,clutP;
3658 if(x1>drawW && x2>drawW && x3>drawW) return;
3659 if(y1>drawH && y2>drawH && y3>drawH) return;
3660 if(x1<drawX && x2<drawX && x3<drawX) return;
3661 if(y1<drawY && y2<drawY && y3<drawY) return;
3662 if(drawY>=drawH) return;
3663 if(drawX>=drawW) return;
3665 if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;
3669 for(ymin=Ymin;ymin<drawY;ymin++)
3670 if(NextRow_FT()) return;
3672 clutP=(clY<<10)+clX;
3674 YAdjust=(GlobalTextAddrY<<10)+GlobalTextAddrX;
3676 difX=delta_right_u;difX2=difX<<1;
3677 difY=delta_right_v;difY2=difY<<1;
3681 if(!bCheckMask && !DrawSemiTrans)
3683 for (i=ymin;i<=ymax;i++)
3685 xmin=(left_x >> 16);
3686 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!
3687 if(drawW<xmax) xmax=drawW;
3695 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3697 for(j=xmin;j<xmax;j+=2)
3701 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
3702 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
3704 tC1= (GETLE16(&psxVuw[(n_yi<<10)+YAdjust+n_xi]) >> ((TXU & 0x01)<<3)) & 0xff;
3706 TXU=(posX+difX)>>16;
3707 TXV=(posY+difY)>>16;
3708 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
3709 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
3711 tC2= (GETLE16(&psxVuw[(n_yi<<10)+YAdjust+n_xi]) >> ((TXU & 0x01)<<3)) & 0xff;
3713 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
3714 GETLE16(&psxVuw[clutP+tC1])|
3715 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
3724 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
3725 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
3727 tC1= (GETLE16(&psxVuw[(n_yi<<10)+YAdjust+n_xi]) >> ((TXU & 0x01)<<3)) & 0xff;
3729 GetTextureTransColG_S(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
3742 for (i=ymin;i<=ymax;i++)
3744 xmin=(left_x >> 16);
3745 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!
3746 if(drawW<xmax) xmax=drawW;
3754 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3756 for(j=xmin;j<xmax;j+=2)
3760 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
3761 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
3763 tC1= (GETLE16(&psxVuw[(n_yi<<10)+YAdjust+n_xi]) >> ((TXU & 0x01)<<3)) & 0xff;
3765 TXU=(posX+difX)>>16;
3766 TXV=(posY+difY)>>16;
3767 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
3768 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
3770 tC2= (GETLE16(&psxVuw[(n_yi<<10)+YAdjust+n_xi]) >> ((TXU & 0x01)<<3)) & 0xff;
3772 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
3773 GETLE16(&psxVuw[clutP+tC1])|
3774 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
3783 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
3784 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
3786 tC1= (GETLE16(&psxVuw[(n_yi<<10)+YAdjust+n_xi]) >> ((TXU & 0x01)<<3)) & 0xff;
3788 GetTextureTransColG(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
3799 ////////////////////////////////////////////////////////////////////////
3801 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)
3803 int i,j,xmin,xmax,ymin,ymax;
3804 int32_t difX, difY,difX2, difY2;
3805 int32_t posX,posY,YAdjust,clutP;
3808 if(x1>drawW && x2>drawW && x3>drawW) return;
3809 if(y1>drawH && y2>drawH && y3>drawH) return;
3810 if(x1<drawX && x2<drawX && x3<drawX) return;
3811 if(y1<drawY && y2<drawY && y3<drawY) return;
3812 if(drawY>=drawH) return;
3813 if(drawX>=drawW) return;
3815 if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;
3819 for(ymin=Ymin;ymin<drawY;ymin++)
3820 if(NextRow_FT()) return;
3822 clutP=(clY<<10)+clX;
3824 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
3825 YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0);
3827 difX=delta_right_u;difX2=difX<<1;
3828 difY=delta_right_v;difY2=difY<<1;
3832 if(!bCheckMask && !DrawSemiTrans)
3834 for (i=ymin;i<=ymax;i++)
3836 xmin=(left_x >> 16);
3837 xmax=(right_x >> 16);//-1; //!!!!!!!!!!!!!!!!
3838 if(xmax>xmin) xmax--;
3840 if(drawW<xmax) xmax=drawW;
3848 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3850 for(j=xmin;j<xmax;j+=2)
3852 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
3853 YAdjust+((posX>>16)&TWin.xmask)];
3854 tC2 = psxVub[((((posY+difY)>>16)&TWin.ymask)<<11)+
3855 YAdjust+(((posX+difX)>>16)&TWin.xmask)];
3856 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
3857 GETLE16(&psxVuw[clutP+tC1])|
3858 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
3865 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
3866 YAdjust+((posX>>16)&TWin.xmask)];
3867 GetTextureTransColG_S(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
3880 for (i=ymin;i<=ymax;i++)
3882 xmin=(left_x >> 16);
3883 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!
3884 if(drawW<xmax) xmax=drawW;
3892 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3894 for(j=xmin;j<xmax;j+=2)
3896 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
3897 YAdjust+((posX>>16)&TWin.xmask)];
3898 tC2 = psxVub[((((posY+difY)>>16)&TWin.ymask)<<11)+
3899 YAdjust+(((posX+difX)>>16)&TWin.xmask)];
3900 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
3901 GETLE16(&psxVuw[clutP+tC1])|
3902 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
3909 tC1 = psxVub[(((posY>>16)&TWin.ymask)<<11)+
3910 YAdjust+((posX>>16)&TWin.xmask)];
3911 GetTextureTransColG(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
3922 ////////////////////////////////////////////////////////////////////////
3926 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)
3928 drawPoly3TEx8(x2,y2,x3,y3,x4,y4,
3929 tx2,ty2,tx3,ty3,tx4,ty4,
3932 drawPoly3TEx8(x1,y1,x2,y2,x4,y4,
3933 tx1,ty1,tx2,ty2,tx4,ty4,
3941 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)
3944 int32_t i,j,xmin,xmax,ymin,ymax;
3945 int32_t difX, difY, difX2, difY2;
3946 int32_t posX,posY,YAdjust,clutP;
3949 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
3950 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
3951 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
3952 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
3953 if(drawY>=drawH) return;
3954 if(drawX>=drawW) return;
3956 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
3960 for(ymin=Ymin;ymin<drawY;ymin++)
3961 if(NextRow_FT4()) return;
3963 clutP=(clY<<10)+clX;
3965 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
3969 if(!bCheckMask && !DrawSemiTrans)
3971 for (i=ymin;i<=ymax;i++)
3973 xmin=(left_x >> 16);
3974 xmax=(right_x >> 16);
3983 difX=(right_u-posX)/num;
3984 difY=(right_v-posY)/num;
3989 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
3990 xmax--;if(drawW<xmax) xmax=drawW;
3992 for(j=xmin;j<xmax;j+=2)
3994 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(posX>>16)];
3995 tC2 = psxVub[(((posY+difY)>>5)&(int32_t)0xFFFFF800)+YAdjust+
3997 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
3998 GETLE16(&psxVuw[clutP+tC1])|
3999 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
4005 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(posX>>16)];
4006 GetTextureTransColG_S(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
4009 if(NextRow_FT4()) return;
4016 for (i=ymin;i<=ymax;i++)
4018 xmin=(left_x >> 16);
4019 xmax=(right_x >> 16);
4028 difX=(right_u-posX)/num;
4029 difY=(right_v-posY)/num;
4034 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
4035 xmax--;if(drawW<xmax) xmax=drawW;
4037 for(j=xmin;j<xmax;j+=2)
4039 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(posX>>16)];
4040 tC2 = psxVub[(((posY+difY)>>5)&(int32_t)0xFFFFF800)+YAdjust+
4042 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
4043 GETLE16(&psxVuw[clutP+tC1])|
4044 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
4050 tC1 = psxVub[((posY>>5)&(int32_t)0xFFFFF800)+YAdjust+(posX>>16)];
4051 GetTextureTransColG(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
4054 if(NextRow_FT4()) return;
4058 ////////////////////////////////////////////////////////////////////////
4060 static void drawPoly4TEx8_IL(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,short clX, short clY)
4063 int32_t i,j,xmin,xmax,ymin,ymax,n_xi,n_yi,TXV,TXU;
4064 int32_t difX, difY, difX2, difY2;
4065 int32_t posX,posY,YAdjust,clutP;
4068 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
4069 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
4070 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
4071 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
4072 if(drawY>=drawH) return;
4073 if(drawX>=drawW) return;
4075 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
4079 for(ymin=Ymin;ymin<drawY;ymin++)
4080 if(NextRow_FT4()) return;
4082 clutP=(clY<<10)+clX;
4084 YAdjust=(GlobalTextAddrY<<10)+GlobalTextAddrX;
4088 if(!bCheckMask && !DrawSemiTrans)
4090 for (i=ymin;i<=ymax;i++)
4092 xmin=(left_x >> 16);
4093 xmax=(right_x >> 16);
4102 difX=(right_u-posX)/num;
4103 difY=(right_v-posY)/num;
4108 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
4109 xmax--;if(drawW<xmax) xmax=drawW;
4111 for(j=xmin;j<xmax;j+=2)
4115 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
4116 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
4118 tC1= (GETLE16(&psxVuw[(n_yi<<10)+YAdjust+n_xi]) >> ((TXU & 0x01)<<3)) & 0xff;
4120 TXU=(posX+difX)>>16;
4121 TXV=(posY+difY)>>16;
4122 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
4123 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
4125 tC2= (GETLE16(&psxVuw[(n_yi<<10)+YAdjust+n_xi]) >> ((TXU & 0x01)<<3)) & 0xff;
4127 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
4128 GETLE16(&psxVuw[clutP+tC1])|
4129 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
4137 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
4138 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
4140 tC1= (GETLE16(&psxVuw[(n_yi<<10)+YAdjust+n_xi]) >> ((TXU & 0x01)<<3)) & 0xff;
4142 GetTextureTransColG_S(&psxVuw[(i<<10)+j],GETLE16(&psxVuw[clutP+tC1]));
4145 if(NextRow_FT4()) return;
4152 for (i=ymin;i<=ymax;i++)
4154 xmin=(left_x >> 16);
4155 xmax=(right_x >> 16);
4164 difX=(right_u-posX)/num;
4165 difY=(right_v-posY)/num;
4170 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
4171 xmax--;if(drawW<xmax) xmax=drawW;
4173 for(j=xmin;j<xmax;j+=2)
4177 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
4178 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
4180 tC1= (GETLE16(&psxVuw[(n_yi<<10)+YAdjust+n_xi]) >> ((TXU & 0x01)<<3)) & 0xff;
4182 TXU=(posX+difX)>>16;
4183 TXV=(posY+difY)>>16;
4184 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
4185 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
4187 tC2= (GETLE16(&psxVuw[(n_yi<<10)+YAdjust+n_xi]) >> ((TXU & 0x01)<<3)) & 0xff;
4189 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
4190 GETLE16(&psxVuw[clutP+tC1])|
4191 ((int32_t)GETLE16(&psxVuw[clutP+tC2]))<<16);
4199 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV <<&n