File: SWTri_Pixel8888.cpp

package info (click to toggle)
libtuxcap 1.4.0.dfsg2-2.1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 4,176 kB
  • sloc: cpp: 43,203; ansic: 3,095; python: 774; objc: 242; makefile: 100; xml: 87
file content (88 lines) | stat: -rw-r--r-- 2,198 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
// This file is included by SWTri.cpp and should not be built directly by the project.

	#if defined(TEXTURED)
	{
		#include "SWTri_GetTexel.cpp"
		
		if (alpha > 0x08)
		{
			#include "SWTri_TexelARGB.cpp"
				
			#if defined(GLOBAL_ARGB) || defined (TEX_ALPHA) || defined(MOD_ARGB)
			{
				if (alpha < 0xf0)
				{
					unsigned int p = *pix;
					unsigned int da = p >> 24;
					
					unsigned int tr,tg,tb;
					#if !defined(LINEAR_BLEND)
					{
						tr = ((tex&0xFF0000)*alpha)&0xFF000000;
						tg = ((tex&0x00FF00)*alpha)&0x00FF0000;
						tb = ((tex&0x0000FF)*alpha)&0x0000FF00;
					}
					#else
					{
						tr = (tex&0xFF0000)<<8;
						tg = (tex&0x00FF00)<<8;
						tb = (tex&0x0000FF)<<8;
					}
					#endif
					
					unsigned int dr = (((p&0xFF0000)*da)>>8) & 0xFF0000;
					unsigned int dg = (((p&0x00FF00)*da)>>8) & 0x00FF00;
					unsigned int db = (((p&0x0000FF)*da)>>8) & 0x0000FF;
					
					int finalAlpha = 256 - (((256 - alpha)*(256 - da))>>8);
					tr = ((tr + (256-alpha)*dr)/finalAlpha) & 0xFF0000;
					tg = ((tg + (256-alpha)*dg)/finalAlpha) & 0x00FF00;
					tb = ((tb + (256-alpha)*db)/finalAlpha) & 0x0000FF;
					
					*pix = ((finalAlpha-1)<<24) | tr | tg | tb; 
				}
				else
				{
					*pix = tex | 0xFF000000;
				}
			}
			#else
			{
				*pix = tex | 0xFF000000;
			}
			#endif
		}
	}
	#elif defined(MOD_ARGB)
	{
		if (a > 0xf00000)
		{
			*pix = 0xFF000000 | ((r)&0xff0000)|((g>>8)&0xff00)|((b>>16)&0xff);
		}
		else if (a > 0x080000)
		{
			unsigned int p = *pix;
			unsigned int da = p >> 24;
			
			int alpha = a>>16;

			unsigned int tr = ((r)*(alpha))&0xFF000000;
			unsigned int tg = ((g>>8)*(alpha))&0x00FF0000;
			unsigned int tb = ((b>>16)*(alpha))&0x0000FF00;
			
			unsigned int dr = (((p&0xFF0000)*da)>>8) & 0xFF0000;
			unsigned int dg = (((p&0x00FF00)*da)>>8) & 0x00FF00;
			unsigned int db = (((p&0x0000FF)*da)>>8) & 0x0000FF;
			
			int finalAlpha = 256 - (((256 - alpha)*(256 - da))>>8);
			tr = ((tr + (256-alpha)*dr)/finalAlpha) & 0xFF0000;
			tg = ((tg + (256-alpha)*dg)/finalAlpha) & 0x00FF00;
			tb = ((tb + (256-alpha)*db)/finalAlpha) & 0x0000FF;
			
			*pix = ((finalAlpha-1)<<24) | tr | tg | tb;
		}
		else
			asm("nop");
	}
	#endif