@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/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
- var initPromise = null;
624
- var initError = null;
625
- async function initWasm(wasmUrl) {
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
- var CrtCpuRenderer = class _CrtCpuRenderer {
672
- constructor() {
673
- this.initialized = false;
639
+ function ensureWasm() {
640
+ if (!wasmReady || !wasm) {
641
+ throw new Error("WASM not initialized. Call initWasm() first.");
674
642
  }
675
- /** Create and initialize renderer */
676
- static async create() {
677
- const renderer = new _CrtCpuRenderer();
678
- await renderer.init();
679
- return renderer;
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 this.initialized && wasmReady;
652
+ return wasmReady;
689
653
  }
690
654
  /** Render CRT effect */
691
655
  render(input, options = {}) {
692
- if (!this.initialized || !wasm) {
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
- return parseInt(hex, 16) << 8 | 255;
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
- constructor() {
741
- this.initialized = false;
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 this.initialized && wasmReady;
701
+ return wasmReady;
757
702
  }
758
- /** Render hexagonal effect */
759
703
  render(input, options = {}) {
760
- if (!this.initialized || !wasm) {
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
- if (!this.initialized || !wasm) {
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
- constructor() {
799
- this.initialized = false;
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 this.initialized && wasmReady;
740
+ return wasmReady;
815
741
  }
816
- /** Render xBRZ scaling */
817
742
  render(input, options = {}) {
818
- if (!this.initialized || !wasm) {
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
- async ensureCpu() {
816
+ ensureCpu() {
896
817
  if (!this.cpuRenderer) {
897
- this.cpuRenderer = await CrtCpuRenderer.create();
818
+ this.cpuRenderer = CrtCpuRenderer.create();
898
819
  }
899
820
  return this.cpuRenderer;
900
821
  }
901
- async render(input, optionsOrPreset, overrides) {
902
- let options = {};
903
- if (typeof optionsOrPreset === "string") {
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
- try {
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
- const cpu = await this.ensureCpu();
917
- return cpu.render(input, options);
829
+ return this.ensureCpu().render(input, options);
918
830
  }
919
- /** Render synchronously (GPU only) */
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
- async ensureCpu() {
855
+ ensureCpu() {
944
856
  if (!this.cpuRenderer) {
945
- this.cpuRenderer = await HexCpuRenderer.create();
857
+ this.cpuRenderer = HexCpuRenderer.create();
946
858
  }
947
859
  return this.cpuRenderer;
948
860
  }
949
- async render(input, optionsOrPreset, overrides) {
950
- let options = {};
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
- try {
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
- const cpu = await this.ensureCpu();
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?.scale ?? 16;
972
- const orientation = options?.orientation ?? "flat-top";
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
- async ensureCpu() {
888
+ ensureCpu() {
987
889
  if (!this.cpuRenderer) {
988
- this.cpuRenderer = await XbrzCpuRenderer.create();
890
+ this.cpuRenderer = XbrzCpuRenderer.create();
989
891
  }
990
892
  return this.cpuRenderer;
991
893
  }
992
- async render(input, optionsOrPreset, overrides) {
993
- let options = {};
994
- if (typeof optionsOrPreset === "string") {
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(gpuAvailable) {
1013
- this.crt = new CrtEngine(gpuAvailable);
1014
- this.hex = new HexEngine(gpuAvailable);
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
- /** Create RenderArt instance */
910
+ /**
911
+ * Create RenderArt instance.
912
+ * For CPU/WASM support, call initWasm() first.
913
+ */
1026
914
  static create() {
1027
915
  const gpuAvailable = checkWebGL2();
1028
- return new _RenderArt(gpuAvailable);
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
- /** Create GPU-only instance */
924
+ /**
925
+ * Create GPU-only RenderArt instance (no WASM needed).
926
+ */
1031
927
  static createGpuOnly() {
1032
- if (!checkWebGL2()) {
1033
- throw new Error("WebGL2 not supported");
1034
- }
1035
- return new _RenderArt(true);
1036
- }
1037
- /** Pre-initialize WASM for faster first CPU render */
1038
- async preloadWasm(wasmUrl) {
1039
- await initWasm();
1040
- }
1041
- get capabilities() {
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, getWasmError, hasWasmError, hexGetDimensions, initWasm, isWasmLoaded };
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