aboutsummaryrefslogtreecommitdiff
path: root/shell/video
diff options
context:
space:
mode:
authorgameblabla2020-12-26 08:53:03 +0100
committergameblabla2020-12-26 08:53:03 +0100
commit2c41876dd9913c2a49cd044a805df54915b95f0f (patch)
treee04b3f224a90c217289c49b84129faac19bf1248 /shell/video
parent4c1a193d483b10ef63c27553f6e6e95af23552b8 (diff)
downloadsnesemu-2c41876dd9913c2a49cd044a805df54915b95f0f.tar.gz
snesemu-2c41876dd9913c2a49cd044a805df54915b95f0f.tar.bz2
snesemu-2c41876dd9913c2a49cd044a805df54915b95f0f.zip
Fix issue wit pitch being doubled by 2.
Change all of the code accordingly and simplify it. This was made as to allocate less memory than needed, improve the speed of the scaler code and make it more suitable for IPU mode.
Diffstat (limited to 'shell/video')
-rw-r--r--shell/video/gcw0/video_blit.c106
-rw-r--r--shell/video/gcw0/video_blit.h24
-rw-r--r--shell/video/retrostone/video_blit.c5
-rw-r--r--shell/video/sdl/video_blit.c18
4 files changed, 142 insertions, 11 deletions
diff --git a/shell/video/gcw0/video_blit.c b/shell/video/gcw0/video_blit.c
new file mode 100644
index 0000000..da72224
--- /dev/null
+++ b/shell/video/gcw0/video_blit.c
@@ -0,0 +1,106 @@
+/* Cygne
+ *
+ * Copyright notice for this file:
+ * Copyright (C) 2002 Dox dox@space.pl
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <SDL/SDL.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include "main.h"
+#include "snes9x.h"
+#include "soundux.h"
+#include "memmap.h"
+#include "apu.h"
+#include "cheats.h"
+#include "display.h"
+#include "gfx.h"
+#include "cpuexec.h"
+#include "spc7110.h"
+#include "srtc.h"
+#include "sa1.h"
+#include "scaler.h"
+
+#include "video_blit.h"
+#include "scaler.h"
+#include "config.h"
+
+
+SDL_Surface *sdl_screen, *backbuffer;
+
+uint32_t width_of_surface;
+uint32_t* Draw_to_Virtual_Screen;
+
+#ifndef SDL_TRIPLEBUF
+#define SDL_TRIPLEBUF SDL_DOUBLEBUF
+#endif
+
+#define SDL_FLAGS SDL_HWSURFACE | SDL_TRIPLEBUF
+
+void Init_Video()
+{
+ SDL_Init( SDL_INIT_VIDEO );
+
+ SDL_ShowCursor(0);
+
+ sdl_screen = SDL_SetVideoMode(640, 480, 16, SDL_FLAGS);
+
+ backbuffer = SDL_CreateRGBSurface(SDL_SWSURFACE, 320, 240, 16, 0,0,0,0);
+
+ Set_Video_InGame();
+}
+
+void Set_Video_Menu()
+{
+ sdl_screen = SDL_SetVideoMode(320, 240, 16, SDL_FLAGS);
+}
+
+void Set_Video_InGame()
+{
+ sdl_screen = SDL_SetVideoMode(IPPU.RenderedScreenWidth, IPPU.RenderedScreenHeight, 16, SDL_FLAGS);
+}
+
+void Video_Close()
+{
+ if (sdl_screen) SDL_FreeSurface(sdl_screen);
+ if (backbuffer) SDL_FreeSurface(backbuffer);
+ SDL_Quit();
+}
+
+void Update_Video_Menu()
+{
+ SDL_BlitSurface(backbuffer, NULL, sdl_screen, NULL);
+ SDL_Flip(sdl_screen);
+}
+
+void Update_Video_Ingame()
+{
+ uint32_t *s, *d;
+ uint32_t h, w;
+ uint8_t PAL = !!(Memory.FillRAM[0x2133] & 4);
+
+ if (SDL_LockSurface(sdl_screen) == 0)
+ {
+ if (IPPU.RenderedScreenWidth != sdl_screen->w || IPPU.RenderedScreenHeight != sdl_screen->h) Set_Video_InGame();
+ memcpy(sdl_screen->pixels, GFX.Screen, (IPPU.RenderedScreenWidth * IPPU.RenderedScreenHeight) * 2);
+ SDL_UnlockSurface(sdl_screen);
+ }
+ SDL_Flip(sdl_screen);
+}
diff --git a/shell/video/gcw0/video_blit.h b/shell/video/gcw0/video_blit.h
new file mode 100644
index 0000000..08528e1
--- /dev/null
+++ b/shell/video/gcw0/video_blit.h
@@ -0,0 +1,24 @@
+#ifndef VIDEO_BLIT_H
+#define VIDEO_BLIT_H
+
+#include <SDL/SDL.h>
+
+#define HOST_WIDTH_RESOLUTION sdl_screen->w
+#define HOST_HEIGHT_RESOLUTION sdl_screen->h
+
+#define BACKBUFFER_WIDTH_RESOLUTION backbuffer->w
+#define BACKBUFFER_HEIGHT_RESOLUTION backbuffer->h
+
+extern SDL_Surface *sdl_screen, *backbuffer;
+
+extern uint32_t width_of_surface;
+extern uint32_t* Draw_to_Virtual_Screen;
+
+void Init_Video();
+void Set_Video_Menu();
+void Set_Video_InGame();
+void Video_Close();
+void Update_Video_Menu();
+void Update_Video_Ingame();
+
+#endif
diff --git a/shell/video/retrostone/video_blit.c b/shell/video/retrostone/video_blit.c
index 7dcdce1..fd189cc 100644
--- a/shell/video/retrostone/video_blit.c
+++ b/shell/video/retrostone/video_blit.c
@@ -78,6 +78,7 @@ void Video_Close()
void Update_Video_Menu()
{
+ SDL_SoftStretch(backbuffer, NULL, sdl_screen, NULL);
SDL_Flip(sdl_screen);
}
@@ -92,11 +93,11 @@ void Update_Video_Ingame()
switch(option.fullscreen)
{
case 0:
- bitmap_scale(0,0,IPPU.RenderedScreenWidth,IPPU.RenderedScreenHeight,IPPU.RenderedScreenWidth*2,sdl_screen->h, SNES_WIDTH*2, sdl_screen->w - (IPPU.RenderedScreenWidth*2),(uint16_t* restrict)GFX.Screen,(uint16_t* restrict)sdl_screen->pixels+(HOST_WIDTH_RESOLUTION-(IPPU.RenderedScreenWidth*2))/2+(HOST_HEIGHT_RESOLUTION-((HOST_HEIGHT_RESOLUTION)))/2*HOST_WIDTH_RESOLUTION);
+ bitmap_scale(0,0,IPPU.RenderedScreenWidth,IPPU.RenderedScreenHeight,IPPU.RenderedScreenWidth*2,sdl_screen->h, SNES_WIDTH, sdl_screen->w - (IPPU.RenderedScreenWidth*2),(uint16_t* restrict)GFX.Screen,(uint16_t* restrict)sdl_screen->pixels+(HOST_WIDTH_RESOLUTION-(IPPU.RenderedScreenWidth*2))/2+(HOST_HEIGHT_RESOLUTION-((HOST_HEIGHT_RESOLUTION)))/2*HOST_WIDTH_RESOLUTION);
break;
case 1:
case 2:
- bitmap_scale(0, 0, IPPU.RenderedScreenWidth, IPPU.RenderedScreenHeight, sdl_screen->w, sdl_screen->h, SNES_WIDTH*2, 0, GFX.Screen, sdl_screen->pixels);
+ bitmap_scale(0, 0, IPPU.RenderedScreenWidth, IPPU.RenderedScreenHeight, sdl_screen->w, sdl_screen->h, SNES_WIDTH, 0, GFX.Screen, sdl_screen->pixels);
break;
}
diff --git a/shell/video/sdl/video_blit.c b/shell/video/sdl/video_blit.c
index b4a6bbe..0e489c0 100644
--- a/shell/video/sdl/video_blit.c
+++ b/shell/video/sdl/video_blit.c
@@ -54,7 +54,7 @@ void Init_Video()
SDL_ShowCursor(0);
- sdl_screen = SDL_SetVideoMode(0, 0, 16, SDL_HWSURFACE);
+ sdl_screen = SDL_SetVideoMode(320, 240, 16, SDL_HWSURFACE);
backbuffer = SDL_CreateRGBSurface(SDL_SWSURFACE, 320, 240, 16, 0,0,0,0);
@@ -78,12 +78,13 @@ void Video_Close()
void Update_Video_Menu()
{
+ SDL_SoftStretch(backbuffer, NULL, sdl_screen, NULL);
SDL_Flip(sdl_screen);
}
void Update_Video_Ingame()
{
- uint32_t *s, *d;
+ uint16_t *s, *d;
uint32_t h, w;
uint8_t PAL = !!(Memory.FillRAM[0x2133] & 4);
@@ -92,17 +93,16 @@ void Update_Video_Ingame()
switch(option.fullscreen)
{
case 0:
- s = (uint32_t*) GFX.Screen;
- d = (uint32_t*) sdl_screen->pixels + ((sdl_screen->w - IPPU.RenderedScreenWidth)/4 + (sdl_screen->h - IPPU.RenderedScreenHeight) * 160) - (PAL ? 0 : 4*320);
- for(uint8_t y = 0; y < IPPU.RenderedScreenHeight; y++, s += IPPU.RenderedScreenWidth, d += sdl_screen->w/2) memmove(d, s, IPPU.RenderedScreenWidth * 2);
-
+ s = (uint16_t*) GFX.Screen;
+ d = (uint16_t*) sdl_screen->pixels + ((sdl_screen->w - IPPU.RenderedScreenWidth)/2 + (sdl_screen->h - IPPU.RenderedScreenHeight) * 160) - (PAL ? 0 : 2*320);
+ for(uint8_t y = 0; y < IPPU.RenderedScreenHeight; y++, s += IPPU.RenderedScreenWidth, d += sdl_screen->w) memmove(d, s, IPPU.RenderedScreenWidth * 2);
break;
case 1:
- upscale_256xXXX_to_320x240((uint32_t*) sdl_screen->pixels, (uint32_t*) GFX.Screen, SNES_WIDTH, PAL ? 240 : 224);
+ upscale_256xXXX_to_320x240((uint32_t*) sdl_screen->pixels, (uint32_t*) GFX.Screen, IPPU.RenderedScreenWidth, PAL ? 240 : 224);
break;
case 2:
- if (IPPU.RenderedScreenHeight == 240) upscale_256x240_to_320x240_bilinearish((uint32_t*) sdl_screen->pixels, (uint32_t*) GFX.Screen, SNES_WIDTH, 239);
- else upscale_256x240_to_320x240_bilinearish((uint32_t*) sdl_screen->pixels + (160*8), (uint32_t*) GFX.Screen, SNES_WIDTH, 224);
+ if (IPPU.RenderedScreenHeight == 240) upscale_256x240_to_320x240_bilinearish((uint32_t*) sdl_screen->pixels, (uint32_t*) GFX.Screen, IPPU.RenderedScreenWidth, 239);
+ else upscale_256x240_to_320x240_bilinearish((uint32_t*) sdl_screen->pixels + (160*8), (uint32_t*) GFX.Screen, IPPU.RenderedScreenWidth, 224);
break;
}
//bitmap_scale(0, 0, IPPU.RenderedScreenWidth, IPPU.RenderedScreenHeight, sdl_screen->w, sdl_screen->h, SNES_WIDTH*2, 0, GFX.Screen, sdl_screen->pixels);