Files
XRLib/Assets/ADL-Plugins/zip/Scripts/testWebGLtvOS.cs
2025-06-04 23:10:11 +09:00

418 lines
17 KiB
C#

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.Networking;
public class testWebGLtvOS : MonoBehaviour
{
#if UNITY_WEBGL || UNITY_TVOS
//an output Buffer for the decompressed gz buffer
private byte[] outbuffer = null, outbuffer2 = null;
private Texture2D tex = null, tex2 = null, tex3 = null, tex4 = null, tex5 = null, tex6 = null, tex7 = null, tex8 = null, tex9 = null;
byte[] wwb = null, wwb3 = null, zipwww = null;
private bool downloadDone1, downloadDone2, downloadDone3, downloadDone4;
private string log = "";
//log for output of results
void plog(string t = "")
{
log += t + "\n"; ;
}
void Start(){
tex = new Texture2D(1,1,TextureFormat.RGBA32, false);
tex2 = new Texture2D(1,1,TextureFormat.RGBA32, false);
tex3 = new Texture2D(1,1,TextureFormat.RGBA32, false);
tex4 = new Texture2D(1,1,TextureFormat.RGBA32, false);
tex5 = new Texture2D(1,1,TextureFormat.RGBA32, false);
tex6 = new Texture2D(1,1,TextureFormat.RGBA32, false);
tex7 = new Texture2D(1,1,TextureFormat.RGBA32, false);
tex8 = new Texture2D(1,1,TextureFormat.RGBA32, false);
tex9 = new Texture2D(1,1,TextureFormat.RGBA32, false);
//get some files from a server
StartCoroutine( getFromSite() );
}
void OnGUI(){
if(tex != null) GUI.DrawTexture(new Rect(200, 10, 185, 140), tex);
if(tex2 != null) GUI.DrawTexture(new Rect(395, 10, 185, 140), tex2);
if(tex3 != null) GUI.DrawTexture(new Rect(590, 10,185, 140), tex3);
if(tex4 != null) GUI.DrawTexture(new Rect(785, 10,185, 140), tex4);
if(tex5 != null) GUI.DrawTexture(new Rect(980, 10,185, 140), tex5);
if(tex6 != null) GUI.DrawTexture(new Rect(200, 160,125, 100), tex6);
if(tex7 != null) GUI.DrawTexture(new Rect(335, 160,125, 100), tex7);
if(tex8 != null) GUI.DrawTexture(new Rect(470, 160,125, 100), tex8);
if(tex9 != null) GUI.DrawTexture(new Rect(605, 160,125, 100), tex9);
if(downloadDone1) {
// gzip read from buffer and decompress. gzip compress a buffer.
if (GUI.Button(new Rect(5, 5, 180, 40), "Buffer gz test")) gzTest();
}
if(downloadDone2) {
// find a gzip file merged in a buffer and decompress. The gzip attached must be created with the plugin's gzip function and the overrideDateTimeWithLength = true.
if (GUI.Button(new Rect(5, 50, 180, 40), "start merged gzip test")) mergedTest();
//check the compress/decompress zlib buffers section in the lzip.cs section for more variations
if(outbuffer != null) {
if (GUI.Button(new Rect(5, 95, 180, 40), "zlib buffer tests")) zlibTest();
}
}
//--------------------------------------------------------------------------------------------------------------
//
// ZIP tests peformed in byte buffers. All operations are supported except those that need a file system.
// (Refer to the testZip.cs script for more examples that do not use the file system!)
//
//--------------------------------------------------------------------------------------------------------------
if (downloadDone3) {
if (GUI.Button(new Rect(5, 140, 180, 40), "zip tests 1")) zipTest();
}
// Zip tests performed using native file buffers. Avoid memory peaks during decompression.
if (GUI.Button(new Rect(5, 185, 180, 40), "zip native buffer")) StartCoroutine(zipNativeBuffer());
GUI.TextArea(new Rect(10, 270, Screen.width - 20, Screen.height - 280), log);
}
void gzTest() {
log = "";
//decompress a gzip buffer.
plog("ungzip2: "+lzip.unGzip2(wwb, outbuffer).ToString()+" bytes"+ "\n");
if(outbuffer != null) {
tex.LoadImage(outbuffer);
//compress a buffer to a gzip buffer.
plog("gzip a buffer");
// a temp buffer where the compression will occur.
var tempBuffer = new byte[outbuffer.Length + 18];
// do compression
int res = lzip.gzip(outbuffer, tempBuffer, 9);
// create the final gzipped buffer
var gzippedBuffer = new byte[res];
// copy the compressed data to it.
Buffer.BlockCopy(tempBuffer, 0, gzippedBuffer, 0, res);
// erase the the temp buffer. (or it could be a reusable fixed buffer to avoid allocations.)
tempBuffer = null;
// show decompresed and compressed sizes
plog(outbuffer.Length.ToString() + " -> " + res.ToString());
gzippedBuffer = null; // erase gzipped buffer
}
}
void mergedTest() {
log = "";
int offset = lzip.findGzStart(wwb3);
int gzipSize = lzip.gzipCompressedSize(wwb3, offset);
if(gzipSize > 0) plog("Compresed size: " + gzipSize.ToString()); else plog("No compressed size stored in gzip.");
plog("Start of gzip File: " + offset.ToString());
plog("unGzip2Merged: "+lzip.unGzip2Merged(wwb3, offset, wwb3.Length - offset, outbuffer2).ToString()+" bytes");
if(outbuffer2 != null) tex2.LoadImage(outbuffer2);
}
void zlibTest() {
log = "";
var nt = lzip.compressBuffer(outbuffer, 9);
if(nt != null){
plog("compressed zlib buffer size: " + nt.Length.ToString());
var cb = lzip.decompressBuffer(nt);
if(cb != null) {
plog("decompressed zlib buffer size: " + cb.Length.ToString());
tex3.LoadImage(cb);
}
cb = null; nt = null;
}
}
void zipTest() {
log = "";
// Handle regular zip in buffer
//
// get info of a zip file using the getFileInfo method.
plog("Get Info of zip in Buffer: " + lzip.getFileInfo(null, zipwww).ToString());
if(lzip.ninfo != null && lzip.ninfo.Count > 0) {
for(int i=0; i < lzip.ninfo.Count; i++){
plog("Entry no: " + (i+1).ToString() +
" " + lzip.ninfo[i] +
" uncompressed: " + lzip.uinfo[i].ToString() +
" compressed: " + lzip.cinfo[i].ToString() +
" offset: " + lzip.localOffset[i].ToString());
}
}
//validate a zip file in a buffer and extract an entry from it to a byte buffer.
plog("Validate zip file in Buffer: " + lzip.validateFile(null, zipwww).ToString());
var ob = lzip.entry2Buffer(null, "dir1/dir2/dir3/Unity_1.jpg", zipwww);
plog("entry2Buffer: " + ob.Length.ToString());
if(ob != null) tex4.LoadImage(ob);
byte [] merged = null;
//create an inMemory zip file.
if(ob != null) {
lzip.inMemory t = new lzip.inMemory();
// compress a buffer to an in memory zip with a password. bz2 compression method is not supported.
// The function returns the pointer to the in memory zip buffer. But you can get this also through t.pointer.
// This function is slow when adding multiple buffers to the inMemory zip. It is better to use the low level functions below this example.
lzip.compress_Buf2Mem(t, 9, ob, "inmem/test.jpg", null,"1234");
// print the in memory zip size in bytes.
plog("Create inMemory zip size: " + t.size().ToString());
// a buffer to perform decompression operations from an in memory zip to it.
byte[] bf = null;
// a function that decompresses an entry from an in memory zip to a buffer that will get resized to fit the output.
// (you can use entry2FixedBufferMem to decompress to a fixed sixed buffer or the overloaded entry2BufferMem function that returns a new buffer.)
plog("entry2BufferMem: " + lzip.entry2BufferMem(t,"inmem/test.jpg", ref bf, "1234").ToString());
// (!) If you don't need anymore the inMemory object use the free_inmemory function to free the occupied memory by the zip (!)
//
lzip.free_inmemory(t);
// low level functions to create inMemory zip which are faster then using the above function. ------------------------------
//
// Create an in memory object to reference our in memory zip
lzip.inMemory t2 = new lzip.inMemory();
// Initiate an inMemory zip archive
lzip.inMemoryZipStart(t2);
// Add a buffer as a first entry in the inMemory zip
lzip.inMemoryZipAdd(t2, 9, ob, "test.jpg");
// Add a second buffer as the second entry.
lzip.inMemoryZipAdd(t2, 9, ob, "directory/test2.jpg");
// !!! -> After finishing adding buffer/files in the inMemory zip we must close it <- !!!
// You can reopen it later with the inMemoryZipStart function to append more entries to it.
lzip.inMemoryZipClose(t2);
// Write out the compressed size of the inMemory created zip
plog("Size of Low Level inMemory zip: " + t2.size().ToString());
byte[] bf2 = null;
plog("entry2BufferMem low: " + lzip.entry2BufferMem(t2,"directory/test2.jpg", ref bf2).ToString());
// make sure we got a valid inMemory zip by extracting an image out of it and loading it to a texture.
if(bf2 != null) { tex7.LoadImage(bf2); bf2 = null; }
// free the t2 inMemory object if you don't need it anymore.
lzip.free_inmemory(t2);
// end low memory functions -------------------------------------------------------------------------------------------------
if(bf != null) {
tex5.LoadImage(bf);
//create a mereged zip file for the next test
merged = new byte[bf.Length + zipwww.Length];
Array.Copy(bf, 0, merged, 0, bf.Length);
Array.Copy(zipwww, 0, merged, bf.Length, zipwww.Length);
}
}
// Merged zip file in buffer examples.
//
// -----------------------------------
if (merged != null) {
plog("");
// get info of a zip file using the merged method.
plog("Get Info of merged zip in Buffer: " + lzip.getZipInfoMerged( merged ).ToString());
if(lzip.zinfo != null && lzip.zinfo.Count > 0) {
for(int i=0; i < lzip.zinfo.Count; i++){
plog("Entry no: " + (i+1).ToString() +
" " + lzip.zinfo[i].filename +
" uncompressed: " + lzip.zinfo[i].UncompressedSize.ToString() +
" compressed: " + lzip.zinfo[i].CompressedSize.ToString() +
" offset: " + lzip.zinfo[i].RelativeOffsetOfLocalFileHeader.ToString());
}
}
// get the position and size of the merged zip in a buffer
int position = 0, size = 0;
lzip.getZipInfoMerged(merged, ref position, ref size, false);
plog("merged zip: position = " + position.ToString() + " , size = "+ size.ToString());
// get the pure zip file from where it is merged.
var pureZip = lzip.getMergedZip(merged);
if(pureZip != null) plog("got pure zip buffer with size: " + pureZip.Length.ToString());
pureZip = null;
// extract an entry from a merged zip
// see lzip.cs for more overloaded functions to extract to referenced or fixed sized buffers
var extractedData = lzip.entry2BufferMerged(merged, "dir1/dir2/dir3/Unity_1.jpg");
if(extractedData != null) {
tex6.LoadImage(extractedData);
plog("entry2BufferMerged: " + extractedData.Length.ToString());
}
}
}
IEnumerator zipNativeBuffer() {
// A native memory pointer
IntPtr nativePointer = IntPtr.Zero;
// Declare an int to get the downloaded archive size from the coroutine. When we pass directly a pointer to the plugin we need the size or the buffer it occupies.
int zipSize = 0;
log = "";
plog("Downloading 1st file");
plog();
downloadDone4 = false;
// Here we are calling the coroutine for a pointer. We also get the downloaded file size.
StartCoroutine(lzip.downloadZipFileNative("http://telias.free.fr/temp/testZip.zip", r => downloadDone4 = r, null, pointerResult => nativePointer = pointerResult, size => zipSize = size));
while (!downloadDone4) yield return true;
plog("File size: " + zipSize.ToString()); // show size of the zip
// validate a zip file in a buffer.
plog("Validate zip file in Buffer: " + lzip.validateFile(zipSize.ToString(), nativePointer).ToString());
// extract an entry from it to a byte buffer (could be in a fixed or referenced buffer also)
var ob = lzip.entry2Buffer(zipSize.ToString(), "dir1/dir2/dir3/Unity_1.jpg", nativePointer);
// Delete the buffer from native memory.
lzip.releaseBuffer(nativePointer);
plog("entry2Buffer: " + ob.Length.ToString());
if(ob != null) tex8.LoadImage(ob);
plog(); plog();
// Now download a zip file to a native pointer of an lzip.inMemory class
downloadDone4 = false;
plog("Downloading 2nd file");
plog();
// An inMemory lzip struct class.
lzip.inMemory inMemZip = null;
// Here we are calling the coroutine for an inMemory class.
StartCoroutine(lzip.downloadZipFileNative("http://telias.free.fr/temp/testZip.zip", r => downloadDone4 = r, result => inMemZip = result));
while (!downloadDone4) yield return true;
plog("File size: " + inMemZip.size().ToString());
// validate a zip file in a buffer.
plog("Validate zip file in Buffer: " + lzip.validateFile(inMemZip.size().ToString(), inMemZip.memoryPointer()).ToString());
// extract an entry from it to a byte buffer (could be in a fixed or referenced buffer also)
var ob2 = lzip.entry2Buffer(inMemZip.size().ToString(), "dir1/dir2/dir3/Unity_1.jpg", inMemZip.memoryPointer());
// free the struct and the native memory it occupies!!!
lzip.free_inmemory(inMemZip);
plog("entry2Buffer: " + ob2.Length.ToString());
if(ob2 != null) tex9.LoadImage(ob);
}
// =============================================================================================================================================================
IEnumerator getFromSite() {
plog("getting buffer from site ...");
yield return true;
using (UnityWebRequest www = UnityWebRequest.Get("https://dl.dropboxusercontent.com/s/zk118shcawkiwas/testLZ4b.png.gz")) {
#if UNITY_5 || UNITY_4
yield return www.Send();
#else
yield return www.SendWebRequest();
#endif
if (www.error != null) {
Debug.Log(www.error);
} else {
wwb = new byte[www.downloadHandler.data.Length]; Array.Copy(www.downloadHandler.data, 0, wwb, 0, www.downloadHandler.data.Length);
outbuffer = new byte[ lzip.gzipUncompressedSize(wwb) ];
plog("Got buffer");
downloadDone1 = true;
}
}
using (UnityWebRequest www = UnityWebRequest.Get("https://dl.dropboxusercontent.com/s/874ijig3hzq1jzm/gzipMerged.jpg")) {
#if UNITY_5 || UNITY_4
yield return www.Send();
#else
yield return www.SendWebRequest();
#endif
if (www.error != null) {
Debug.Log(www.error);
} else {
wwb3 = new byte[www.downloadHandler.data.Length]; Array.Copy(www.downloadHandler.data, 0, wwb3, 0, www.downloadHandler.data.Length);
outbuffer2 = new byte[ lzip.gzipUncompressedSize(wwb3) ];
plog("Got buffer2");
downloadDone2 = true;
}
}
using (UnityWebRequest www = UnityWebRequest.Get("https://dl.dropboxusercontent.com/s/whbz2hsuyescgej/test2Zip.zip")) {
#if UNITY_5 || UNITY_4
yield return www.Send();
#else
yield return www.SendWebRequest();
#endif
if (www.error != null) {
Debug.Log(www.error);
} else {
zipwww = new byte[www.downloadHandler.data.Length]; Array.Copy(www.downloadHandler.data, 0, zipwww, 0, www.downloadHandler.data.Length);
plog("Got zip file");
downloadDone3 = true;
}
}
yield return true;
// Run all the tests on tvos (usefull for emulator)
#if UNITY_TVOS && !UNITY_EDITOR
gzTest();
mergedTest();
zlibTest();
zipTest();
#endif
}
#else
void Start(){
Debug.Log("Only for WebGL ot tvOS");
}
#endif
}