From 4aaa3ba06beaaf05e3e120e6724a38dbcf422807 Mon Sep 17 00:00:00 2001
From: Ralty <78720179+Raltyro@users.noreply.github.com>
Date: Tue, 3 Mar 2026 01:15:16 +0700
Subject: [PATCH] Modify openfl Assets in macro instead
---
project.xml | 2 +
.../funkin/backend/shaders/BlendModeEffect.hx | 36 -
source/funkin/backend/system/macros/Macros.hx | 21 +
source/openfl/utils/Assets.hx | 1043 -----------------
4 files changed, 23 insertions(+), 1079 deletions(-)
delete mode 100644 source/funkin/backend/shaders/BlendModeEffect.hx
delete mode 100644 source/openfl/utils/Assets.hx
diff --git a/project.xml b/project.xml
index 3be967db..c14bf085 100644
--- a/project.xml
+++ b/project.xml
@@ -222,6 +222,8 @@
+
+
diff --git a/source/funkin/backend/shaders/BlendModeEffect.hx b/source/funkin/backend/shaders/BlendModeEffect.hx
deleted file mode 100644
index 28658292..00000000
--- a/source/funkin/backend/shaders/BlendModeEffect.hx
+++ /dev/null
@@ -1,36 +0,0 @@
-package funkin.backend.shaders;
-
-import flixel.util.FlxColor;
-import openfl.display.ShaderParameter;
-
-@:dox(hide)
-typedef BlendModeShader =
-{
- var uBlendColor:ShaderParameter;
-}
-
-@:dox(hide)
-class BlendModeEffect
-{
- public var shader(default, null):BlendModeShader;
-
- @:isVar
- public var color(default, set):FlxColor;
-
- public function new(shader:BlendModeShader, color:FlxColor):Void
- {
- shader.uBlendColor.value = [];
- this.shader = shader;
- this.color = color;
- }
-
- function set_color(color:FlxColor):FlxColor
- {
- shader.uBlendColor.value[0] = color.redFloat;
- shader.uBlendColor.value[1] = color.greenFloat;
- shader.uBlendColor.value[2] = color.blueFloat;
- shader.uBlendColor.value[3] = color.alphaFloat;
-
- return this.color = color;
- }
-}
diff --git a/source/funkin/backend/system/macros/Macros.hx b/source/funkin/backend/system/macros/Macros.hx
index 3bb95cf5..d5dfa6c2 100644
--- a/source/funkin/backend/system/macros/Macros.hx
+++ b/source/funkin/backend/system/macros/Macros.hx
@@ -60,6 +60,7 @@ class Macros {
Compiler.addMetadata('@:build($macroPath.buildLimeAssetLibrary())', 'lime.utils.AssetLibrary');
Compiler.addMetadata('@:build($macroPath.buildLimeApplication())', 'lime.app.Application');
Compiler.addMetadata('@:build($macroPath.buildLimeWindow())', 'lime.ui.Window');
+ Compiler.addMetadata('@:build($macroPath.buildOpenflAssets())', 'openfl.utils.Assets');
//Adds Compat for #if hscript blocks when you have hscript improved
if (Context.defined("hscript_improved") && !Context.defined("hscript")) {
@@ -106,5 +107,25 @@ class Macros {
return fields;
}
+
+ public static function buildOpenflAssets():Array {
+ final fields:Array = Context.getBuildFields(), pos:Position = Context.currentPos();
+ for (f in fields) switch (f.name) {
+ case "allowCompressedTextures": fields.remove(f);
+ default:
+ }
+
+ fields.push({name: 'allowCompressedTextures', access: [APublic, AStatic], pos: pos, kind: FProp("get", "set", macro :Null), meta: [{pos: pos, name: ":isVar"}]});
+
+ fields.push({name: "get_allowCompressedTextures", access: [APublic, AStatic, AInline], pos: pos, kind: FFun({ret: macro :Bool, args: [], expr: macro {
+ return allowCompressedTextures != null ? allowCompressedTextures : !funkin.backend.system.Main.forceGPUOnlyBitmapsOff && funkin.options.Options.gpuOnlyBitmaps;
+ }})});
+ fields.push({name: "set_allowCompressedTextures", access: [APublic, AStatic, AInline], pos: pos, kind: FFun({ret: macro :Bool, args: [{name: "value", type: macro :Bool}], expr: macro {
+ allowCompressedTextures = value;
+ return get_allowCompressedTextures();
+ }})});
+
+ return fields;
+ }
}
#end
\ No newline at end of file
diff --git a/source/openfl/utils/Assets.hx b/source/openfl/utils/Assets.hx
deleted file mode 100644
index e49ce293..00000000
--- a/source/openfl/utils/Assets.hx
+++ /dev/null
@@ -1,1043 +0,0 @@
-package openfl.utils;
-
-#if !macro
-import funkin.backend.system.Main;
-import funkin.options.Options;
-#end
-import openfl.utils._internal.Log;
-import openfl.display.BitmapData;
-import openfl.display.MovieClip;
-import openfl.display.Sprite;
-import openfl.events.Event;
-import openfl.events.EventDispatcher;
-import openfl.media.Sound;
-import openfl.text.Font;
-#if lime
-import lime.app.Promise;
-import lime.media.AudioBuffer;
-import lime.utils.AssetLibrary as LimeAssetLibrary;
-import lime.utils.Assets as LimeAssets;
-#end
-#if lime_vorbis
-import lime.media.vorbis.VorbisFile;
-#end
-
-/**
- The Assets class provides a cross-platform interface to access
- embedded images, fonts, sounds and other resource files.
-
- The contents are populated automatically when an application
- is compiled using the OpenFL command-line tools, based on the
- contents of the *.xml project file.
-
- For most platforms, the assets are included in the same directory
- or package as the application, and the paths are handled
- automatically. For web content, the assets are preloaded before
- the start of the rest of the application. You can customize the
- preloader by extending the `NMEPreloader` class,
- and specifying a custom preloader using
- in the project file.
-
- @see [Working with bitmap assets](https://books.openfl.org/openfl-developers-guide/working-with-bitmaps/working-with-bitmap-assets.html)
- @see [Working with byte array assets](https://books.openfl.org/openfl-developers-guide/working-with-byte-arrays/working-with-byte-array-assets.html)
- @see [Working with font assets](https://books.openfl.org/openfl-developers-guide/using-the-textfield-class/working-with-font-assets.html)
- @see [Working with sound assets](https://books.openfl.org/openfl-developers-guide/working-with-sound/working-with-sound-assets.html)
-**/
-#if !openfl_debug
-@:fileXml('tags="haxe,release"')
-@:noDebug
-#end
-@:access(openfl.display.BitmapData)
-@:access(openfl.display.Sprite)
-@:access(openfl.text.Font)
-@:access(openfl.utils.AssetLibrary)
-class Assets
-{
- public static var allowCompressedTextures:Bool = false;
-
- public static var cache:IAssetCache = new AssetCache();
-
- @:noCompletion private static var dispatcher:EventDispatcher #if !macro = new EventDispatcher() #end;
- private static var libraryBindings:Map = new Map();
-
- public static function addEventListener(type:String, listener:Dynamic, useCapture:Bool = false, priority:Int = 0, useWeakReference:Bool = false):Void
- {
- #if lime
- if (!LimeAssets.onChange.has(LimeAssets_onChange))
- {
- LimeAssets.onChange.add(LimeAssets_onChange);
- }
- #end
-
- dispatcher.addEventListener(type, listener, useCapture, priority, useWeakReference);
- }
-
- public static function dispatchEvent(event:Event):Bool
- {
- return dispatcher.dispatchEvent(event);
- }
-
- /**
- Returns whether a specific asset exists
- @param id The ID or asset path for the asset
- @param type The asset type to match, or null to match any type
- @param allowCompressedTextures Whether to check for compressed texture formats (e.g., ASTC) when the asset is a PNG. Defaults to true.
- @return Whether the requested asset ID and type exists
- **/
- public static function exists(id:String, type:AssetType = null, allowCompressedTextures:Bool = true):Bool
- {
- #if lime
- #if !flash
- if (allowCompressedTextures)
- {
- if (id != null && haxe.io.Path.extension(id) == "png")
- {
- if (LimeAssets.exists(haxe.io.Path.withExtension(id, "astc"), BINARY))
- {
- return true;
- }
- }
- else if (id != null && haxe.io.Path.extension(id) == "astc" && type != AssetType.BINARY)
- {
- type = AssetType.BINARY;
- }
- }
- #end
-
- return LimeAssets.exists(id, cast type);
- #else
- return false;
- #end
- }
-
- /**
- Gets an instance of an embedded bitmap.
-
- ```haxe
- var bitmap = new Bitmap (Assets.getBitmapData ("image.png"));
- ```
-
- _Note:_ This method may behave differently, depending on the target
- platform. On targets that can quickly create new BitmapData instances
- synchronously, every call to `Assets.getBitmapData()` with the same ID
- will return a BitmapData instance with its own separate copy of the
- underlying image data. However, on other targets where loading
- BitmapData synchronously is unacceptably slow, or where BitmapData may
- not be loaded synchronously at all (meaning that there is no choice but
- to load it asynchronously), every call to `Assets.getBitmapData()` with
- the same ID may return a BitmapData instance that shares the same
- underlying image data each time.
-
- With that in mind, modifying or disposing the contents of the BitmapData
- returned by `Assets.getBitmapData()` may affect the results of future
- calls to `Assets.getBitmapData()` on some targets. To access a
- BitmapData instance that may be modified or disposed without affecting
- future calls to `Assets.getBitmapData()`, call the BitmapData instance's
- `clone()` method to manually create a copy.
-
- @param id The ID or asset path for the bitmap
- @param useCache (Optional) Whether to allow use of the asset cache (Default: true)
- @param allowCompressedTextures (Optional) Wether to allow compressed textures to be used to get this bitmap (Default: true)
- @return A new BitmapData object
-
- @see [Working with bitmap assets](https://books.openfl.org/openfl-developers-guide/working-with-bitmaps/working-with-bitmap-assets.html)
- **/
- public static function getBitmapData(id:String, useCache:Bool = true, allowCompressedTextures:Bool = true):BitmapData
- {
- #if (lime && tools && !display)
- if (useCache && cache.enabled && cache.hasBitmapData(id))
- {
- var bitmapData = cache.getBitmapData(id);
-
- if (isValidBitmapData(bitmapData))
- {
- return bitmapData;
- }
- }
-
- #if !flash
- if ((allowCompressedTextures || haxe.io.Path.extension(id) == "astc") && openfl.Lib.current.stage.context3D.isASTCSupported())
- {
- final astcTexture:String = haxe.io.Path.withExtension(id, "astc");
-
- if (LimeAssets.exists(astcTexture, BINARY))
- {
- var bitmapData = BitmapData.fromTexture(openfl.Lib.current.stage.context3D.createASTCTexture(LimeAssets.getBytes(astcTexture)), false);
-
- if (useCache && cache.enabled)
- {
- cache.setBitmapData(id, bitmapData);
- }
-
- return bitmapData;
- }
-
- if (haxe.io.Path.extension(id) == "astc")
- {
- return null;
- }
- }
- #end
-
- var image = LimeAssets.getImage(id, false);
-
- if (image != null)
- {
- #if flash
- var bitmapData = image.src;
- #else
- var bitmapData = BitmapData.fromImage(image);
- if (Assets.allowCompressedTextures && allowCompressedTextures && !Main.forceGPUOnlyBitmapsOff && Options.gpuOnlyBitmaps)
- BitmapDataUtil.toHardware(bitmapData);
-
- bitmapData.__asset = true;
- #end
-
- if (useCache && cache.enabled)
- {
- cache.setBitmapData(id, bitmapData);
- }
-
- return bitmapData;
- }
- #end
-
- return null;
- }
-
- /**
- Gets an instance of an embedded binary asset
-
- ```haxe
- var bytes = Assets.getBytes ("file.zip");
- ```
-
- @param id The ID or asset path for the asset
- @return A new ByteArray object
-
- @see [Working with byte array assets](https://books.openfl.org/openfl-developers-guide/working-with-byte-arrays/working-with-byte-array-assets.html)
- **/
- public static function getBytes(id:String):ByteArray
- {
- #if lime
- return LimeAssets.getBytes(id);
- #else
- return null;
- #end
- }
-
- /**
- Gets an instance of an embedded font
-
- ```haxe
- var fontName = Assets.getFont ("font.ttf").fontName;
- ```
-
- @param id The ID or asset path for the font
- @param useCache (Optional) Whether to allow use of the asset cache (Default: true)
- @return A new Font object
-
- @see [Working with font assets](https://books.openfl.org/openfl-developers-guide/using-the-textfield-class/working-with-font-assets.html)
- **/
- public static function getFont(id:String, useCache:Bool = true):Font
- {
- #if (lime && tools && !display && !macro)
- if (useCache && cache.enabled && cache.hasFont(id))
- {
- return cache.getFont(id);
- }
-
- var limeFont = LimeAssets.getFont(id, false);
-
- if (limeFont != null)
- {
- #if flash
- var font = limeFont.src;
- #else
- var font = new Font();
- font.__fromLimeFont(limeFont);
- #end
-
- if (useCache && cache.enabled)
- {
- cache.setFont(id, font);
- }
-
- return font;
- }
- #end
-
- return new Font();
- }
-
- public static function getLibrary(name:String):#if lime LimeAssetLibrary #else AssetLibrary #end
- {
- #if lime
- return LimeAssets.getLibrary(name);
- #else
- return null;
- #end
- }
-
- /**
- Gets an instance of an included MovieClip
-
- ```haxe
- var movieClip = Assets.getMovieClip ("library:BouncingBall");
- ```
-
- @param id The ID for the MovieClip
- @return A new MovieClip object
- **/
- public static function getMovieClip(id:String):MovieClip
- {
- #if (lime && tools && !display)
- var libraryName = id.substring(0, id.indexOf(":"));
- var symbolName = id.substr(id.indexOf(":") + 1);
- var limeLibrary = getLibrary(libraryName);
-
- if (limeLibrary != null)
- {
- if ((limeLibrary is AssetLibrary))
- {
- var library:AssetLibrary = cast limeLibrary;
-
- if (library.exists(symbolName, cast AssetType.MOVIE_CLIP))
- {
- if (library.isLocal(symbolName, cast AssetType.MOVIE_CLIP))
- {
- return library.getMovieClip(symbolName);
- }
- else
- {
- Log.error("MovieClip asset \"" + id + "\" exists, but only asynchronously");
- return null;
- }
- }
- }
-
- Log.error("There is no MovieClip asset with an ID of \"" + id + "\"");
- }
- else
- {
- Log.error("There is no asset library named \"" + libraryName + "\"");
- }
- #end
-
- return null;
- }
-
- public static function getMusic(id:String, useCache:Bool = true):Sound
- {
- if (Options.streamedMusic) {
- #if (lime_funkin && lime_native)
- var path = getPath(id);
- var buffer = AudioBuffer.fromFile(path, true);
- if (buffer != null) return Sound.fromAudioBuffer(buffer);
- #elseif (lime_vorbis && lime > "7.9.0")
- var path = getPath(id);
- var vorbisFile = VorbisFile.fromFile(path);
- var buffer = AudioBuffer.fromVorbisFile(vorbisFile);
- if (buffer != null) return Sound.fromAudioBuffer(buffer);
- #end
- }
-
- return getSound(id, useCache);
- }
-
- /**
- Gets the file path (if available) for an asset
-
- ```haxe
- var path = Assets.getPath ("file.txt");
- ```
-
- @param id The ID or asset path for the asset
- @return The path to the asset, or null if it does not exist
- **/
- public static function getPath(id:String):String
- {
- #if lime
- return LimeAssets.getPath(id);
- #else
- return null;
- #end
- }
-
- /**
- Gets an instance of an embedded sound
-
- ```haxe
- var sound = Assets.getSound ("sound.wav");
- ```
-
- @param id The ID or asset path for the sound
- @param useCache (Optional) Whether to allow use of the asset cache (Default: true)
- @return A new Sound object
-
- @see [Working with sound assets](https://books.openfl.org/openfl-developers-guide/working-with-sound/working-with-sound-assets.html)
- **/
- public static function getSound(id:String, useCache:Bool = true):Sound
- {
- #if (lime && tools && !display)
- if (useCache && cache.enabled && cache.hasSound(id))
- {
- var sound = cache.getSound(id);
-
- if (isValidSound(sound))
- {
- return sound;
- }
- }
-
- var buffer = LimeAssets.getAudioBuffer(id, false);
-
- if (buffer != null)
- {
- #if flash
- var sound = buffer.src;
- #else
- var sound = Sound.fromAudioBuffer(buffer);
- #end
-
- if (useCache && cache.enabled)
- {
- cache.setSound(id, sound);
- }
-
- return sound;
- }
- #end
-
- return null;
- }
-
- /**
- Gets an instance of an embedded text asset
-
- ```haxe
- var text = Assets.getText ("text.txt");
- ```
-
- @param id The ID or asset path for the asset
- @return A new String object
- **/
- public static function getText(id:String):String
- {
- #if lime
- return LimeAssets.getText(id);
- #else
- return null;
- #end
- }
-
- public static function hasEventListener(type:String):Bool
- {
- return dispatcher.hasEventListener(type);
- }
-
- public static function hasLibrary(name:String):Bool
- {
- #if lime
- return LimeAssets.hasLibrary(name);
- #else
- return false;
- #end
- }
-
- /**
- Connects a user-defined class to a related asset class.
-
- This method call is added to the beginning of user-defined class constructors when
- the `@:bind` meta-data is used. This allows insertion of related asset resources in
- compatible super classes, such as `openfl.display.MovieClip`.
- @param className The registered class name of the asset constructor
- @param instance The current class instance to be bound (default is null)
- @return Whether asset binding was successful
- **/
- public static function initBinding(className:String, instance:Dynamic = null):Void
- {
- if (libraryBindings.exists(className))
- {
- var library = libraryBindings.get(className);
- #if !flash
- if (instance == null)
- {
- Sprite.__constructor = function(instance:Sprite)
- {
- instance.__bind(library, className);
- }
- }
- else
- {
- Sprite.__constructor = null;
- instance.__bind(library, className);
- }
- #else
- // TODO: Consolidate behavior
- library.bind(className);
- #end
- }
- else
- {
- Log.warn("No asset is registered as \"" + className + "\"");
- }
- }
-
- /**
- Returns whether an asset is "local", and therefore can be loaded synchronously
- @param id The ID or asset path for the asset
- @param type The asset type to match, or null to match any type
- @param useCache (Optional) Whether to allow use of the asset cache (Default: true)
- @return Whether the asset is local
- **/
- public static function isLocal(id:String, type:AssetType = null, useCache:Bool = true):Bool
- {
- #if (lime && tools && !display)
- if (useCache && cache.enabled)
- {
- if (type == AssetType.IMAGE || type == null)
- {
- if (cache.hasBitmapData(id)) return true;
- }
-
- if (type == AssetType.FONT || type == null)
- {
- if (cache.hasFont(id)) return true;
- }
-
- if (type == AssetType.SOUND || type == AssetType.MUSIC || type == null)
- {
- if (cache.hasSound(id)) return true;
- }
- }
-
- var libraryName = id.substring(0, id.indexOf(":"));
- var symbolName = id.substr(id.indexOf(":") + 1);
- var library = getLibrary(libraryName);
-
- if (library != null)
- {
- return library.isLocal(symbolName, cast type);
- }
- #end
-
- return false;
- }
-
- @:analyzer(ignore) private static function isValidBitmapData(bitmapData:BitmapData):Bool
- {
- #if (lime && tools && !display)
- #if flash
- try
- {
- bitmapData.width;
- return true;
- }
- catch (e:Dynamic)
- {
- return false;
- }
- #else
- return (bitmapData != null
- && #if !lime_hybrid (bitmapData.image != null || bitmapData.__texture != null) #else bitmapData.__handle != null #end);
- #end
- #else
- return true;
- #end
- }
-
- @:noCompletion private static function isValidSound(sound:Sound):Bool
- {
- #if ((tools && !display) && (cpp || neko || nodejs))
- return true;
- // return (sound.__handle != null && sound.__handle != 0);
- #else
- return true;
- #end
- }
-
- /**
- Returns a list of all embedded assets (by type)
- @param type The asset type to match, or null to match any type
- @return An array of asset ID values
- **/
- public static function list(type:AssetType = null):Array
- {
- #if lime
- return LimeAssets.list(cast type);
- #else
- return [];
- #end
- }
-
- /**
- Loads an included bitmap asset asynchronously
-
- ```haxe
- Assets.loadBitmapData ("image.png").onComplete (handleImage);
- ```
-
- @param id The ID or asset path for the asset
- @param useCache (Optional) Whether to allow use of the asset cache (Default: true)
- @return Returns a Future
-
- @see [Working with bitmap assets](https://books.openfl.org/openfl-developers-guide/working-with-bitmaps/working-with-bitmap-assets.html)
- **/
- public static function loadBitmapData(id:String, useCache:Null = true, allowCompressedTextures:Bool = true):Future
- {
- if (useCache == null) useCache = true;
-
- #if (lime && tools && !display)
- var promise = new Promise();
-
- if (useCache && cache.enabled && cache.hasBitmapData(id))
- {
- var bitmapData = cache.getBitmapData(id);
-
- if (isValidBitmapData(bitmapData))
- {
- promise.complete(bitmapData);
- return promise.future;
- }
- }
-
- #if !flash
- if ((allowCompressedTextures || haxe.io.Path.extension(id) == "astc") && openfl.Lib.current.stage.context3D.isASTCSupported())
- {
- final astcTexture:String = haxe.io.Path.withExtension(id, "astc");
-
- if (LimeAssets.exists(astcTexture, BINARY))
- {
- LimeAssets.loadBytes(astcTexture).onComplete(function(bytes)
- {
- if (bytes != null)
- {
- var bitmapData = BitmapData.fromTexture(openfl.Lib.current.stage.context3D.createASTCTexture(bytes), false);
- if (Assets.allowCompressedTextures && allowCompressedTextures && !Main.forceGPUOnlyBitmapsOff && Options.gpuOnlyBitmaps)
- BitmapDataUtil.toHardware(bitmapData);
-
- bitmapData.__asset = true;
-
- if (useCache && cache.enabled)
- {
- cache.setBitmapData(id, bitmapData);
- }
-
- promise.complete(bitmapData);
- }
- else
- {
- promise.error("[Assets] Could not load Image \"" + id + "\"");
- }
- }).onError(promise.error).onProgress(promise.progress);
-
- return promise.future;
- }
-
- if (haxe.io.Path.extension(id) == "astc")
- {
- promise.error("[Assets] Could not load Image \"" + id + "\"");
- return promise.future;
- }
- }
- #end
-
- LimeAssets.loadImage(id, false).onComplete(function(image)
- {
- if (image != null)
- {
- #if flash
- var bitmapData = image.src;
- #else
- var bitmapData = BitmapData.fromImage(image);
- if (Assets.allowCompressedTextures && allowCompressedTextures && !Main.forceGPUOnlyBitmapsOff && Options.gpuOnlyBitmaps)
- BitmapDataUtil.toHardware(bitmapData);
-
- bitmapData.__asset = true;
- #end
-
- if (useCache && cache.enabled)
- {
- cache.setBitmapData(id, bitmapData);
- }
-
- promise.complete(bitmapData);
- }
- else
- {
- promise.error("[Assets] Could not load Image \"" + id + "\"");
- }
- }).onError(promise.error).onProgress(promise.progress);
-
- return promise.future;
- #else
- return Future.withValue(getBitmapData(id, useCache));
- #end
- }
-
- /**
- Loads an included byte asset asynchronously
-
- ```haxe
- Assets.loadBytes ("file.zip").onComplete (handleBytes);
- ```
-
- @param id The ID or asset path for the asset
- @return Returns a Future
-
- @see [Working with byte array assets](https://books.openfl.org/openfl-developers-guide/working-with-byte-arrays/working-with-byte-array-assets.html)
- **/
- public static function loadBytes(id:String):Future
- {
- #if lime
- var promise = new Promise();
- var future = LimeAssets.loadBytes(id);
-
- future.onComplete(function(bytes) promise.complete(bytes));
- future.onProgress(function(progress, total) promise.progress(progress, total));
- future.onError(function(msg) promise.error(msg));
-
- return promise.future;
- #else
- return Future.withValue(getBytes(id));
- #end
- }
-
- /**
- Loads an included font asset asynchronously
-
- ```haxe
- Assets.loadFont ("font.ttf").onComplete (handleFont);
- ```
-
- @param id The ID or asset path for the asset
- @param useCache (Optional) Whether to allow use of the asset cache (Default: true)
- @return Returns a Future
-
- @see [Working with font assets](https://books.openfl.org/openfl-developers-guide/using-the-textfield-class/working-with-font-assets.html)
- **/
- public static function loadFont(id:String, useCache:Null = true):Future
- {
- if (useCache == null) useCache = true;
-
- #if (lime && tools && !display && !macro)
- var promise = new Promise();
-
- if (useCache && cache.enabled && cache.hasFont(id))
- {
- promise.complete(cache.getFont(id));
- return promise.future;
- }
-
- LimeAssets.loadFont(id)
- .onComplete(function(limeFont)
- {
- #if flash
- var font = limeFont.src;
- #else
- var font = new Font();
- font.__fromLimeFont(limeFont);
- #end
-
- if (useCache && cache.enabled)
- {
- cache.setFont(id, font);
- }
-
- promise.complete(font);
- })
- .onError(promise.error)
- .onProgress(promise.progress);
-
- return promise.future;
- #else
- return Future.withValue(getFont(id, useCache));
- #end
- }
-
- /**
- Load an included AssetLibrary
- @param name The name of the AssetLibrary to load
- @return Returns a Future
- **/
- public static function loadLibrary(name:String):#if java Future #else Future #end
- {
- #if lime
- return LimeAssets.loadLibrary(name).then(function(library)
- {
- var _library:AssetLibrary = null;
-
- if (library != null)
- {
- if ((library is AssetLibrary))
- {
- _library = cast library;
- }
- else
- {
- // TODO: after Lime 8.2.0 is released, use conditional
- // compilation to call LimeAssets.removeLibrary(name, false)
- // since that is a new public API
- @:privateAccess LimeAssets.libraries.remove(name);
- _library = new AssetLibrary();
- _library.__proxy = library;
-
- // ERIC: Figure out what bug the change here was made to fix
- // https://github.com/FunkinCrew/openfl/commit/7af97e4baff7371eba1f79959909ffca7971902e
- // https://github.com/FunkinCrew/lime/commit/f195121ebec688b417e38ab115185c8d93c349d3
- LimeAssets.registerLibrary(name, _library);
- }
- }
-
- return Future.withValue(_library);
- });
- #else
- return cast Future.withError("Cannot load library");
- #end
- }
-
- /**
- Loads an included music asset asynchronously
-
- ```haxe
- Assets.loadMusic ("music.ogg").onComplete (handleMusic);
- ```
-
- @param id The ID or asset path for the asset
- @param useCache (Optional) Whether to allow use of the asset cache (Default: true)
- @return Returns a Future
- **/
- public static function loadMusic(id:String, useCache:Null = true):Future
- {
- if (useCache == null) useCache = true;
-
- #if lime
- #if !html5
- var promise = new Promise();
-
- LimeAssets.loadAudioBuffer(id, useCache)
- .onComplete(function(buffer)
- {
- if (buffer != null)
- {
- #if flash
- var sound = buffer.src;
- #else
- var sound = Sound.fromAudioBuffer(buffer);
- #end
-
- if (useCache && cache.enabled)
- {
- cache.setSound(id, sound);
- }
-
- promise.complete(sound);
- }
- else
- {
- promise.error("[Assets] Could not load Sound \"" + id + "\"");
- }
- })
- .onError(promise.error)
- .onProgress(promise.progress);
- return promise.future;
- #else
- var future = new Future(function() return getMusic(id, useCache));
- return future;
- #end
- #else
- return Future.withValue(getMusic(id, useCache));
- #end
- }
-
- /**
- Loads an included MovieClip asset asynchronously
-
- ```haxe
- Assets.loadMovieClip ("library:BouncingBall").onComplete (handleMovieClip);
- ```
-
- @param id The ID for the asset
- @param useCache (Optional) Whether to allow use of the asset cache (Default: true)
- @return Returns a Future
- **/
- public static function loadMovieClip(id:String):Future
- {
- #if (lime && tools && !display)
- var promise = new Promise();
-
- var libraryName = id.substring(0, id.indexOf(":"));
- var symbolName = id.substr(id.indexOf(":") + 1);
- var limeLibrary = getLibrary(libraryName);
-
- if (limeLibrary != null)
- {
- if ((limeLibrary is AssetLibrary))
- {
- var library:AssetLibrary = cast limeLibrary;
-
- if (library.exists(symbolName, cast AssetType.MOVIE_CLIP))
- {
- promise.completeWith(library.loadMovieClip(symbolName));
- return promise.future;
- }
- }
-
- promise.error("[Assets] There is no MovieClip asset with an ID of \"" + id + "\"");
- }
- else
- {
- promise.error("[Assets] There is no asset library named \"" + libraryName + "\"");
- }
-
- return promise.future;
- #else
- return Future.withValue(getMovieClip(id));
- #end
- }
-
- /**
- Loads an included sound asset asynchronously
-
- ```haxe
- Assets.loadSound ("sound.wav").onComplete (handleSound);
- ```
-
- @param id The ID or asset path for the asset
- @param useCache (Optional) Whether to allow use of the asset cache (Default: true)
- @return Returns a Future
-
- @see [Working with sound assets](https://books.openfl.org/openfl-developers-guide/working-with-sound/working-with-sound-assets.html)
- **/
- public static function loadSound(id:String, useCache:Null = true):Future
- {
- if (useCache == null) useCache = true;
-
- #if lime
- var promise = new Promise();
-
- LimeAssets.loadAudioBuffer(id, useCache)
- .onComplete(function(buffer)
- {
- if (buffer != null)
- {
- #if flash
- var sound = buffer.src;
- #else
- var sound = Sound.fromAudioBuffer(buffer);
- #end
-
- if (useCache && cache.enabled)
- {
- cache.setSound(id, sound);
- }
-
- promise.complete(sound);
- }
- else
- {
- promise.error("[Assets] Could not load Sound \"" + id + "\"");
- }
- })
- .onError(promise.error)
- .onProgress(promise.progress);
- return promise.future;
- #else
- return Future.withValue(getSound(id, useCache));
- #end
- }
-
- /**
- Loads an included text asset asynchronously
-
- ```haxe
- Assets.loadText ("text.txt").onComplete (handleString);
- ```
-
- @param id The ID or asset path for the asset
- @param useCache (Optional) Whether to allow use of the asset cache (Default: true)
- @return Returns a Future
- **/
- public static function loadText(id:String):Future
- {
- #if lime
- var future = LimeAssets.loadText(id);
- return future;
- #else
- return Future.withValue(getText(id));
- #end
- }
-
- /**
- Registers an AssetLibrary binding for use with @:bind or Assets.bind
- @param className The class name to use for the binding
- @param method The AssetLibrary responsible for the binding
- **/
- public static function registerBinding(className:String, library:AssetLibrary):Void
- {
- libraryBindings.set(className, library);
- }
-
- /**
- Registers a new AssetLibrary with the Assets class
- @param name The name (prefix) to use for the library
- @param library An AssetLibrary instance to register
- **/
- public static function registerLibrary(name:String, library:AssetLibrary):Void
- {
- #if lime
- LimeAssets.registerLibrary(name, library);
- #end
- }
-
- public static function removeEventListener(type:String, listener:Dynamic, capture:Bool = false):Void
- {
- dispatcher.removeEventListener(type, listener, capture);
- }
-
- @:noCompletion private static function resolveClass(name:String):Class
- {
- return Type.resolveClass(name);
- }
-
- @:noCompletion private static function resolveEnum(name:String):Enum
- {
- var value = Type.resolveEnum(name);
-
- #if flash
- if (value == null)
- {
- return cast Type.resolveClass(name);
- }
- #end
-
- return value;
- }
-
- public static function unloadLibrary(name:String):Void
- {
- #if lime
- LimeAssets.unloadLibrary(name);
- #end
- }
-
- /**
- Unregisters an AssetLibrary binding for use with @:bind or Assets.bind
- @param className The class name to use for the binding
- @param method The AssetLibrary responsible for the binding
- **/
- public static function unregisterBinding(className:String, library:AssetLibrary):Void
- {
- if (libraryBindings.exists(className) && libraryBindings.get(className) == library)
- {
- libraryBindings.remove(className);
- }
- }
-
- // Event Handlers
- @:noCompletion private static function LimeAssets_onChange():Void
- {
- dispatchEvent(new Event(Event.CHANGE));
- }
-}