@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.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
- 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.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
- var CrtCpuRenderer = class _CrtCpuRenderer {
674
- constructor() {
675
- this.initialized = false;
639
+ function ensureWasm() {
640
+ if (!wasmReady || !wasm) {
641
+ throw new Error("WASM not initialized. Call initWasm() first.");
676
642
  }
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;
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 this.initialized && wasmReady;
652
+ return wasmReady;
691
653
  }
692
654
  /** Render CRT effect */
693
655
  render(input, options = {}) {
694
- if (!this.initialized || !wasm) {
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
- return parseInt(hex, 16) << 8 | 255;
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
- 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;
696
+ static create() {
697
+ ensureWasm();
698
+ return new _HexCpuRenderer();
755
699
  }
756
- /** Check if renderer is ready */
757
700
  isReady() {
758
- return this.initialized && wasmReady;
701
+ return wasmReady;
759
702
  }
760
- /** Render hexagonal effect */
761
703
  render(input, options = {}) {
762
- if (!this.initialized || !wasm) {
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
- if (!this.initialized || !wasm) {
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
- 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;
735
+ static create() {
736
+ ensureWasm();
737
+ return new _XbrzCpuRenderer();
813
738
  }
814
- /** Check if renderer is ready */
815
739
  isReady() {
816
- return this.initialized && wasmReady;
740
+ return wasmReady;
817
741
  }
818
- /** Render xBRZ scaling */
819
742
  render(input, options = {}) {
820
- if (!this.initialized || !wasm) {
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
- async ensureCpu() {
816
+ ensureCpu() {
898
817
  if (!this.cpuRenderer) {
899
- this.cpuRenderer = await CrtCpuRenderer.create();
818
+ this.cpuRenderer = CrtCpuRenderer.create();
900
819
  }
901
820
  return this.cpuRenderer;
902
821
  }
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
- }
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
- try {
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
- const cpu = await this.ensureCpu();
919
- return cpu.render(input, options);
829
+ return this.ensureCpu().render(input, options);
920
830
  }
921
- /** Render synchronously (GPU only) */
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
- async ensureCpu() {
855
+ ensureCpu() {
946
856
  if (!this.cpuRenderer) {
947
- this.cpuRenderer = await HexCpuRenderer.create();
857
+ this.cpuRenderer = HexCpuRenderer.create();
948
858
  }
949
859
  return this.cpuRenderer;
950
860
  }
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
- }
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
- try {
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
- const cpu = await this.ensureCpu();
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?.scale ?? 16;
974
- const orientation = options?.orientation ?? "flat-top";
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
- async ensureCpu() {
888
+ ensureCpu() {
989
889
  if (!this.cpuRenderer) {
990
- this.cpuRenderer = await XbrzCpuRenderer.create();
890
+ this.cpuRenderer = XbrzCpuRenderer.create();
991
891
  }
992
892
  return this.cpuRenderer;
993
893
  }
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 };
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(gpuAvailable) {
1015
- this.crt = new CrtEngine(gpuAvailable);
1016
- 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);
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
- /** Create RenderArt instance */
910
+ /**
911
+ * Create RenderArt instance.
912
+ * For CPU/WASM support, call initWasm() first.
913
+ */
1028
914
  static create() {
1029
915
  const gpuAvailable = checkWebGL2();
1030
- 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
+ });
1031
923
  }
1032
- /** Create GPU-only instance */
924
+ /**
925
+ * Create GPU-only RenderArt instance (no WASM needed).
926
+ */
1033
927
  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 };
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, 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 };
1054
947
  //# sourceMappingURL=index.mjs.map
1055
948
  //# sourceMappingURL=index.mjs.map