// // ElisWriter.m // Elis Colors // // Created by 柳 on 09/09/17. // Copyright 2009 __MyCompanyName__. All rights reserved. // #import "ElisWriter.h" #import "ElisController.h" @implementation ElisWriter - (id)init { fps = 30; imageCodec = @"mp4v"; imageQuality = [NSNumber numberWithLong:codecMaxQuality]; gamma_table = malloc(sizeof(unsigned char) * 256); return self; } - (void)setView:(id)v { _mainView = v; } - (void)setContoller:(id)c { _mainController = c; } - (void)write:(NSString*)path { int frame, i, size, totalFrames; NSImage* image; float seconds; int w, h; unsigned char *buffer, *pixels; QTTime now; NSRect rect; NSBitmapImageRep* rep; [self initializeMovie:path]; seconds = [_mainController getHipTime]; totalFrames = seconds * fps; w = ProjectMovieSize.size.width; h = ProjectMovieSize.size.height; rect = *(NSRect*)&ProjectMovieSize; buffer = malloc(w*h*3*sizeof(unsigned char)); pixels = malloc(w*h*3*sizeof(unsigned char)); attrs = [NSDictionary dictionaryWithObjectsAndKeys:imageCodec, QTAddImageCodecType, imageQuality, QTAddImageCodecQuality, nil]; [self readyGammmaTable]; for(frame = 1; frame < 300/*totalFrames*/; frame++){ NSLog(@"%d", frame); now = QTMakeTime(frame, fps); [_mainView getFrameForQTTime:now]; [_mainView getCurrentPixelData:rect buffer:buffer]; for(i = 0; i < h; i++) // 富豪的に上下反転。テラ強引 memcpy(&pixels[i*w*3], &buffer[(h-1-i)*w*3], w*3*sizeof(unsigned char)); [self gammaAdjust:pixels size:w*h*3]; // 色味がシフトする分をガンマ補正。これはひどい。 rep = [[NSBitmapImageRep alloc] // RGB RGB RGB ... なバイト列からBitMapImageRepをつくる。 initWithBitmapDataPlanes:&pixels pixelsWide:w pixelsHigh:h bitsPerSample:8 samplesPerPixel:3 hasAlpha:NO isPlanar:NO colorSpaceName:NSCalibratedRGBColorSpace bitmapFormat:NSAlphaNonpremultipliedBitmapFormat bytesPerRow:w*3 bitsPerPixel:24]; image = [[NSImage alloc] init]; [image addRepresentation:rep]; [outputMovie addImage:image forDuration:QTMakeTime(1, fps) withAttributes:attrs]; } free(buffer); free(pixels); [outputMovie updateMovieFile]; } - (void)initializeMovie:(NSString*)path { outputMovie = [[QTMovie alloc] initToWritableFile:path error:nil]; } - (void)finalize { free(gamma_table); [super finalize]; } - (void)readyGammmaTable { int i; for(i = 0; i < 256; i++) gamma_table[i] = (unsigned char)255.0 * pow(i/255.0, 1.0/GAMMA); } - (void)gammaAdjust:(unsigned char*)pixels size:(int)s { int i; for(i = 0; i < s; i++) pixels[i] = gamma_table[pixels[i]]; } @end