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