mirror of
https://github.com/libretro/scummvm.git
synced 2025-04-02 14:51:40 +00:00
Converted the iPhone backend to use OpenGL ES instead of CoreSurface for graphics output
svn-id: r40403
This commit is contained in:
parent
5dc9bdc05a
commit
8b813f02b8
@ -62,11 +62,8 @@ void iphone_main(int argc, char *argv[]);
|
||||
|
||||
// On the ObjC side
|
||||
void iPhone_updateScreen();
|
||||
void iPhone_updateScreenRect(int x1, int y1, int x2, int y2);
|
||||
unsigned short* iPhone_getSurface();
|
||||
void iPhone_lockSurface();
|
||||
void iPhone_unlockSurface();
|
||||
void iPhone_initSurface(int width, int height, bool landscape);
|
||||
void iPhone_updateScreenRect(unsigned short* screen, int x1, int y1, int x2, int y2);
|
||||
void iPhone_initSurface(int width, int height);
|
||||
bool iPhone_fetchEvent(int *outEvent, float *outX, float *outY);
|
||||
const char* iPhone_getDocumentsDir();
|
||||
|
||||
|
@ -25,6 +25,7 @@
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import <Foundation/NSThread.h>
|
||||
|
||||
#include "iphone_video.h"
|
||||
|
||||
void iphone_main(int argc, char *argv[]);
|
||||
@ -37,6 +38,7 @@ void iphone_main(int argc, char *argv[]);
|
||||
- (void) mainLoop: (id)param;
|
||||
- (iPhoneView*) getView;
|
||||
- (UIWindow*) getWindow;
|
||||
- (void)didRotate:(NSNotification *)notification;
|
||||
@end
|
||||
|
||||
static int gArgc;
|
||||
@ -90,17 +92,19 @@ int main(int argc, char** argv) {
|
||||
|
||||
[_window setContentView: _view];
|
||||
|
||||
//[_window orderFront: self];
|
||||
//[_window makeKey: self];
|
||||
|
||||
[_window addSubview:_view];
|
||||
[_window makeKeyAndVisible];
|
||||
|
||||
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(didRotate:)
|
||||
name:@"UIDeviceOrientationDidChangeNotification" object:nil];
|
||||
|
||||
[NSThread detachNewThreadSelector:@selector(mainLoop:) toTarget:self withObject:nil];
|
||||
}
|
||||
|
||||
- (void)applicationSuspend:(struct __GSEvent *)event {
|
||||
[self setApplicationBadge:NSLocalizedString(@"ON", nil)];
|
||||
//[self setApplicationBadge:NSLocalizedString(@"ON", nil)];
|
||||
[_view applicationSuspend];
|
||||
}
|
||||
|
||||
@ -115,8 +119,8 @@ int main(int argc, char** argv) {
|
||||
[self setStatusBarHidden:YES animated:YES];
|
||||
}
|
||||
|
||||
- (void)deviceOrientationChanged:(struct __GSEvent *)event {
|
||||
int screenOrientation = GSEventDeviceOrientation(event);
|
||||
- (void)didRotate:(NSNotification *)notification {
|
||||
int screenOrientation = [[UIDevice currentDevice] orientation];
|
||||
[_view deviceOrientationChanged: screenOrientation];
|
||||
}
|
||||
|
||||
|
@ -30,30 +30,16 @@
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <QuartzCore/QuartzCore.h>
|
||||
|
||||
#import <OpenGLES/EAGL.h>
|
||||
#import <OpenGLES/ES1/gl.h>
|
||||
#import <OpenGLES/ES1/glext.h>
|
||||
|
||||
#import "iphone_keyboard.h"
|
||||
|
||||
void *CoreSurfaceBufferGetBaseAddress(void* surface);
|
||||
int CoreSurfaceBufferLock(void* surface, unsigned int lockType);
|
||||
int CoreSurfaceBufferUnlock(void* surface);
|
||||
void* CoreSurfaceBufferCreate(CFDictionaryRef dict);
|
||||
|
||||
extern CFStringRef kCoreSurfaceBufferGlobal;
|
||||
extern CFStringRef kCoreSurfaceBufferMemoryRegion;
|
||||
extern CFStringRef kCoreSurfaceBufferPitch;
|
||||
extern CFStringRef kCoreSurfaceBufferWidth;
|
||||
extern CFStringRef kCoreSurfaceBufferHeight;
|
||||
extern CFStringRef kCoreSurfaceBufferPixelFormat;
|
||||
extern CFStringRef kCoreSurfaceBufferAllocSize;
|
||||
|
||||
struct __GSEvent;
|
||||
CGPoint GSEventGetLocationInWindow(struct __GSEvent *ev);
|
||||
unsigned int GSEventDeviceOrientation(struct __GSEvent *ev);
|
||||
|
||||
@interface iPhoneView : UIView
|
||||
{
|
||||
void* _screenSurface;
|
||||
NSMutableArray* _events;
|
||||
NSLock* _lock;
|
||||
SoftKeyboard* _keyboardView;
|
||||
CALayer* _screenLayer;
|
||||
|
||||
@ -61,6 +47,15 @@ unsigned int GSEventDeviceOrientation(struct __GSEvent *ev);
|
||||
int _fullHeight;
|
||||
int _widthOffset;
|
||||
int _heightOffset;
|
||||
|
||||
EAGLContext* _context;
|
||||
GLuint _viewRenderbuffer;
|
||||
GLuint _viewFramebuffer;
|
||||
GLint _backingWidth;
|
||||
GLint _backingHeight;
|
||||
GLint _visibleWidth;
|
||||
GLint _visibleHeight;
|
||||
GLuint _screenTexture;
|
||||
}
|
||||
|
||||
- (id)initWithFrame:(struct CGRect)frame;
|
||||
@ -71,7 +66,7 @@ unsigned int GSEventDeviceOrientation(struct __GSEvent *ev);
|
||||
|
||||
- (void)initSurface;
|
||||
|
||||
- (void)updateScreenRect:(id)rect;
|
||||
- (void)updateSurface;
|
||||
|
||||
- (id)getEvent;
|
||||
|
||||
|
@ -33,38 +33,38 @@
|
||||
static iPhoneView *sharedInstance = nil;
|
||||
static int _width = 0;
|
||||
static int _height = 0;
|
||||
static bool _landscape;
|
||||
static CGRect _screenRect;
|
||||
static char* _textureBuffer = 0;
|
||||
static int _textureWidth = 0;
|
||||
static int _textureHeight = 0;
|
||||
NSLock* _lock = nil;
|
||||
static int _needsScreenUpdate = 0;
|
||||
|
||||
// static long lastTick = 0;
|
||||
// static int frames = 0;
|
||||
|
||||
unsigned short* iPhone_getSurface() {
|
||||
return CoreSurfaceBufferGetBaseAddress([sharedInstance getSurface]);
|
||||
}
|
||||
|
||||
void iPhone_updateScreen() {
|
||||
[sharedInstance performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone: NO];
|
||||
if (!_needsScreenUpdate) {
|
||||
_needsScreenUpdate = 1;
|
||||
[sharedInstance performSelectorOnMainThread:@selector(updateSurface) withObject:nil waitUntilDone: NO];
|
||||
}
|
||||
}
|
||||
|
||||
void iPhone_updateScreenRect(int x1, int y1, int x2, int y2) {
|
||||
//CGRect rect = CGRectMake(x1, y1, x2, y2);
|
||||
//[sharedInstance performSelectorOnMainThread:@selector(updateScreenRect:) withObject: [NSValue valueWithRect:rect] waitUntilDone: NO];
|
||||
void iPhone_updateScreenRect(unsigned short* screen, int x1, int y1, int x2, int y2) {
|
||||
[_lock lock];
|
||||
|
||||
int y;
|
||||
for (y = y1; y < y2; ++y) {
|
||||
memcpy(&_textureBuffer[(y * _textureWidth + x1 )* 2], &screen[y * _width + x1], (x2 - x1) * 2);
|
||||
}
|
||||
|
||||
[_lock unlock];
|
||||
}
|
||||
|
||||
void iPhone_lockSurface() {
|
||||
CoreSurfaceBufferLock([sharedInstance getSurface], 3);
|
||||
}
|
||||
|
||||
void iPhone_unlockSurface() {
|
||||
CoreSurfaceBufferUnlock([sharedInstance getSurface]);
|
||||
}
|
||||
|
||||
void iPhone_initSurface(int width, int height, bool landscape) {
|
||||
void iPhone_initSurface(int width, int height) {
|
||||
_width = width;
|
||||
_height = height;
|
||||
_landscape = landscape;
|
||||
|
||||
[sharedInstance performSelectorOnMainThread:@selector(initSurface) withObject:nil waitUntilDone: YES];
|
||||
}
|
||||
|
||||
@ -105,8 +105,26 @@ bool getLocalMouseCoords(CGPoint *point) {
|
||||
return true;
|
||||
}
|
||||
|
||||
uint getSizeNextPOT(uint size) {
|
||||
if ((size & (size - 1)) || !size) {
|
||||
int log = 0;
|
||||
|
||||
while (size >>= 1)
|
||||
++log;
|
||||
|
||||
size = (2 << log);
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
@implementation iPhoneView
|
||||
|
||||
+ (Class) layerClass
|
||||
{
|
||||
return [CAEAGLLayer class];
|
||||
}
|
||||
|
||||
- (id)initWithFrame:(struct CGRect)frame {
|
||||
[super initWithFrame: frame];
|
||||
|
||||
@ -115,8 +133,11 @@ bool getLocalMouseCoords(CGPoint *point) {
|
||||
_screenLayer = nil;
|
||||
|
||||
sharedInstance = self;
|
||||
|
||||
_lock = [NSLock new];
|
||||
_keyboardView = nil;
|
||||
//[super setTapDelegate: self];
|
||||
_context = nil;
|
||||
_screenTexture = 0;
|
||||
|
||||
return self;
|
||||
}
|
||||
@ -127,6 +148,9 @@ bool getLocalMouseCoords(CGPoint *point) {
|
||||
if (_keyboardView != nil) {
|
||||
[_keyboardView dealloc];
|
||||
}
|
||||
|
||||
if (_screenTexture)
|
||||
free(_textureBuffer);
|
||||
}
|
||||
|
||||
- (void *)getSurface {
|
||||
@ -146,44 +170,132 @@ bool getLocalMouseCoords(CGPoint *point) {
|
||||
// }
|
||||
}
|
||||
|
||||
- (void)updateScreenRect:(id)rect {
|
||||
// NSRect nsRect = [rect rectValue];
|
||||
// CGRect cgRect = CGRectMake(nsRect.origin.x, nsRect.origin.y, nsRect.size.width, nsRect.size.height);
|
||||
// [sharedInstance setNeedsDisplayInRect: cgRect];
|
||||
- (void)updateSurface {
|
||||
if (!_needsScreenUpdate) {
|
||||
return;
|
||||
}
|
||||
_needsScreenUpdate = 0;
|
||||
|
||||
GLfloat vertices[] = {
|
||||
0.0f + _heightOffset, 0.0f + _widthOffset,
|
||||
_visibleWidth - _heightOffset, 0.0f + _widthOffset,
|
||||
0.0f + _heightOffset, _visibleHeight - _widthOffset,
|
||||
_visibleWidth - _heightOffset, _visibleHeight - _widthOffset
|
||||
};
|
||||
|
||||
float texWidth = _width / (float)_textureWidth;;
|
||||
float texHeight = _height / (float)_textureHeight;
|
||||
|
||||
const GLfloat texCoords[] = {
|
||||
texWidth, 0.0f,
|
||||
0.0f, 0.0f,
|
||||
texWidth, texHeight,
|
||||
0.0f, texHeight
|
||||
};
|
||||
|
||||
glVertexPointer(2, GL_FLOAT, 0, vertices);
|
||||
glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
|
||||
|
||||
[_lock lock];
|
||||
// Unfortunately we have to update the whole texture every frame, since glTexSubImage2D is actually slower in all cases
|
||||
// due to the iPhone internals having to convert the whole texture back from its internal format when used.
|
||||
// In the future we could use several tiled textures instead.
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, _textureWidth, _textureHeight, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, _textureBuffer);
|
||||
[_lock unlock];
|
||||
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||
glBindRenderbufferOES(GL_RENDERBUFFER_OES, _viewRenderbuffer);
|
||||
[_context presentRenderbuffer:GL_RENDERBUFFER_OES];
|
||||
|
||||
}
|
||||
|
||||
- (void)initSurface {
|
||||
//printf("Window: (%d, %d), Surface: (%d, %d)\n", _fullWidth, _fullHeight, _width, _height);
|
||||
_textureWidth = getSizeNextPOT(_width);
|
||||
_textureHeight = getSizeNextPOT(_height);
|
||||
|
||||
int pitch = _width * 2;
|
||||
int allocSize = 2 * _width * _height;
|
||||
char *pixelFormat = "565L";
|
||||
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
|
||||
|
||||
NSDictionary* dict = [[NSDictionary alloc] initWithObjectsAndKeys:
|
||||
kCFBooleanTrue, kCoreSurfaceBufferGlobal,
|
||||
@"PurpleGFXMem", kCoreSurfaceBufferMemoryRegion,
|
||||
[NSNumber numberWithInt: pitch], kCoreSurfaceBufferPitch,
|
||||
[NSNumber numberWithInt: _width], kCoreSurfaceBufferWidth,
|
||||
[NSNumber numberWithInt: _height], kCoreSurfaceBufferHeight,
|
||||
[NSNumber numberWithInt: *(int*)pixelFormat], kCoreSurfaceBufferPixelFormat,
|
||||
[NSNumber numberWithInt: allocSize], kCoreSurfaceBufferAllocSize,
|
||||
nil
|
||||
];
|
||||
//printf("Window: (%d, %d), Surface: (%d, %d), Texture(%d, %d)\n", _fullWidth, _fullHeight, _width, _height, _textureWidth, _textureHeight);
|
||||
|
||||
if (_context == nil) {
|
||||
orientation = UIDeviceOrientationLandscapeRight;
|
||||
CAEAGLLayer *eaglLayer = (CAEAGLLayer*) self.layer;
|
||||
|
||||
eaglLayer.opaque = YES;
|
||||
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
|
||||
[NSNumber numberWithBool:FALSE], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGB565, kEAGLDrawablePropertyColorFormat, nil];
|
||||
|
||||
_context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
|
||||
if (!_context || [EAGLContext setCurrentContext:_context]) {
|
||||
glGenFramebuffersOES(1, &_viewFramebuffer);
|
||||
glGenRenderbuffersOES(1, &_viewRenderbuffer);
|
||||
|
||||
glBindFramebufferOES(GL_FRAMEBUFFER_OES, _viewFramebuffer);
|
||||
glBindRenderbufferOES(GL_RENDERBUFFER_OES, _viewRenderbuffer);
|
||||
[_context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(id<EAGLDrawable>)self.layer];
|
||||
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, _viewRenderbuffer);
|
||||
|
||||
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &_backingWidth);
|
||||
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &_backingHeight);
|
||||
|
||||
if (glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) {
|
||||
NSLog(@"Failed to make complete framebuffer object %x.", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
|
||||
return;
|
||||
}
|
||||
|
||||
glViewport(0, 0, _backingWidth, _backingHeight);
|
||||
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
||||
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
glEnableClientState(GL_VERTEX_ARRAY);
|
||||
}
|
||||
}
|
||||
|
||||
//("Allocating surface: %d\n", allocSize);
|
||||
_screenSurface = CoreSurfaceBufferCreate((CFDictionaryRef)dict);
|
||||
//printf("Surface created.\n");
|
||||
CoreSurfaceBufferLock(_screenSurface, 3);
|
||||
|
||||
CALayer* screenLayer = [[CALayer layer] retain];
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
|
||||
if (orientation == UIDeviceOrientationLandscapeRight) {
|
||||
glRotatef(-90, 0, 0, 1);
|
||||
} else if (orientation == UIDeviceOrientationLandscapeLeft) {
|
||||
glRotatef(90, 0, 0, 1);
|
||||
} else {
|
||||
glRotatef(180, 0, 0, 1);
|
||||
}
|
||||
|
||||
glOrthof(0, _backingWidth, 0, _backingHeight, 0, 1);
|
||||
|
||||
if (_screenTexture > 0)
|
||||
glDeleteTextures(1, &_screenTexture);
|
||||
|
||||
glGenTextures(1, &_screenTexture);
|
||||
glBindTexture(GL_TEXTURE_2D, _screenTexture);
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
|
||||
if (_textureBuffer)
|
||||
free(_textureBuffer);
|
||||
|
||||
int textureSize = _textureWidth * _textureHeight * 2;
|
||||
_textureBuffer = (char*)malloc(textureSize);
|
||||
memset(_textureBuffer, 0, textureSize);
|
||||
|
||||
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
glBindRenderbufferOES(GL_RENDERBUFFER_OES, _viewRenderbuffer);
|
||||
[_context presentRenderbuffer:GL_RENDERBUFFER_OES];
|
||||
|
||||
if (_keyboardView != nil) {
|
||||
[_keyboardView removeFromSuperview];
|
||||
[[_keyboardView inputView] removeFromSuperview];
|
||||
}
|
||||
|
||||
if (_landscape) {
|
||||
float ratioDifference = ((float)_width / (float)_height) / ((float)_fullWidth / (float)_fullHeight);
|
||||
if (orientation == UIDeviceOrientationLandscapeLeft || orientation == UIDeviceOrientationLandscapeRight) {
|
||||
_visibleHeight = _backingHeight;
|
||||
_visibleWidth = _backingWidth;
|
||||
|
||||
float ratioDifference = ((float)_height / (float)_width) / ((float)_fullWidth / (float)_fullHeight);
|
||||
int rectWidth, rectHeight;
|
||||
if (ratioDifference < 1.0f) {
|
||||
rectWidth = _fullWidth * ratioDifference;
|
||||
@ -199,15 +311,17 @@ bool getLocalMouseCoords(CGPoint *point) {
|
||||
|
||||
//printf("Rect: %i, %i, %i, %i\n", _widthOffset, _heightOffset, rectWidth, rectHeight);
|
||||
_screenRect = CGRectMake(_widthOffset, _heightOffset, rectWidth, rectHeight);
|
||||
[screenLayer setFrame: _screenRect];
|
||||
} else {
|
||||
float ratio = (float)_height / (float)_width;
|
||||
int height = _fullWidth * ratio;
|
||||
//printf("Making rect (%u, %u)\n", _fullWidth, height);
|
||||
_screenRect = CGRectMake(0, 0, _fullWidth - 1, height - 1);
|
||||
[screenLayer setFrame: _screenRect];
|
||||
|
||||
//CGRect keyFrame = CGRectMake(0.0f, _screenRect.size.height, _fullWidth, _fullHeight - _screenRect.size.height);
|
||||
_visibleHeight = height;
|
||||
_visibleWidth = _backingWidth;
|
||||
_heightOffset = 0.0f;
|
||||
_widthOffset = 0.0f;
|
||||
|
||||
CGRect keyFrame = CGRectMake(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
if (_keyboardView == nil) {
|
||||
_keyboardView = [[SoftKeyboard alloc] initWithFrame:keyFrame];
|
||||
@ -218,28 +332,6 @@ bool getLocalMouseCoords(CGPoint *point) {
|
||||
[self addSubview: _keyboardView];
|
||||
[[_keyboardView inputView] becomeFirstResponder];
|
||||
}
|
||||
|
||||
[screenLayer setContents: _screenSurface];
|
||||
[screenLayer setOpaque: YES];
|
||||
|
||||
if (_screenLayer != nil) {
|
||||
[[sharedInstance layer] replaceSublayer: _screenLayer with: screenLayer];
|
||||
} else {
|
||||
[[sharedInstance layer] addSublayer: screenLayer];
|
||||
}
|
||||
_screenLayer = screenLayer;
|
||||
|
||||
CoreSurfaceBufferUnlock(_screenSurface);
|
||||
[dict release];
|
||||
}
|
||||
|
||||
|
||||
- (void)lock {
|
||||
[_lock lock];
|
||||
}
|
||||
|
||||
- (void)unlock {
|
||||
[_lock unlock];
|
||||
}
|
||||
|
||||
- (id)getEvent {
|
||||
@ -247,25 +339,20 @@ bool getLocalMouseCoords(CGPoint *point) {
|
||||
return nil;
|
||||
}
|
||||
|
||||
[self lock];
|
||||
|
||||
id event = [_events objectAtIndex: 0];
|
||||
|
||||
[_events removeObjectAtIndex: 0];
|
||||
[self unlock];
|
||||
|
||||
return event;
|
||||
}
|
||||
|
||||
- (void)addEvent:(NSDictionary*)event {
|
||||
[self lock];
|
||||
|
||||
if(_events == nil)
|
||||
_events = [[NSMutableArray alloc] init];
|
||||
|
||||
[_events addObject: event];
|
||||
|
||||
[self unlock];
|
||||
}
|
||||
|
||||
- (void)deviceOrientationChanged:(int)orientation {
|
||||
@ -289,7 +376,6 @@ bool getLocalMouseCoords(CGPoint *point) {
|
||||
{
|
||||
UITouch *touch = [[allTouches allObjects] objectAtIndex:0];
|
||||
CGPoint point = [touch locationInView:self];
|
||||
//point = [self convertPoint:point fromView:nil];
|
||||
if (!getLocalMouseCoords(&point))
|
||||
return;
|
||||
|
||||
@ -307,7 +393,6 @@ bool getLocalMouseCoords(CGPoint *point) {
|
||||
{
|
||||
UITouch *touch = [[allTouches allObjects] objectAtIndex:1];
|
||||
CGPoint point = [touch locationInView:self];
|
||||
//point = [self convertPoint:point fromView:nil];
|
||||
if (!getLocalMouseCoords(&point))
|
||||
return;
|
||||
|
||||
@ -333,7 +418,6 @@ bool getLocalMouseCoords(CGPoint *point) {
|
||||
{
|
||||
UITouch *touch = [[allTouches allObjects] objectAtIndex:0];
|
||||
CGPoint point = [touch locationInView:self];
|
||||
//point = [self convertPoint:point fromView:nil];
|
||||
if (!getLocalMouseCoords(&point))
|
||||
return;
|
||||
|
||||
@ -351,7 +435,6 @@ bool getLocalMouseCoords(CGPoint *point) {
|
||||
{
|
||||
UITouch *touch = [[allTouches allObjects] objectAtIndex:1];
|
||||
CGPoint point = [touch locationInView:self];
|
||||
//point = [self convertPoint:point fromView:nil];
|
||||
if (!getLocalMouseCoords(&point))
|
||||
return;
|
||||
|
||||
@ -377,7 +460,6 @@ bool getLocalMouseCoords(CGPoint *point) {
|
||||
{
|
||||
UITouch *touch = [[allTouches allObjects] objectAtIndex:0];
|
||||
CGPoint point = [touch locationInView:self];
|
||||
//point = [self convertPoint:point fromView:nil];
|
||||
if (!getLocalMouseCoords(&point))
|
||||
return;
|
||||
|
||||
@ -395,7 +477,6 @@ bool getLocalMouseCoords(CGPoint *point) {
|
||||
{
|
||||
UITouch *touch = [[allTouches allObjects] objectAtIndex:1];
|
||||
CGPoint point = [touch locationInView:self];
|
||||
//point = [self convertPoint:point fromView:nil];
|
||||
if (!getLocalMouseCoords(&point))
|
||||
return;
|
||||
|
||||
|
@ -26,6 +26,8 @@
|
||||
#include <unistd.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#include <sys/time.h>
|
||||
|
||||
#include "common/scummsys.h"
|
||||
#include "common/util.h"
|
||||
#include "common/rect.h"
|
||||
@ -41,8 +43,7 @@
|
||||
#include "gui/message.h"
|
||||
|
||||
#include "osys_iphone.h"
|
||||
#include "blit_arm.h"
|
||||
#include <sys/time.h>
|
||||
|
||||
|
||||
const OSystem::GraphicsMode OSystem_IPHONE::s_supportedGraphicsModes[] = {
|
||||
{0, 0, 0}
|
||||
@ -157,11 +158,8 @@ void OSystem_IPHONE::initSize(uint width, uint height) {
|
||||
_fullscreen = (uint16 *)malloc(fullSize);
|
||||
bzero(_fullscreen, fullSize);
|
||||
|
||||
if (_screenOrientation != kScreenOrientationPortrait)
|
||||
iPhone_initSurface(height, width, true);
|
||||
else
|
||||
iPhone_initSurface(width, height, false);
|
||||
|
||||
iPhone_initSurface(width, height);
|
||||
|
||||
_fullScreenIsDirty = false;
|
||||
dirtyFullScreen();
|
||||
_mouseVisible = false;
|
||||
@ -270,9 +268,7 @@ void OSystem_IPHONE::updateScreen() {
|
||||
|
||||
internUpdateScreen();
|
||||
_fullScreenIsDirty = false;
|
||||
_fullScreenOverlayIsDirty = false;
|
||||
|
||||
//memcpy(iPhone_getSurface(), _fullscreen, _screenWidth * _screenHeight * 2);
|
||||
_fullScreenOverlayIsDirty = false;
|
||||
|
||||
iPhone_updateScreen();
|
||||
}
|
||||
@ -311,7 +307,7 @@ void OSystem_IPHONE::internUpdateScreen() {
|
||||
drawDirtyOverlayRect(dirtyRect);
|
||||
|
||||
drawMouseCursorOnRectUpdate(dirtyRect, mouseRect);
|
||||
updateHardwareSurfaceForRect(dirtyRect);
|
||||
updateHardwareSurfaceForRect(dirtyRect);
|
||||
}
|
||||
|
||||
if (_overlayVisible) {
|
||||
@ -325,71 +321,35 @@ void OSystem_IPHONE::internUpdateScreen() {
|
||||
updateHardwareSurfaceForRect(dirtyRect);
|
||||
}
|
||||
}
|
||||
|
||||
//iPhone_updateScreenRect(dirtyRect.left, dirtyRect.top, dirtyRect.right, dirtyRect.bottom );
|
||||
}
|
||||
|
||||
void OSystem_IPHONE::drawDirtyRect(const Common::Rect& dirtyRect) {
|
||||
int h = dirtyRect.bottom - dirtyRect.top;
|
||||
int w = dirtyRect.right - dirtyRect.left;
|
||||
|
||||
switch (_screenOrientation) {
|
||||
case kScreenOrientationPortrait: {
|
||||
byte *src = &_offscreen[dirtyRect.top * _screenWidth + dirtyRect.left];
|
||||
uint16 *dst = &_fullscreen[dirtyRect.top * _screenWidth + dirtyRect.left];
|
||||
for (int y = h; y > 0; y--) {
|
||||
for (int x = w; x > 0; x--)
|
||||
*dst++ = _palette[*src++];
|
||||
|
||||
dst += _screenWidth - w;
|
||||
src += _screenWidth - w;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case kScreenOrientationLandscape: {
|
||||
byte *src = &_offscreen[(dirtyRect.bottom - 1) * _screenWidth + dirtyRect.left];
|
||||
uint16 *dst = &_fullscreen[dirtyRect.left * _screenHeight + (_screenHeight - dirtyRect.bottom)];
|
||||
blitLandscapeScreenRect8bpp(dst, src, w, h, _palette, -_screenWidth, -_screenHeight);
|
||||
break;
|
||||
}
|
||||
case kScreenOrientationFlippedLandscape: {
|
||||
byte *src = &_offscreen[dirtyRect.top * _screenWidth + dirtyRect.left];
|
||||
uint16 *dst = &_fullscreen[(_screenWidth - dirtyRect.left - 1) * _screenHeight + dirtyRect.top];
|
||||
blitLandscapeScreenRect8bpp(dst, src, w, h, _palette, _screenWidth, _screenHeight);
|
||||
break;
|
||||
}
|
||||
}
|
||||
byte *src = &_offscreen[dirtyRect.top * _screenWidth + dirtyRect.left];
|
||||
uint16 *dst = &_fullscreen[dirtyRect.top * _screenWidth + dirtyRect.left];
|
||||
for (int y = h; y > 0; y--) {
|
||||
for (int x = w; x > 0; x--)
|
||||
*dst++ = _palette[*src++];
|
||||
|
||||
dst += _screenWidth - w;
|
||||
src += _screenWidth - w;
|
||||
}
|
||||
}
|
||||
|
||||
void OSystem_IPHONE::drawDirtyOverlayRect(const Common::Rect& dirtyRect) {
|
||||
int h = dirtyRect.bottom - dirtyRect.top;
|
||||
int w = dirtyRect.right - dirtyRect.left;
|
||||
|
||||
switch (_screenOrientation) {
|
||||
case kScreenOrientationPortrait: {
|
||||
uint16 *src = (uint16 *)&_overlayBuffer[dirtyRect.top * _screenWidth + dirtyRect.left];
|
||||
uint16 *dst = &_fullscreen[dirtyRect.top * _screenWidth + dirtyRect.left];
|
||||
int x = (dirtyRect.right - dirtyRect.left) * 2;
|
||||
for (int y = h; y > 0; y--) {
|
||||
memcpy(dst, src, x);
|
||||
src += _screenWidth;
|
||||
dst += _screenWidth;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case kScreenOrientationLandscape: {
|
||||
uint16 *src = (uint16 *)&_overlayBuffer[(dirtyRect.bottom - 1) * _screenWidth + dirtyRect.left];
|
||||
uint16 *dst = &_fullscreen[dirtyRect.left * _screenHeight + (_screenHeight - dirtyRect.bottom)];
|
||||
blitLandscapeScreenRect16bpp(dst, src, w, h, -_screenWidth, -_screenHeight);
|
||||
break;
|
||||
}
|
||||
case kScreenOrientationFlippedLandscape: {
|
||||
uint16 *src = (uint16 *)&_overlayBuffer[dirtyRect.top * _screenWidth + dirtyRect.left];
|
||||
uint16 *dst = &_fullscreen[(_screenWidth - dirtyRect.left - 1) * _screenHeight + dirtyRect.top];
|
||||
blitLandscapeScreenRect16bpp(dst, src, dirtyRect.right - dirtyRect.left, h, _screenWidth, _screenHeight);
|
||||
break;
|
||||
}
|
||||
}
|
||||
uint16 *src = (uint16 *)&_overlayBuffer[dirtyRect.top * _screenWidth + dirtyRect.left];
|
||||
uint16 *dst = &_fullscreen[dirtyRect.top * _screenWidth + dirtyRect.left];
|
||||
int x = (dirtyRect.right - dirtyRect.left) * 2;
|
||||
for (int y = h; y > 0; y--) {
|
||||
memcpy(dst, src, x);
|
||||
src += _screenWidth;
|
||||
dst += _screenWidth;
|
||||
}
|
||||
}
|
||||
|
||||
void OSystem_IPHONE::drawMouseCursorOnRectUpdate(const Common::Rect& updatedRect, const Common::Rect& mouseRect) {
|
||||
@ -417,104 +377,23 @@ void OSystem_IPHONE::drawMouseCursorOnRectUpdate(const Common::Rect& updatedRect
|
||||
int displayHeight = _mouseHeight;
|
||||
if (_mouseHeight + top > _screenHeight)
|
||||
displayHeight = _screenHeight - top;
|
||||
switch (_screenOrientation) {
|
||||
case kScreenOrientationPortrait: {
|
||||
byte *src = &_mouseBuf[srcY * _mouseWidth + srcX];
|
||||
uint16 *dst = &_fullscreen[top * _screenWidth + left];
|
||||
for (int y = displayHeight; y > srcY; y--) {
|
||||
for (int x = displayWidth; x > srcX; x--) {
|
||||
if (*src != _mouseKeyColour)
|
||||
*dst = _palette[*src];
|
||||
dst++;
|
||||
src++;
|
||||
}
|
||||
dst += _screenWidth - displayWidth + srcX;
|
||||
src += _mouseWidth - displayWidth + srcX;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case kScreenOrientationLandscape: {
|
||||
byte *src = &_mouseBuf[(_mouseHeight - 1 - srcY) * _mouseWidth + srcX];
|
||||
uint16 *dst = &_fullscreen[left * _screenHeight + (_screenHeight - bottom + srcY)];
|
||||
for (int x = displayWidth; x > srcX; x--) {
|
||||
for (int y = displayHeight; y > srcY; y--) {
|
||||
if (*src != _mouseKeyColour)
|
||||
*dst = _palette[*src];
|
||||
dst++;
|
||||
src -= _mouseWidth;
|
||||
}
|
||||
dst -= -_screenHeight + displayHeight - srcY;
|
||||
src += 1 - (displayHeight - srcY) * -_mouseWidth;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case kScreenOrientationFlippedLandscape: {
|
||||
byte *src = &_mouseBuf[srcY * _mouseWidth + srcX];
|
||||
uint16 *dst = &_fullscreen[(_screenWidth - left - 1) * _screenHeight + top];
|
||||
for (int x = displayWidth; x > srcX; x--) {
|
||||
for (int y = displayHeight; y > srcY; y--) {
|
||||
if (*src != _mouseKeyColour)
|
||||
*dst = _palette[*src];
|
||||
dst++;
|
||||
src += _mouseWidth;
|
||||
}
|
||||
dst -= _screenHeight + displayHeight - srcY;
|
||||
src += 1 - (displayHeight - srcY) * _mouseWidth;
|
||||
}
|
||||
break;
|
||||
byte *src = &_mouseBuf[srcY * _mouseWidth + srcX];
|
||||
uint16 *dst = &_fullscreen[top * _screenWidth + left];
|
||||
for (int y = displayHeight; y > srcY; y--) {
|
||||
for (int x = displayWidth; x > srcX; x--) {
|
||||
if (*src != _mouseKeyColour)
|
||||
*dst = _palette[*src];
|
||||
dst++;
|
||||
src++;
|
||||
}
|
||||
dst += _screenWidth - displayWidth + srcX;
|
||||
src += _mouseWidth - displayWidth + srcX;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void OSystem_IPHONE::updateHardwareSurfaceForRect(const Common::Rect& updatedRect) {
|
||||
uint16 *surface = iPhone_getSurface();
|
||||
|
||||
int h = updatedRect.bottom - updatedRect.top;
|
||||
int w = updatedRect.right - updatedRect.left;
|
||||
|
||||
if (w == _screenWidth && h == _screenHeight)
|
||||
memcpy(surface, _fullscreen, _screenWidth * _screenHeight * 2);
|
||||
else {
|
||||
switch (_screenOrientation) {
|
||||
case kScreenOrientationPortrait: {
|
||||
int width = w * 2;
|
||||
int offset = updatedRect.top * _screenWidth + updatedRect.left;
|
||||
uint16 *fs = _fullscreen + offset;
|
||||
surface += offset;
|
||||
for (int y = h; y > 0; y--) {
|
||||
memcpy(surface, fs, width);
|
||||
surface += _screenWidth;
|
||||
fs += _screenWidth;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case kScreenOrientationLandscape: {
|
||||
int height = h * 2;
|
||||
int offset = updatedRect.left * _screenHeight + (_screenHeight - updatedRect.bottom);
|
||||
uint16 *fs = _fullscreen + offset;
|
||||
surface += offset;
|
||||
for (int x = w; x > 0; x--) {
|
||||
memcpy(surface, fs, height);
|
||||
surface += _screenHeight;
|
||||
fs += _screenHeight;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case kScreenOrientationFlippedLandscape: {
|
||||
int height = h * 2;
|
||||
int offset = ((_screenWidth - updatedRect.left - 1) * _screenHeight + updatedRect.top);
|
||||
uint16 *fs = _fullscreen + offset;
|
||||
surface += offset;
|
||||
for (int x = w; x > 0; x--) {
|
||||
memcpy(surface, fs, height);
|
||||
surface -= _screenHeight;
|
||||
fs -= _screenHeight;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
iPhone_updateScreenRect(_fullscreen, updatedRect.left, updatedRect.top, updatedRect.right, updatedRect.bottom );
|
||||
}
|
||||
|
||||
Graphics::Surface *OSystem_IPHONE::lockScreen() {
|
||||
@ -1015,11 +894,8 @@ void OSystem_IPHONE::handleEvent_orientationChanged(int orientation) {
|
||||
|
||||
if (_screenOrientation != newOrientation) {
|
||||
_screenOrientation = newOrientation;
|
||||
if (_screenOrientation != kScreenOrientationPortrait)
|
||||
iPhone_initSurface(_screenHeight, _screenWidth, true);
|
||||
else
|
||||
iPhone_initSurface(_screenWidth, _screenHeight, false);
|
||||
|
||||
iPhone_initSurface(_screenWidth, _screenHeight);
|
||||
|
||||
dirtyFullScreen();
|
||||
if (_overlayVisible)
|
||||
dirtyFullOverlayScreen();
|
||||
@ -1406,12 +1282,12 @@ void iphone_main(int argc, char *argv[]) {
|
||||
//gDebugLevel = 10;
|
||||
}
|
||||
|
||||
system("mkdir " SCUMMVM_ROOT_PATH);
|
||||
system("mkdir " SCUMMVM_SAVE_PATH);
|
||||
|
||||
#ifdef IPHONE_OFFICIAL
|
||||
chdir( iPhone_getDocumentsDir() );
|
||||
#else
|
||||
system("mkdir " SCUMMVM_ROOT_PATH);
|
||||
system("mkdir " SCUMMVM_SAVE_PATH);
|
||||
|
||||
chdir("/var/mobile/");
|
||||
#endif
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user