X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=plugins%2Fgpu_senquack%2Fgpu_raster_image.h;fp=plugins%2Fgpu_senquack%2Fgpu_raster_image.h;h=8e8064c46fa8be7ad79b98d13cec55b5e273b363;hb=0bfe8d59b9150b2662c3ca68f950b272344cb9a4;hp=0000000000000000000000000000000000000000;hpb=fcaa8d2263c8da53bbe86c482921e1a715bf59b3;p=pcsx_rearmed.git diff --git a/plugins/gpu_senquack/gpu_raster_image.h b/plugins/gpu_senquack/gpu_raster_image.h new file mode 100644 index 00000000..8e8064c4 --- /dev/null +++ b/plugins/gpu_senquack/gpu_raster_image.h @@ -0,0 +1,220 @@ +/*************************************************************************** + * 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. * + ***************************************************************************/ + +#ifndef __GPU_UNAI_GPU_RASTER_IMAGE_H__ +#define __GPU_UNAI_GPU_RASTER_IMAGE_H__ + +/////////////////////////////////////////////////////////////////////////////// +#ifndef USE_GPULIB +void gpuLoadImage(PtrUnion packet) +{ + u16 x0, y0, w0, h0; + x0 = packet.U2[2] & 1023; + y0 = packet.U2[3] & 511; + w0 = packet.U2[4]; + h0 = packet.U2[5]; + + if ((y0 + h0) > FRAME_HEIGHT) + { + h0 = FRAME_HEIGHT - y0; + } + + gpu_senquack.dma.FrameToWrite = ((w0)&&(h0)); + + gpu_senquack.dma.px = 0; + gpu_senquack.dma.py = 0; + gpu_senquack.dma.x_end = w0; + gpu_senquack.dma.y_end = h0; + gpu_senquack.dma.pvram = &((u16*)gpu_senquack.vram)[x0+(y0*1024)]; + + gpu_senquack.GPU_GP1 |= 0x08000000; +} +#endif // !USE_GPULIB + +/////////////////////////////////////////////////////////////////////////////// +#ifndef USE_GPULIB +void gpuStoreImage(PtrUnion packet) +{ + u16 x0, y0, w0, h0; + x0 = packet.U2[2] & 1023; + y0 = packet.U2[3] & 511; + w0 = packet.U2[4]; + h0 = packet.U2[5]; + + if ((y0 + h0) > FRAME_HEIGHT) + { + h0 = FRAME_HEIGHT - y0; + } + gpu_senquack.dma.FrameToRead = ((w0)&&(h0)); + + gpu_senquack.dma.px = 0; + gpu_senquack.dma.py = 0; + gpu_senquack.dma.x_end = w0; + gpu_senquack.dma.y_end = h0; + gpu_senquack.dma.pvram = &((u16*)gpu_senquack.vram)[x0+(y0*1024)]; + + gpu_senquack.GPU_GP1 |= 0x08000000; +} +#endif // !USE_GPULIB + +void gpuMoveImage(PtrUnion packet) +{ + u32 x0, y0, x1, y1; + s32 w0, h0; + x0 = packet.U2[2] & 1023; + y0 = packet.U2[3] & 511; + x1 = packet.U2[4] & 1023; + y1 = packet.U2[5] & 511; + w0 = packet.U2[6]; + h0 = packet.U2[7]; + + if( (x0==x1) && (y0==y1) ) return; + if ((w0<=0) || (h0<=0)) return; + + #ifdef ENABLE_GPU_LOG_SUPPORT + fprintf(stdout,"gpuMoveImage(x0=%u,y0=%u,x1=%u,y1=%u,w0=%d,h0=%d)\n",x0,y0,x1,y1,w0,h0); + #endif + + if (((y0+h0)>512)||((x0+w0)>1024)||((y1+h0)>512)||((x1+w0)>1024)) + { + u16 *psxVuw=gpu_senquack.vram; + s32 i,j; + for(j=0;j>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); + } + } +} + +void gpuClearImage(PtrUnion packet) +{ + s32 x0, y0, w0, h0; + x0 = packet.S2[2]; + y0 = packet.S2[3]; + w0 = packet.S2[4] & 0x3ff; + h0 = packet.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; + + #ifdef ENABLE_GPU_LOG_SUPPORT + fprintf(stdout,"gpuClearImage(x0=%d,y0=%d,w0=%d,h0=%d)\n",x0,y0,w0,h0); + #endif + + if (x0&1) + { + u16* pixel = (u16*)gpu_senquack.vram + FRAME_OFFSET(x0, y0); + u16 rgb = GPU_RGB16(packet.U4[0]); + y0 = FRAME_WIDTH - w0; + do { + x0=w0; + do { *pixel++ = rgb; } while (--x0); + pixel += y0; + } while (--h0); + } + else + { + u32* pixel = (u32*)gpu_senquack.vram + ((FRAME_OFFSET(x0, y0))>>1); + u32 rgb = GPU_RGB16(packet.U4[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); + } + } +} + +#endif /* __GPU_UNAI_GPU_RASTER_IMAGE_H__ */