@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.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
- var initPromise = null;
626
- var initError = null;
627
- async function initWasm(wasmUrl) {
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
- var CrtCpuRenderer = class _CrtCpuRenderer {
674
- constructor() {
675
- this.initialized = false;
641
+ function ensureWasm() {
642
+ if (!wasmReady || !wasm) {
643
+ throw new Error("WASM not initialized. Call initWasm() first.");
676
644
  }
677
- /** Create and initialize renderer */
678
- static async create() {
679
- const renderer = new _CrtCpuRenderer();
680
- await renderer.init();
681
- return renderer;
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 this.initialized && wasmReady;
654
+ return wasmReady;
691
655
  }
692
656
  /** Render CRT effect */
693
657
  render(input, options = {}) {
694
- if (!this.initialized || !wasm) {
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
- return parseInt(hex, 16) << 8 | 255;
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
- constructor() {
743
- this.initialized = false;
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 this.initialized && wasmReady;
703
+ return wasmReady;
759
704
  }
760
- /** Render hexagonal effect */
761
705
  render(input, options = {}) {
762
- if (!this.initialized || !wasm) {
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
- if (!this.initialized || !wasm) {
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
- constructor() {
801
- this.initialized = false;
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 this.initialized && wasmReady;
742
+ return wasmReady;
817
743
  }
818
- /** Render xBRZ scaling */
819
744
  render(input, options = {}) {
820
- if (!this.initialized || !wasm) {
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
- async ensureCpu() {
818
+ ensureCpu() {
898
819
  if (!this.cpuRenderer) {
899
- this.cpuRenderer = await CrtCpuRenderer.create();
820
+ this.cpuRenderer = CrtCpuRenderer.create();
900
821
  }
901
822
  return this.cpuRenderer;
902
823
  }
903
- async render(input, optionsOrPreset, overrides) {
904
- let options = {};
905
- if (typeof optionsOrPreset === "string") {
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
- try {
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
- const cpu = await this.ensureCpu();
919
- return cpu.render(input, options);
831
+ return this.ensureCpu().render(input, options);
920
832
  }
921
- /** Render synchronously (GPU only) */
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
- async ensureCpu() {
857
+ ensureCpu() {
946
858
  if (!this.cpuRenderer) {
947
- this.cpuRenderer = await HexCpuRenderer.create();
859
+ this.cpuRenderer = HexCpuRenderer.create();
948
860
  }
949
861
  return this.cpuRenderer;
950
862
  }
951
- async render(input, optionsOrPreset, overrides) {
952
- let options = {};
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
- try {
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
- const cpu = await this.ensureCpu();
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?.scale ?? 16;
974
- const orientation = options?.orientation ?? "flat-top";
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
- async ensureCpu() {
890
+ ensureCpu() {
989
891
  if (!this.cpuRenderer) {
990
- this.cpuRenderer = await XbrzCpuRenderer.create();
892
+ this.cpuRenderer = XbrzCpuRenderer.create();
991
893
  }
992
894
  return this.cpuRenderer;
993
895
  }
994
- async render(input, optionsOrPreset, overrides) {
995
- let options = {};
996
- if (typeof optionsOrPreset === "string") {
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(gpuAvailable) {
1015
- this.crt = new CrtEngine(gpuAvailable);
1016
- this.hex = new HexEngine(gpuAvailable);
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
- /** Create RenderArt instance */
912
+ /**
913
+ * Create RenderArt instance.
914
+ * For CPU/WASM support, call initWasm() first.
915
+ */
1028
916
  static create() {
1029
917
  const gpuAvailable = checkWebGL2();
1030
- return new _RenderArt(gpuAvailable);
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
- /** Create GPU-only instance */
926
+ /**
927
+ * Create GPU-only RenderArt instance (no WASM needed).
928
+ */
1033
929
  static createGpuOnly() {
1034
- if (!checkWebGL2()) {
1035
- throw new Error("WebGL2 not supported");
1036
- }
1037
- return new _RenderArt(true);
1038
- }
1039
- /** Pre-initialize WASM for faster first CPU render */
1040
- async preloadWasm(wasmUrl) {
1041
- await initWasm();
1042
- }
1043
- get capabilities() {
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;