📄 helper.c
字号:
{
case 0: /* VGA mode 13h - linear 320x200 */
case 1: /* VESA2 - linear 320x240 */
case 2: /* VGA mode-x - planar 320x240 */
case 3: /* VGA - linear 256x239 */
screenshot_source = gbSNES_Screen8.subbitmap;
switch (stretch_x)
{
case 0:
out_size_x = 256;
out_position_x = (ScreenX - out_size_x) / 2;
break;
default:
out_size_x = 256 * stretch_x;
out_position_x = (ScreenX - out_size_x) / 2;
break;
case 1:
out_position_x = 0;
out_size_x = ScreenX;
break;
}
switch (stretch_y)
{
case 0:
out_size_y = 239;
out_position_y = (ScreenY - out_size_y) / 2;
break;
default:
out_size_y = 239 * stretch_y;
out_position_y = (ScreenY - out_size_y) / 2;
break;
case 1:
out_position_y = 0;
out_size_y = ScreenY;
break;
}
if (stretch_x || stretch_y)
{
if (Current_Line_Render < 239 && Current_Line_Render < Last_Frame_Line)
{
/* fill unrendered area with black */
rectfill(gbSNES_Screen8.subbitmap,
0, Current_Line_Render,
255, Last_Frame_Line - 1,
0);
}
acquire_screen();
stretch_blit(gbSNES_Screen8.subbitmap, screen,
0, 0, 256, 239,
out_position_x, out_position_y, out_size_x, out_size_y);
release_screen();
}
else
{
acquire_screen();
blit(gbSNES_Screen8.subbitmap, screen, 0, 0,
out_position_x, out_position_y, out_size_x, Current_Line_Render);
if (Current_Line_Render < 239 && Current_Line_Render < Last_Frame_Line)
{
/* fill unrendered area with black */
rectfill(screen,
out_position_x, out_position_y + Current_Line_Render,
out_position_x + out_size_x - 1, out_position_y + Last_Frame_Line - 1,
0);
}
release_screen();
}
break;
case 4: /* VESA 2 16-bit - 320x200 */
case 5: /* VESA 2 16-bit - 320x240 */
case 6: /* VESA 2 16-bit - 640x480 */
case 7: /* Windows/X windowing system 16-bit - 640x480 */
#if 0
{
int ox, oy;
out_position_x = (ScreenX > 256) ? (ScreenX - 256) / 2 : 0;
out_size_x = (ScreenX < 256) ? ScreenX : 256;
out_position_y = (ScreenY > 239) ? (ScreenY - 239) / 2 : 0;
out_size_y = (ScreenY < Current_Line_Render) ? ScreenY : Current_Line_Render;
acquire_screen();
for (oy = 0; oy < out_size_y; oy++)
{
unsigned char *src_line_address = gbSNES_Screen8.subbitmap->line[oy];
for (ox = 0; ox < out_size_x; ox++)
{
unsigned char color = src_line_address[ox];
unsigned short color16 =
((unsigned short *)HICOLOUR_Palette)[color];
_putpixel16(screen, out_position_x + ox, out_position_y + oy, color16);
}
}
if (Current_Line_Render < 239 && Current_Line_Render < Last_Frame_Line)
{
/* fill unrendered area with black */
rectfill(screen,
out_position_x, out_position_y + Current_Line_Render,
out_position_x + out_size_x - 1, out_position_y + Last_Frame_Line - 1,
0);
}
release_screen();
break;
}
#else
switch (stretch_x)
{
case 0:
out_size_x = 256;
out_position_x = (ScreenX - out_size_x) / 2;
break;
default:
out_size_x = 256 * stretch_x;
out_position_x = (ScreenX - out_size_x) / 2;
break;
case 1:
out_position_x = 0;
out_size_x = ScreenX;
break;
}
switch (stretch_y)
{
case 0:
out_size_y = 239;
out_position_y = (ScreenY - out_size_y) / 2;
break;
default:
out_size_y = 239 * stretch_y;
out_position_y = (ScreenY - out_size_y) / 2;
break;
case 1:
out_position_y = 0;
out_size_y = ScreenY;
break;
}
if (stretch_x || stretch_y)
{
screenshot_source = gbSNES_Screen16.subbitmap;
if (Current_Line_Render < 239 && Current_Line_Render < Last_Frame_Line)
{
/* fill unrendered area with black */
rectfill(gbSNES_Screen8.subbitmap,
0, Current_Line_Render,
255, Last_Frame_Line - 1,
0);
}
blit(gbSNES_Screen8.subbitmap, gbSNES_Screen16.subbitmap,
0, 0, 0, 0, 256, 239);
acquire_screen();
stretch_blit(gbSNES_Screen16.subbitmap, screen,
0, 0, 256, 239,
out_position_x, out_position_y, out_size_x, out_size_y);
release_screen();
}
else
{
screenshot_source = gbSNES_Screen8.subbitmap;
acquire_screen();
blit(gbSNES_Screen8.subbitmap, screen, 0, 0, out_position_x, out_position_y,
out_size_x, Current_Line_Render);
if (Current_Line_Render < 239 && Current_Line_Render < Last_Frame_Line)
{
/* fill unrendered area with black */
rectfill(screen,
out_position_x, out_position_y + Current_Line_Render,
out_position_x + out_size_x - 1, out_position_y + Last_Frame_Line - 1,
0);
}
release_screen();
}
break;
#endif
default:
screenshot_source = gbSNES_Screen8.subbitmap;
acquire_screen();
blit(gbSNES_Screen8.subbitmap, screen, 0, 0, 0, 0, ScreenX, ScreenY);
release_screen();
}
}
#if defined(UNIX) || defined(__BEOS__)
void fnmerge(char *out, const char *drive, const char *dir, const char *file,
const char *ext)
{
out[0] = 0;
if (strlen (drive))
strcat(out, drive);
if (strlen (dir))
{
strcat(out, dir);
strcat(out, "/");
}
if (strlen (file))
strcat(out, file);
if (strlen (ext))
{
strcat(out, ".");
strcat(out, ext);
}
}
static void set_dir(char *dir, const char *in, const char *inptr)
{
if (inptr > in + 1)
{
if (*(inptr - 2) == '.' && *(inptr - 1) == '.') /* check for ".." */
{
strcpy(dir, inptr - 2);
return;
}
}
else if (inptr > in)
{
if (*(inptr - 1) == '.') /* check for "." */
{
strcpy(dir, inptr - 1);
return;
}
}
/* NOT else! */
strcpy(dir, in);
}
void fnsplit(const char *in0, char *drive, char *dir, char *file, char *ext)
/* Note: We assume "in0" points to a correct filename */
{
struct stat fstate;
char *p1, *p2, in[FILENAME_MAX];
strcpy(in, in0); /* don't modify in0 parameter */
stat(in, &fstate);
/* We're running on Unix or BeOS, so we don't check for a drive letter */
*drive = 0;
if ((p1 = strchr(in, '/')))
{
if (S_ISDIR(fstate.st_mode))
{
if (p1[1] == 0) /* single trailing slash */
strcpy(dir, in);
else /* "leading" slash */
set_dir(dir, in, p1);
*file = 0;
}
else
{
p2 = strrchr(in, '/');
if (p1 == p2) /* only one slash (must be a leading one) */
{
*p1 = 0;
set_dir(dir, in, p1);
strcpy(file, p1 + 1);
}
else
{
*p2 = 0;
set_dir(dir, in, p1);
strcpy(file, p2 + 1);
}
}
}
else /* no slash */
{
if (S_ISDIR(fstate.st_mode))
{
strcpy(dir, in);
*file = 0;
}
else
{
*dir = 0;
strcpy(file, in);
}
}
if ((p1 = strrchr(file, '.')))
{
if (p1 > file)
{
strcpy(ext, p1); /* save period in ext */
*p1 = 0;
}
else /* file name with leading period */
*ext = 0;
}
else
*ext = 0;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -