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