@tableslayer/ui 0.1.3 → 0.1.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/package.json +2 -13
- package/src/lib/components/Avatar/Avatar.svelte +82 -0
- package/src/lib/components/Avatar/AvatarFileInput.svelte +85 -0
- package/src/lib/components/Avatar/AvatarPopover.svelte +34 -0
- package/src/lib/components/Avatar/index.ts +4 -0
- package/src/lib/components/Avatar/types.ts +24 -0
- package/src/lib/components/BrushSizeSlider/BrushSizeSlider.svelte +174 -0
- package/src/lib/components/BrushSizeSlider/index.ts +1 -0
- package/src/lib/components/Button/Button.svelte +182 -0
- package/src/lib/components/Button/ConfirmActionButton.svelte +98 -0
- package/src/lib/components/Button/IconButton.svelte +121 -0
- package/src/lib/components/Button/RadioButton.svelte +93 -0
- package/src/lib/components/Button/index.ts +5 -0
- package/src/lib/components/Button/types.ts +54 -0
- package/src/lib/components/CardFan/CardFan.svelte +165 -0
- package/src/lib/components/CardFan/index.ts +2 -0
- package/src/lib/components/CardFan/types.ts +6 -0
- package/src/lib/components/CodeBlock/Code.svelte +7 -0
- package/src/lib/components/CodeBlock/CodeBlock.svelte +102 -0
- package/src/lib/components/CodeBlock/index.ts +3 -0
- package/src/lib/components/CodeBlock/types.ts +10 -0
- package/src/lib/components/ColorMode/ColorMode.svelte +8 -0
- package/src/lib/components/ColorMode/index.ts +2 -0
- package/src/lib/components/ColorMode/types.ts +12 -0
- package/src/lib/components/ColorPicker/ColorPicker.svelte +838 -0
- package/src/lib/components/ColorPicker/ColorPickerSwatch.svelte +32 -0
- package/src/lib/components/ColorPicker/index.ts +3 -0
- package/src/lib/components/ColorPicker/types.ts +51 -0
- package/src/lib/components/ContextMenu/ContextMenu.svelte +86 -0
- package/src/lib/components/ContextMenu/index.ts +2 -0
- package/src/lib/components/ContextMenu/types.ts +15 -0
- package/src/lib/components/DrawingSliders/DrawingSliders.svelte +379 -0
- package/src/lib/components/DrawingSliders/index.ts +1 -0
- package/src/lib/components/Editor/Editor.svelte +825 -0
- package/src/lib/components/Editor/index.ts +1 -0
- package/src/lib/components/FogSliders/FogSliders.svelte +33 -0
- package/src/lib/components/FogSliders/index.ts +1 -0
- package/src/lib/components/Hr/Hr.svelte +15 -0
- package/src/lib/components/Hr/index.ts +1 -0
- package/src/lib/components/Icon/Icon.svelte +6 -0
- package/src/lib/components/Icon/index.ts +2 -0
- package/src/lib/components/Icon/types.ts +20 -0
- package/src/lib/components/Input/DualInputSlider.svelte +126 -0
- package/src/lib/components/Input/FileInput.svelte +176 -0
- package/src/lib/components/Input/FormControl.svelte +150 -0
- package/src/lib/components/Input/FormError.svelte +37 -0
- package/src/lib/components/Input/Input.svelte +56 -0
- package/src/lib/components/Input/InputCheckbox.svelte +99 -0
- package/src/lib/components/Input/InputSlider.svelte +86 -0
- package/src/lib/components/Input/Label.svelte +19 -0
- package/src/lib/components/Input/index.ts +9 -0
- package/src/lib/components/Input/types.ts +39 -0
- package/src/lib/components/Link/Link.svelte +41 -0
- package/src/lib/components/Link/LinkBox.svelte +20 -0
- package/src/lib/components/Link/LinkOverlay.svelte +23 -0
- package/src/lib/components/Link/index.ts +4 -0
- package/src/lib/components/Link/types.ts +17 -0
- package/src/lib/components/Loading/Loader.svelte +60 -0
- package/src/lib/components/Loading/Skeleton.svelte +9 -0
- package/src/lib/components/Loading/index.ts +2 -0
- package/src/lib/components/Logo/Logo.svelte +16 -0
- package/src/lib/components/Logo/index.ts +1 -0
- package/src/lib/components/MarkerTooltip/MarkerTooltip.svelte +435 -0
- package/src/lib/components/MarkerTooltip/index.ts +1 -0
- package/src/lib/components/Menu/SelectorMenu.svelte +280 -0
- package/src/lib/components/Menu/index.ts +2 -0
- package/src/lib/components/Menu/types.ts +17 -0
- package/src/lib/components/MyCounterButton.svelte +11 -0
- package/src/lib/components/Panel/index.ts +2 -0
- package/src/lib/components/Panel/panel.svelte +18 -0
- package/src/lib/components/Panel/types.ts +8 -0
- package/src/lib/components/PersistButton/PersistButton.svelte +100 -0
- package/src/lib/components/PersistButton/index.ts +1 -0
- package/src/lib/components/Popover/Popover.svelte +81 -0
- package/src/lib/components/Popover/index.ts +2 -0
- package/src/lib/components/Popover/types.ts +19 -0
- package/src/lib/components/PropsTable/PropsTable.svelte +107 -0
- package/src/lib/components/RadialMenu/EffectPreview.svelte +36 -0
- package/src/lib/components/RadialMenu/EffectPreviewScene.svelte +194 -0
- package/src/lib/components/RadialMenu/RadialMenu.svelte +503 -0
- package/src/lib/components/RadialMenu/RadialMenuItem.svelte +176 -0
- package/src/lib/components/RadialMenu/index.ts +2 -0
- package/src/lib/components/RadialMenu/types.ts +35 -0
- package/src/lib/components/Select/Select.svelte +342 -0
- package/src/lib/components/Select/index.ts +2 -0
- package/src/lib/components/Select/types.ts +22 -0
- package/src/lib/components/Spacer/Spacer.svelte +14 -0
- package/src/lib/components/Spacer/index.ts +2 -0
- package/src/lib/components/Spacer/types.ts +5 -0
- package/src/lib/components/Stage/components/AnnotationLayer/AnnotationLayer.svelte +445 -0
- package/src/lib/components/Stage/components/AnnotationLayer/AnnotationMaterial.svelte +167 -0
- package/src/lib/components/Stage/components/AnnotationLayer/types.ts +196 -0
- package/src/lib/components/Stage/components/CursorLayer/CursorLayer.svelte +148 -0
- package/src/lib/components/Stage/components/CursorLayer/cursor.svg +26 -0
- package/src/lib/components/Stage/components/CursorLayer/index.ts +2 -0
- package/src/lib/components/Stage/components/CursorLayer/types.ts +23 -0
- package/src/lib/components/Stage/components/DrawingLayer/DrawingMaterial.svelte +364 -0
- package/src/lib/components/Stage/components/DrawingLayer/types.ts +65 -0
- package/src/lib/components/Stage/components/EdgeOverlayLayer/EdgeOverlayLayer.svelte +72 -0
- package/src/lib/components/Stage/components/EdgeOverlayLayer/types.ts +34 -0
- package/src/lib/components/Stage/components/FogLayer/FogLayer.svelte +75 -0
- package/src/lib/components/Stage/components/FogLayer/types.ts +51 -0
- package/src/lib/components/Stage/components/FogOfWarLayer/FogOfWarLayer.svelte +249 -0
- package/src/lib/components/Stage/components/FogOfWarLayer/FogOfWarMaterial.svelte +200 -0
- package/src/lib/components/Stage/components/FogOfWarLayer/types.ts +116 -0
- package/src/lib/components/Stage/components/GridLayer/GridLayer.svelte +20 -0
- package/src/lib/components/Stage/components/GridLayer/GridMaterial.svelte +69 -0
- package/src/lib/components/Stage/components/GridLayer/types.ts +79 -0
- package/src/lib/components/Stage/components/LayerInput/LayerInput.svelte +300 -0
- package/src/lib/components/Stage/components/MapLayer/MapLayer.svelte +196 -0
- package/src/lib/components/Stage/components/MapLayer/dataSources/GifDataSource.ts +265 -0
- package/src/lib/components/Stage/components/MapLayer/dataSources/IMapDataSource.ts +55 -0
- package/src/lib/components/Stage/components/MapLayer/dataSources/ImageDataSource.ts +87 -0
- package/src/lib/components/Stage/components/MapLayer/dataSources/VideoDataSource.ts +150 -0
- package/src/lib/components/Stage/components/MapLayer/dataSources/dataSourceFactory.ts +48 -0
- package/src/lib/components/Stage/components/MapLayer/dataSources/index.ts +16 -0
- package/src/lib/components/Stage/components/MapLayer/types.ts +58 -0
- package/src/lib/components/Stage/components/MarkerLayer/MarkerLayer.svelte +398 -0
- package/src/lib/components/Stage/components/MarkerLayer/MarkerToken.svelte +262 -0
- package/src/lib/components/Stage/components/MarkerLayer/types.ts +126 -0
- package/src/lib/components/Stage/components/MeasurementLayer/MeasurementLayer.svelte +364 -0
- package/src/lib/components/Stage/components/MeasurementLayer/MeasurementManager.svelte +473 -0
- package/src/lib/components/Stage/components/MeasurementLayer/measurements/BaseMeasurement.ts +427 -0
- package/src/lib/components/Stage/components/MeasurementLayer/measurements/BeamMeasurement.ts +105 -0
- package/src/lib/components/Stage/components/MeasurementLayer/measurements/CircleMeasurement.ts +98 -0
- package/src/lib/components/Stage/components/MeasurementLayer/measurements/ConeMeasurement.ts +163 -0
- package/src/lib/components/Stage/components/MeasurementLayer/measurements/LineMeasurement.ts +102 -0
- package/src/lib/components/Stage/components/MeasurementLayer/measurements/RectangleMeasurement.ts +120 -0
- package/src/lib/components/Stage/components/MeasurementLayer/measurements/index.ts +7 -0
- package/src/lib/components/Stage/components/MeasurementLayer/types.ts +94 -0
- package/src/lib/components/Stage/components/MeasurementLayer/utils/canvasDrawing.ts +357 -0
- package/src/lib/components/Stage/components/MeasurementLayer/utils/distanceCalculations.ts +170 -0
- package/src/lib/components/Stage/components/ParticleSystem/ParticleSystem.svelte +220 -0
- package/src/lib/components/Stage/components/ParticleSystem/particles/atlases/ash.png +0 -0
- package/src/lib/components/Stage/components/ParticleSystem/particles/atlases/leaves.png +0 -0
- package/src/lib/components/Stage/components/ParticleSystem/particles/atlases/rain.png +0 -0
- package/src/lib/components/Stage/components/ParticleSystem/particles/atlases/snow.png +0 -0
- package/src/lib/components/Stage/components/ParticleSystem/rng.js +20 -0
- package/src/lib/components/Stage/components/ParticleSystem/types.ts +95 -0
- package/src/lib/components/Stage/components/PerformanceDebugger/PerformanceDebugger.svelte +144 -0
- package/src/lib/components/Stage/components/PerformanceDebugger/index.ts +1 -0
- package/src/lib/components/Stage/components/PerformanceOverlay/PerformanceOverlay.svelte +208 -0
- package/src/lib/components/Stage/components/PerformanceOverlay/index.ts +1 -0
- package/src/lib/components/Stage/components/PointerInputManager/PointerInputManager.svelte +201 -0
- package/src/lib/components/Stage/components/Scene/Scene.svelte +651 -0
- package/src/lib/components/Stage/components/Scene/luts.ts +24 -0
- package/src/lib/components/Stage/components/Scene/types.ts +225 -0
- package/src/lib/components/Stage/components/Stage/Stage.svelte +332 -0
- package/src/lib/components/Stage/components/Stage/types.ts +136 -0
- package/src/lib/components/Stage/components/WeatherLayer/WeatherLayer.svelte +135 -0
- package/src/lib/components/Stage/components/WeatherLayer/presets/AshPreset.ts +71 -0
- package/src/lib/components/Stage/components/WeatherLayer/presets/LeavesPreset.ts +70 -0
- package/src/lib/components/Stage/components/WeatherLayer/presets/RainPreset.ts +68 -0
- package/src/lib/components/Stage/components/WeatherLayer/presets/SnowPreset.ts +70 -0
- package/src/lib/components/Stage/components/WeatherLayer/presets/index.ts +6 -0
- package/src/lib/components/Stage/components/WeatherLayer/types.ts +35 -0
- package/src/lib/components/Stage/helpers/clippingPlaneStore.svelte.ts +28 -0
- package/src/lib/components/Stage/helpers/debugState.svelte.ts +18 -0
- package/src/lib/components/Stage/helpers/grid.ts +548 -0
- package/src/lib/components/Stage/helpers/lazyBrush.ts +171 -0
- package/src/lib/components/Stage/helpers/performanceMetrics.svelte.ts +220 -0
- package/src/lib/components/Stage/helpers/utils.ts +21 -0
- package/src/lib/components/Stage/index.ts +49 -0
- package/src/lib/components/Stage/shaders/AnnotationEffects.frag +1070 -0
- package/src/lib/components/Stage/shaders/Annotations.frag +29 -0
- package/src/lib/components/Stage/shaders/Drawing.frag +83 -0
- package/src/lib/components/Stage/shaders/Drawing.vert +5 -0
- package/src/lib/components/Stage/shaders/Fog.frag +147 -0
- package/src/lib/components/Stage/shaders/FractalNoise.frag +96 -0
- package/src/lib/components/Stage/shaders/GridShader.frag +174 -0
- package/src/lib/components/Stage/shaders/Overlay.frag +23 -0
- package/src/lib/components/Stage/shaders/Overlay.vert +0 -0
- package/src/lib/components/Stage/shaders/Particles.frag +27 -0
- package/src/lib/components/Stage/shaders/Particles.vert +51 -0
- package/src/lib/components/Stage/shaders/ToolOutline.frag +59 -0
- package/src/lib/components/Stage/shaders/default.vert +8 -0
- package/src/lib/components/Stage/types.ts +4 -0
- package/src/lib/components/Table/Table.svelte +16 -0
- package/src/lib/components/Table/Td.svelte +17 -0
- package/src/lib/components/Table/Th.svelte +18 -0
- package/src/lib/components/Table/index.ts +4 -0
- package/src/lib/components/Table/types.ts +14 -0
- package/src/lib/components/Text/Text.svelte +23 -0
- package/src/lib/components/Text/index.ts +2 -0
- package/src/lib/components/Text/types.ts +12 -0
- package/src/lib/components/Title/Title.svelte +54 -0
- package/src/lib/components/Title/index.ts +2 -0
- package/src/lib/components/Title/types.ts +9 -0
- package/src/lib/components/Toast/Toast.svelte +155 -0
- package/src/lib/components/Toast/index.ts +5 -0
- package/src/lib/components/Toast/toastCookie.ts +24 -0
- package/src/lib/components/Toast/types.ts +6 -0
- package/src/lib/components/ToolTip/ToolTip.svelte +70 -0
- package/src/lib/components/ToolTip/index.ts +2 -0
- package/src/lib/components/ToolTip/types.ts +14 -0
- package/src/lib/components/index.ts +32 -0
- package/src/lib/components/types.ts +0 -0
- package/src/lib/index.ts +2 -0
- package/src/lib/styles/globals.css +108 -0
- package/src/lib/styles/normalize.css +9 -0
- package/src/lib/styles/reset.css +133 -0
- package/src/lib/styles/utilities.css +179 -0
- package/src/lib/styles/vars.css +1103 -0
- package/src/lib/types/awareness.ts +17 -0
- package/src/lib/utils/rle.ts +217 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface HoveredMarker {
|
|
2
|
+
id: string;
|
|
3
|
+
position: {
|
|
4
|
+
x: number;
|
|
5
|
+
y: number;
|
|
6
|
+
z: number;
|
|
7
|
+
};
|
|
8
|
+
tooltip: {
|
|
9
|
+
title: string;
|
|
10
|
+
content: string; // Rich text HTML from TipTap
|
|
11
|
+
imageUrl?: string;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface MarkerAwarenessState {
|
|
16
|
+
hoveredMarker?: HoveredMarker;
|
|
17
|
+
}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run-Length Encoding utilities for binary mask compression
|
|
3
|
+
* Optimized for fog and annotation layers
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Encodes a binary mask using Run-Length Encoding
|
|
8
|
+
* @param data - Binary mask data (Uint8Array where each byte is 0 or 255)
|
|
9
|
+
* @returns Encoded RLE data as Uint8Array
|
|
10
|
+
*/
|
|
11
|
+
export function encodeRLE(data: Uint8Array): Uint8Array {
|
|
12
|
+
if (data.length === 0) return new Uint8Array(0);
|
|
13
|
+
|
|
14
|
+
const runs: number[] = [];
|
|
15
|
+
let currentValue = data[0];
|
|
16
|
+
let runLength = 1;
|
|
17
|
+
|
|
18
|
+
// First byte indicates the starting value (0 or 1)
|
|
19
|
+
runs.push(currentValue === 0 ? 0 : 1);
|
|
20
|
+
|
|
21
|
+
for (let i = 1; i < data.length; i++) {
|
|
22
|
+
if (data[i] === currentValue) {
|
|
23
|
+
runLength++;
|
|
24
|
+
} else {
|
|
25
|
+
// Store the run length
|
|
26
|
+
pushVarint(runs, runLength);
|
|
27
|
+
currentValue = data[i];
|
|
28
|
+
runLength = 1;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Don't forget the last run
|
|
33
|
+
pushVarint(runs, runLength);
|
|
34
|
+
|
|
35
|
+
return new Uint8Array(runs);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Decodes RLE data back to binary mask
|
|
40
|
+
* @param encoded - RLE encoded data
|
|
41
|
+
* @param targetLength - Expected length of decoded data
|
|
42
|
+
* @returns Decoded binary mask as Uint8Array
|
|
43
|
+
*/
|
|
44
|
+
export function decodeRLE(encoded: Uint8Array, targetLength: number): Uint8Array {
|
|
45
|
+
if (encoded.length === 0) return new Uint8Array(targetLength);
|
|
46
|
+
|
|
47
|
+
const result = new Uint8Array(targetLength);
|
|
48
|
+
let position = 0;
|
|
49
|
+
let index = 0;
|
|
50
|
+
|
|
51
|
+
// First byte indicates the starting value
|
|
52
|
+
const startValue = encoded[index++];
|
|
53
|
+
let currentValue = startValue === 0 ? 0 : 255;
|
|
54
|
+
|
|
55
|
+
while (index < encoded.length && position < targetLength) {
|
|
56
|
+
const [runLength, newIndex] = readVarint(encoded, index);
|
|
57
|
+
index = newIndex;
|
|
58
|
+
|
|
59
|
+
// Fill the result array with the current value
|
|
60
|
+
const end = Math.min(position + runLength, targetLength);
|
|
61
|
+
for (let i = position; i < end; i++) {
|
|
62
|
+
result[i] = currentValue;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
position = end;
|
|
66
|
+
// Toggle the current value
|
|
67
|
+
currentValue = currentValue === 0 ? 255 : 0;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Variable-length integer encoding (for efficient storage of run lengths)
|
|
75
|
+
* Uses continuation bit in MSB
|
|
76
|
+
*/
|
|
77
|
+
function pushVarint(array: number[], value: number): void {
|
|
78
|
+
while (value > 127) {
|
|
79
|
+
array.push((value & 0x7f) | 0x80);
|
|
80
|
+
value >>>= 7;
|
|
81
|
+
}
|
|
82
|
+
array.push(value & 0x7f);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Read a variable-length integer from the array
|
|
87
|
+
*/
|
|
88
|
+
function readVarint(array: Uint8Array, index: number): [number, number] {
|
|
89
|
+
let value = 0;
|
|
90
|
+
let shift = 0;
|
|
91
|
+
|
|
92
|
+
while (index < array.length) {
|
|
93
|
+
const byte = array[index++];
|
|
94
|
+
value |= (byte & 0x7f) << shift;
|
|
95
|
+
if ((byte & 0x80) === 0) {
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
shift += 7;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return [value, index];
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Converts a PNG blob to RLE encoded data
|
|
106
|
+
* @param blob - PNG image blob
|
|
107
|
+
* @param width - Image width
|
|
108
|
+
* @param height - Image height
|
|
109
|
+
* @returns RLE encoded data
|
|
110
|
+
*/
|
|
111
|
+
export async function pngToRLE(blob: Blob, width: number, height: number): Promise<Uint8Array> {
|
|
112
|
+
// Create an off-screen canvas
|
|
113
|
+
const canvas = document.createElement('canvas');
|
|
114
|
+
canvas.width = width;
|
|
115
|
+
canvas.height = height;
|
|
116
|
+
const ctx = canvas.getContext('2d');
|
|
117
|
+
|
|
118
|
+
if (!ctx) {
|
|
119
|
+
throw new Error('Failed to get canvas context');
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Load the image
|
|
123
|
+
const img = new Image();
|
|
124
|
+
const url = URL.createObjectURL(blob);
|
|
125
|
+
|
|
126
|
+
try {
|
|
127
|
+
await new Promise((resolve, reject) => {
|
|
128
|
+
img.onload = resolve;
|
|
129
|
+
img.onerror = reject;
|
|
130
|
+
img.src = url;
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
// Draw image to canvas
|
|
134
|
+
ctx.drawImage(img, 0, 0, width, height);
|
|
135
|
+
|
|
136
|
+
// Get image data
|
|
137
|
+
const imageData = ctx.getImageData(0, 0, width, height);
|
|
138
|
+
const pixels = imageData.data;
|
|
139
|
+
|
|
140
|
+
// Convert RGBA to binary (using alpha channel)
|
|
141
|
+
const binaryData = new Uint8Array(width * height);
|
|
142
|
+
for (let i = 0; i < binaryData.length; i++) {
|
|
143
|
+
// Use alpha channel (every 4th byte starting at index 3)
|
|
144
|
+
binaryData[i] = pixels[i * 4 + 3] > 127 ? 255 : 0;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Encode to RLE
|
|
148
|
+
return encodeRLE(binaryData);
|
|
149
|
+
} finally {
|
|
150
|
+
URL.revokeObjectURL(url);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Converts RLE encoded data to a PNG blob
|
|
156
|
+
* @param rleData - RLE encoded data
|
|
157
|
+
* @param width - Image width
|
|
158
|
+
* @param height - Image height
|
|
159
|
+
* @returns PNG image blob
|
|
160
|
+
*/
|
|
161
|
+
export async function rleToPng(rleData: Uint8Array, width: number, height: number): Promise<Blob> {
|
|
162
|
+
// Decode RLE to binary
|
|
163
|
+
const binaryData = decodeRLE(rleData, width * height);
|
|
164
|
+
|
|
165
|
+
// Create canvas
|
|
166
|
+
const canvas = document.createElement('canvas');
|
|
167
|
+
canvas.width = width;
|
|
168
|
+
canvas.height = height;
|
|
169
|
+
const ctx = canvas.getContext('2d');
|
|
170
|
+
|
|
171
|
+
if (!ctx) {
|
|
172
|
+
throw new Error('Failed to get canvas context');
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Create image data
|
|
176
|
+
const imageData = ctx.createImageData(width, height);
|
|
177
|
+
const pixels = imageData.data;
|
|
178
|
+
|
|
179
|
+
// Convert binary to RGBA
|
|
180
|
+
for (let i = 0; i < binaryData.length; i++) {
|
|
181
|
+
const idx = i * 4;
|
|
182
|
+
const value = binaryData[i];
|
|
183
|
+
pixels[idx] = 0; // R
|
|
184
|
+
pixels[idx + 1] = 0; // G
|
|
185
|
+
pixels[idx + 2] = 0; // B
|
|
186
|
+
pixels[idx + 3] = value; // A (0 or 255)
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// Put image data to canvas
|
|
190
|
+
ctx.putImageData(imageData, 0, 0);
|
|
191
|
+
|
|
192
|
+
// Convert to blob
|
|
193
|
+
return new Promise((resolve, reject) => {
|
|
194
|
+
canvas.toBlob((blob) => {
|
|
195
|
+
if (blob) {
|
|
196
|
+
resolve(blob);
|
|
197
|
+
} else {
|
|
198
|
+
reject(new Error('Failed to convert canvas to blob'));
|
|
199
|
+
}
|
|
200
|
+
}, 'image/png');
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Gets the size of RLE data when encoded
|
|
206
|
+
*/
|
|
207
|
+
export function getRLESize(data: Uint8Array): number {
|
|
208
|
+
return encodeRLE(data).length;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Estimates compression ratio for RLE encoding
|
|
213
|
+
*/
|
|
214
|
+
export function estimateCompressionRatio(data: Uint8Array): number {
|
|
215
|
+
const encoded = encodeRLE(data);
|
|
216
|
+
return data.length / encoded.length;
|
|
217
|
+
}
|