@pixzle/core 0.1.6 → 0.1.8
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/block-operations.d.ts +5 -0
- package/dist/block-operations.js +34 -0
- package/dist/block-operations.js.map +1 -1
- package/dist/block-permutation.d.ts +7 -0
- package/dist/block-permutation.js +45 -0
- package/dist/block-permutation.js.map +1 -0
- package/dist/fragment-buffers.d.ts +9 -0
- package/dist/fragment-buffers.js +65 -0
- package/dist/fragment-buffers.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/restore-buffers.d.ts +3 -0
- package/dist/restore-buffers.js +52 -0
- package/dist/restore-buffers.js.map +1 -0
- package/dist/types.d.ts +8 -0
- package/dist/validators.d.ts +19 -1
- package/dist/validators.js +52 -0
- package/dist/validators.js.map +1 -1
- package/package.json +4 -1
|
@@ -35,6 +35,11 @@ export declare function extractBlock(buffer: Uint8Array, imageWidth: number, ima
|
|
|
35
35
|
* @param blockHeight Actual block height (optional, defaults to blockSize)
|
|
36
36
|
*/
|
|
37
37
|
export declare function placeBlock(targetBuffer: Uint8Array, blockData: Uint8Array, targetWidth: number, destX: number, destY: number, blockSize: number, blockWidth?: number, blockHeight?: number): void;
|
|
38
|
+
/**
|
|
39
|
+
* Copy a block from a source image buffer into a target image buffer.
|
|
40
|
+
* This avoids allocating intermediate block buffers.
|
|
41
|
+
*/
|
|
42
|
+
export declare function copyBlockFromImageBuffer(sourceBuffer: Uint8Array, sourceWidth: number, sourceHeight: number, blockSize: number, sourceBlockIndex: number, targetBuffer: Uint8Array, targetWidth: number, targetHeight: number, targetBlockIndex: number, targetBlocksPerRow: number): void;
|
|
38
43
|
/**
|
|
39
44
|
* Split an RGBA image buffer into an array of blocks
|
|
40
45
|
* @param buffer Source image buffer (RGBA format)
|
package/dist/block-operations.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.extractBlock = extractBlock;
|
|
4
4
|
exports.placeBlock = placeBlock;
|
|
5
|
+
exports.copyBlockFromImageBuffer = copyBlockFromImageBuffer;
|
|
5
6
|
exports.splitImageToBlocks = splitImageToBlocks;
|
|
6
7
|
exports.blocksToImageBuffer = blocksToImageBuffer;
|
|
7
8
|
const block_utils_1 = require("./block-utils");
|
|
@@ -67,6 +68,39 @@ function placeBlock(targetBuffer, blockData, targetWidth, destX, destY, blockSiz
|
|
|
67
68
|
}
|
|
68
69
|
}
|
|
69
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* Copy a block from a source image buffer into a target image buffer.
|
|
73
|
+
* This avoids allocating intermediate block buffers.
|
|
74
|
+
*/
|
|
75
|
+
function copyBlockFromImageBuffer(sourceBuffer, sourceWidth, sourceHeight, blockSize, sourceBlockIndex, targetBuffer, targetWidth, targetHeight, targetBlockIndex, targetBlocksPerRow) {
|
|
76
|
+
if (blockSize <= 0)
|
|
77
|
+
return;
|
|
78
|
+
const sourceBlocksPerRow = Math.ceil(sourceWidth / blockSize);
|
|
79
|
+
if (sourceBlocksPerRow <= 0 || targetBlocksPerRow <= 0)
|
|
80
|
+
return;
|
|
81
|
+
const sourceBlockX = sourceBlockIndex % sourceBlocksPerRow;
|
|
82
|
+
const sourceBlockY = Math.floor(sourceBlockIndex / sourceBlocksPerRow);
|
|
83
|
+
const sourceStartX = sourceBlockX * blockSize;
|
|
84
|
+
const sourceStartY = sourceBlockY * blockSize;
|
|
85
|
+
const targetBlockX = targetBlockIndex % targetBlocksPerRow;
|
|
86
|
+
const targetBlockY = Math.floor(targetBlockIndex / targetBlocksPerRow);
|
|
87
|
+
const targetStartX = targetBlockX * blockSize;
|
|
88
|
+
const targetStartY = targetBlockY * blockSize;
|
|
89
|
+
const availableSourceWidth = sourceWidth - sourceStartX;
|
|
90
|
+
const availableSourceHeight = sourceHeight - sourceStartY;
|
|
91
|
+
const availableTargetWidth = targetWidth - targetStartX;
|
|
92
|
+
const availableTargetHeight = targetHeight - targetStartY;
|
|
93
|
+
const actualWidth = Math.min(blockSize, availableSourceWidth, availableTargetWidth);
|
|
94
|
+
const actualHeight = Math.min(blockSize, availableSourceHeight, availableTargetHeight);
|
|
95
|
+
if (actualWidth <= 0 || actualHeight <= 0)
|
|
96
|
+
return;
|
|
97
|
+
const rowLength = actualWidth * block_utils_1.RGBA_CHANNELS;
|
|
98
|
+
for (let y = 0; y < actualHeight; y++) {
|
|
99
|
+
const srcRowStart = ((sourceStartY + y) * sourceWidth + sourceStartX) * block_utils_1.RGBA_CHANNELS;
|
|
100
|
+
const destRowStart = ((targetStartY + y) * targetWidth + targetStartX) * block_utils_1.RGBA_CHANNELS;
|
|
101
|
+
targetBuffer.set(sourceBuffer.subarray(srcRowStart, srcRowStart + rowLength), destRowStart);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
70
104
|
/**
|
|
71
105
|
* Calculate actual block dimensions at edge positions
|
|
72
106
|
* @param position Block position (x or y)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block-operations.js","sourceRoot":"","sources":["../src/block-operations.ts"],"names":[],"mappings":";;AAgCA,oCAiCC;AAaD,gCA8BC;AA4DD,gDA6BC;AAUD,kDA8CC;
|
|
1
|
+
{"version":3,"file":"block-operations.js","sourceRoot":"","sources":["../src/block-operations.ts"],"names":[],"mappings":";;AAgCA,oCAiCC;AAaD,gCA8BC;AAMD,4DAyDC;AA4DD,gDA6BC;AAUD,kDA8CC;AA5TD,+CAIuB;AAkBvB;;;;;;;;;GASG;AACH,SAAgB,YAAY,CAC1B,MAAkB,EAClB,UAAkB,EAClB,WAA+B,EAC/B,MAAc,EACd,MAAc,EACd,SAAiB;IAEjB,iEAAiE;IACjE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,GAAG,MAAM,CAAC,CAAC;IAC5D,MAAM,WAAW,GACf,WAAW,KAAK,SAAS;QACvB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,GAAG,MAAM,CAAC;QAC3C,CAAC,CAAC,SAAS,CAAC;IAEhB,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,SAAS,GAAG,SAAS,GAAG,2BAAa,CAAC,CAAC;IAExE,gCAAgC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC;YAC1B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC;YAC1B,MAAM,UAAU,GAAG,CAAC,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC,GAAG,2BAAa,CAAC;YAClE,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,GAAG,2BAAa,CAAC;YAEvD,qBAAqB;YACrB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,2BAAa,EAAE,OAAO,EAAE,EAAE,CAAC;gBACzD,SAAS,CAAC,UAAU,GAAG,OAAO,CAAC,GAAG,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,UAAU,CACxB,YAAwB,EACxB,SAAqB,EACrB,WAAmB,EACnB,KAAa,EACb,KAAa,EACb,SAAiB,EACjB,UAAmB,EACnB,WAAoB;IAEpB,MAAM,WAAW,GAAG,UAAU,IAAI,SAAS,CAAC;IAC5C,MAAM,YAAY,GAAG,WAAW,IAAI,SAAS,CAAC;IAE9C,0BAA0B;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,GAAG,2BAAa,CAAC;YACxD,MAAM,WAAW,GACf,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,WAAW,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,2BAAa,CAAC;YAE5D,6CAA6C;YAC7C,IAAI,WAAW,GAAG,2BAAa,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;gBACvD,qBAAqB;gBACrB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,2BAAa,EAAE,OAAO,EAAE,EAAE,CAAC;oBACzD,YAAY,CAAC,WAAW,GAAG,OAAO,CAAC;wBACjC,SAAS,CAAC,WAAW,GAAG,OAAO,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,wBAAwB,CACtC,YAAwB,EACxB,WAAmB,EACnB,YAAoB,EACpB,SAAiB,EACjB,gBAAwB,EACxB,YAAwB,EACxB,WAAmB,EACnB,YAAoB,EACpB,gBAAwB,EACxB,kBAA0B;IAE1B,IAAI,SAAS,IAAI,CAAC;QAAE,OAAO;IAE3B,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IAC9D,IAAI,kBAAkB,IAAI,CAAC,IAAI,kBAAkB,IAAI,CAAC;QAAE,OAAO;IAE/D,MAAM,YAAY,GAAG,gBAAgB,GAAG,kBAAkB,CAAC;IAC3D,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,kBAAkB,CAAC,CAAC;IACvE,MAAM,YAAY,GAAG,YAAY,GAAG,SAAS,CAAC;IAC9C,MAAM,YAAY,GAAG,YAAY,GAAG,SAAS,CAAC;IAE9C,MAAM,YAAY,GAAG,gBAAgB,GAAG,kBAAkB,CAAC;IAC3D,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,kBAAkB,CAAC,CAAC;IACvE,MAAM,YAAY,GAAG,YAAY,GAAG,SAAS,CAAC;IAC9C,MAAM,YAAY,GAAG,YAAY,GAAG,SAAS,CAAC;IAE9C,MAAM,oBAAoB,GAAG,WAAW,GAAG,YAAY,CAAC;IACxD,MAAM,qBAAqB,GAAG,YAAY,GAAG,YAAY,CAAC;IAC1D,MAAM,oBAAoB,GAAG,WAAW,GAAG,YAAY,CAAC;IACxD,MAAM,qBAAqB,GAAG,YAAY,GAAG,YAAY,CAAC;IAE1D,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAC1B,SAAS,EACT,oBAAoB,EACpB,oBAAoB,CACrB,CAAC;IACF,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAC3B,SAAS,EACT,qBAAqB,EACrB,qBAAqB,CACtB,CAAC;IAEF,IAAI,WAAW,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC;QAAE,OAAO;IAElD,MAAM,SAAS,GAAG,WAAW,GAAG,2BAAa,CAAC;IAE9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,WAAW,GACf,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,WAAW,GAAG,YAAY,CAAC,GAAG,2BAAa,CAAC;QACpE,MAAM,YAAY,GAChB,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,WAAW,GAAG,YAAY,CAAC,GAAG,2BAAa,CAAC;QACpE,YAAY,CAAC,GAAG,CACd,YAAY,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS,CAAC,EAC3D,YAAY,CACb,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,wBAAwB,CAC/B,QAAgB,EAChB,SAAiB,EACjB,SAAiB,EACjB,UAAkB;IAElB,MAAM,WAAW,GAAG,QAAQ,KAAK,UAAU,GAAG,CAAC,CAAC;IAChD,OAAO,WAAW,CAAC,CAAC,CAAC,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AACpE,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,wBAAwB,CAC/B,QAAuB,EACvB,SAAiB,EACjB,UAAkB,EAClB,WAAmB,EACnB,WAAwB;IAExB,OAAO;QACL,KAAK,EAAE,wBAAwB,CAC7B,QAAQ,CAAC,CAAC,EACV,SAAS,EACT,UAAU,EACV,WAAW,CAAC,WAAW,CACxB;QACD,MAAM,EAAE,wBAAwB,CAC9B,QAAQ,CAAC,CAAC,EACV,SAAS,EACT,WAAW,EACX,WAAW,CAAC,WAAW,CACxB;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,kBAAkB,CAChC,MAAkB,EAClB,KAAa,EACb,MAAc,EACd,SAAiB;IAEjB,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,MAAM,WAAW,GAAG,IAAA,kCAAoB,EAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAEnE,2CAA2C;IAC3C,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC;QAChE,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC;YAChE,MAAM,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;YAElC,MAAM,KAAK,GAAG,YAAY,CACxB,MAAM,EACN,KAAK,EACL,MAAM,EACN,MAAM,EACN,MAAM,EACN,SAAS,CACV,CAAC;YAEF,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,mBAAmB,CACjC,MAAoB,EACpB,KAAa,EACb,MAAc,EACd,SAAiB;IAEjB,MAAM,WAAW,GAAG,IAAI,UAAU,CAAC,KAAK,GAAG,MAAM,GAAG,2BAAa,CAAC,CAAC;IACnE,MAAM,WAAW,GAAG,IAAA,kCAAoB,EAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAEnE,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,yCAAyC;IACzC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC;QAChE,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC;YAChE,IAAI,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAChC,MAAM;YACR,CAAC;YAED,MAAM,QAAQ,GAAkB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;YACzD,MAAM,UAAU,GAAG,wBAAwB,CACzC,QAAQ,EACR,SAAS,EACT,KAAK,EACL,MAAM,EACN,WAAW,CACZ,CAAC;YAEF,MAAM,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;YACjC,MAAM,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;YAEjC,UAAU,CACR,WAAW,EACX,MAAM,CAAC,UAAU,CAAC,EAClB,KAAK,EACL,KAAK,EACL,KAAK,EACL,SAAS,EACT,UAAU,CAAC,KAAK,EAChB,UAAU,CAAC,MAAM,CAClB,CAAC;YAEF,UAAU,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function createPermutation(length: number, seed: number | string): number[];
|
|
2
|
+
export declare function invertPermutation(permutation: number[]): number[];
|
|
3
|
+
export declare function buildCumulativeCounts(counts: number[]): number[];
|
|
4
|
+
export declare function findIndexInCumulative(cumulativeEnds: number[], counts: number[], index: number): {
|
|
5
|
+
rangeIndex: number;
|
|
6
|
+
localIndex: number;
|
|
7
|
+
};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createPermutation = createPermutation;
|
|
4
|
+
exports.invertPermutation = invertPermutation;
|
|
5
|
+
exports.buildCumulativeCounts = buildCumulativeCounts;
|
|
6
|
+
exports.findIndexInCumulative = findIndexInCumulative;
|
|
7
|
+
const seeded_shuffle_1 = require("@tuki0918/seeded-shuffle");
|
|
8
|
+
function createPermutation(length, seed) {
|
|
9
|
+
if (length <= 0)
|
|
10
|
+
return [];
|
|
11
|
+
const indices = Array.from({ length }, (_, i) => i);
|
|
12
|
+
return (0, seeded_shuffle_1.shuffle)(indices, seed);
|
|
13
|
+
}
|
|
14
|
+
function invertPermutation(permutation) {
|
|
15
|
+
const inverse = new Array(permutation.length);
|
|
16
|
+
for (let i = 0; i < permutation.length; i++) {
|
|
17
|
+
inverse[permutation[i]] = i;
|
|
18
|
+
}
|
|
19
|
+
return inverse;
|
|
20
|
+
}
|
|
21
|
+
function buildCumulativeCounts(counts) {
|
|
22
|
+
const ends = [];
|
|
23
|
+
let sum = 0;
|
|
24
|
+
for (const count of counts) {
|
|
25
|
+
sum += count;
|
|
26
|
+
ends.push(sum);
|
|
27
|
+
}
|
|
28
|
+
return ends;
|
|
29
|
+
}
|
|
30
|
+
function findIndexInCumulative(cumulativeEnds, counts, index) {
|
|
31
|
+
let low = 0;
|
|
32
|
+
let high = cumulativeEnds.length - 1;
|
|
33
|
+
while (low < high) {
|
|
34
|
+
const mid = Math.floor((low + high) / 2);
|
|
35
|
+
if (index < cumulativeEnds[mid]) {
|
|
36
|
+
high = mid;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
low = mid + 1;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const start = cumulativeEnds[low] - counts[low];
|
|
43
|
+
return { rangeIndex: low, localIndex: index - start };
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=block-permutation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block-permutation.js","sourceRoot":"","sources":["../src/block-permutation.ts"],"names":[],"mappings":";;AAEA,8CAOC;AAED,8CAMC;AAED,sDAQC;AAED,sDAmBC;AAhDD,6DAAmD;AAEnD,SAAgB,iBAAiB,CAC/B,MAAc,EACd,IAAqB;IAErB,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,IAAA,wBAAO,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,SAAgB,iBAAiB,CAAC,WAAqB;IACrD,MAAM,OAAO,GAAG,IAAI,KAAK,CAAS,WAAW,CAAC,MAAM,CAAC,CAAC;IACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,qBAAqB,CAAC,MAAgB;IACpD,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,GAAG,IAAI,KAAK,CAAC;QACb,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,qBAAqB,CACnC,cAAwB,EACxB,MAAgB,EAChB,KAAa;IAEb,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,IAAI,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;IAErC,OAAO,GAAG,GAAG,IAAI,EAAE,CAAC;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACzC,IAAI,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,IAAI,GAAG,GAAG,CAAC;QACb,CAAC;aAAM,CAAC;YACN,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAChD,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,GAAG,KAAK,EAAE,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { FragmentationConfig, ImageBufferData } from "./types";
|
|
2
|
+
type FragmentBufferConfig = Pick<Required<FragmentationConfig>, "blockSize" | "seed" | "crossImageShuffle">;
|
|
3
|
+
export declare function fragmentImageBuffers(images: ImageBufferData[], config: FragmentBufferConfig): ImageBufferData[];
|
|
4
|
+
export declare function calculateFragmentLayout(blockCount: number, blockSize: number): {
|
|
5
|
+
blocksPerRow: number;
|
|
6
|
+
width: number;
|
|
7
|
+
height: number;
|
|
8
|
+
};
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fragmentImageBuffers = fragmentImageBuffers;
|
|
4
|
+
exports.calculateFragmentLayout = calculateFragmentLayout;
|
|
5
|
+
const block_operations_1 = require("./block-operations");
|
|
6
|
+
const block_permutation_1 = require("./block-permutation");
|
|
7
|
+
const block_utils_1 = require("./block-utils");
|
|
8
|
+
function fragmentImageBuffers(images, config) {
|
|
9
|
+
if (config.crossImageShuffle) {
|
|
10
|
+
return fragmentAcrossImages(images, config);
|
|
11
|
+
}
|
|
12
|
+
return fragmentEachImage(images, config);
|
|
13
|
+
}
|
|
14
|
+
function calculateFragmentLayout(blockCount, blockSize) {
|
|
15
|
+
if (blockCount <= 0 || blockSize <= 0) {
|
|
16
|
+
return { blocksPerRow: 0, width: 0, height: 0 };
|
|
17
|
+
}
|
|
18
|
+
const blocksPerRow = Math.ceil(Math.sqrt(blockCount));
|
|
19
|
+
const width = blocksPerRow * blockSize;
|
|
20
|
+
const height = Math.ceil(blockCount / blocksPerRow) * blockSize;
|
|
21
|
+
return { blocksPerRow, width, height };
|
|
22
|
+
}
|
|
23
|
+
function fragmentEachImage(images, config) {
|
|
24
|
+
return images.map((image) => {
|
|
25
|
+
const { blockCountX, blockCountY } = (0, block_utils_1.calculateBlockCounts)(image.width, image.height, config.blockSize);
|
|
26
|
+
const blockCount = blockCountX * blockCountY;
|
|
27
|
+
const permutation = (0, block_permutation_1.createPermutation)(blockCount, config.seed);
|
|
28
|
+
const { width, height } = calculateFragmentLayout(blockCount, config.blockSize);
|
|
29
|
+
const buffer = new Uint8Array(width * height * block_utils_1.RGBA_CHANNELS);
|
|
30
|
+
for (let targetBlockIndex = 0; targetBlockIndex < blockCount; targetBlockIndex++) {
|
|
31
|
+
(0, block_operations_1.copyBlockFromImageBuffer)(image.buffer, image.width, image.height, config.blockSize, permutation[targetBlockIndex], buffer, width, height, targetBlockIndex, Math.ceil(width / config.blockSize));
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
buffer,
|
|
35
|
+
width,
|
|
36
|
+
height,
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
function fragmentAcrossImages(images, config) {
|
|
41
|
+
const sourceCounts = images.map((image) => {
|
|
42
|
+
const { blockCountX, blockCountY } = (0, block_utils_1.calculateBlockCounts)(image.width, image.height, config.blockSize);
|
|
43
|
+
return blockCountX * blockCountY;
|
|
44
|
+
});
|
|
45
|
+
const totalBlocks = sourceCounts.reduce((sum, blockCount) => sum + blockCount, 0);
|
|
46
|
+
const sourceEnds = (0, block_permutation_1.buildCumulativeCounts)(sourceCounts);
|
|
47
|
+
const permutation = (0, block_permutation_1.createPermutation)(totalBlocks, config.seed);
|
|
48
|
+
const fragmentBlockCounts = (0, block_utils_1.calculateBlockCountsForCrossImages)(totalBlocks, images.length);
|
|
49
|
+
let offset = 0;
|
|
50
|
+
return fragmentBlockCounts.map((blockCount) => {
|
|
51
|
+
const { width, height } = calculateFragmentLayout(blockCount, config.blockSize);
|
|
52
|
+
const buffer = new Uint8Array(width * height * block_utils_1.RGBA_CHANNELS);
|
|
53
|
+
const blocksPerRow = Math.ceil(width / config.blockSize);
|
|
54
|
+
for (let localBlockIndex = 0; localBlockIndex < blockCount; localBlockIndex++) {
|
|
55
|
+
const globalIndex = offset + localBlockIndex;
|
|
56
|
+
const sourceGlobalIndex = permutation[globalIndex];
|
|
57
|
+
const { rangeIndex, localIndex: sourceBlockIndex } = (0, block_permutation_1.findIndexInCumulative)(sourceEnds, sourceCounts, sourceGlobalIndex);
|
|
58
|
+
const source = images[rangeIndex];
|
|
59
|
+
(0, block_operations_1.copyBlockFromImageBuffer)(source.buffer, source.width, source.height, config.blockSize, sourceBlockIndex, buffer, width, height, localBlockIndex, blocksPerRow);
|
|
60
|
+
}
|
|
61
|
+
offset += blockCount;
|
|
62
|
+
return { buffer, width, height };
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=fragment-buffers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fragment-buffers.js","sourceRoot":"","sources":["../src/fragment-buffers.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
export * from "./types";
|
|
2
2
|
export * from "./constants";
|
|
3
3
|
export * from "./helpers";
|
|
4
|
+
export * from "./fragment-buffers";
|
|
4
5
|
export * from "./block-utils";
|
|
5
6
|
export * from "./block-operations";
|
|
7
|
+
export * from "./block-permutation";
|
|
8
|
+
export * from "./restore-buffers";
|
|
6
9
|
export * from "./validators";
|
|
7
10
|
export { DEFAULT_FRAGMENTATION_CONFIG } from "./constants";
|
package/dist/index.js
CHANGED
|
@@ -18,8 +18,11 @@ exports.DEFAULT_FRAGMENTATION_CONFIG = void 0;
|
|
|
18
18
|
__exportStar(require("./types"), exports);
|
|
19
19
|
__exportStar(require("./constants"), exports);
|
|
20
20
|
__exportStar(require("./helpers"), exports);
|
|
21
|
+
__exportStar(require("./fragment-buffers"), exports);
|
|
21
22
|
__exportStar(require("./block-utils"), exports);
|
|
22
23
|
__exportStar(require("./block-operations"), exports);
|
|
24
|
+
__exportStar(require("./block-permutation"), exports);
|
|
25
|
+
__exportStar(require("./restore-buffers"), exports);
|
|
23
26
|
__exportStar(require("./validators"), exports);
|
|
24
27
|
// Re-export constants with old name for backward compatibility
|
|
25
28
|
var constants_1 = require("./constants");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,8CAA4B;AAC5B,4CAA0B;AAC1B,gDAA8B;AAC9B,qDAAmC;AACnC,+CAA6B;AAE7B,+DAA+D;AAC/D,yCAA2D;AAAlD,yHAAA,4BAA4B,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,8CAA4B;AAC5B,4CAA0B;AAC1B,qDAAmC;AACnC,gDAA8B;AAC9B,qDAAmC;AACnC,sDAAoC;AACpC,oDAAkC;AAClC,+CAA6B;AAE7B,+DAA+D;AAC/D,yCAA2D;AAAlD,yHAAA,4BAA4B,OAAA"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { FragmentationConfig, ImageBufferData, ImageInfo, ManifestData } from "./types";
|
|
2
|
+
export declare function restoreImageBuffers(fragments: ImageBufferData[], manifest: ManifestData): Uint8Array[];
|
|
3
|
+
export declare function restoreSingleImageBuffer(fragment: ImageBufferData, config: Pick<Required<FragmentationConfig>, "blockSize" | "seed">, imageInfo: ImageInfo): Uint8Array;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.restoreImageBuffers = restoreImageBuffers;
|
|
4
|
+
exports.restoreSingleImageBuffer = restoreSingleImageBuffer;
|
|
5
|
+
const block_operations_1 = require("./block-operations");
|
|
6
|
+
const block_permutation_1 = require("./block-permutation");
|
|
7
|
+
const block_utils_1 = require("./block-utils");
|
|
8
|
+
const validators_1 = require("./validators");
|
|
9
|
+
function restoreImageBuffers(fragments, manifest) {
|
|
10
|
+
(0, validators_1.validateFragmentImageCount)(fragments, manifest);
|
|
11
|
+
if (manifest.config.crossImageShuffle) {
|
|
12
|
+
return restoreAcrossImages(fragments, manifest);
|
|
13
|
+
}
|
|
14
|
+
return restoreEachImage(fragments, manifest);
|
|
15
|
+
}
|
|
16
|
+
function restoreSingleImageBuffer(fragment, config, imageInfo) {
|
|
17
|
+
const { blockCountX, blockCountY } = (0, block_utils_1.calculateBlockCounts)(imageInfo.w, imageInfo.h, config.blockSize);
|
|
18
|
+
const blockCount = blockCountX * blockCountY;
|
|
19
|
+
const permutation = (0, block_permutation_1.createPermutation)(blockCount, config.seed);
|
|
20
|
+
const inverse = (0, block_permutation_1.invertPermutation)(permutation);
|
|
21
|
+
const outputBuffer = new Uint8Array(imageInfo.w * imageInfo.h * block_utils_1.RGBA_CHANNELS);
|
|
22
|
+
for (let blockIndex = 0; blockIndex < blockCount; blockIndex++) {
|
|
23
|
+
(0, block_operations_1.copyBlockFromImageBuffer)(fragment.buffer, fragment.width, fragment.height, config.blockSize, inverse[blockIndex], outputBuffer, imageInfo.w, imageInfo.h, blockIndex, blockCountX);
|
|
24
|
+
}
|
|
25
|
+
return outputBuffer;
|
|
26
|
+
}
|
|
27
|
+
function restoreEachImage(fragments, manifest) {
|
|
28
|
+
return manifest.images.map((imageInfo, imageIndex) => restoreSingleImageBuffer(fragments[imageIndex], manifest.config, imageInfo));
|
|
29
|
+
}
|
|
30
|
+
function restoreAcrossImages(fragments, manifest) {
|
|
31
|
+
const totalBlocks = (0, block_utils_1.calculateTotalBlocks)(manifest.images, manifest.config.blockSize);
|
|
32
|
+
const blockCountsForCrossImages = (0, block_utils_1.calculateBlockCountsForCrossImages)(totalBlocks, fragments.length);
|
|
33
|
+
const blockCountsPerImage = (0, block_utils_1.calculateBlockCountsPerImage)(manifest.images, manifest.config.blockSize);
|
|
34
|
+
const fragmentEnds = (0, block_permutation_1.buildCumulativeCounts)(blockCountsForCrossImages);
|
|
35
|
+
const imageEnds = (0, block_permutation_1.buildCumulativeCounts)(blockCountsPerImage);
|
|
36
|
+
const permutation = (0, block_permutation_1.createPermutation)(totalBlocks, manifest.config.seed);
|
|
37
|
+
const inverse = (0, block_permutation_1.invertPermutation)(permutation);
|
|
38
|
+
return manifest.images.map((imageInfo, imageIndex) => {
|
|
39
|
+
const blockCount = blockCountsPerImage[imageIndex];
|
|
40
|
+
const imageStart = imageEnds[imageIndex] - blockCount;
|
|
41
|
+
const outputBuffer = new Uint8Array(imageInfo.w * imageInfo.h * block_utils_1.RGBA_CHANNELS);
|
|
42
|
+
const targetBlocksPerRow = (0, block_utils_1.calculateBlockCounts)(imageInfo.w, imageInfo.h, manifest.config.blockSize).blockCountX;
|
|
43
|
+
for (let localIndex = 0; localIndex < blockCount; localIndex++) {
|
|
44
|
+
const sourceIndex = inverse[imageStart + localIndex];
|
|
45
|
+
const { rangeIndex, localIndex: fragmentLocalIndex } = (0, block_permutation_1.findIndexInCumulative)(fragmentEnds, blockCountsForCrossImages, sourceIndex);
|
|
46
|
+
const fragment = fragments[rangeIndex];
|
|
47
|
+
(0, block_operations_1.copyBlockFromImageBuffer)(fragment.buffer, fragment.width, fragment.height, manifest.config.blockSize, fragmentLocalIndex, outputBuffer, imageInfo.w, imageInfo.h, localIndex, targetBlocksPerRow);
|
|
48
|
+
}
|
|
49
|
+
return outputBuffer;
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=restore-buffers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restore-buffers.js","sourceRoot":"","sources":["../src/restore-buffers.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -55,6 +55,14 @@ export interface ManifestData {
|
|
|
55
55
|
/** Image information */
|
|
56
56
|
images: ImageInfo[];
|
|
57
57
|
}
|
|
58
|
+
export interface ImageBufferData {
|
|
59
|
+
/** Raw RGBA pixel buffer */
|
|
60
|
+
buffer: Uint8Array;
|
|
61
|
+
/** Image width */
|
|
62
|
+
width: number;
|
|
63
|
+
/** Image height */
|
|
64
|
+
height: number;
|
|
65
|
+
}
|
|
58
66
|
export interface FragmentationResult {
|
|
59
67
|
/** Manifest data */
|
|
60
68
|
manifest: ManifestData;
|
package/dist/validators.d.ts
CHANGED
|
@@ -5,7 +5,25 @@ import type { ImageInfo, ManifestData } from "./types";
|
|
|
5
5
|
* @param manifest - The manifest data containing image information
|
|
6
6
|
* @throws {Error} When the counts don't match
|
|
7
7
|
*/
|
|
8
|
-
export declare function validateFragmentImageCount(fragmentImages:
|
|
8
|
+
export declare function validateFragmentImageCount(fragmentImages: {
|
|
9
|
+
length: number;
|
|
10
|
+
}, manifest: ManifestData): void;
|
|
11
|
+
export declare function validateOptionsWithImages<T extends {
|
|
12
|
+
images: unknown;
|
|
13
|
+
}>(options: T, context: string): T;
|
|
14
|
+
export declare function validateOutputDirectoryOption<T extends {
|
|
15
|
+
outputDir?: unknown;
|
|
16
|
+
}>(options: T, context: string): T;
|
|
17
|
+
export declare function validateManifestOptions<T extends {
|
|
18
|
+
manifest?: unknown;
|
|
19
|
+
manifestData?: ManifestData;
|
|
20
|
+
}>(options: T, context: string): T;
|
|
21
|
+
export declare function validateRestoreImageOptions<T extends {
|
|
22
|
+
image?: unknown;
|
|
23
|
+
blockSize?: unknown;
|
|
24
|
+
seed?: unknown;
|
|
25
|
+
imageInfo?: ImageInfo;
|
|
26
|
+
}>(options: T, context: string): T;
|
|
9
27
|
/**
|
|
10
28
|
* Validates that there are no duplicate file names in the image infos
|
|
11
29
|
* @param imageInfos - Array of image information objects
|
package/dist/validators.js
CHANGED
|
@@ -1,8 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.validateFragmentImageCount = validateFragmentImageCount;
|
|
4
|
+
exports.validateOptionsWithImages = validateOptionsWithImages;
|
|
5
|
+
exports.validateOutputDirectoryOption = validateOutputDirectoryOption;
|
|
6
|
+
exports.validateManifestOptions = validateManifestOptions;
|
|
7
|
+
exports.validateRestoreImageOptions = validateRestoreImageOptions;
|
|
4
8
|
exports.validateFileNames = validateFileNames;
|
|
5
9
|
const helpers_1 = require("./helpers");
|
|
10
|
+
function validateOptionsObject(options, context) {
|
|
11
|
+
if (!options) {
|
|
12
|
+
throw new Error(`[${context}] Options object is required.`);
|
|
13
|
+
}
|
|
14
|
+
return options;
|
|
15
|
+
}
|
|
6
16
|
/**
|
|
7
17
|
* Validates that the number of fragment images matches the number of images in the manifest
|
|
8
18
|
* @param fragmentImages - Array of fragment images (file paths or buffers)
|
|
@@ -16,6 +26,48 @@ function validateFragmentImageCount(fragmentImages, manifest) {
|
|
|
16
26
|
throw new Error(`Fragment image count mismatch: expected ${manifestImageCount} but got ${fragmentImageCount}`);
|
|
17
27
|
}
|
|
18
28
|
}
|
|
29
|
+
function validateOptionsWithImages(options, context) {
|
|
30
|
+
validateOptionsObject(options, context);
|
|
31
|
+
if (!Array.isArray(options.images) || options.images.length === 0) {
|
|
32
|
+
throw new Error(`[${context}] images must be a non-empty array.`);
|
|
33
|
+
}
|
|
34
|
+
return options;
|
|
35
|
+
}
|
|
36
|
+
function validateOutputDirectoryOption(options, context) {
|
|
37
|
+
validateOptionsObject(options, context);
|
|
38
|
+
if (typeof options.outputDir !== "string" || options.outputDir.length === 0) {
|
|
39
|
+
throw new Error(`[${context}] outputDir is required and must be a string.`);
|
|
40
|
+
}
|
|
41
|
+
return options;
|
|
42
|
+
}
|
|
43
|
+
function validateManifestOptions(options, context) {
|
|
44
|
+
validateOptionsObject(options, context);
|
|
45
|
+
if (!options.manifest && !options.manifestData) {
|
|
46
|
+
throw new Error(`[${context}] Either manifest or manifestData is required.`);
|
|
47
|
+
}
|
|
48
|
+
if (options.manifest !== undefined && typeof options.manifest !== "string") {
|
|
49
|
+
throw new Error(`[${context}] manifest must be a string.`);
|
|
50
|
+
}
|
|
51
|
+
return options;
|
|
52
|
+
}
|
|
53
|
+
function validateRestoreImageOptions(options, context) {
|
|
54
|
+
validateOptionsObject(options, context);
|
|
55
|
+
if (!options.image) {
|
|
56
|
+
throw new Error(`[${context}] image is required.`);
|
|
57
|
+
}
|
|
58
|
+
if (typeof options.blockSize !== "number" || options.blockSize <= 0) {
|
|
59
|
+
throw new Error(`[${context}] blockSize must be a positive number.`);
|
|
60
|
+
}
|
|
61
|
+
if (typeof options.seed !== "number") {
|
|
62
|
+
throw new Error(`[${context}] seed must be a number.`);
|
|
63
|
+
}
|
|
64
|
+
if (!options.imageInfo ||
|
|
65
|
+
typeof options.imageInfo.w !== "number" ||
|
|
66
|
+
typeof options.imageInfo.h !== "number") {
|
|
67
|
+
throw new Error(`[${context}] imageInfo with valid w and h is required.`);
|
|
68
|
+
}
|
|
69
|
+
return options;
|
|
70
|
+
}
|
|
19
71
|
/**
|
|
20
72
|
* Validates that there are no duplicate file names in the image infos
|
|
21
73
|
* @param imageInfos - Array of image information objects
|
package/dist/validators.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pixzle/core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.8",
|
|
4
4
|
"description": "Core image fragmentation and restoration logic",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -22,6 +22,9 @@
|
|
|
22
22
|
"directory": "packages/core"
|
|
23
23
|
},
|
|
24
24
|
"license": "MIT",
|
|
25
|
+
"engines": {
|
|
26
|
+
"node": ">=20"
|
|
27
|
+
},
|
|
25
28
|
"publishConfig": {
|
|
26
29
|
"access": "public"
|
|
27
30
|
},
|