diff --git a/CommonJS/lib/cappuccino/image-utility.js b/CommonJS/lib/cappuccino/image-utility.js new file mode 100644 index 000000000..fabd6fdf9 --- /dev/null +++ b/CommonJS/lib/cappuccino/image-utility.js @@ -0,0 +1,140 @@ + +var OS = require("os"); +var FILE = require("file"); +var ByteString = require("binary").ByteString; + +var javaImageSize = function (aFilePath) +{ + var imageStream = javax.imageio.ImageIO.createImageInputStream(new Packages.java.io.File(aFilePath).getCanonicalFile()), + readers = javax.imageio.ImageIO.getImageReaders(imageStream), + reader = null; + + if(readers.hasNext()) + reader = readers.next(); + + else + { + imageStream.close(); + //can't read image format... what do you want to do about it, + //throw an exception, return ? + } + + reader.setInput(imageStream, true, true); + + // Now we know the size (yay!) + var size = {width:reader.getWidth(0), height:reader.getHeight(0)}; + + reader.dispose(); + imageStream.close(); + + return size; +} + +var server = null; + +var serverImageSize = function (aFilePath) +{ + if (!server) + { + var cmd = "NARWHAL_ENGINE_HOME='' NARWHAL_ENGINE=rhino narwhal "+OS.enquote(module.path); + server = OS.popen(cmd, { charset : "UTF-8" }); + } + + var request = aFilePath.toByteString("UTF-8"); + sendLengthPrefixMessage(server.stdin.raw, request); + + var response = receiveLengthPrefixMessage(server.stdout.raw); + return JSON.parse(response.decodeToString("UTF-8")); +} + +if (system.engine == "rhino") + exports.sizeOfImageAtPath = javaImageSize; +else + exports.sizeOfImageAtPath = serverImageSize; + +// TODO: move these methods somewhere else? + +var bytesToNumberLE = function(bytes) { + var acc = 0; + for (var i = 0; i < bytes.length; i++) + acc += bytes.get(i) << (8*i); + return acc; +} + +var bytesToNumberBE = function(bytes) { + var acc = 0; + for (var i = 0; i < bytes.length; i++) + acc = (acc << 8) + bytes.get(i); + return acc; +} + +var numberToBytesLE = function(number, length) { + var bytes = []; + for (var i = 0; i < length; i++) + bytes[i] = (number >> (8*i)) & 0xFF; + return new ByteString(bytes); +} + +var numberToBytesBE = function(number, length) { + var bytes = []; + for (var i = 0; i < length; i++) + bytes[length-i-1] = (number >> (8*i)) & 0xFF; + return new ByteString(bytes); +} + +var lengthPrefixServer = function(stream, callback, prefixLength) { + var bytes; + do { + bytes = receiveLengthPrefixMessage(stream, prefixLength); + callback(bytes); + } while (bytes); +} + +var receiveLengthPrefixMessage = function(stream, prefixLength) { + var prefixBytes = stream.read(prefixLength || 4); + var length = bytesToNumberBE(prefixBytes); + var bytes = stream.read(length); + return bytes; +} + +var sendLengthPrefixMessage = function(stream, bytes, prefixLength) { + var lengthBytes = numberToBytesBE(bytes.length, prefixLength || 4); + stream.write(lengthBytes).write(bytes).flush(); +} + +if (module == require.main) +{ + var bytes; + while (bytes = receiveLengthPrefixMessage(require("system").stdin.raw)) + { + var fileName = bytes.decodeToString("UTF-8"); + var size = javaImageSize(fileName); + + sendLengthPrefixMessage(require("system").stdout.raw, JSON.stringify(size).toByteString("UTF-8")); + } +} + +/* + //ASYNCHRONOUS, so not useful to us + +function jscImageSize(aFilePath) +{ + var MIME_TYPES = { + ".png" : "image/png", + ".jpg" : "image/jpeg", + ".jpeg" : "image/jpeg", + ".gif" : "image/gif", + ".tif" : "image/tiff", + ".tiff" : "image/tiff" + }, + FILE = require("file"); + + var image = new Image(); + + image.src = "data:" + MIME_TYPES[FILE.extension(aFilePath)] + ";base64," + require("base64").encode(FILE.read(aFilePath, { mode : 'b'})); + + return CGSizeMake(image.width, image.height); +} + +*/ + diff --git a/Objective-J/CommonJS/lib/objective-j.js b/Objective-J/CommonJS/lib/objective-j.js index c1778c65f..565137440 100644 --- a/Objective-J/CommonJS/lib/objective-j.js +++ b/Objective-J/CommonJS/lib/objective-j.js @@ -172,11 +172,7 @@ exports.make_narwhal_factory = function(path) return function(require, exports, module, system, print) { Executable.setCommonJSArguments(require, exports, module, system, print, window); - - Executable.fileImporterForURL(FILE.dirname(path))(path, YES, function() - { - print("all done"); - }); + Executable.fileImporterForURL(FILE.dirname(path))(path, YES); } } diff --git a/Tools/nib2cib/NSCustomResource.j b/Tools/nib2cib/NSCustomResource.j index 0ea72f079..76fba1b33 100644 --- a/Tools/nib2cib/NSCustomResource.j +++ b/Tools/nib2cib/NSCustomResource.j @@ -25,6 +25,7 @@ @import +var FILE = require("file"); @implementation _CPCibCustomResource (NSCoding) @@ -47,9 +48,8 @@ if (!resourcePath) CPLog.warn("***WARNING: Resource named " + _resourceName + " not found in supplied resources path."); - else - size = imageSize(resourcePath); + size = imageSize(FILE.join(FILE.cwd(), resourcePath)); } _properties = [CPDictionary dictionaryWithObject:size forKey:@"size"]; @@ -60,56 +60,8 @@ @end -function imageSize(aFilePath) -{ - return (system.engine === "rhino") ? javaImageSize(aFilePath) : jscImageSize(aFilePath); -} - -function javaImageSize(aFilePath) -{ - var imageStream = javax.imageio.ImageIO.createImageInputStream(new Packages.java.io.File(aFilePath).getCanonicalFile()), - readers = javax.imageio.ImageIO.getImageReaders(imageStream), - reader = null; - - if(readers.hasNext()) - reader = readers.next(); - - else - { - imageStream.close(); - //can't read image format... what do you want to do about it, - //throw an exception, return ? - } - - reader.setInput(imageStream, true, true); - - // Now we know the size (yay!) - var size = CGSizeMake(reader.getWidth(0), reader.getHeight(0)); - - reader.dispose(); - imageStream.close(); - - return size; -} - -function jscImageSize(aFilePath) -{ - var MIME_TYPES = { - ".png" : "image/png", - ".jpg" : "image/jpeg", - ".jpeg" : "image/jpeg", - ".gif" : "image/gif", - ".tif" : "image/tiff", - ".tiff" : "image/tiff" - }, - FILE = require("file"); - - var image = new Image(); - - image.src = "data:" + MIME_TYPES[FILE.extension(aFilePath)] + ";base64," + require("base64").encode(FILE.read(aFilePath, { mode : 'b'})); - - return CGSizeMake(image.width, image.height); -} +var ImageUtility = require("cappuccino/image-utility"), + imageSize = ImageUtility.sizeOfImageAtPath; @implementation NSCustomResource : _CPCibCustomResource {