Skip to content

Commit

Permalink
Implemented parsing of data URLs for images
Browse files Browse the repository at this point in the history
  • Loading branch information
warrenm committed Apr 20, 2022
1 parent 589ef13 commit 5f75e5d
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 4 deletions.
26 changes: 25 additions & 1 deletion GLTFKit2/GLTFKit2/GLTFAsset.m
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,25 @@ int GLTFComponentCountForDimension(GLTFValueDimension dim) {
return 0;
}

NSData *GLTFCreateImageDataFromDataURI(NSString *uriData) {
NSString *prefix = @"data:";
if ([uriData hasPrefix:prefix]) {
NSInteger prefixEnd = prefix.length;
NSInteger firstComma = [uriData rangeOfString:@","].location;
if (firstComma != NSNotFound) {
NSString *mediaTypeAndTokenString = [uriData substringWithRange:NSMakeRange(prefixEnd, firstComma - prefixEnd)];
NSArray *mediaTypeAndToken = [mediaTypeAndTokenString componentsSeparatedByString:@";"];
if (mediaTypeAndToken.count > 0) {
NSString *encodedImageData = [uriData substringFromIndex:firstComma + 1];
NSData *imageData = [[NSData alloc] initWithBase64EncodedString:encodedImageData
options:NSDataBase64DecodingIgnoreUnknownCharacters];
return imageData;
}
}
}
return nil;
}

@implementation GLTFObject

- (instancetype)init {
Expand Down Expand Up @@ -377,7 +396,12 @@ - (CGImageRef)newCGImage {
imageSource = CGImageSourceCreateWithData(sourceData, NULL);
CFRelease(sourceData);
} else if (self.uri) {
imageSource = CGImageSourceCreateWithURL((__bridge CFURLRef)_uri, NULL);
if ([self.uri.scheme isEqualTo:@"data"]) {
NSData *imageData = GLTFCreateImageDataFromDataURI(self.uri.absoluteString);
imageSource = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL);
} else {
imageSource = CGImageSourceCreateWithURL((__bridge CFURLRef)_uri, NULL);
}
}
if (imageSource) {
CGImageRef image = CGImageSourceCreateImageAtIndex(imageSource, 0, NULL);
Expand Down
10 changes: 7 additions & 3 deletions GLTFKit2/GLTFKit2/impl/GLTFAssetReader.m
Original file line number Diff line number Diff line change
Expand Up @@ -410,9 +410,13 @@ - (NSArray *)convertImages
image = [[GLTFImage alloc] initWithBufferView:bufferView mimeType:mime];
} else {
assert(img->uri);
NSURL *baseURI = [self.asset.url URLByDeletingLastPathComponent];
NSURL *imageURI = [baseURI URLByAppendingPathComponent:[NSString stringWithUTF8String:img->uri]];
image = [[GLTFImage alloc] initWithURI:imageURI];
if (strncmp(img->uri, "data:", 5) == 0) {
image = [[GLTFImage alloc] initWithURI:[NSURL URLWithString:[NSString stringWithUTF8String:img->uri]]];
} else {
NSURL *baseURI = [self.asset.url URLByDeletingLastPathComponent];
NSURL *imageURI = [baseURI URLByAppendingPathComponent:[NSString stringWithUTF8String:img->uri]];
image = [[GLTFImage alloc] initWithURI:imageURI];
}
}
image.name = img->name ? [NSString stringWithUTF8String:img->name]
: [self.nameGenerator nextUniqueNameWithPrefix:@"Image"];
Expand Down

0 comments on commit 5f75e5d

Please sign in to comment.