1 /***************************************************************************
2 * Copyright (C) 2010 PCSX4ALL Team *
3 * Copyright (C) 2010 Unai *
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. *
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. *
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 ***************************************************************************/
21 ///////////////////////////////////////////////////////////////////////////////
22 // GPU internal line drawing functions
25 #define GPU_DIGITSC (GPU_DIGITS+3)
27 INLINE long GPU_DIV(long rs, long rt)
29 return rt ? (rs / rt) : (0);
32 ///////////////////////////////////////////////////////////////////////////////
33 void gpuDrawLF(const PD gpuPixelDriver)
41 x0 = PacketBuffer.S2[2] + DrawingOffset[0]; GPU_TESTRANGE(x0);
42 y0 = PacketBuffer.S2[3] + DrawingOffset[1]; GPU_TESTRANGE(y0);
43 x1 = PacketBuffer.S2[4] + DrawingOffset[0]; GPU_TESTRANGE(x1);
44 y1 = PacketBuffer.S2[5] + DrawingOffset[1]; GPU_TESTRANGE(y1);
46 xmin = DrawingArea[0]; xmax = DrawingArea[2];
47 ymin = DrawingArea[1]; ymax = DrawingArea[3];
48 const u16 pixeldata = GPU_RGB16(PacketBuffer.U4[0]);
56 GPU_SWAP(x0, x1, temp);
57 GPU_SWAP(y0, y1, temp);
59 y1 = GPU_DIV((y1 - y0) << GPU_DIGITS, dx);
66 if (x1 > xmax) x1 = xmax;
70 const int li=linesInterlace;
72 temp = y0 >> GPU_DIGITS;
73 if( 0 == (temp&li) ) {
74 if ((u32) (temp - ymin) < (u32) (ymax - ymin)) {
75 gpuPixelDriver(&((u16*)GPU_FrameBuffer)[FRAME_OFFSET(x0, temp)],pixeldata);
83 GPU_SWAP(x0, x1, temp);
84 GPU_SWAP(y0, y1, temp);
86 x1 = GPU_DIV((x1 - x0) << GPU_DIGITS, dy);
93 if (y1 > ymax) y1 = ymax;
97 const int li=linesInterlace;
100 temp = x0 >> GPU_DIGITS;
101 if ((u32) (temp - xmin) < (u32) (xmax - xmin)) {
102 gpuPixelDriver(&((u16*)GPU_FrameBuffer)[FRAME_OFFSET(temp, y0)],pixeldata);
110 if( 0 == (y0&linesInterlace) ) {
111 if ((u32) (x0 - xmin) < (u32) (xmax - xmin)) {
112 if ((u32) (y0 - ymin) < (u32) (ymax - ymin)) {
113 gpuPixelDriver(&((u16*)GPU_FrameBuffer)[FRAME_OFFSET(x0, y0)],pixeldata);
120 /*----------------------------------------------------------------------
122 ----------------------------------------------------------------------*/
124 ///////////////////////////////////////////////////////////////////////////////
125 void gpuDrawLG(const PD gpuPixelDriver)
136 x0 = PacketBuffer.S2[2] + DrawingOffset[0]; GPU_TESTRANGE(x0);
137 y0 = PacketBuffer.S2[3] + DrawingOffset[1]; GPU_TESTRANGE(y0);
138 x1 = PacketBuffer.S2[6] + DrawingOffset[0]; GPU_TESTRANGE(x1);
139 y1 = PacketBuffer.S2[7] + DrawingOffset[1]; GPU_TESTRANGE(y1);
141 r0 = PacketBuffer.U1[0]; g0 = PacketBuffer.U1[1]; b0 = PacketBuffer.U1[2];
142 r1 = PacketBuffer.U1[8]; g1 = PacketBuffer.U1[9]; b1 = PacketBuffer.U1[10];
144 xmin = DrawingArea[0]; xmax = DrawingArea[2];
145 ymin = DrawingArea[1]; ymax = DrawingArea[3];
155 GPU_SWAP(x0, x1, temp);
156 GPU_SWAP(y0, y1, temp);
157 GPU_SWAP(r0, r1, temp);
158 GPU_SWAP(g0, g1, temp);
159 GPU_SWAP(b0, b1, temp);
161 y1 = GPU_DIV((y1 - y0) << GPU_DIGITS, dx);
162 r1 = GPU_DIV((r1 - r0) << GPU_DIGITS, dx);
163 g1 = GPU_DIV((g1 - g0) << GPU_DIGITS, dx);
164 b1 = GPU_DIV((b1 - b0) << GPU_DIGITS, dx);
177 if (x1 > xmax) x1 = xmax;
181 const int li=linesInterlace;
183 temp = y0 >> GPU_DIGITS;
184 if( 0 == (temp&li) ) {
185 if ((u32) (temp - ymin) < (u32) (ymax - ymin)) {
187 &((u16*)GPU_FrameBuffer)[FRAME_OFFSET(x0, temp)],
188 (((b0>>GPU_DIGITSC)&0x1F)<<10) | (((g0>>GPU_DIGITSC)&0x1F)<< 5) | ((r0>>GPU_DIGITSC)&0x1F)
200 GPU_SWAP(x0, x1, temp);
201 GPU_SWAP(y0, y1, temp);
202 GPU_SWAP(r0, r1, temp);
203 GPU_SWAP(g0, g1, temp);
204 GPU_SWAP(b0, b1, temp);
206 x1 = GPU_DIV((x1 - x0) << GPU_DIGITS, dy);
207 r1 = GPU_DIV((r1 - r0) << GPU_DIGITS, dy);
208 g1 = GPU_DIV((g1 - g0) << GPU_DIGITS, dy);
209 b1 = GPU_DIV((b1 - b0) << GPU_DIGITS, dy);
222 if (y1 > ymax) y1 = ymax;
226 const int li=linesInterlace;
229 temp = x0 >> GPU_DIGITS;
230 if ((u32) (temp - xmin) < (u32) (xmax - xmin)) {
232 &((u16*)GPU_FrameBuffer)[FRAME_OFFSET(temp, y0)],
233 (((b0>>GPU_DIGITSC)&0x1F)<<10) | (((g0>>GPU_DIGITSC)&0x1F)<< 5) | ((r0>>GPU_DIGITSC)&0x1F)
244 if( 0 == (y0&linesInterlace) ) {
245 if ((u32) (x0 - xmin) < (u32) (xmax - xmin)) {
246 if ((u32) (y0 - ymin) < (u32) (ymax - ymin)) {
248 &((u16*)GPU_FrameBuffer)[FRAME_OFFSET(x0, y0)],
249 (((b0>>GPU_DIGITSC)&0x1F)<<10) | (((g0>>GPU_DIGITSC)&0x1F)<< 5) | ((r0>>GPU_DIGITSC)&0x1F)