@pixagram/renderart 0.4.0 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -157
- package/dist/index.d.mts +36 -58
- package/dist/index.d.ts +36 -58
- package/dist/index.js +81 -190
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +82 -189
- package/dist/index.mjs.map +1 -1
- package/package.json +7 -3
- package/pkg/LICENSE +21 -0
- package/pkg/README.md +117 -0
- /package/{dist → pkg}/renderart_wasm.d.ts +0 -0
- /package/{dist → pkg}/renderart_wasm.js +0 -0
- /package/{dist → pkg}/renderart_wasm_bg.js +0 -0
- /package/{dist → pkg}/renderart_wasm_bg.wasm +0 -0
- /package/{dist → pkg}/renderart_wasm_bg.wasm.d.ts +0 -0
package/dist/index.js
CHANGED
|
@@ -622,47 +622,13 @@ var HEX_PRESETS = {
|
|
|
622
622
|
// src/wasm-loader.ts
|
|
623
623
|
var wasm = null;
|
|
624
624
|
var wasmReady = false;
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
if (wasmReady) return;
|
|
629
|
-
if (initError) throw initError;
|
|
630
|
-
if (initPromise) return initPromise;
|
|
631
|
-
initPromise = (async () => {
|
|
632
|
-
try {
|
|
633
|
-
const wasmModule = await import('./renderart_wasm.js');
|
|
634
|
-
const init = wasmModule.default || wasmModule.__wbg_init || wasmModule;
|
|
635
|
-
if (typeof init === "function") {
|
|
636
|
-
await init();
|
|
637
|
-
} else if (typeof init.default === "function") {
|
|
638
|
-
await init.default();
|
|
639
|
-
} else {
|
|
640
|
-
throw new Error("Could not find WASM init function");
|
|
641
|
-
}
|
|
642
|
-
wasm = wasmModule;
|
|
643
|
-
wasmReady = true;
|
|
644
|
-
} catch (e) {
|
|
645
|
-
initError = new Error(`Failed to initialize WASM: ${e}`);
|
|
646
|
-
initPromise = null;
|
|
647
|
-
throw initError;
|
|
648
|
-
}
|
|
649
|
-
})();
|
|
650
|
-
return initPromise;
|
|
625
|
+
function initWasm(wasmModule) {
|
|
626
|
+
wasm = wasmModule;
|
|
627
|
+
wasmReady = true;
|
|
651
628
|
}
|
|
652
629
|
function isWasmLoaded() {
|
|
653
630
|
return wasmReady;
|
|
654
631
|
}
|
|
655
|
-
function hasWasmError() {
|
|
656
|
-
return initError !== null;
|
|
657
|
-
}
|
|
658
|
-
function getWasmError() {
|
|
659
|
-
return initError;
|
|
660
|
-
}
|
|
661
|
-
async function ensureWasm() {
|
|
662
|
-
if (!wasmReady) {
|
|
663
|
-
await initWasm();
|
|
664
|
-
}
|
|
665
|
-
}
|
|
666
632
|
function getOutputData(result) {
|
|
667
633
|
const memory = wasm.get_memory();
|
|
668
634
|
const buffer = new Uint8Array(memory.buffer, result.ptr, result.len);
|
|
@@ -672,30 +638,24 @@ function toUint8Array(input) {
|
|
|
672
638
|
const data = input instanceof ImageData ? input.data : input.data;
|
|
673
639
|
return data instanceof Uint8Array ? data : new Uint8Array(data);
|
|
674
640
|
}
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
641
|
+
function ensureWasm() {
|
|
642
|
+
if (!wasmReady || !wasm) {
|
|
643
|
+
throw new Error("WASM not initialized. Call initWasm() first.");
|
|
678
644
|
}
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
/** Initialize (loads WASM if needed) */
|
|
686
|
-
async init() {
|
|
687
|
-
await ensureWasm();
|
|
688
|
-
this.initialized = true;
|
|
645
|
+
}
|
|
646
|
+
var CrtCpuRenderer = class _CrtCpuRenderer {
|
|
647
|
+
/** Create renderer (WASM must be initialized first) */
|
|
648
|
+
static create() {
|
|
649
|
+
ensureWasm();
|
|
650
|
+
return new _CrtCpuRenderer();
|
|
689
651
|
}
|
|
690
652
|
/** Check if renderer is ready */
|
|
691
653
|
isReady() {
|
|
692
|
-
return
|
|
654
|
+
return wasmReady;
|
|
693
655
|
}
|
|
694
656
|
/** Render CRT effect */
|
|
695
657
|
render(input, options = {}) {
|
|
696
|
-
|
|
697
|
-
throw new Error("Renderer not initialized. Call init() first or use CrtCpuRenderer.create()");
|
|
698
|
-
}
|
|
658
|
+
ensureWasm();
|
|
699
659
|
const data = toUint8Array(input);
|
|
700
660
|
const width = input.width;
|
|
701
661
|
const height = input.height;
|
|
@@ -720,9 +680,7 @@ var CrtCpuRenderer = class _CrtCpuRenderer {
|
|
|
720
680
|
height: result.height
|
|
721
681
|
};
|
|
722
682
|
}
|
|
723
|
-
/** Dispose resources */
|
|
724
683
|
dispose() {
|
|
725
|
-
this.initialized = false;
|
|
726
684
|
}
|
|
727
685
|
};
|
|
728
686
|
function parseColorToU32(color, defaultVal) {
|
|
@@ -731,39 +689,21 @@ function parseColorToU32(color, defaultVal) {
|
|
|
731
689
|
if (color === "transparent") return 0;
|
|
732
690
|
if (color.startsWith("#")) {
|
|
733
691
|
const hex = color.slice(1);
|
|
734
|
-
if (hex.length === 6)
|
|
735
|
-
|
|
736
|
-
}
|
|
737
|
-
if (hex.length === 8) {
|
|
738
|
-
return parseInt(hex, 16);
|
|
739
|
-
}
|
|
692
|
+
if (hex.length === 6) return parseInt(hex, 16) << 8 | 255;
|
|
693
|
+
if (hex.length === 8) return parseInt(hex, 16);
|
|
740
694
|
}
|
|
741
695
|
return defaultVal;
|
|
742
696
|
}
|
|
743
697
|
var HexCpuRenderer = class _HexCpuRenderer {
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
/** Create and initialize renderer */
|
|
748
|
-
static async create() {
|
|
749
|
-
const renderer = new _HexCpuRenderer();
|
|
750
|
-
await renderer.init();
|
|
751
|
-
return renderer;
|
|
752
|
-
}
|
|
753
|
-
/** Initialize (loads WASM if needed) */
|
|
754
|
-
async init() {
|
|
755
|
-
await ensureWasm();
|
|
756
|
-
this.initialized = true;
|
|
698
|
+
static create() {
|
|
699
|
+
ensureWasm();
|
|
700
|
+
return new _HexCpuRenderer();
|
|
757
701
|
}
|
|
758
|
-
/** Check if renderer is ready */
|
|
759
702
|
isReady() {
|
|
760
|
-
return
|
|
703
|
+
return wasmReady;
|
|
761
704
|
}
|
|
762
|
-
/** Render hexagonal effect */
|
|
763
705
|
render(input, options = {}) {
|
|
764
|
-
|
|
765
|
-
throw new Error("Renderer not initialized. Call init() first or use HexCpuRenderer.create()");
|
|
766
|
-
}
|
|
706
|
+
ensureWasm();
|
|
767
707
|
const data = toUint8Array(input);
|
|
768
708
|
const width = input.width;
|
|
769
709
|
const height = input.height;
|
|
@@ -785,43 +725,24 @@ var HexCpuRenderer = class _HexCpuRenderer {
|
|
|
785
725
|
height: result.height
|
|
786
726
|
};
|
|
787
727
|
}
|
|
788
|
-
/** Get output dimensions */
|
|
789
728
|
getDimensions(srcWidth, srcHeight, scale, orientation = "flat-top") {
|
|
790
|
-
|
|
791
|
-
throw new Error("Renderer not initialized");
|
|
792
|
-
}
|
|
729
|
+
ensureWasm();
|
|
793
730
|
const dims = wasm.hex_get_dimensions(srcWidth, srcHeight, scale, orientation === "pointy-top" ? 1 : 0);
|
|
794
731
|
return { width: dims[0], height: dims[1] };
|
|
795
732
|
}
|
|
796
|
-
/** Dispose resources */
|
|
797
733
|
dispose() {
|
|
798
|
-
this.initialized = false;
|
|
799
734
|
}
|
|
800
735
|
};
|
|
801
736
|
var XbrzCpuRenderer = class _XbrzCpuRenderer {
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
/** Create and initialize renderer */
|
|
806
|
-
static async create() {
|
|
807
|
-
const renderer = new _XbrzCpuRenderer();
|
|
808
|
-
await renderer.init();
|
|
809
|
-
return renderer;
|
|
810
|
-
}
|
|
811
|
-
/** Initialize (loads WASM if needed) */
|
|
812
|
-
async init() {
|
|
813
|
-
await ensureWasm();
|
|
814
|
-
this.initialized = true;
|
|
737
|
+
static create() {
|
|
738
|
+
ensureWasm();
|
|
739
|
+
return new _XbrzCpuRenderer();
|
|
815
740
|
}
|
|
816
|
-
/** Check if renderer is ready */
|
|
817
741
|
isReady() {
|
|
818
|
-
return
|
|
742
|
+
return wasmReady;
|
|
819
743
|
}
|
|
820
|
-
/** Render xBRZ scaling */
|
|
821
744
|
render(input, options = {}) {
|
|
822
|
-
|
|
823
|
-
throw new Error("Renderer not initialized. Call init() first or use XbrzCpuRenderer.create()");
|
|
824
|
-
}
|
|
745
|
+
ensureWasm();
|
|
825
746
|
const data = toUint8Array(input);
|
|
826
747
|
const width = input.width;
|
|
827
748
|
const height = input.height;
|
|
@@ -842,9 +763,7 @@ var XbrzCpuRenderer = class _XbrzCpuRenderer {
|
|
|
842
763
|
height: result.height
|
|
843
764
|
};
|
|
844
765
|
}
|
|
845
|
-
/** Dispose resources */
|
|
846
766
|
dispose() {
|
|
847
|
-
this.initialized = false;
|
|
848
767
|
}
|
|
849
768
|
};
|
|
850
769
|
var XBRZ_PRESETS = {
|
|
@@ -896,33 +815,24 @@ var CrtEngine = class {
|
|
|
896
815
|
if (!this.gpuRenderer) throw new Error("GPU renderer not available");
|
|
897
816
|
return this.gpuRenderer;
|
|
898
817
|
}
|
|
899
|
-
|
|
818
|
+
ensureCpu() {
|
|
900
819
|
if (!this.cpuRenderer) {
|
|
901
|
-
this.cpuRenderer =
|
|
820
|
+
this.cpuRenderer = CrtCpuRenderer.create();
|
|
902
821
|
}
|
|
903
822
|
return this.cpuRenderer;
|
|
904
823
|
}
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
options = { ...CRT_PRESETS[optionsOrPreset], ...overrides };
|
|
909
|
-
} else if (optionsOrPreset) {
|
|
910
|
-
options = optionsOrPreset;
|
|
911
|
-
}
|
|
824
|
+
/** Render with options or preset */
|
|
825
|
+
render(input, optionsOrPreset = {}) {
|
|
826
|
+
const options = typeof optionsOrPreset === "string" ? { ...CRT_PRESETS[optionsOrPreset] } : optionsOrPreset;
|
|
912
827
|
const backend = options.backend ?? "auto";
|
|
913
828
|
if (backend === "gpu" || backend === "auto" && this.gpuAvailable) {
|
|
914
|
-
|
|
915
|
-
return this.ensureGpu().render(input, options);
|
|
916
|
-
} catch (e) {
|
|
917
|
-
if (backend === "gpu") throw e;
|
|
918
|
-
}
|
|
829
|
+
return this.ensureGpu().render(input, options);
|
|
919
830
|
}
|
|
920
|
-
|
|
921
|
-
return cpu.render(input, options);
|
|
831
|
+
return this.ensureCpu().render(input, options);
|
|
922
832
|
}
|
|
923
|
-
/**
|
|
924
|
-
renderSync(input, options) {
|
|
925
|
-
return this.ensureGpu().render(input, options
|
|
833
|
+
/** Synchronous GPU-only render */
|
|
834
|
+
renderSync(input, options = {}) {
|
|
835
|
+
return this.ensureGpu().render(input, options);
|
|
926
836
|
}
|
|
927
837
|
dispose() {
|
|
928
838
|
this.gpuRenderer?.dispose();
|
|
@@ -944,36 +854,26 @@ var HexEngine = class {
|
|
|
944
854
|
if (!this.gpuRenderer) throw new Error("GPU renderer not available");
|
|
945
855
|
return this.gpuRenderer;
|
|
946
856
|
}
|
|
947
|
-
|
|
857
|
+
ensureCpu() {
|
|
948
858
|
if (!this.cpuRenderer) {
|
|
949
|
-
this.cpuRenderer =
|
|
859
|
+
this.cpuRenderer = HexCpuRenderer.create();
|
|
950
860
|
}
|
|
951
861
|
return this.cpuRenderer;
|
|
952
862
|
}
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
if (typeof optionsOrPreset === "string") {
|
|
956
|
-
options = { ...HEX_PRESETS[optionsOrPreset], ...overrides };
|
|
957
|
-
} else if (optionsOrPreset) {
|
|
958
|
-
options = optionsOrPreset;
|
|
959
|
-
}
|
|
863
|
+
render(input, optionsOrPreset = {}) {
|
|
864
|
+
const options = typeof optionsOrPreset === "string" ? { ...HEX_PRESETS[optionsOrPreset] } : optionsOrPreset;
|
|
960
865
|
const backend = options.backend ?? "auto";
|
|
961
866
|
if (backend === "gpu" || backend === "auto" && this.gpuAvailable) {
|
|
962
|
-
|
|
963
|
-
return this.ensureGpu().render(input, options);
|
|
964
|
-
} catch (e) {
|
|
965
|
-
if (backend === "gpu") throw e;
|
|
966
|
-
}
|
|
867
|
+
return this.ensureGpu().render(input, options);
|
|
967
868
|
}
|
|
968
|
-
|
|
969
|
-
return cpu.render(input, options);
|
|
869
|
+
return this.ensureCpu().render(input, options);
|
|
970
870
|
}
|
|
971
|
-
renderSync(input, options) {
|
|
972
|
-
return this.ensureGpu().render(input, options
|
|
871
|
+
renderSync(input, options = {}) {
|
|
872
|
+
return this.ensureGpu().render(input, options);
|
|
973
873
|
}
|
|
974
|
-
getDimensions(srcWidth, srcHeight, options) {
|
|
975
|
-
const scale = options
|
|
976
|
-
const orientation = options
|
|
874
|
+
getDimensions(srcWidth, srcHeight, options = {}) {
|
|
875
|
+
const scale = options.scale ?? 16;
|
|
876
|
+
const orientation = options.orientation ?? "flat-top";
|
|
977
877
|
return hexGetDimensions(srcWidth, srcHeight, scale, orientation);
|
|
978
878
|
}
|
|
979
879
|
dispose() {
|
|
@@ -987,25 +887,15 @@ var XbrzEngine = class {
|
|
|
987
887
|
constructor() {
|
|
988
888
|
this.cpuRenderer = null;
|
|
989
889
|
}
|
|
990
|
-
|
|
890
|
+
ensureCpu() {
|
|
991
891
|
if (!this.cpuRenderer) {
|
|
992
|
-
this.cpuRenderer =
|
|
892
|
+
this.cpuRenderer = XbrzCpuRenderer.create();
|
|
993
893
|
}
|
|
994
894
|
return this.cpuRenderer;
|
|
995
895
|
}
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
options = { ...XBRZ_PRESETS[optionsOrPreset], ...overrides };
|
|
1000
|
-
} else if (optionsOrPreset) {
|
|
1001
|
-
options = optionsOrPreset;
|
|
1002
|
-
}
|
|
1003
|
-
const cpu = await this.ensureCpu();
|
|
1004
|
-
return cpu.render(input, options);
|
|
1005
|
-
}
|
|
1006
|
-
getDimensions(srcWidth, srcHeight, scale = 2) {
|
|
1007
|
-
const s = Math.min(6, Math.max(2, scale));
|
|
1008
|
-
return { width: srcWidth * s, height: srcHeight * s };
|
|
896
|
+
render(input, optionsOrPreset = {}) {
|
|
897
|
+
const options = typeof optionsOrPreset === "string" ? { ...XBRZ_PRESETS[optionsOrPreset] } : optionsOrPreset;
|
|
898
|
+
return this.ensureCpu().render(input, options);
|
|
1009
899
|
}
|
|
1010
900
|
dispose() {
|
|
1011
901
|
this.cpuRenderer?.dispose();
|
|
@@ -1013,37 +903,40 @@ var XbrzEngine = class {
|
|
|
1013
903
|
}
|
|
1014
904
|
};
|
|
1015
905
|
var RenderArt = class _RenderArt {
|
|
1016
|
-
constructor(
|
|
1017
|
-
this.
|
|
1018
|
-
this.
|
|
906
|
+
constructor(capabilities) {
|
|
907
|
+
this.capabilities = capabilities;
|
|
908
|
+
this.crt = new CrtEngine(capabilities.gpu);
|
|
909
|
+
this.hex = new HexEngine(capabilities.gpu);
|
|
1019
910
|
this.xbrz = new XbrzEngine();
|
|
1020
|
-
const maxTextureSize = gpuAvailable ? getMaxTextureSize() : 0;
|
|
1021
|
-
this._capabilities = {
|
|
1022
|
-
gpu: gpuAvailable,
|
|
1023
|
-
cpu: true,
|
|
1024
|
-
// Always potentially available via async init
|
|
1025
|
-
maxTextureSize,
|
|
1026
|
-
recommendedBackend: gpuAvailable ? "gpu" : "cpu"
|
|
1027
|
-
};
|
|
1028
911
|
}
|
|
1029
|
-
/**
|
|
912
|
+
/**
|
|
913
|
+
* Create RenderArt instance.
|
|
914
|
+
* For CPU/WASM support, call initWasm() first.
|
|
915
|
+
*/
|
|
1030
916
|
static create() {
|
|
1031
917
|
const gpuAvailable = checkWebGL2();
|
|
1032
|
-
|
|
918
|
+
const cpuAvailable = isWasmLoaded();
|
|
919
|
+
return new _RenderArt({
|
|
920
|
+
gpu: gpuAvailable,
|
|
921
|
+
cpu: cpuAvailable,
|
|
922
|
+
maxTextureSize: gpuAvailable ? getMaxTextureSize() : 0,
|
|
923
|
+
recommendedBackend: gpuAvailable ? "gpu" : cpuAvailable ? "cpu" : "gpu"
|
|
924
|
+
});
|
|
1033
925
|
}
|
|
1034
|
-
/**
|
|
926
|
+
/**
|
|
927
|
+
* Create GPU-only RenderArt instance (no WASM needed).
|
|
928
|
+
*/
|
|
1035
929
|
static createGpuOnly() {
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
return { ...this._capabilities };
|
|
930
|
+
const gpuAvailable = checkWebGL2();
|
|
931
|
+
if (!gpuAvailable) {
|
|
932
|
+
throw new Error("WebGL2 not available");
|
|
933
|
+
}
|
|
934
|
+
return new _RenderArt({
|
|
935
|
+
gpu: true,
|
|
936
|
+
cpu: false,
|
|
937
|
+
maxTextureSize: getMaxTextureSize(),
|
|
938
|
+
recommendedBackend: "gpu"
|
|
939
|
+
});
|
|
1047
940
|
}
|
|
1048
941
|
dispose() {
|
|
1049
942
|
this.crt.dispose();
|
|
@@ -1064,8 +957,6 @@ exports.RenderArt = RenderArt;
|
|
|
1064
957
|
exports.XBRZ_PRESETS = XBRZ_PRESETS;
|
|
1065
958
|
exports.XbrzCpuRenderer = XbrzCpuRenderer;
|
|
1066
959
|
exports.XbrzEngine = XbrzEngine;
|
|
1067
|
-
exports.getWasmError = getWasmError;
|
|
1068
|
-
exports.hasWasmError = hasWasmError;
|
|
1069
960
|
exports.hexGetDimensions = hexGetDimensions;
|
|
1070
961
|
exports.initWasm = initWasm;
|
|
1071
962
|
exports.isWasmLoaded = isWasmLoaded;
|