cc68a136 |
1 | \r |
2 | #include "app.h"\r |
3 | \r |
4 | IDirect3DTexture8 *TexScreen=NULL;\r |
5 | int TexWidth=0,TexHeight=0;\r |
6 | \r |
7 | // Blank the texture:\r |
8 | static int TexBlank()\r |
9 | {\r |
10 | D3DLOCKED_RECT lock={0,NULL};\r |
11 | unsigned char *dest=NULL;\r |
12 | int y=0,line=0;\r |
13 | \r |
14 | TexScreen->LockRect(0,&lock,NULL,0); if (lock.pBits==NULL) return 1;\r |
15 | \r |
16 | dest=(unsigned char *)lock.pBits;\r |
17 | for (y=0; y<TexHeight; y++,line+=lock.Pitch)\r |
18 | {\r |
19 | memset(dest+line,0,TexWidth<<1);\r |
20 | }\r |
21 | \r |
22 | TexScreen->UnlockRect(0);\r |
23 | return 0;\r |
24 | }\r |
25 | \r |
26 | int TexScreenInit()\r |
27 | {\r |
28 | TexWidth =512;\r |
29 | TexHeight=512;\r |
30 | \r |
31 | Device->CreateTexture(TexWidth,TexHeight,1,0,D3DFMT_R5G6B5,D3DPOOL_MANAGED,&TexScreen);\r |
32 | if (TexScreen==NULL) return 1;\r |
33 | \r |
34 | TexBlank();\r |
35 | return 0;\r |
36 | }\r |
37 | \r |
38 | void TexScreenExit()\r |
39 | {\r |
40 | RELEASE(TexScreen)\r |
41 | TexWidth=TexHeight=0;\r |
42 | }\r |
43 | \r |
44 | // Copy screen to a swizzled texture\r |
45 | int TexScreenSwizzle()\r |
46 | {\r |
47 | D3DLOCKED_RECT lock={0,NULL};\r |
48 | unsigned char *dest=NULL;\r |
49 | int y=0,sy=0,mask=0;\r |
50 | unsigned short *ps=NULL;\r |
51 | \r |
52 | mask=TexWidth*TexHeight-1;\r |
53 | \r |
54 | TexScreen->LockRect(0,&lock,NULL,0); if (lock.pBits==NULL) return 1;\r |
55 | \r |
56 | dest=(unsigned char *)lock.pBits;\r |
57 | ps=EmuScreen;\r |
58 | \r |
59 | // Write to swizzled locations:\r |
60 | for (y=0,sy=0; y<EmuHeight; y++,sy++)\r |
61 | {\r |
62 | int x=0,sx=0;\r |
63 | sy|=0x55555555;\r |
64 | \r |
65 | for (x=0,sx=0; x<EmuWidth; x++,sx++)\r |
66 | {\r |
67 | int addr=0;\r |
68 | \r |
69 | sx|=0xaaaaaaaa;\r |
70 | addr=sx&sy&mask; // Calculate swizzled address\r |
71 | \r |
72 | ((unsigned short *)dest)[addr]=*ps++;\r |
73 | }\r |
74 | }\r |
75 | \r |
76 | TexScreen->UnlockRect(0);\r |
77 | \r |
78 | return 0;\r |
79 | }\r |
80 | \r |
81 | // Copy screen to a linear texture:\r |
82 | int TexScreenLinear()\r |
83 | {\r |
84 | D3DLOCKED_RECT lock={0,NULL};\r |
85 | unsigned char *dest=NULL;\r |
86 | int y=0,line=0;\r |
87 | unsigned short *ps=NULL;\r |
88 | \r |
89 | TexScreen->LockRect(0,&lock,NULL,0); if (lock.pBits==NULL) return 1;\r |
90 | \r |
91 | dest=(unsigned char *)lock.pBits;\r |
92 | ps=EmuScreen;\r |
93 | \r |
94 | for (y=0; y<EmuHeight; y++,line+=lock.Pitch)\r |
95 | {\r |
96 | int x=0;\r |
97 | int addr=line;\r |
98 | \r |
99 | for (x=0; x<EmuWidth; x++,addr+=2)\r |
100 | {\r |
101 | *(unsigned int *)(dest+addr)=*ps++;\r |
102 | }\r |
103 | }\r |
104 | \r |
105 | TexScreen->UnlockRect(0);\r |
106 | return 0;\r |
107 | }\r |