psx_gpu: more limit checking
[pcsx_rearmed.git] / plugins / gpu_unai / gpu_raster_image.h
CommitLineData
86aad47b 1/***************************************************************************
2 * Copyright (C) 2010 PCSX4ALL Team *
3 * Copyright (C) 2010 Unai *
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. *
19 ***************************************************************************/
20
21///////////////////////////////////////////////////////////////////////////////
22INLINE void gpuLoadImage(void)
23{
24 u16 x0, y0, w0, h0;
25 x0 = PacketBuffer.U2[2] & 1023;
26 y0 = PacketBuffer.U2[3] & 511;
27 w0 = PacketBuffer.U2[4];
28 h0 = PacketBuffer.U2[5];
29
30 if ((y0 + h0) > FRAME_HEIGHT)
31 {
32 h0 = FRAME_HEIGHT - y0;
33 }
34
35 FrameToWrite = ((w0)&&(h0));
36
37 px = 0;
38 py = 0;
39 x_end = w0;
40 y_end = h0;
41 pvram = &((u16*)GPU_FrameBuffer)[x0+(y0*1024)];
42
43 GPU_GP1 |= 0x08000000;
44}
45
46///////////////////////////////////////////////////////////////////////////////
47INLINE void gpuStoreImage(void)
48{
49 u16 x0, y0, w0, h0;
50 x0 = PacketBuffer.U2[2] & 1023;
51 y0 = PacketBuffer.U2[3] & 511;
52 w0 = PacketBuffer.U2[4];
53 h0 = PacketBuffer.U2[5];
54
55 if ((y0 + h0) > FRAME_HEIGHT)
56 {
57 h0 = FRAME_HEIGHT - y0;
58 }
59 FrameToRead = ((w0)&&(h0));
60
61 px = 0;
62 py = 0;
63 x_end = w0;
64 y_end = h0;
65 pvram = &((u16*)GPU_FrameBuffer)[x0+(y0*1024)];
66
67 GPU_GP1 |= 0x08000000;
68}
69
70INLINE void gpuMoveImage(void)
71{
72 u32 x0, y0, x1, y1;
73 s32 w0, h0;
74 x0 = PacketBuffer.U2[2] & 1023;
75 y0 = PacketBuffer.U2[3] & 511;
76 x1 = PacketBuffer.U2[4] & 1023;
77 y1 = PacketBuffer.U2[5] & 511;
78 w0 = PacketBuffer.U2[6];
79 h0 = PacketBuffer.U2[7];
80
81 if( (x0==x1) && (y0==y1) ) return;
82 if ((w0<=0) || (h0<=0)) return;
83
84 if (((y0+h0)>512)||((x0+w0)>1024)||((y1+h0)>512)||((x1+w0)>1024))
85 {
86 u16 *psxVuw=GPU_FrameBuffer;
be013764 87 s32 i,j;
86aad47b 88 for(j=0;j<h0;j++)
89 for(i=0;i<w0;i++)
90 psxVuw [(1024*((y1+j)&511))+((x1+i)&0x3ff)]=
91 psxVuw[(1024*((y0+j)&511))+((x0+i)&0x3ff)];
92 }
93 else if ((x0&1)||(x1&1))
94 {
95 u16 *lpDst, *lpSrc;
96 lpDst = lpSrc = (u16*)GPU_FrameBuffer;
97 lpSrc += FRAME_OFFSET(x0, y0);
98 lpDst += FRAME_OFFSET(x1, y1);
99 x1 = FRAME_WIDTH - w0;
100 do {
101 x0=w0;
102 do { *lpDst++ = *lpSrc++; } while (--x0);
103 lpDst += x1;
104 lpSrc += x1;
105 } while (--h0);
106 }
107 else
108 {
109 u32 *lpDst, *lpSrc;
110 lpDst = lpSrc = (u32*)(void*)GPU_FrameBuffer;
111 lpSrc += ((FRAME_OFFSET(x0, y0))>>1);
112 lpDst += ((FRAME_OFFSET(x1, y1))>>1);
113 if (w0&1)
114 {
115 x1 = (FRAME_WIDTH - w0 +1)>>1;
116 w0>>=1;
117 if (!w0) {
118 do {
119 *((u16*)lpDst) = *((u16*)lpSrc);
120 lpDst += x1;
121 lpSrc += x1;
122 } while (--h0);
123 } else
124 do {
125 x0=w0;
126 do { *lpDst++ = *lpSrc++; } while (--x0);
127 *((u16*)lpDst) = *((u16*)lpSrc);
128 lpDst += x1;
129 lpSrc += x1;
130 } while (--h0);
131 }
132 else
133 {
134 x1 = (FRAME_WIDTH - w0)>>1;
135 w0>>=1;
136 do {
137 x0=w0;
138 do { *lpDst++ = *lpSrc++; } while (--x0);
139 lpDst += x1;
140 lpSrc += x1;
141 } while (--h0);
142 }
143 }
144}
145
146INLINE void gpuClearImage(void)
147{
148 s32 x0, y0, w0, h0;
149 x0 = PacketBuffer.S2[2];
150 y0 = PacketBuffer.S2[3];
151 w0 = PacketBuffer.S2[4] & 0x3ff;
152 h0 = PacketBuffer.S2[5] & 0x3ff;
153
154 w0 += x0;
155 if (x0 < 0) x0 = 0;
156 if (w0 > FRAME_WIDTH) w0 = FRAME_WIDTH;
157 w0 -= x0;
158 if (w0 <= 0) return;
159 h0 += y0;
160 if (y0 < 0) y0 = 0;
161 if (h0 > FRAME_HEIGHT) h0 = FRAME_HEIGHT;
162 h0 -= y0;
163 if (h0 <= 0) return;
164
165 if (x0&1)
166 {
167 u16* pixel = (u16*)GPU_FrameBuffer + FRAME_OFFSET(x0, y0);
168 u16 rgb = GPU_RGB16(PacketBuffer.S4[0]);
169 y0 = FRAME_WIDTH - w0;
170 do {
171 x0=w0;
172 do { *pixel++ = rgb; } while (--x0);
173 pixel += y0;
174 } while (--h0);
175 }
176 else
177 {
178 u32* pixel = (u32*)(void*)GPU_FrameBuffer + ((FRAME_OFFSET(x0, y0))>>1);
179 u32 rgb = GPU_RGB16(PacketBuffer.S4[0]);
180 rgb |= (rgb<<16);
181 if (w0&1)
182 {
183 y0 = (FRAME_WIDTH - w0 +1)>>1;
184 w0>>=1;
185 do {
186 x0=w0;
187 do { *pixel++ = rgb; } while (--x0);
188 *((u16*)pixel) = (u16)rgb;
189 pixel += y0;
190 } while (--h0);
191 }
192 else
193 {
194 y0 = (FRAME_WIDTH - w0)>>1;
195 w0>>=1;
196 do {
197 x0=w0;
198 do { *pixel++ = rgb; } while (--x0);
199 pixel += y0;
200 } while (--h0);
201 }
202 }
203}