#import "RCGImageDevice.h"
commit3113e2b28002150f316b54515f79cba64f2cebfb
authorByron Ellis <bcellis@HR-bcellis-1155580861.Stanford.EDU>
Thu, 5 Jul 2007 20:10:01 +0000 (5 13:10 -0700)
committerByron Ellis <bcellis@HR-bcellis-1155580861.Stanford.EDU>
Thu, 5 Jul 2007 20:10:01 +0000 (5 13:10 -0700)
tree6883ebfecfbf4d3e030cee83b633f75df2e515a8
parentc2f9b8333d01c8cf8c1ed3ef2973e70fbd9893d7
parent8ed7290f3fb56194d5133836b989b40a4c3f0340
#import "RCGImageDevice.h"

@implementation RCGImageDevice
+ (void)load {
[RDevice registerDevice:self forDisplay:@"jpeg"];
[RDevice registerDevice:self forDisplay:@"png"];
[RDevice registerDevice:self forDisplay:@"tiff"];
[RDevice registerDevice:self forDisplay:@""];
}

- (void)didResize {
//Dispose of old context if needed
if(context != NULL && bitmap != NULL) {
CGContextRelease(context);
free(bitmap);
bitmapSize = 0;
}

NSSize size = [self size];
size_t width    = 1*size.width;
size_t height   = 1*size.height;
size_t rowBytes = (width*8*4+7)/8;

bitmapSize = rowBytes*height;
bitmap = malloc(bitmapSize);
memset(bitmap,0,bitmapSize);
context = CGBitmapContextCreate(bitmap,width,height,8,rowBytes,CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB),kCGImageAlphaPremultipliedLast);
CGContextTranslateCTM(context,0,1*size.height);
CGContextScaleCTM(context,1.0,-1.0);
CGContextSetShouldAntialias(context,RDevice_GetAntialias(desc) ? true : false);
RDevice_ResetGDepth(desc);
}

- (void)finishOpening {
RDevice_SetScale(desc,1.0);
[self didResize];
}

- (void)drawInRect:(NSRect)rect {
if(NULL != context) {
CGImageRef image = CGBitmapContextCreateImage(context);
CGContextDrawImage([[NSGraphicsContext currentContext] graphicsPort],CGRectMake(rect.origin.x,rect.origin.y,rect.size.width,rect.size.height),image);
CGImageRelease(image);
}
}

- (CGContextRef)context {
return context;
}

- (BOOL)canDrawInView { return YES; }
- (BOOL)canResize { return YES; }

- (void)close {
if(nil != [self display] && nil != [self target]) {
NSData *data = [self deviceRepresentationOfType:[self display]];
if(nil != data) {
[data retain];
[data writeToURL:[NSURL URLWithString:[self target]] atomically:YES];
[data release];
}
}
[super close];
}

- (NSData*)deviceRepresentationOfType:(NSString*)aType {
if((nil == aType || [aType isEqual:@""])) {
NSString *display = [self display];
//If we don't have a display just return the raw bitmap
if(nil == display || [display isEqual:@""])
return [[[NSData alloc] initWithBytes:bitmap length:bitmapSize] autorelease];
else aType = display;
}
if([aType isEqual:@"tiff"] || [aType isEqual:NSTIFFPboardType]) {
}
return nil;
}

//For easier access
- (NSData*)deviceRepresentation { return [self deviceRepresentationOfType:nil]; }

@end
RCGImageDevice.m
RExecServer.xcodeproj/project.pbxproj