pixel-data-js 0.32.0 → 0.33.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pixel-data-js",
3
3
  "type": "module",
4
- "version": "0.32.0",
4
+ "version": "0.33.0",
5
5
  "packageManager": "pnpm@10.33.0",
6
6
  "description": "JS Pixel and ImageData operations",
7
7
  "author": {
@@ -1,7 +1,9 @@
1
1
  import type { ImageDataLike } from './_ImageData-types'
2
2
 
3
- export function copyImageData({ data, width, height }: ImageDataLike): ImageData {
4
- return new ImageData(data.slice(), width, height)
3
+ export function copyImageData(source: ImageDataLike): ImageData {
4
+ const dataCopy = new Uint8ClampedArray(source.data)
5
+
6
+ return new ImageData(dataCopy, source.width, source.height)
5
7
  }
6
8
 
7
9
  export function copyImageDataLike({ data, width, height }: ImageDataLike): ImageDataLike {
@@ -42,8 +42,7 @@ export function extractImageData(
42
42
  ? _x
43
43
  : { x: _x, y: _y!, w: _w!, h: _h! }
44
44
 
45
- if (w <= 0) return null
46
- if (h <= 0) return null
45
+ if (w <= 0 || h <= 0) return null
47
46
 
48
47
  const result = new ImageData(w, h)
49
48
 
@@ -40,8 +40,7 @@ export function extractImageDataBuffer(
40
40
  const { x, y, w, h } = typeof _x === 'object'
41
41
  ? _x
42
42
  : { x: _x, y: _y!, w: _w!, h: _h! }
43
- if (w <= 0) return new Uint8ClampedArray(0)
44
- if (h <= 0) return new Uint8ClampedArray(0)
43
+ if (w <= 0 || h <= 0) return new Uint8ClampedArray(0)
45
44
 
46
45
  const srcW = imageData.width
47
46
  const srcH = imageData.height
@@ -72,8 +71,7 @@ export function extractImageDataBuffer(
72
71
  copyW = Math.min(copyW, srcW - srcX)
73
72
  copyH = Math.min(copyH, srcH - srcY)
74
73
 
75
- if (copyW <= 0) return out
76
- if (copyH <= 0) return out
74
+ if (copyW <= 0 || copyH <= 0) return out
77
75
 
78
76
  // 2. Perform high-speed block copy
79
77
  // Attempt to use a 32-bit view if the buffer is memory-aligned.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Writes image data from a source to a target with support for clipping and alpha masking.
2
+ * Writes image data from a source to a target.
3
3
  *
4
4
  * @param target - The destination ImageData to write to.
5
5
  * @param source - The source ImageData to read from.
@@ -9,8 +9,8 @@
9
9
  export function writeImageData(
10
10
  target: ImageData,
11
11
  source: ImageData,
12
- x: number,
13
- y: number,
12
+ x = 0,
13
+ y = 0,
14
14
  ): void {
15
15
  const dstW = target.width
16
16
  const dstH = target.height
@@ -42,8 +42,7 @@ export function writeImageData(
42
42
  copyW = Math.min(copyW, dstW - dstX)
43
43
  copyH = Math.min(copyH, dstH - dstY)
44
44
 
45
- if (copyW <= 0) return
46
- if (copyH <= 0) return
45
+ if (copyW <= 0 || copyH <= 0) return
47
46
 
48
47
  const isDstAligned = dst.byteOffset % 4 === 0
49
48
  const isSrcAligned = src.byteOffset % 4 === 0
@@ -57,8 +57,7 @@ export function writeImageDataBuffer(
57
57
  h = _h!
58
58
  }
59
59
 
60
- if (w <= 0) return
61
- if (h <= 0) return
60
+ if (w <= 0 || h <= 0) return
62
61
 
63
62
  const dstW = target.width
64
63
  const dstH = target.height
@@ -87,8 +86,7 @@ export function writeImageDataBuffer(
87
86
  copyW = Math.min(copyW, dstW - dstX)
88
87
  copyH = Math.min(copyH, dstH - dstY)
89
88
 
90
- if (copyW <= 0) return
91
- if (copyH <= 0) return
89
+ if (copyW <= 0 || copyH <= 0) return
92
90
 
93
91
  // Fast-path: Both arrays must be 4-byte aligned to use Uint32Array safely
94
92
  const isDstAligned = dst.byteOffset % 4 === 0
@@ -44,8 +44,7 @@ export function extractPixelDataBuffer(
44
44
  const srcH = source.h
45
45
  const srcData = source.data
46
46
 
47
- if (w <= 0) return new Uint32Array(0)
48
- if (h <= 0) return new Uint32Array(0)
47
+ if (w <= 0 || h <= 0) return new Uint32Array(0)
49
48
 
50
49
  const dstData = new Uint32Array(w * h)
51
50
 
@@ -72,8 +71,7 @@ export function extractPixelDataBuffer(
72
71
  copyW = Math.min(copyW, srcW - srcX)
73
72
  copyH = Math.min(copyH, srcH - srcY)
74
73
 
75
- if (copyW <= 0) return dstData
76
- if (copyH <= 0) return dstData
74
+ if (copyW <= 0 || copyH <= 0) return dstData
77
75
 
78
76
  for (let row = 0; row < copyH; row++) {
79
77
  const srcStart = (srcY + row) * srcW + srcX
@@ -83,8 +83,7 @@ export function fillPixelData(
83
83
  fillW = Math.min(fillW, dstW - dstX)
84
84
  fillH = Math.min(fillH, dstH - dstY)
85
85
 
86
- if (fillW <= 0) return false
87
- if (fillH <= 0) return false
86
+ if (fillW <= 0 || fillH <= 0) return false
88
87
 
89
88
  const dst32 = dst.data
90
89
  let hasChanged = false
@@ -85,8 +85,7 @@ export function fillPixelDataFast(
85
85
  fillW = Math.min(fillW, dstW - dstX)
86
86
  fillH = Math.min(fillH, dstH - dstY)
87
87
 
88
- if (fillW <= 0) return
89
- if (fillH <= 0) return
88
+ if (fillW <= 0 || fillH <= 0) return
90
89
 
91
90
  const dst32 = dst.data
92
91
  const dw = dst.w
@@ -0,0 +1,55 @@
1
+ import type { PixelData32 } from './_pixelData-types'
2
+
3
+ /**
4
+ * Writes PixelData from a source to a target.
5
+ * @param target - The destination to write to.
6
+ * @param source - The source to read from.
7
+ * @param x - The x-coordinate in the target where drawing starts.
8
+ * @param y - The y-coordinate in the target where drawing starts.
9
+ */
10
+ export function writePixelData(
11
+ target: PixelData32,
12
+ source: PixelData32,
13
+ x = 0,
14
+ y = 0,
15
+ ): void {
16
+ const dstW = target.w
17
+ const dstH = target.h
18
+ const dst = target.data
19
+
20
+ const srcW = source.w
21
+ const srcH = source.h
22
+ const src = source.data
23
+
24
+ let dstX = x
25
+ let dstY = y
26
+ let srcX = 0
27
+ let srcY = 0
28
+ let copyW = srcW
29
+ let copyH = srcH
30
+
31
+ if (dstX < 0) {
32
+ srcX = -dstX
33
+ copyW += dstX
34
+ dstX = 0
35
+ }
36
+
37
+ if (dstY < 0) {
38
+ srcY = -dstY
39
+ copyH += dstY
40
+ dstY = 0
41
+ }
42
+
43
+ copyW = Math.min(copyW, dstW - dstX)
44
+ copyH = Math.min(copyH, dstH - dstY)
45
+
46
+ if (copyW <= 0 || copyH <= 0) return
47
+
48
+ for (let row = 0; row < copyH; row++) {
49
+ const dstStart = (dstY + row) * dstW + dstX
50
+ const srcStart = (srcY + row) * srcW + srcX
51
+ const chunk = src.subarray(srcStart, srcStart + copyW)
52
+
53
+ dst.set(chunk, dstStart)
54
+ }
55
+ }
package/src/index.ts CHANGED
@@ -166,6 +166,7 @@ export * from './PixelData/ReusablePixelData'
166
166
  export * from './PixelData/rotatePixelData'
167
167
  export * from './PixelData/uInt32ArrayToPixelData'
168
168
  export * from './PixelData/writePaintBufferToPixelData'
169
+ export * from './PixelData/writePixelData'
169
170
  export * from './PixelData/writePixelDataBuffer'
170
171
 
171
172
  export * from './Rect/_rect-types'