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