DrawHiResClippedTilePtr = DrawHiResClippedTile16;
S9xFixColourBrightness();
- if (Settings.SixteenBit)
- {
if (!(GFX.X2 = (uint16 *) malloc (sizeof (uint16) * 0x10000)))
return (FALSE);
}
}
}
- }
- else
- {
- GFX.X2 = NULL;
- GFX.ZERO_OR_X2 = NULL;
- GFX.ZERO = NULL;
- }
return (TRUE);
}
IPPU.RenderedFramesCount++;
if (IPPU.ColorsChanged) {
- uint32 saved = PPU.CGDATA[0];
-
- if (!Settings.SixteenBit) {
- // Hack for Super Mario World - to get its sky blue
- // (It uses Fixed colour addition on the backdrop colour)
- if (!(Memory.FillRAM [0x2131] & 0x80) &&
- (Memory.FillRAM[0x2131] & 0x20) &&
- (PPU.FixedColourRed || PPU.FixedColourGreen ||
- PPU.FixedColourBlue)) {
- PPU.CGDATA[0] = PPU.FixedColourRed |
- (PPU.FixedColourGreen << 5) |
- (PPU.FixedColourBlue << 10);
- }
- }
-
IPPU.ColorsChanged = FALSE;
- S9xSetPalette();
- PPU.CGDATA[0] = saved;
}
if (Settings.DisplayFrameRate) {
S9xDisplayString(GFX.InfoString);
}
- S9xDeinitUpdate(
- IPPU.RenderedScreenWidth, IPPU.RenderedScreenHeight,
- Settings.SixteenBit);
+ S9xDeinitUpdate(IPPU.RenderedScreenWidth, IPPU.RenderedScreenHeight);
}
#ifndef RC_OPTIMIZED
{
int line = (((c & 0x7f) - 32) >> 4) * font_height;
int offset = (((c & 0x7f) - 32) & 15) * font_width;
-#ifndef _SNESPPC
- if (Settings.SixteenBit)
-#endif
- {
+
int h, w;
uint16 *s = (uint16 *) Screen;
for (h = 0; h < font_height; h++, line++,
*s = BLACK;
}
}
- }
-#ifndef _SNESPPC
- else
- {
- int h, w;
- uint8 *s = Screen;
- for (h = 0; h < font_height; h++, line++,
- s += GFX.PPL - font_width)
- {
- for (w = 0; w < font_width; w++, s++)
- {
- uint8 p = font [line][offset + w];
-
- if (p == '#')
- *s = 255;
- else
- if (p == '.')
- *s = BLACK;
- }
- }
- }
-#endif
}
static void S9xDisplayFrameRate()
{
+ const unsigned int char_width = (font_width - 1) * sizeof (uint16);
uint8 *Screen = GFX.Screen + 2 +
(IPPU.RenderedScreenHeight - font_height - 1) * GFX.Pitch;
char string[12];
int len;
- const unsigned int char_width = Settings.SixteenBit ?
- (font_width - 1) * sizeof (uint16) :
- (font_width - 1);
if (Settings.TurboMode) {
len = sprintf(string, "%u",
static void S9xDisplayString(const char *string)
{
+ const unsigned int char_width = (font_width - 1) * sizeof (uint16);
uint8 *Screen = GFX.Screen + 2 +
(IPPU.RenderedScreenHeight - font_height * 5) * GFX.Pitch;
int len = strlen (string);
{
if (char_count >= max_chars || string [i] < 32)
{
- Screen -= Settings.SixteenBit ?
- (font_width - 1) * sizeof (uint16) * max_chars :
- (font_width - 1) * max_chars;
+ Screen -= char_width * max_chars;
Screen += font_height * GFX.Pitch;
if (Screen >= GFX.Screen + GFX.Pitch * IPPU.RenderedScreenHeight)
break;
if (string [i] < 32)
continue;
DisplayChar (Screen, string [i]);
- Screen += Settings.SixteenBit ? (font_width - 1) * sizeof (uint16) :
- (font_width - 1);
+ Screen += char_width;
}
}
if (!IPPU.DoubleWidthPixels) {
// The game has switched from lo-res to hi-res mode part way down
// the screen. Scale any existing lo-res pixels on screen
- if (Settings.SixteenBit) {
- for (register uint32 y = 0; y < GFX.StartY; y++) {
- register uint16 *p =
- (uint16 *) (GFX.Screen + y * GFX.Pitch) + 255;
- register uint16 *q =
- (uint16 *) (GFX.Screen + y * GFX.Pitch) + 510;
- for (register int x = 255; x >= 0; x--, p--, q -= 2) {
- *q = *(q + 1) = *p;
- }
- }
- } else {
- for (register uint32 y = 0; y < GFX.StartY; y++) {
- register uint8 *p =
- GFX.Screen + y * GFX.Pitch + 255;
- register uint8 *q =
- GFX.Screen + y * GFX.Pitch + 510;
- for (register int x = 255; x >= 0; x--, p--, q -= 2) {
- *q = *(q + 1) = *p;
- }
+ for (register uint32 y = 0; y < GFX.StartY; y++) {
+ register uint16 *p =
+ (uint16 *) (GFX.Screen + y * GFX.Pitch) + 255;
+ register uint16 *q =
+ (uint16 *) (GFX.Screen + y * GFX.Pitch) + 510;
+ for (register int x = 255; x >= 0; x--, p--, q -= 2) {
+ *q = *(q + 1) = *p;
}
- }
+ }
IPPU.DoubleWidthPixels = TRUE;
}
uint32 black = BLACK | (BLACK << 16);
// Are we worrying about transparencies?
- if (Settings.Transparency && Settings.SixteenBit)
+ if (Settings.Transparency)
{
if (GFX.Pseudo)
{
}
else // Transparencys are disabled, ahh lovely ... nice and easy.
{
-#ifndef _SNESPPC
- if (Settings.SixteenBit)
-#endif
+ // get back colour to be used in clearing the screen
+ register uint32 back;
+ if (!(Memory.FillRAM [0x2131] & 0x80) &&(Memory.FillRAM[0x2131] & 0x20) &&
+ (PPU.FixedColourRed || PPU.FixedColourGreen || PPU.FixedColourBlue))
{
- // get back colour to be used in clearing the screen
- register uint32 back;
- if (!(Memory.FillRAM [0x2131] & 0x80) &&(Memory.FillRAM[0x2131] & 0x20) &&
- (PPU.FixedColourRed || PPU.FixedColourGreen || PPU.FixedColourBlue))
- {
- back = (IPPU.XB[PPU.FixedColourRed]<<11) |
- (IPPU.XB[PPU.FixedColourGreen] << 6) |
- (IPPU.XB[PPU.FixedColourBlue] << 1) | 1;
- back = (back << 16) | back;
- }
- else
- {
- back = IPPU.ScreenColors [0] | (IPPU.ScreenColors [0] << 16);
- }
-
- // if Forcedblanking in use then back colour becomes black
- if (PPU.ForcedBlanking)
- back = black;
- else
- {
- SelectTileRenderer (TRUE); //selects the tile renderers to be used
- // TRUE means to use the default
- // FALSE means use best renderer based on current
- // graphics register settings
- }
-
- // now clear all graphics lines which are being updated using the back colour
- for (register uint32 y = starty; y <= endy; y++)
- {
- memset32 ((uint32_t*)(GFX.Screen + y * GFX.Pitch), back,
- IPPU.RenderedScreenWidth>>1);
- }
+ back = (IPPU.XB[PPU.FixedColourRed]<<11) |
+ (IPPU.XB[PPU.FixedColourGreen] << 6) |
+ (IPPU.XB[PPU.FixedColourBlue] << 1) | 1;
+ back = (back << 16) | back;
}
-#ifndef _SNESPPC
- else // Settings.SixteenBit == false
+ else
{
- // because we are in 8 bit we can just use 0 to clear the screen
- // this means we can use the Zero Memory function
-
- // Loop through all lines being updated and clear the pixels to 0
- for (uint32 y = starty; y <= endy; y++)
- {
- ZeroMemory (GFX.Screen + y * GFX.Pitch,
- IPPU.RenderedScreenWidth);
- }
+ back = IPPU.ScreenColors [0] | (IPPU.ScreenColors [0] << 16);
}
-#endif
+
+ // if Forcedblanking in use then back colour becomes black
+ if (PPU.ForcedBlanking)
+ back = black;
+ else
+ {
+ SelectTileRenderer (TRUE); //selects the tile renderers to be used
+ // TRUE means to use the default
+ // FALSE means use best renderer based on current
+ // graphics register settings
+ }
+
+ // now clear all graphics lines which are being updated using the back colour
+ for (register uint32 y = starty; y <= endy; y++)
+ {
+ memset32 ((uint32_t*)(GFX.Screen + y * GFX.Pitch), back,
+ IPPU.RenderedScreenWidth>>1);
+ }
+
if (!PPU.ForcedBlanking)
{
// Loop through all lines being updated and clear the
bg = 0;
}
-#ifndef _SNESPPC
- if (!Settings.SixteenBit)
- DrawBGMode7Background (GFX.Screen, bg);
- else
-#endif
- {
if (!Settings.Mode7Interpolate)
{
DrawBGMode7Background16 (GFX.Screen, bg);
{
DrawBGMode7Background16_i (GFX.Screen, bg);
}
- }
}
}
}
{
// Mixure of background modes used on screen - scale width
// of all non-mode 5 and 6 pixels.
-#ifndef _SNESPPC
- if (Settings.SixteenBit)
-#endif
- {
for (register uint32 y = GFX.StartY; y <= GFX.EndY; y++)
{
register uint16 *p = (uint16 *) (GFX.Screen + y * GFX.Pitch) + 255;
for (register int x = 255; x >= 0; x--, p--, q -= 2)
*q = *(q + 1) = *p;
}
- }
-#ifndef _SNESPPC
- else
- {
- for (register uint32 y = GFX.StartY; y <= GFX.EndY; y++)
- {
- register uint8 *p = GFX.Screen + y * GFX.Pitch + 255;
- register uint8 *q = GFX.Screen + y * GFX.Pitch + 510;
- for (register int x = 255; x >= 0; x--, p--, q -= 2)
- *q = *(q + 1) = *p;
- }
- }
-#endif
}
if (IPPU.LatchedInterlace)
if (gameHeight > GUI.Height || gameWidth > GUI.Width)
DIE("Video is larger than window size!");
- const ScalerFactory* sFactory =
- searchForScaler(Settings.SixteenBit ? 16 : 8, gameWidth, gameHeight);
+ const ScalerFactory* sFactory = searchForScaler(16, gameWidth, gameHeight);
+
+ screen = SDL_SetVideoMode(GUI.Width, GUI.Height, 16,
+ SDL_SWSURFACE | (Config.fullscreen ? SDL_FULLSCREEN : 0));
- screen = SDL_SetVideoMode(GUI.Width, GUI.Height,
- Settings.SixteenBit ? 16 : 8,
- SDL_SWSURFACE |
- (Config.fullscreen ? SDL_FULLSCREEN : 0));
if (!screen)
DIE("SDL_SetVideoMode: %s", SDL_GetError());
if (Config.touchscreenShow) {
scaler->pause();
SDL_FillRect(screen, NULL, 0);
- S9xInputScreenDraw(Settings.SixteenBit ? 2 : 1,
- screen->pixels, screen->pitch);
+ S9xInputScreenDraw(screen->pixels, screen->pitch);
SDL_Flip(screen);
scaler->resume();
}
return false;
}
-// This is here for completeness, but palette mode is mostly useless (slow).
-void S9xSetPalette ()
-{
- if (Settings.SixteenBit) return;
-
- SDL_Color colors[256];
- int brightness = IPPU.MaxBrightness *138;
- for (int i = 0; i < 256; i++)
- {
- colors[i].r = ((PPU.CGDATA[i] >> 0) & 0x1F) * brightness;
- colors[i].g = ((PPU.CGDATA[i] >> 5) & 0x1F) * brightness;
- colors[i].b = ((PPU.CGDATA[i] >> 10) & 0x1F) * brightness;
- }
-
- SDL_SetColors(screen, colors, 0, 256);
-}
-
/** Called before rendering a frame.
This function must ensure GFX.Screen points to something, but we did that
while initializing video output.
478 if hi-res. SNES screen modes are being supported.
*/
// TODO Above.
-bool8_32 S9xDeinitUpdate (int width, int height, bool8_32 sixteenBit)
+bool8_32 S9xDeinitUpdate (int width, int height)
{
scaler->finish();
}
png_init_io(png_ptr, fp);
- if(!Settings.SixteenBit){
- // BJ: credit sanmaiwashi for the idea to do palettized pngs, and to
- // S9xSetPalette in x11.cpp for how to calculate the RGB values
- int b=IPPU.MaxBrightness*140;
- for(int i=0; i<256; i++){
- pngpal[i].red = (PPU.CGDATA[i] & 0x1f)*b>>8;
- pngpal[i].green = ((PPU.CGDATA[i] >> 5) & 0x1f)*b>>8;
- pngpal[i].blue = ((PPU.CGDATA[i] >> 10) & 0x1f)*b>>8;
- }
- png_set_PLTE(png_ptr, info_ptr, pngpal, 256);
- }
png_set_IHDR(png_ptr, info_ptr, imgwidth, imgheight, 8,
- (Settings.SixteenBit?PNG_COLOR_TYPE_RGB:PNG_COLOR_TYPE_PALETTE),
- PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT,
- PNG_FILTER_TYPE_DEFAULT);
-
- if(Settings.SixteenBit){
- /* 5 bits per color */
- sig_bit.red=5;
- sig_bit.green=5;
- sig_bit.blue=5;
- png_set_sBIT(png_ptr, info_ptr, &sig_bit);
- png_set_shift(png_ptr, &sig_bit);
- }
+ PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE,
+ PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
+
+ /* 5 bits per color */
+ sig_bit.red=5;
+ sig_bit.green=5;
+ sig_bit.blue=5;
+ png_set_sBIT(png_ptr, info_ptr, &sig_bit);
+ png_set_shift(png_ptr, &sig_bit);
png_write_info(png_ptr, info_ptr);
for(int y=0; y<height; y++, screen+=GFX.Pitch){
png_byte *rowpix = row_pointer;
for(int x=0; x<width; x++){
- if(Settings.SixteenBit){
- uint32 r, g, b;
- DECOMPOSE_PIXEL((*(uint16 *)(screen+2*x)), r, g, b);
+ uint32 r, g, b;
+ DECOMPOSE_PIXEL((*(uint16 *)(screen+2*x)), r, g, b);
+ *(rowpix++) = r;
+ *(rowpix++) = g;
+ *(rowpix++) = b;
+ if (imgwidth!=width) {
*(rowpix++) = r;
*(rowpix++) = g;
*(rowpix++) = b;
- if(imgwidth!=width){
- *(rowpix++) = r;
- *(rowpix++) = g;
- *(rowpix++) = b;
- }
- } else {
- *(rowpix++)=*(uint8 *)(screen+x);
- if(imgwidth!=width)
- *(rowpix++)=*(uint8 *)(screen+x);
}
}
png_write_row(png_ptr, row_pointer);