File: demo.c

package info (click to toggle)
libretro-nestopia 1.52.0%2B20230102.gitcb1e24e-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 12,960 kB
  • sloc: cpp: 107,513; xml: 27,221; python: 1,329; ansic: 772; makefile: 634
file content (117 lines) | stat: -rw-r--r-- 3,499 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/* Displays and saves NTSC filtered image. Mouse controls sharpness and gamma.
Defaults to using "test.bmp" for input and "filtered.bmp" for output. Input
image must be an uncompressed BMP. Also writes "nes.pal" RGB color file on exit.

Usage: demo [in.bmp [out.bmp]]

Space   Toggle field merging
C       Composite video quality
S       S-video quality
R       RGB video quality
M       Monochrome video quality
D       Toggle between standard and Sony decoder matrix
*/

#include "nes_ntsc.h"

#include "demo_impl.h"

/* only used to convert input image to native palette format */
static SDL_Color palette [256] = {
	{102,102,102},{  0, 42,136},{ 20, 18,168},{ 59,  0,164},
	{ 92,  0,126},{110,  0, 64},{108,  7,  0},{ 87, 29,  0},
	{ 52, 53,  0},{ 12, 73,  0},{  0, 82,  0},{  0, 79,  8},
	{  0, 64, 78},{  0,  0,  0},{  0,  0,  0},{  0,  0,  0},
	{174,174,174},{ 21, 95,218},{ 66, 64,254},{118, 39,255},
	{161, 27,205},{184, 30,124},{181, 50, 32},{153, 79,  0},
	{108,110,  0},{ 56,135,  0},{ 13,148,  0},{  0,144, 50},
	{  0,124,142},{  0,  0,  0},{  0,  0,  0},{  0,  0,  0},
	{254,254,254},{100,176,254},{147,144,254},{199,119,254},
	{243,106,254},{254,110,205},{254,130,112},{235,159, 35},
	{189,191,  0},{137,217,  0},{ 93,229, 48},{ 69,225,130},
	{ 72,206,223},{ 79, 79, 79},{  0,  0,  0},{  0,  0,  0},
	{254,254,254},{193,224,254},{212,211,254},{233,200,254},
	{251,195,254},{254,197,235},{254,205,198},{247,217,166},
	{229,230,149},{208,240,151},{190,245,171},{180,243,205},
	{181,236,243},{184,184,184},{  0,  0,  0},{  0,  0,  0}
};

int main( int argc, char** argv )
{
	image_t image;
	int sony_decoder = 0;
	int merge_fields = 1;
	int burst_phase = 0;
	nes_ntsc_setup_t setup = nes_ntsc_composite;

	nes_ntsc_t* ntsc = (nes_ntsc_t*) malloc( sizeof (nes_ntsc_t) );
	if ( !ntsc )
		fatal_error( "Out of memory" );
	nes_ntsc_init( ntsc, &setup );
	
	load_bmp( &image, (argc > 1 ? argv [1] : "test.bmp"), palette );
	init_window( NES_NTSC_OUT_WIDTH( image.width ), image.height * 2 );
	
	while ( read_input() )
	{
		lock_pixels();
		
		burst_phase ^= 1;
		if ( setup.merge_fields )
			burst_phase = 0;
		
		nes_ntsc_blit( ntsc, image.byte_pixels, image.row_width, burst_phase,
				image.width, image.height, output_pixels, output_pitch );
		
		double_output_height();
		display_output();
		
		switch ( key_pressed )
		{
			case ' ': merge_fields = !merge_fields; break;
			case 'c': setup = nes_ntsc_composite; break;
			case 's': setup = nes_ntsc_svideo; break;
			case 'r': setup = nes_ntsc_rgb; break;
			case 'm': setup = nes_ntsc_monochrome; break;
			case 'd': sony_decoder = !sony_decoder; break;
		}
		
		if ( key_pressed || mouse_moved )
		{
			setup.merge_fields = merge_fields;
			
			/* available parameters: hue, saturation, contrast, brightness,
			sharpness, gamma, bleed, resolution, artifacts, fringing */
			setup.sharpness = mouse_x;
			setup.gamma     = mouse_y;
			
			setup.decoder_matrix = 0;
			if ( sony_decoder )
			{
				/* Sony CXA2025AS US */
				static float matrix [6] = { 1.630, 0.317, -0.378, -0.466, -1.089, 1.677 };
				setup.decoder_matrix = matrix;
			}
			
			nes_ntsc_init( ntsc, &setup );
		}
	}
	
	save_bmp( argc > 2 ? argv [2] : "filtered.bmp" );
	
	free( ntsc );
	
	/* write standard 192-byte NES palette */
	{
		FILE* out = fopen( "nes.pal", "wb" );
		if ( out )
		{
			unsigned char palette [nes_ntsc_palette_size * 3];
			setup.palette_out = palette;
			nes_ntsc_init( 0, &setup );
			fwrite( palette, 192, 1, out );
		}
	}
	
	return 0;
}