diff --git a/src/lime/utils/AssetBundle.hx b/src/lime/utils/AssetBundle.hx new file mode 100644 index 000000000..11428c47e --- /dev/null +++ b/src/lime/utils/AssetBundle.hx @@ -0,0 +1,53 @@ +package lime.utils; + +import haxe.zip.Reader; +import lime.utils.Bytes; + +#if sys +import sys.io.File; +#end + +#if !lime_debug +@:fileXml('tags="haxe,release"') +@:noDebug +#end +class AssetBundle +{ + public var data:Map; + public var paths:Array; + + public function new() + { + // compressed = new Map(); + data = new Map(); + paths = new Array(); + } + + public static function fromFile(path:String):AssetBundle + { + #if sys + var input = File.read(path); + var entries = Reader.readZip(input); + + var bundle = new AssetBundle(); + + for (entry in entries) + { + if (entry.compressed) + { + var bytes:Bytes = entry.data; + bundle.data.set(entry.fileName, bytes.decompress(DEFLATE)); + } + else + { + bundle.data.set(entry.fileName, entry.data); + } + bundle.paths.push(entry.fileName); + } + + return bundle; + #else + return null; + #end + } +} \ No newline at end of file diff --git a/src/lime/utils/AssetLibrary.hx b/src/lime/utils/AssetLibrary.hx index 4d74fb257..a2a324883 100644 --- a/src/lime/utils/AssetLibrary.hx +++ b/src/lime/utils/AssetLibrary.hx @@ -96,6 +96,47 @@ class AssetLibrary return fromManifest(AssetManifest.fromFile(path, rootPath)); } + public static function fromBundle(bundle:AssetBundle):AssetLibrary + { + if (bundle.data.exists("library.json")) + { + var manifest = AssetManifest.fromBytes(bundle.data.get("library.json")); + if (manifest != null) + { + var library:AssetLibrary = null; + + if (manifest.libraryType == null) + { + library = new AssetLibrary(); + } + else + { + var libraryClass = Type.resolveClass(manifest.libraryType); + + if (libraryClass != null) + { + library = Type.createInstance(libraryClass, manifest.libraryArgs); + } + else + { + Log.warn("Could not find library type: " + manifest.libraryType); + return null; + } + } + + library.__fromBundle(bundle, manifest); + return library; + } + } + else + { + var library = new AssetLibrary(); + library.__fromBundle(bundle); + return library; + } + return null; + } + public static function fromManifest(manifest:AssetManifest):AssetLibrary { if (manifest == null) return null; @@ -608,6 +649,50 @@ class AssetLibrary return Assets.__cacheBreak(path); } + @:noCompletion private function __fromBundle(bundle:AssetBundle, manifest:AssetManifest = null):Void + { + if (manifest != null) + { + var id, data, type:AssetType; + for (asset in manifest.assets) + { + id = Reflect.hasField(asset, "id") ? asset.id : asset.path; + data = bundle.data.get(asset.path); + if (Reflect.hasField(asset, "type")) + { + type = asset.type; + switch(type) + { + case IMAGE: + cachedImages.set(id, Image.fromBytes(data)); + case MUSIC, SOUND: + cachedAudioBuffers.set(id, AudioBuffer.fromBytes(data)); + case FONT: + cachedFonts.set(id, Font.fromBytes(data)); + case TEXT: + cachedText.set(id, data != null ? Std.string(data) : null); + default: + cachedBytes.set(id, data); + } + types.set(id, asset.type); + } + else + { + cachedBytes.set(id, data); + types.set(id, BINARY); + } + } + } + else + { + for (path in bundle.paths) + { + cachedBytes.set(path, bundle.data.get(path)); + types.set(path, BINARY); + } + } + } + @:noCompletion private function __fromManifest(manifest:AssetManifest):Void { var hasSize = (manifest.version >= 2);