1d86ed7fbStbbdev/*
2*b15aabb3Stbbdev    Copyright (c) 2005-2021 Intel Corporation
3d86ed7fbStbbdev
4d86ed7fbStbbdev    Licensed under the Apache License, Version 2.0 (the "License");
5d86ed7fbStbbdev    you may not use this file except in compliance with the License.
6d86ed7fbStbbdev    You may obtain a copy of the License at
7d86ed7fbStbbdev
8d86ed7fbStbbdev        http://www.apache.org/licenses/LICENSE-2.0
9d86ed7fbStbbdev
10d86ed7fbStbbdev    Unless required by applicable law or agreed to in writing, software
11d86ed7fbStbbdev    distributed under the License is distributed on an "AS IS" BASIS,
12d86ed7fbStbbdev    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d86ed7fbStbbdev    See the License for the specific language governing permissions and
14d86ed7fbStbbdev    limitations under the License.
15d86ed7fbStbbdev*/
16d86ed7fbStbbdev
17d86ed7fbStbbdev#import <Foundation/Foundation.h>
18d86ed7fbStbbdev#import "OpenGLView.h"
19d86ed7fbStbbdev
20d86ed7fbStbbdev// defined in macvideo.cpp
21d86ed7fbStbbdevextern char* window_title;
22d86ed7fbStbbdevextern int cocoa_update;
23d86ed7fbStbbdevextern int g_sizex, g_sizey;
24d86ed7fbStbbdevextern unsigned int *g_pImg;
25d86ed7fbStbbdevvoid on_mouse_func(int x, int y, int k);
26d86ed7fbStbbdevvoid on_key_func(int x);
27d86ed7fbStbbdev
28d86ed7fbStbbdevbool initialized = false;
29d86ed7fbStbbdev
30d86ed7fbStbbdev#if TARGET_OS_IPHONE
31d86ed7fbStbbdev
32d86ed7fbStbbdev#import "OpenGLES/ES2/gl.h"
33d86ed7fbStbbdev
34d86ed7fbStbbdev@implementation OpenGLView
35d86ed7fbStbbdev
36d86ed7fbStbbdev@synthesize timer;
37d86ed7fbStbbdev@synthesize imageRect;
38d86ed7fbStbbdev
39d86ed7fbStbbdev- (void)drawRect:(CGRect)start
40d86ed7fbStbbdev{
41d86ed7fbStbbdev    if (initialized == false) {
42d86ed7fbStbbdev        NSLog(@"INITIALIZE");
43d86ed7fbStbbdev        timer = [NSTimer scheduledTimerWithTimeInterval:0.03 target:self selector:@selector(update_window) userInfo:nil repeats:YES];
44d86ed7fbStbbdev        imageRect = [[UIScreen mainScreen] bounds];
45d86ed7fbStbbdev        CGFloat full_height = imageRect.size.height;
46d86ed7fbStbbdev        const float ratio=(float)g_sizex/g_sizey;
47d86ed7fbStbbdev        imageRect.size.height=imageRect.size.width/ratio;
48d86ed7fbStbbdev        imageRect.origin.y=(full_height-imageRect.size.height)/2;
49d86ed7fbStbbdev        initialized = true;
50d86ed7fbStbbdev    }
51d86ed7fbStbbdev
52d86ed7fbStbbdev    CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB();
53d86ed7fbStbbdev    CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, g_pImg, 4*g_sizex*g_sizey, NULL);
54d86ed7fbStbbdev
55d86ed7fbStbbdev    CGImageRef inputImage = CGImageCreate(g_sizex, g_sizey, 8, 32, g_sizex * 4, colourSpace,(CGBitmapInfo)kCGImageAlphaNoneSkipLast, dataProvider, NULL, NO, kCGRenderingIntentDefault);
56d86ed7fbStbbdev    UIImage *image = [UIImage imageWithCGImage:inputImage];
57d86ed7fbStbbdev
58d86ed7fbStbbdev    CGDataProviderRelease(dataProvider);
59d86ed7fbStbbdev    CGColorSpaceRelease(colourSpace);
60d86ed7fbStbbdev    CGImageRelease(inputImage);
61d86ed7fbStbbdev
62d86ed7fbStbbdev    [image drawInRect:imageRect];
63d86ed7fbStbbdev
64d86ed7fbStbbdev}
65d86ed7fbStbbdev
66d86ed7fbStbbdev- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
67d86ed7fbStbbdev{
68d86ed7fbStbbdev    CGPoint point = [[touches anyObject] locationInView:self];
69d86ed7fbStbbdev    const int x = point.x;
70d86ed7fbStbbdev    const int y = point.y;
71d86ed7fbStbbdev    if ( (y-imageRect.origin.y) > 0 && y < (imageRect.origin.y + imageRect.size.height ))
72d86ed7fbStbbdev    on_mouse_func( x*g_sizex/(imageRect.size.width), (y-imageRect.origin.y)*g_sizey/imageRect.size.height,1);
73d86ed7fbStbbdev    [self setNeedsDisplay];
74d86ed7fbStbbdev}
75d86ed7fbStbbdev
76d86ed7fbStbbdev-(void) update_window{
77d86ed7fbStbbdev    if( cocoa_update ) [self setNeedsDisplay];
78d86ed7fbStbbdev}
79d86ed7fbStbbdev
80d86ed7fbStbbdev@end
81d86ed7fbStbbdev
82d86ed7fbStbbdev#elif TARGET_OS_MAC
83d86ed7fbStbbdev
84d86ed7fbStbbdev#import <OpenGL/gl.h>
85d86ed7fbStbbdev
86d86ed7fbStbbdev@implementation OpenGLView
87d86ed7fbStbbdev
88d86ed7fbStbbdev@synthesize timer;
89d86ed7fbStbbdev
90d86ed7fbStbbdev- (void) drawRect:(NSRect)start
91d86ed7fbStbbdev{
92d86ed7fbStbbdev    if (initialized == false) {
93d86ed7fbStbbdev        NSLog(@"INITIALIZE");
94d86ed7fbStbbdev        timer = [NSTimer scheduledTimerWithTimeInterval:0.03 target:self selector:@selector(update_window) userInfo:nil repeats:YES];
95d86ed7fbStbbdev        initialized = true;
96d86ed7fbStbbdev    }
97d86ed7fbStbbdev    glWindowPos2i(0, (int)self.visibleRect.size.height);
98d86ed7fbStbbdev    glPixelZoom( (float)self.visibleRect.size.width /(float)g_sizex,
99d86ed7fbStbbdev                -(float)self.visibleRect.size.height/(float)g_sizey);
100d86ed7fbStbbdev    glDrawPixels(g_sizex, g_sizey, GL_BGRA_EXT, GL_UNSIGNED_INT_8_8_8_8_REV, g_pImg);
101d86ed7fbStbbdev    glFlush();
102d86ed7fbStbbdev}
103d86ed7fbStbbdev
104d86ed7fbStbbdev-(void) update_window{
105d86ed7fbStbbdev    if( cocoa_update ) [self setNeedsDisplay:YES];
106d86ed7fbStbbdev    if( window_title ) [self.window setTitle:[NSString stringWithFormat:@"%s", window_title]];
107d86ed7fbStbbdev}
108d86ed7fbStbbdev
109d86ed7fbStbbdev-(void) keyDown:(NSEvent *)theEvent{
110d86ed7fbStbbdev    on_key_func([theEvent.characters characterAtIndex:0]);
111d86ed7fbStbbdev}
112d86ed7fbStbbdev
113d86ed7fbStbbdev-(void) mouseDown:(NSEvent *)theEvent{
114d86ed7fbStbbdev    // mouse event for seismic and fractal
115d86ed7fbStbbdev    NSPoint point= theEvent.locationInWindow;
116d86ed7fbStbbdev    const int x = (int)point.x;
117d86ed7fbStbbdev    const int y = (int)point.y;
118d86ed7fbStbbdev    NSRect rect = self.visibleRect;
119d86ed7fbStbbdev    on_mouse_func(x*g_sizex/(int)rect.size.width,((int)rect.size.height-y)*g_sizey/(int)rect.size.height,1);
120d86ed7fbStbbdev    [self setNeedsDisplay:YES];
121d86ed7fbStbbdev}
122d86ed7fbStbbdev
123d86ed7fbStbbdev- (BOOL) acceptsFirstResponder
124d86ed7fbStbbdev{
125d86ed7fbStbbdev    return YES;
126d86ed7fbStbbdev}
127d86ed7fbStbbdev
128d86ed7fbStbbdev- (void) rightMouseDown:(NSEvent *)theEvent
129d86ed7fbStbbdev{
130d86ed7fbStbbdev    return;
131d86ed7fbStbbdev}
132d86ed7fbStbbdev
133d86ed7fbStbbdev-(void) viewDidEndLiveResize
134d86ed7fbStbbdev{
135d86ed7fbStbbdev    NSRect rect = self.visibleRect;
136d86ed7fbStbbdev    const int x=(int)rect.size.width;
137d86ed7fbStbbdev    const int y=(int)rect.size.height;
138d86ed7fbStbbdev    [self.window setTitle:[NSString stringWithFormat:@"X=%d Y=%d", x,y]];
139d86ed7fbStbbdev}
140d86ed7fbStbbdev
141d86ed7fbStbbdev@end
142d86ed7fbStbbdev
143d86ed7fbStbbdev#endif
144