#!/usr/bin/python import sys import getopt headerTemplate = """/* * Copyright 2010-present Facebook. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * This is is a generated file during the SDK build process. * Please do not hand edit this file. * It can be rebuilt by running * * ./image_to_code.py %(args)s * */ """ def bytes_from_file(filename, chunksize=8192): with open(filename, "rb") as f: while True: chunk = f.read(chunksize) if chunk: for b in chunk: yield b else: break def write_header_file(header, className, outputFile): with open(outputFile, "w") as f: f.write(header) f.write(""" #import #import """) f.write("@interface " + className + " : NSObject\n\n") f.write("+ (UIImage *)image;\n\n") f.write("@end") def write_implementation_file(inputFile, header, className, outputFile): formattedBytes = ["0x{0:02x}".format(ord(x)) for x in bytes_from_file(inputFile)] with open(outputFile, "w") as f: f.write(header) f.write("\n") f.write("#import \"" + className + ".h\"\n") f.write("#import \"FBImageResourceLoader.h\"\n\n") # Write standard bytes out f.write("const Byte " + className + "_standard[] = {\n") f.write(", ".join(formattedBytes)) f.write("\n") f.write("};\n") # Write retina if present useRetina = True try: (name, ext) = inputFile.rsplit(".", 1) name = name + "@2x" formattedBytes = ["0x{0:02x}".format(ord(x)) for x in bytes_from_file(name + "." + ext)] f.write("const Byte " + className + "_retina[] = {\n") f.write(", ".join(formattedBytes)) f.write("\n") f.write("};\n") except IOError: useRetina = False # Enter the bundle path override # strip of the PNG that was added for our class name for the resource name bundlepath = "@\"" + "FacebookSDKImages/" + className[0:-3] + ".png\"" f.write("\n") f.write("@implementation " + className + "\n\n") f.write("+ (UIImage *)image {\n") f.write(" return [FBImageResourceLoader imageNamed:") f.write(bundlepath) f.write("\n") f.write(" fromBytes:" + className + "_standard\n") f.write(" length:sizeof(" + className + "_standard)/sizeof(" + className + "_standard[0])\n") if useRetina: f.write(" fromRetinaBytes:" + className + "_retina\n") f.write(" retinaLength:sizeof(" + className + "_retina)/sizeof(" + className + "_retina[0])];\n") else: f.write(" fromRetinaBytes:NULL\n") f.write(" retinaLength:0];\n") f.write("}\n") f.write("@end\n") def main(argv): inputFile = '' outputClass = '' outputDir = '' try: opts, args = getopt.getopt(argv,"hi:c:o:") except getopt.GetoptError: print 'image_to_code.py -i -c -o ' sys.exit(2) for opt, arg in opts: if opt == '-h': print 'image_to_code.py -i -c -o ' sys.exit() elif opt == '-i': inputFile = arg elif opt == '-c': outputClass = arg elif opt in '-o': outputDir = arg # Build file headers header = headerTemplate % {"args" : " ".join(argv)} # outputClass needs to add PNG as part of it outputClass = outputClass + "PNG" # Build the output base filename outputFileBase = outputDir + "/" + outputClass # Build .h file outputFile = outputFileBase + ".h" write_header_file(header, outputClass, outputFile) # Build .m file outputFile = outputFileBase + ".m" write_implementation_file(inputFile, header, outputClass, outputFile) if __name__ == "__main__": main(sys.argv[1:])