avm2: Copy data for async loadCompressedTextureFromByteArray

The caller might modify the ByteArray immediately after the call,
so we need to copy the ByteArray.
This commit is contained in:
Aaron Hill 2023-11-19 21:58:39 -05:00 committed by Lord-McSweeney
parent 941f87ca8e
commit 24aa9b8fe4
1 changed files with 12 additions and 7 deletions

View File

@ -1,24 +1,29 @@
package flash.display3D.textures { package flash.display3D.textures {
import flash.display.BitmapData; import flash.display.BitmapData;
import flash.events.Event; import flash.events.Event;
import flash.utils.ByteArray; import flash.utils.ByteArray;
import flash.utils.setTimeout; import flash.utils.setTimeout;
public final class Texture extends TextureBase { public final class Texture extends TextureBase {
public native function uploadFromBitmapData(source:BitmapData, miplevel:uint = 0):void; public native function uploadFromBitmapData(source:BitmapData, miplevel:uint = 0):void;
public native function uploadFromByteArray(data:ByteArray, byteArrayOffset:uint, miplevel:uint = 0):void; public native function uploadFromByteArray(data:ByteArray, byteArrayOffset:uint, miplevel:uint = 0):void;
public function uploadCompressedTextureFromByteArray(data:ByteArray, byteArrayOffset:uint, async:Boolean = false):void { public function uploadCompressedTextureFromByteArray(data:ByteArray, byteArrayOffset:uint, async:Boolean = false):void {
if (async) { if (async) {
var self = this; var self = this;
var copiedData = new ByteArray();
data.position = 0;
data.readBytes(copiedData);
setTimeout(function() { setTimeout(function() {
self.uploadCompressedTextureFromByteArrayInternal(data, byteArrayOffset); self.uploadCompressedTextureFromByteArrayInternal(copiedData, byteArrayOffset);
self.dispatchEvent(new Event("textureReady")); self.dispatchEvent(new Event("textureReady"));
}, 0); }, 0);
} else { }
else {
this.uploadCompressedTextureFromByteArrayInternal(data, byteArrayOffset); this.uploadCompressedTextureFromByteArrayInternal(data, byteArrayOffset);
} }
} }
private native function uploadCompressedTextureFromByteArrayInternal(data:ByteArray, byteArrayOffset:uint):void private native function uploadCompressedTextureFromByteArrayInternal(data:ByteArray, byteArrayOffset:uint):void;
} }
} }