5 // Created by 柳 on 09/09/12.
6 // Copyright 2009 __MyCompanyName__. All rights reserved.
9 #import "ElisMainView.h"
11 #pragma mark Render Callback
12 static CVReturn MyRenderCallback(CVDisplayLinkRef displayLink,
13 const CVTimeStamp *inNow,
14 const CVTimeStamp *inOutputTime,
15 CVOptionFlags flagsIn,
16 CVOptionFlags *flagsOut,
17 void *displayLinkContext)
19 return [(ElisMainView *)displayLinkContext getFrameForTime:inOutputTime flagsOut:flagsOut];
22 @implementation ElisMainView
27 lock = [[NSRecursiveLock alloc] init];
28 timeOffset = QTZeroTime;
29 // layerSet = malloc(sizeof(void*) * TRACK_SIZE);
30 layerSet = [[NSMutableArray alloc] init];
31 sortedLayerSet = malloc(sizeof(void*) * TRACK_SIZE);
36 NSLog(@"Initializing OpenGL ...");
37 GLint swapInterval = 1;
39 glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // black background
40 [[self openGLContext] setValues:&swapInterval forParameter:NSOpenGLCPSwapInterval];
42 CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
43 ciContext = [CIContext contextWithCGLContext:[[self openGLContext] CGLContextObj]
44 pixelFormat:[[self pixelFormat] CGLPixelFormatObj]
45 options:[NSDictionary dictionaryWithObjectsAndKeys:(id)colorSpace, kCIContextOutputColorSpace,
46 (id)colorSpace, kCIContextWorkingColorSpace, nil]];
48 CGColorSpaceRelease(colorSpace);
50 CVDisplayLinkCreateWithCGDisplay(kCGDirectMainDisplay, &displayLink);
51 if (NULL != displayLink) {
52 CVDisplayLinkSetCurrentCGDisplay(displayLink, kCGDirectMainDisplay);
53 CVDisplayLinkSetOutputCallback(displayLink, &MyRenderCallback, self);
56 NSLog(@"Elis Colors, Stand by ready.");
59 #pragma mark Display Link
60 - (CVReturn)getFrameForTime:(CVTimeStamp*)timeStamp flagsOut:(CVOptionFlags*)flagsOut
65 NSTimeInterval duration;
66 now = [[NSDate alloc] init];
67 duration = [now timeIntervalSinceDate:startTime]; // 再生を開始した時間と今の時間から経過時間を得る。
68 qt = QTMakeTime(duration*600, 600); // 経過時間をQTTimeに変換。
69 _qt = QTTimeIncrement(qt, timeOffset); // オフセットを足す。
73 [layerSet removeAllObjects];
74 [_mainController getFrameForTime:_qt result:layerSet];
76 [self drawRect:NSZeroRect];
78 return kCVReturnSuccess;
81 - (void)getFrameForQTTime:(QTTime)time
84 [layerSet removeAllObjects];
85 [_mainController getFrameForTime:time result:layerSet];
86 [self drawRectWithoutStamp:NSZeroRect forTime:time];
90 - (void)drawRectWithoutStamp:(NSRect)rect forTime:(QTTime)time
94 [[self openGLContext] makeCurrentContext];
95 glClear(GL_COLOR_BUFFER_BIT);
97 int i, size = [layerSet count];
104 memset(sortedLayerSet, 0, sizeof(void*) * TRACK_SIZE);
105 for(i = 0; i < size; i++)
106 sortedLayerSet[[[layerSet objectAtIndex:i] trackNumber]] = [layerSet objectAtIndex:i];
108 for(i = 0; i < TRACK_SIZE; i++){
109 if(sortedLayerSet[i] == 0) continue;
111 ci = [sortedLayerSet[i] getEffectedImageWithoutStamp:time]; // 違いはここ。
112 point = [sortedLayerSet[i] getPositionForTime:[sortedLayerSet[i] convertToInnnerTime:time]];
113 if(ci == nil) continue; // サウンドレイヤーはスキップ
114 imageRect = [ci extent];
115 if(imageRect.size.width >= 4000){
116 imageRect = CGRectMake(0.0, 0.0, 4000, 3000);
119 cp = *(CGPoint*)&point;
120 // [ciContext drawImage:ci inRect:CGRectMake(point.x, point.y, imageRect.size.width, imageRect.size.height) fromRect:imageRect];
121 [ciContext drawImage:ci atPoint:cp fromRect:imageRect];
122 // [ciContext drawImage:ci inRect:CGRectMake(point.x, point.y, 640, 480) fromRect:CGRectMake(0, 0, 640, 480)];
128 for(i = 0; i < size; i++)
129 [[layerSet objectAtIndex:i] releaseContext];
131 [layerSet removeAllObjects];
136 - (void)drawRect:(NSRect)rect
140 [[self openGLContext] makeCurrentContext];
141 glClear(GL_COLOR_BUFFER_BIT);
143 int i, size = [layerSet count];
150 memset(sortedLayerSet, 0, sizeof(void*) * TRACK_SIZE);
151 for(i = 0; i < size; i++)
152 sortedLayerSet[[[layerSet objectAtIndex:i] trackNumber]] = [layerSet objectAtIndex:i];
154 for(i = 0; i < TRACK_SIZE; i++){
155 if(sortedLayerSet[i] == 0) continue;
157 ci = [sortedLayerSet[i] getEffectedImage:stamp forTime:_qt];
158 point = [sortedLayerSet[i] getPositionForTime:[sortedLayerSet[i] convertToInnnerTime:_qt]];
159 if(ci == nil) continue; // サウンドレイヤーはスキップ
161 imageRect = [ci extent];
162 if(imageRect.size.width >= 4000){
163 imageRect = CGRectMake(0, 0, 4000, 3000);
166 cp = *(CGPoint*)&point;
167 // [ciContext drawImage:ci inRect:imageRect fromRect:CGRectMake(point.x, point.y, ProjectMovieSize.size.width, ProjectMovieSize.size.height)];
168 [ciContext drawImage:ci atPoint:cp fromRect:imageRect];
169 // [ciContext drawImage:ci inRect:CGRectMake(point.x, point.y, imageRect.size.width, imageRect.size.height)
170 // fromRect:imageRect];
174 for(i = 0; i < size; i++)
175 [[layerSet objectAtIndex:i] releaseContext];
177 [layerSet removeAllObjects];
179 // int size = [imageSet count], i;
183 // for(i = 0; i < size; i += 2){
184 // ci = [imageSet objectAtIndex:i];
185 // np = [[imageSet objectAtIndex:i+1] pointValue];
186 // imRect = [ci extent];
188 // if(imRect.size.width >= 4096.0)
189 // imRect = CGRectMake(0, 0, 640, 480);
190 // [ciContext drawImage:ci inRect:imRect//CGRectMake(np.x, np.y, 640, 480)
191 // fromRect:CGRectMake(np.x, np.y, 640, 480)];
195 // size = [contexts count];
196 // for(i = 0; i < size; i++)
197 // QTVisualContextTask([contexts objectAtIndex:i]);
199 // [imageSet release];
206 GLfloat minX, minY, maxX, maxY;
208 NSRect sceneBounds = [self bounds];
209 NSRect frame = [self frame];
211 minX = NSMinX(sceneBounds);
212 minY = NSMinY(sceneBounds);
213 maxX = NSMaxX(sceneBounds);
214 maxY = NSMaxY(sceneBounds);
216 glViewport(0, 0, (GLsizei)frame.size.width, (GLsizei)frame.size.height); // set the viewport
218 glMatrixMode(GL_MODELVIEW); // select the modelview matrix
219 glLoadIdentity(); // reset it
221 glMatrixMode(GL_PROJECTION); // select the projection matrix
222 glLoadIdentity(); // reset it
224 gluOrtho2D(minX, maxX, minY, maxY); // define a 2-D orthographic projection matrix
226 glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
230 - (void)stopDisplayLink
234 CVDisplayLinkStop(displayLink);
237 - (void)startDisplayLink
239 startTime = [[NSDate alloc] init];
240 CVDisplayLinkStart(displayLink);
243 - (void)seek:(QTTime)time
248 - (void)getCurrentPixelData:(NSRect)rect buffer:(unsigned char*)buffer
250 glReadBuffer(GL_FRONT); // フロントバッファ(って何だろう?)からピクセルを読みに行く。
251 glReadPixels(0, 0, rect.size.width, rect.size.height, GL_RGB, GL_UNSIGNED_BYTE, buffer);