activegs-ios/kegs/iOS/emulatorView.mm

99 lines
1.8 KiB
Plaintext

/*
ActiveGS, Copyright 2004-2016 Olivier Goguel, https://github.com/ogoguel/ActiveGS
Based on Kegs, Copyright 2004 Kent Dickey, https://kegs.sourceforge.net
This code is covered by the GNU GPL licence
*/
#include "../Src/defc.h"
#include "../Src/video.h"
#include "../Src/sim65816.h"
#import "emulatorView.h"
int x_frame_rate = -1;
@implementation emulatorView
-(void)activateEmulatorRefresh:(int)_frameRate
{
if (displayLink)
[self deactivateEmulatorRefresh];
displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(directDraw:)];
x_frame_rate = _frameRate;
switch(_frameRate)
{
case 30:
[displayLink setFrameInterval:2];
g_video.g_screen_redraw_skip_amt = 1;
break;
case 60:
[displayLink setFrameInterval:1];
g_video.g_screen_redraw_skip_amt = -1;
break;
case 15:
[displayLink setFrameInterval:4];
g_video.g_screen_redraw_skip_amt = 3;
break;
case 20:
default: // 20FPS
[displayLink setFrameInterval:3];
g_video.g_screen_redraw_skip_amt = 2;
break;
}
// OG utiliser NSRunLoopCommonModes pour que le rendu ne s'arrete pas durant un uiscrollview
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
}
-(void)deactivateEmulatorRefresh
{
displayLink=nil;
}
int x_video_need_to_be_refreshed = 0;
extern int x_vbl_count ;
void x_invalidrect()
{
x_video_need_to_be_refreshed = 1;
}
- (void)directDraw:(CADisplayLink *)sender
{
x_vbl_count++;
addFrameRate(4);
if (x_video_need_to_be_refreshed)
{
x_video_need_to_be_refreshed = 0;
addFrameRate(3);
[self setNeedsDisplay];
}
/*
#ifdef ACTIVEGS
extern void x_update_framerate();
x_update_framerate();
#endif
*/
}
-(void) drawRect:(CGRect) rect
{
CGContextRef g = UIGraphicsGetCurrentContext();
x_async_refresh(g,rect);
}
@end