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