aboutsummaryrefslogtreecommitdiff
path: root/plugins/gpu_unai/gpu_raster_image.h
diff options
context:
space:
mode:
authornotaz2011-01-02 00:59:02 +0200
committernotaz2011-01-02 00:59:02 +0200
commit86aad47b0418b1715a4d223adf8f59aa92619d15 (patch)
tree176d9e9272cc3ad33a8278fdec0d9030586dc012 /plugins/gpu_unai/gpu_raster_image.h
parent201c21e2ad6be25a4b843d1434eabb432ce72884 (diff)
downloadpcsx_rearmed-86aad47b0418b1715a4d223adf8f59aa92619d15.tar.gz
pcsx_rearmed-86aad47b0418b1715a4d223adf8f59aa92619d15.tar.bz2
pcsx_rearmed-86aad47b0418b1715a4d223adf8f59aa92619d15.zip
import gpu_unai from PCSX4ALL project
Diffstat (limited to 'plugins/gpu_unai/gpu_raster_image.h')
-rw-r--r--plugins/gpu_unai/gpu_raster_image.h203
1 files changed, 203 insertions, 0 deletions
diff --git a/plugins/gpu_unai/gpu_raster_image.h b/plugins/gpu_unai/gpu_raster_image.h
new file mode 100644
index 0000000..7984b18
--- /dev/null
+++ b/plugins/gpu_unai/gpu_raster_image.h
@@ -0,0 +1,203 @@
+/***************************************************************************
+ * Copyright (C) 2010 PCSX4ALL Team *
+ * Copyright (C) 2010 Unai *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. *
+ ***************************************************************************/
+
+///////////////////////////////////////////////////////////////////////////////
+INLINE void gpuLoadImage(void)
+{
+ u16 x0, y0, w0, h0;
+ x0 = PacketBuffer.U2[2] & 1023;
+ y0 = PacketBuffer.U2[3] & 511;
+ w0 = PacketBuffer.U2[4];
+ h0 = PacketBuffer.U2[5];
+
+ if ((y0 + h0) > FRAME_HEIGHT)
+ {
+ h0 = FRAME_HEIGHT - y0;
+ }
+
+ FrameToWrite = ((w0)&&(h0));
+
+ px = 0;
+ py = 0;
+ x_end = w0;
+ y_end = h0;
+ pvram = &((u16*)GPU_FrameBuffer)[x0+(y0*1024)];
+
+ GPU_GP1 |= 0x08000000;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+INLINE void gpuStoreImage(void)
+{
+ u16 x0, y0, w0, h0;
+ x0 = PacketBuffer.U2[2] & 1023;
+ y0 = PacketBuffer.U2[3] & 511;
+ w0 = PacketBuffer.U2[4];
+ h0 = PacketBuffer.U2[5];
+
+ if ((y0 + h0) > FRAME_HEIGHT)
+ {
+ h0 = FRAME_HEIGHT - y0;
+ }
+ FrameToRead = ((w0)&&(h0));
+
+ px = 0;
+ py = 0;
+ x_end = w0;
+ y_end = h0;
+ pvram = &((u16*)GPU_FrameBuffer)[x0+(y0*1024)];
+
+ GPU_GP1 |= 0x08000000;
+}
+
+INLINE void gpuMoveImage(void)
+{
+ u32 x0, y0, x1, y1;
+ s32 w0, h0;
+ x0 = PacketBuffer.U2[2] & 1023;
+ y0 = PacketBuffer.U2[3] & 511;
+ x1 = PacketBuffer.U2[4] & 1023;
+ y1 = PacketBuffer.U2[5] & 511;
+ w0 = PacketBuffer.U2[6];
+ h0 = PacketBuffer.U2[7];
+
+ if( (x0==x1) && (y0==y1) ) return;
+ if ((w0<=0) || (h0<=0)) return;
+
+ if (((y0+h0)>512)||((x0+w0)>1024)||((y1+h0)>512)||((x1+w0)>1024))
+ {
+ u16 *psxVuw=GPU_FrameBuffer;
+ u32 i,j;
+ for(j=0;j<h0;j++)
+ for(i=0;i<w0;i++)
+ psxVuw [(1024*((y1+j)&511))+((x1+i)&0x3ff)]=
+ psxVuw[(1024*((y0+j)&511))+((x0+i)&0x3ff)];
+ }
+ else if ((x0&1)||(x1&1))
+ {
+ u16 *lpDst, *lpSrc;
+ lpDst = lpSrc = (u16*)GPU_FrameBuffer;
+ lpSrc += FRAME_OFFSET(x0, y0);
+ lpDst += FRAME_OFFSET(x1, y1);
+ x1 = FRAME_WIDTH - w0;
+ do {
+ x0=w0;
+ do { *lpDst++ = *lpSrc++; } while (--x0);
+ lpDst += x1;
+ lpSrc += x1;
+ } while (--h0);
+ }
+ else
+ {
+ u32 *lpDst, *lpSrc;
+ lpDst = lpSrc = (u32*)(void*)GPU_FrameBuffer;
+ lpSrc += ((FRAME_OFFSET(x0, y0))>>1);
+ lpDst += ((FRAME_OFFSET(x1, y1))>>1);
+ if (w0&1)
+ {
+ x1 = (FRAME_WIDTH - w0 +1)>>1;
+ w0>>=1;
+ if (!w0) {
+ do {
+ *((u16*)lpDst) = *((u16*)lpSrc);
+ lpDst += x1;
+ lpSrc += x1;
+ } while (--h0);
+ } else
+ do {
+ x0=w0;
+ do { *lpDst++ = *lpSrc++; } while (--x0);
+ *((u16*)lpDst) = *((u16*)lpSrc);
+ lpDst += x1;
+ lpSrc += x1;
+ } while (--h0);
+ }
+ else
+ {
+ x1 = (FRAME_WIDTH - w0)>>1;
+ w0>>=1;
+ do {
+ x0=w0;
+ do { *lpDst++ = *lpSrc++; } while (--x0);
+ lpDst += x1;
+ lpSrc += x1;
+ } while (--h0);
+ }
+ }
+}
+
+INLINE void gpuClearImage(void)
+{
+ s32 x0, y0, w0, h0;
+ x0 = PacketBuffer.S2[2];
+ y0 = PacketBuffer.S2[3];
+ w0 = PacketBuffer.S2[4] & 0x3ff;
+ h0 = PacketBuffer.S2[5] & 0x3ff;
+
+ w0 += x0;
+ if (x0 < 0) x0 = 0;
+ if (w0 > FRAME_WIDTH) w0 = FRAME_WIDTH;
+ w0 -= x0;
+ if (w0 <= 0) return;
+ h0 += y0;
+ if (y0 < 0) y0 = 0;
+ if (h0 > FRAME_HEIGHT) h0 = FRAME_HEIGHT;
+ h0 -= y0;
+ if (h0 <= 0) return;
+
+ if (x0&1)
+ {
+ u16* pixel = (u16*)GPU_FrameBuffer + FRAME_OFFSET(x0, y0);
+ u16 rgb = GPU_RGB16(PacketBuffer.S4[0]);
+ y0 = FRAME_WIDTH - w0;
+ do {
+ x0=w0;
+ do { *pixel++ = rgb; } while (--x0);
+ pixel += y0;
+ } while (--h0);
+ }
+ else
+ {
+ u32* pixel = (u32*)(void*)GPU_FrameBuffer + ((FRAME_OFFSET(x0, y0))>>1);
+ u32 rgb = GPU_RGB16(PacketBuffer.S4[0]);
+ rgb |= (rgb<<16);
+ if (w0&1)
+ {
+ y0 = (FRAME_WIDTH - w0 +1)>>1;
+ w0>>=1;
+ do {
+ x0=w0;
+ do { *pixel++ = rgb; } while (--x0);
+ *((u16*)pixel) = (u16)rgb;
+ pixel += y0;
+ } while (--h0);
+ }
+ else
+ {
+ y0 = (FRAME_WIDTH - w0)>>1;
+ w0>>=1;
+ do {
+ x0=w0;
+ do { *pixel++ = rgb; } while (--x0);
+ pixel += y0;
+ } while (--h0);
+ }
+ }
+}