@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.mjs
CHANGED
|
@@ -620,47 +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.js');
|
|
632
|
-
const init = wasmModule.default || wasmModule.__wbg_init || wasmModule;
|
|
633
|
-
if (typeof init === "function") {
|
|
634
|
-
await init();
|
|
635
|
-
} else if (typeof init.default === "function") {
|
|
636
|
-
await init.default();
|
|
637
|
-
} else {
|
|
638
|
-
throw new Error("Could not find WASM init function");
|
|
639
|
-
}
|
|
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;
|
|
623
|
+
function initWasm(wasmModule) {
|
|
624
|
+
wasm = wasmModule;
|
|
625
|
+
wasmReady = true;
|
|
649
626
|
}
|
|
650
627
|
function isWasmLoaded() {
|
|
651
628
|
return wasmReady;
|
|
652
629
|
}
|
|
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
630
|
function getOutputData(result) {
|
|
665
631
|
const memory = wasm.get_memory();
|
|
666
632
|
const buffer = new Uint8Array(memory.buffer, result.ptr, result.len);
|
|
@@ -670,30 +636,24 @@ function toUint8Array(input) {
|
|
|
670
636
|
const data = input instanceof ImageData ? input.data : input.data;
|
|
671
637
|
return data instanceof Uint8Array ? data : new Uint8Array(data);
|
|
672
638
|
}
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
639
|
+
function ensureWasm() {
|
|
640
|
+
if (!wasmReady || !wasm) {
|
|
641
|
+
throw new Error("WASM not initialized. Call initWasm() first.");
|
|
676
642
|
}
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
/** Initialize (loads WASM if needed) */
|
|
684
|
-
async init() {
|
|
685
|
-
await ensureWasm();
|
|
686
|
-
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();
|
|
687
649
|
}
|
|
688
650
|
/** Check if renderer is ready */
|
|
689
651
|
isReady() {
|
|
690
|
-
return
|
|
652
|
+
return wasmReady;
|
|
691
653
|
}
|
|
692
654
|
/** Render CRT effect */
|
|
693
655
|
render(input, options = {}) {
|
|
694
|
-
|
|
695
|
-
throw new Error("Renderer not initialized. Call init() first or use CrtCpuRenderer.create()");
|
|
696
|
-
}
|
|
656
|
+
ensureWasm();
|
|
697
657
|
const data = toUint8Array(input);
|
|
698
658
|
const width = input.width;
|
|
699
659
|
const height = input.height;
|
|
@@ -718,9 +678,7 @@ var CrtCpuRenderer = class _CrtCpuRenderer {
|
|
|
718
678
|
height: result.height
|
|
719
679
|
};
|
|
720
680
|
}
|
|
721
|
-
/** Dispose resources */
|
|
722
681
|
dispose() {
|
|
723
|
-
this.initialized = false;
|
|
724
682
|
}
|
|
725
683
|
};
|
|
726
684
|
function parseColorToU32(color, defaultVal) {
|
|
@@ -729,39 +687,21 @@ function parseColorToU32(color, defaultVal) {
|
|
|
729
687
|
if (color === "transparent") return 0;
|
|
730
688
|
if (color.startsWith("#")) {
|
|
731
689
|
const hex = color.slice(1);
|
|
732
|
-
if (hex.length === 6)
|
|
733
|
-
|
|
734
|
-
}
|
|
735
|
-
if (hex.length === 8) {
|
|
736
|
-
return parseInt(hex, 16);
|
|
737
|
-
}
|
|
690
|
+
if (hex.length === 6) return parseInt(hex, 16) << 8 | 255;
|
|
691
|
+
if (hex.length === 8) return parseInt(hex, 16);
|
|
738
692
|
}
|
|
739
693
|
return defaultVal;
|
|
740
694
|
}
|
|
741
695
|
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;
|
|
696
|
+
static create() {
|
|
697
|
+
ensureWasm();
|
|
698
|
+
return new _HexCpuRenderer();
|
|
755
699
|
}
|
|
756
|
-
/** Check if renderer is ready */
|
|
757
700
|
isReady() {
|
|
758
|
-
return
|
|
701
|
+
return wasmReady;
|
|
759
702
|
}
|
|
760
|
-
/** Render hexagonal effect */
|
|
761
703
|
render(input, options = {}) {
|
|
762
|
-
|
|
763
|
-
throw new Error("Renderer not initialized. Call init() first or use HexCpuRenderer.create()");
|
|
764
|
-
}
|
|
704
|
+
ensureWasm();
|
|
765
705
|
const data = toUint8Array(input);
|
|
766
706
|
const width = input.width;
|
|
767
707
|
const height = input.height;
|
|
@@ -783,43 +723,24 @@ var HexCpuRenderer = class _HexCpuRenderer {
|
|
|
783
723
|
height: result.height
|
|
784
724
|
};
|
|
785
725
|
}
|
|
786
|
-
/** Get output dimensions */
|
|
787
726
|
getDimensions(srcWidth, srcHeight, scale, orientation = "flat-top") {
|
|
788
|
-
|
|
789
|
-
throw new Error("Renderer not initialized");
|
|
790
|
-
}
|
|
727
|
+
ensureWasm();
|
|
791
728
|
const dims = wasm.hex_get_dimensions(srcWidth, srcHeight, scale, orientation === "pointy-top" ? 1 : 0);
|
|
792
729
|
return { width: dims[0], height: dims[1] };
|
|
793
730
|
}
|
|
794
|
-
/** Dispose resources */
|
|
795
731
|
dispose() {
|
|
796
|
-
this.initialized = false;
|
|
797
732
|
}
|
|
798
733
|
};
|
|
799
734
|
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;
|
|
735
|
+
static create() {
|
|
736
|
+
ensureWasm();
|
|
737
|
+
return new _XbrzCpuRenderer();
|
|
813
738
|
}
|
|
814
|
-
/** Check if renderer is ready */
|
|
815
739
|
isReady() {
|
|
816
|
-
return
|
|
740
|
+
return wasmReady;
|
|
817
741
|
}
|
|
818
|
-
/** Render xBRZ scaling */
|
|
819
742
|
render(input, options = {}) {
|
|
820
|
-
|
|
821
|
-
throw new Error("Renderer not initialized. Call init() first or use XbrzCpuRenderer.create()");
|
|
822
|
-
}
|
|
743
|
+
ensureWasm();
|
|
823
744
|
const data = toUint8Array(input);
|
|
824
745
|
const width = input.width;
|
|
825
746
|
const height = input.height;
|
|
@@ -840,9 +761,7 @@ var XbrzCpuRenderer = class _XbrzCpuRenderer {
|
|
|
840
761
|
height: result.height
|
|
841
762
|
};
|
|
842
763
|
}
|
|
843
|
-
/** Dispose resources */
|
|
844
764
|
dispose() {
|
|
845
|
-
this.initialized = false;
|
|
846
765
|
}
|
|
847
766
|
};
|
|
848
767
|
var XBRZ_PRESETS = {
|
|
@@ -894,33 +813,24 @@ var CrtEngine = class {
|
|
|
894
813
|
if (!this.gpuRenderer) throw new Error("GPU renderer not available");
|
|
895
814
|
return this.gpuRenderer;
|
|
896
815
|
}
|
|
897
|
-
|
|
816
|
+
ensureCpu() {
|
|
898
817
|
if (!this.cpuRenderer) {
|
|
899
|
-
this.cpuRenderer =
|
|
818
|
+
this.cpuRenderer = CrtCpuRenderer.create();
|
|
900
819
|
}
|
|
901
820
|
return this.cpuRenderer;
|
|
902
821
|
}
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
options = { ...CRT_PRESETS[optionsOrPreset], ...overrides };
|
|
907
|
-
} else if (optionsOrPreset) {
|
|
908
|
-
options = optionsOrPreset;
|
|
909
|
-
}
|
|
822
|
+
/** Render with options or preset */
|
|
823
|
+
render(input, optionsOrPreset = {}) {
|
|
824
|
+
const options = typeof optionsOrPreset === "string" ? { ...CRT_PRESETS[optionsOrPreset] } : optionsOrPreset;
|
|
910
825
|
const backend = options.backend ?? "auto";
|
|
911
826
|
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
|
-
}
|
|
827
|
+
return this.ensureGpu().render(input, options);
|
|
917
828
|
}
|
|
918
|
-
|
|
919
|
-
return cpu.render(input, options);
|
|
829
|
+
return this.ensureCpu().render(input, options);
|
|
920
830
|
}
|
|
921
|
-
/**
|
|
922
|
-
renderSync(input, options) {
|
|
923
|
-
return this.ensureGpu().render(input, options
|
|
831
|
+
/** Synchronous GPU-only render */
|
|
832
|
+
renderSync(input, options = {}) {
|
|
833
|
+
return this.ensureGpu().render(input, options);
|
|
924
834
|
}
|
|
925
835
|
dispose() {
|
|
926
836
|
this.gpuRenderer?.dispose();
|
|
@@ -942,36 +852,26 @@ var HexEngine = class {
|
|
|
942
852
|
if (!this.gpuRenderer) throw new Error("GPU renderer not available");
|
|
943
853
|
return this.gpuRenderer;
|
|
944
854
|
}
|
|
945
|
-
|
|
855
|
+
ensureCpu() {
|
|
946
856
|
if (!this.cpuRenderer) {
|
|
947
|
-
this.cpuRenderer =
|
|
857
|
+
this.cpuRenderer = HexCpuRenderer.create();
|
|
948
858
|
}
|
|
949
859
|
return this.cpuRenderer;
|
|
950
860
|
}
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
if (typeof optionsOrPreset === "string") {
|
|
954
|
-
options = { ...HEX_PRESETS[optionsOrPreset], ...overrides };
|
|
955
|
-
} else if (optionsOrPreset) {
|
|
956
|
-
options = optionsOrPreset;
|
|
957
|
-
}
|
|
861
|
+
render(input, optionsOrPreset = {}) {
|
|
862
|
+
const options = typeof optionsOrPreset === "string" ? { ...HEX_PRESETS[optionsOrPreset] } : optionsOrPreset;
|
|
958
863
|
const backend = options.backend ?? "auto";
|
|
959
864
|
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
|
-
}
|
|
865
|
+
return this.ensureGpu().render(input, options);
|
|
965
866
|
}
|
|
966
|
-
|
|
967
|
-
return cpu.render(input, options);
|
|
867
|
+
return this.ensureCpu().render(input, options);
|
|
968
868
|
}
|
|
969
|
-
renderSync(input, options) {
|
|
970
|
-
return this.ensureGpu().render(input, options
|
|
869
|
+
renderSync(input, options = {}) {
|
|
870
|
+
return this.ensureGpu().render(input, options);
|
|
971
871
|
}
|
|
972
|
-
getDimensions(srcWidth, srcHeight, options) {
|
|
973
|
-
const scale = options
|
|
974
|
-
const orientation = options
|
|
872
|
+
getDimensions(srcWidth, srcHeight, options = {}) {
|
|
873
|
+
const scale = options.scale ?? 16;
|
|
874
|
+
const orientation = options.orientation ?? "flat-top";
|
|
975
875
|
return hexGetDimensions(srcWidth, srcHeight, scale, orientation);
|
|
976
876
|
}
|
|
977
877
|
dispose() {
|
|
@@ -985,25 +885,15 @@ var XbrzEngine = class {
|
|
|
985
885
|
constructor() {
|
|
986
886
|
this.cpuRenderer = null;
|
|
987
887
|
}
|
|
988
|
-
|
|
888
|
+
ensureCpu() {
|
|
989
889
|
if (!this.cpuRenderer) {
|
|
990
|
-
this.cpuRenderer =
|
|
890
|
+
this.cpuRenderer = XbrzCpuRenderer.create();
|
|
991
891
|
}
|
|
992
892
|
return this.cpuRenderer;
|
|
993
893
|
}
|
|
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 };
|
|
894
|
+
render(input, optionsOrPreset = {}) {
|
|
895
|
+
const options = typeof optionsOrPreset === "string" ? { ...XBRZ_PRESETS[optionsOrPreset] } : optionsOrPreset;
|
|
896
|
+
return this.ensureCpu().render(input, options);
|
|
1007
897
|
}
|
|
1008
898
|
dispose() {
|
|
1009
899
|
this.cpuRenderer?.dispose();
|
|
@@ -1011,37 +901,40 @@ var XbrzEngine = class {
|
|
|
1011
901
|
}
|
|
1012
902
|
};
|
|
1013
903
|
var RenderArt = class _RenderArt {
|
|
1014
|
-
constructor(
|
|
1015
|
-
this.
|
|
1016
|
-
this.
|
|
904
|
+
constructor(capabilities) {
|
|
905
|
+
this.capabilities = capabilities;
|
|
906
|
+
this.crt = new CrtEngine(capabilities.gpu);
|
|
907
|
+
this.hex = new HexEngine(capabilities.gpu);
|
|
1017
908
|
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
909
|
}
|
|
1027
|
-
/**
|
|
910
|
+
/**
|
|
911
|
+
* Create RenderArt instance.
|
|
912
|
+
* For CPU/WASM support, call initWasm() first.
|
|
913
|
+
*/
|
|
1028
914
|
static create() {
|
|
1029
915
|
const gpuAvailable = checkWebGL2();
|
|
1030
|
-
|
|
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
|
+
});
|
|
1031
923
|
}
|
|
1032
|
-
/**
|
|
924
|
+
/**
|
|
925
|
+
* Create GPU-only RenderArt instance (no WASM needed).
|
|
926
|
+
*/
|
|
1033
927
|
static createGpuOnly() {
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
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
|
+
});
|
|
1045
938
|
}
|
|
1046
939
|
dispose() {
|
|
1047
940
|
this.crt.dispose();
|
|
@@ -1050,6 +943,6 @@ var RenderArt = class _RenderArt {
|
|
|
1050
943
|
}
|
|
1051
944
|
};
|
|
1052
945
|
|
|
1053
|
-
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 };
|
|
1054
947
|
//# sourceMappingURL=index.mjs.map
|
|
1055
948
|
//# sourceMappingURL=index.mjs.map
|