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 #define GPU_TESTRANGE(x) { if((u32)(x+1024) > 2047) return; }
23 ///////////////////////////////////////////////////////////////////////////////
24 // GPU internal line drawing functions
27 #define GPU_DIGITSC (GPU_DIGITS+3)
29 INLINE long GPU_DIV(long rs, long rt)
31 return rt ? (rs / rt) : (0);
34 ///////////////////////////////////////////////////////////////////////////////
35 void gpuDrawLF(const PD gpuPixelDriver)
43 x0 = PacketBuffer.S2[2] + DrawingOffset[0]; GPU_TESTRANGE(x0);
44 y0 = PacketBuffer.S2[3] + DrawingOffset[1]; GPU_TESTRANGE(y0);
45 x1 = PacketBuffer.S2[4] + DrawingOffset[0]; GPU_TESTRANGE(x1);
46 y1 = PacketBuffer.S2[5] + DrawingOffset[1]; GPU_TESTRANGE(y1);
48 xmin = DrawingArea[0]; xmax = DrawingArea[2];
49 ymin = DrawingArea[1]; ymax = DrawingArea[3];
50 const u16 pixeldata = GPU_RGB16(PacketBuffer.U4[0]);
58 GPU_SWAP(x0, x1, temp);
59 GPU_SWAP(y0, y1, temp);
61 y1 = GPU_DIV((y1 - y0) << GPU_DIGITS, dx);
68 if (x1 > xmax) x1 = xmax;
72 const int li=linesInterlace;
74 temp = y0 >> GPU_DIGITS;
75 if( 0 == (temp&li) ) {
76 if ((u32) (temp - ymin) < (u32) (ymax - ymin)) {
77 gpuPixelDriver(&((u16*)GPU_FrameBuffer)[FRAME_OFFSET(x0, temp)],pixeldata);
85 GPU_SWAP(x0, x1, temp);
86 GPU_SWAP(y0, y1, temp);
88 x1 = GPU_DIV((x1 - x0) << GPU_DIGITS, dy);
95 if (y1 > ymax) y1 = ymax;
99 const int li=linesInterlace;
102 temp = x0 >> GPU_DIGITS;
103 if ((u32) (temp - xmin) < (u32) (xmax - xmin)) {
104 gpuPixelDriver(&((u16*)GPU_FrameBuffer)[FRAME_OFFSET(temp, y0)],pixeldata);
112 if( 0 == (y0&linesInterlace) ) {
113 if ((u32) (x0 - xmin) < (u32) (xmax - xmin)) {
114 if ((u32) (y0 - ymin) < (u32) (ymax - ymin)) {
115 gpuPixelDriver(&((u16*)GPU_FrameBuffer)[FRAME_OFFSET(x0, y0)],pixeldata);
122 /*----------------------------------------------------------------------
124 ----------------------------------------------------------------------*/
126 ///////////////////////////////////////////////////////////////////////////////
127 void gpuDrawLG(const PD gpuPixelDriver)
138 x0 = PacketBuffer.S2[2] + DrawingOffset[0]; GPU_TESTRANGE(x0);
139 y0 = PacketBuffer.S2[3] + DrawingOffset[1]; GPU_TESTRANGE(y0);
140 x1 = PacketBuffer.S2[6] + DrawingOffset[0]; GPU_TESTRANGE(x1);
141 y1 = PacketBuffer.S2[7] + DrawingOffset[1]; GPU_TESTRANGE(y1);
143 r0 = PacketBuffer.U1[0]; g0 = PacketBuffer.U1[1]; b0 = PacketBuffer.U1[2];
144 r1 = PacketBuffer.U1[8]; g1 = PacketBuffer.U1[9]; b1 = PacketBuffer.U1[10];
146 xmin = DrawingArea[0]; xmax = DrawingArea[2];
147 ymin = DrawingArea[1]; ymax = DrawingArea[3];
157 GPU_SWAP(x0, x1, temp);
158 GPU_SWAP(y0, y1, temp);
159 GPU_SWAP(r0, r1, temp);
160 GPU_SWAP(g0, g1, temp);
161 GPU_SWAP(b0, b1, temp);
163 y1 = GPU_DIV((y1 - y0) << GPU_DIGITS, dx);
164 r1 = GPU_DIV((r1 - r0) << GPU_DIGITS, dx);
165 g1 = GPU_DIV((g1 - g0) << GPU_DIGITS, dx);
166 b1 = GPU_DIV((b1 - b0) << GPU_DIGITS, dx);
179 if (x1 > xmax) x1 = xmax;
183 const int li=linesInterlace;
185 temp = y0 >> GPU_DIGITS;
186 if( 0 == (temp&li) ) {
187 if ((u32) (temp - ymin) < (u32) (ymax - ymin)) {
189 &((u16*)GPU_FrameBuffer)[FRAME_OFFSET(x0, temp)],
190 (((b0>>GPU_DIGITSC)&0x1F)<<10) | (((g0>>GPU_DIGITSC)&0x1F)<< 5) | ((r0>>GPU_DIGITSC)&0x1F)
202 GPU_SWAP(x0, x1, temp);
203 GPU_SWAP(y0, y1, temp);
204 GPU_SWAP(r0, r1, temp);
205 GPU_SWAP(g0, g1, temp);
206 GPU_SWAP(b0, b1, temp);
208 x1 = GPU_DIV((x1 - x0) << GPU_DIGITS, dy);
209 r1 = GPU_DIV((r1 - r0) << GPU_DIGITS, dy);
210 g1 = GPU_DIV((g1 - g0) << GPU_DIGITS, dy);
211 b1 = GPU_DIV((b1 - b0) << GPU_DIGITS, dy);
224 if (y1 > ymax) y1 = ymax;
228 const int li=linesInterlace;
231 temp = x0 >> GPU_DIGITS;
232 if ((u32) (temp - xmin) < (u32) (xmax - xmin)) {
234 &((u16*)GPU_FrameBuffer)[FRAME_OFFSET(temp, y0)],
235 (((b0>>GPU_DIGITSC)&0x1F)<<10) | (((g0>>GPU_DIGITSC)&0x1F)<< 5) | ((r0>>GPU_DIGITSC)&0x1F)
246 if( 0 == (y0&linesInterlace) ) {
247 if ((u32) (x0 - xmin) < (u32) (xmax - xmin)) {
248 if ((u32) (y0 - ymin) < (u32) (ymax - ymin)) {
250 &((u16*)GPU_FrameBuffer)[FRAME_OFFSET(x0, y0)],
251 (((b0>>GPU_DIGITSC)&0x1F)<<10) | (((g0>>GPU_DIGITSC)&0x1F)<< 5) | ((r0>>GPU_DIGITSC)&0x1F)