all:
	make build
	make install

install:
	zip -r application_creative.zip . -x "lib/vendor/*"
	mv application_creative.zip ../../../dist/data/state/plugins/

build:
	make deps_font
	make deps_zipimage
	make deps_xcf
	make deps_stb
	make deps_exr
	make deps_dds
	make deps_im

clean:
	[ ! -d lib ] || rm -rf lib

deps_font:
	[ -d lib ] || mkdir lib
	[ -e lib/opentype.mjs ] || { \
		curl -s https://opentype.js.org/dist/opentype.mjs > lib/opentype.mjs; \
		brotli -f -k ./lib/opentype.mjs; \
	}
	[ -e lib/decompress_binding.js ] || { \
		curl -s https://unpkg.com/wawoff2@2.0.1/build/decompress_binding.js > lib/decompress_binding.js; \
		brotli -f -k ./lib/decompress_binding.js; \
	}

deps_zipimage:
	[ -d lib ] || mkdir lib
	[ -d lib/zip ] || { \
		mkdir lib/zip && cd lib/zip; \
		curl -sLO https://deno.land/x/zipjs@v2.7.60/index.js; \
		mkdir lib && cd lib; \
		curl -sLO https://deno.land/x/zipjs@v2.7.60/lib/zip-fs.js; \
		curl -sLO https://deno.land/x/zipjs@v2.7.60/lib/z-worker-inline.js; \
		mkdir core && cd core; \
		curl -sLO https://deno.land/x/zipjs@v2.7.60/lib/core/io.js; \
		curl -sLO https://deno.land/x/zipjs@v2.7.60/lib/core/zip-reader.js; \
		curl -sLO https://deno.land/x/zipjs@v2.7.60/lib/core/zip-writer.js; \
		curl -sLO https://deno.land/x/zipjs@v2.7.60/lib/core/zip-fs-core.js; \
		curl -sLO https://deno.land/x/zipjs@v2.7.60/lib/core/codec-worker.js; \
		curl -sLO https://deno.land/x/zipjs@v2.7.60/lib/core/zip-entry.js; \
		curl -sLO https://deno.land/x/zipjs@v2.7.60/lib/core/configuration.js; \
		curl -sLO https://deno.land/x/zipjs@v2.7.60/lib/core/codec-pool.js; \
		curl -sLO https://deno.land/x/zipjs@v2.7.60/lib/core/constants.js; \
		mkdir util && cd util; \
		curl -sLO https://deno.land/x/zipjs@v2.7.60/lib/core/util/default-mime-type.js; \
		curl -sLO https://deno.land/x/zipjs@v2.7.60/lib/core/util/stream-codec-shim.js; \
		curl -sLO https://deno.land/x/zipjs@v2.7.60/lib/core/util/decode-text.js; \
		curl -sLO https://deno.land/x/zipjs@v2.7.60/lib/core/util/encode-text.js; \
		curl -sLO https://deno.land/x/zipjs@v2.7.60/lib/core/util/cp437-decode.js; \
		curl -sLO https://deno.land/x/zipjs@v2.7.60/lib/core/util/mime-type.js; \
		cd ../ && mkdir streams && cd streams; \
		curl -sLO https://deno.land/x/zipjs@v2.7.60/lib/core/streams/codec-stream.js; \
		curl -sLO https://deno.land/x/zipjs@v2.7.60/lib/core/streams/zip-entry-stream.js; \
		curl -sLO https://deno.land/x/zipjs@v2.7.60/lib/core/streams/crc32-stream.js; \
		curl -sLO https://deno.land/x/zipjs@v2.7.60/lib/core/streams/aes-crypto-stream.js; \
		curl -sLO https://deno.land/x/zipjs@v2.7.60/lib/core/streams/zip-crypto-stream.js; \
		curl -sLO https://deno.land/x/zipjs@v2.7.60/lib/core/streams/common-crypto.js; \
		curl -sLO https://deno.land/x/zipjs@v2.7.60/lib/core/streams/stream-adapter.js; \
		mkdir codecs && cd codecs; \
		curl -sLO https://deno.land/x/zipjs@v2.7.60/lib/core/streams/codecs/sjcl.js; \
		curl -sLO https://deno.land/x/zipjs@v2.7.60/lib/core/streams/codecs/crc32.js; \
		curl -sLO https://deno.land/x/zipjs@v2.7.60/lib/core/streams/codecs/deflate.js; \
		curl -sLO https://deno.land/x/zipjs@v2.7.60/lib/core/streams/codecs/inflate.js; \
	}

deps_xcf:
	[ -d lib/vendor ] || mkdir -p lib/vendor
	[ -d lib/vendor/xcftools ] || { \
		cd lib/vendor && git clone https://github.com/j-jorge/xcftools xcftools && cd xcftools; \
		sed -i "24i #include <endian.h>" ./xcf-general.c; \
		curl -s https://gist.githubusercontent.com/mickael-kerjean/c591d2e99fb25c3607b332392bc524f3/raw/7a0aba1e26cc1d8bad37c3012df21c68752f1afd/gistfile1.txt > ./io-unix.c; \
		emconfigure ./configure --disable-nls; \
		emmake make || true; \
		emcc -Wall -I. xcf2png.c xcf-general.c flatten.c utils.c palette.c pixels.c table.c enums.c scaletab.c flatspec.c io-unix.c -lpng -lz -o ../../xcf2png.js -s EXPORT_ES6=1 -s "EXPORTED_FUNCTIONS=['_main']" -s "EXPORTED_RUNTIME_METHODS=['FS', 'callMain']" -s INVOKE_RUN=0; \
		gzip -f -k ../../xcf2png.js; \
		gzip -f -k ../../xcf2png.wasm; \
	}

deps_stb:
	[ -d lib/vendor ] || mkdir -p lib/vendor
	[ -d lib/vendor/stb ] || git clone --depth 1 https://github.com/nothings/stb ./lib/vendor/stb
	emcc -O2 -c loader_stb.c -I./lib/vendor/stb/
	emcc --no-entry loader_stb.o -o lib/stb_wasm.mjs -sINITIAL_HEAP=0KB -sINITIAL_MEMORY=512MB

deps_exr:
	[ -d lib/vendor ] || mkdir -p lib/vendor
	[ -d lib/vendor/openexr ] || { \
		cd lib/vendor && git clone --branch v3.3.3 https://github.com/AcademySoftwareFoundation/openexr && cd openexr; \
		emcmake cmake -B build -DCMAKE_BUILD_TYPE=Release; \
		emmake make -C build -j 8; \
	}
	em++ -O2 -c ./loader_exr.cpp -I./lib/vendor/openexr/src/lib/OpenEXR -I./lib/vendor/openexr/build/cmake -I./lib/vendor/openexr/build/_deps/imath-src/src/Imath -I./lib/vendor/openexr/build/_deps/imath-build/config -I./lib/vendor/openexr/src/lib/Iex
	em++ --no-entry ./loader_exr.o ./lib/vendor/openexr/build/_deps/imath-build/src/Imath/libImath-3_1.a ./lib/vendor/openexr/build/src/lib/Iex/libIex-3_3.a ./lib/vendor/openexr/build/src/lib/OpenEXRUtil/libOpenEXRUtil-3_3.a ./lib/vendor/openexr/build/src/lib/OpenEXR/libOpenEXR-3_3.a ./lib/vendor/openexr/build/src/lib/OpenEXRCore/libOpenEXRCore-3_3.a ./lib/vendor/openexr/build/src/lib/IlmThread/libIlmThread-3_3.a -o lib/exr_wasm.mjs

deps_dds:
	[ -d lib/vendor ] || mkdir -p lib/vendor
	[ -d lib/vendor/ddskts ] || { \
		cd lib/vendor && git clone https://github.com/sh0c/dds-ktx-parser.git ddskts && cd ddskts; \
		npm install && npm run build && cd ../../; \
		mv vendor/ddskts/dist/index.mjs ./ddskts.mjs; \
		curl -sLO https://cdn.jsdelivr.net/npm/buffer-polyfill@6.0.3/dist/buffer.js; \
		sed -i '1i import Buffer from "./buffer.js"' ./ddskts.mjs; \
	}

deps_im:
	[ -d lib ] || mkdir lib
	[ -e lib/magickApi.js ] || curl -s https://knicknic.github.io/wasm-imagemagick/magickApi.js > lib/magickApi.js && brotli -f -k ./lib/magickApi.js
	[ -e lib/magick.js ] || curl -s https://knicknic.github.io/wasm-imagemagick/magick.js > lib/magick.js && brotli -f -k ./lib/magick.js
	[ -e lib/magick.wasm ] || curl -s https://knicknic.github.io/wasm-imagemagick/magick.wasm > lib/magick.wasm && brotli -f -k ./lib/magick.wasm
