Skip to content

Commit dc885e3

Browse files
committed
Fix for gifs that require datum to be u64
Also added visual preview file for testing
1 parent c6b25bb commit dc885e3

9 files changed

+401
-18
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11

2+
__visual_preview__/
3+
24
# Created by https://www.toptal.com/developers/gitignore/api/node
35
# Edit at https://www.toptal.com/developers/gitignore?templates=node
46

__test__/index.spec.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ test('Correct Frame Count', (t) => {
4040

4141
gif = Decoder.decode('./gifs/BBoomer.gif') // Interlace Gif
4242
t.is(gif.frames.length, 13)
43+
44+
gif = Decoder.decode('./gifs/YESITHINKSO.gif') // 64 bit datum gif
45+
t.is(gif.frames.length, 162)
4346
})
4447

4548
test('Decoding Individual Frames', (t) => {
@@ -67,11 +70,14 @@ test('Decoding Individual Frames', (t) => {
6770
gif = Decoder.decode('./gifs/forsenEnter.gif')
6871
t.is(gif.decodeFrame(gif.frames[33]).length, 3136)
6972

70-
gif = Decoder.decode('./gifs/shadowchanHeart.0')
73+
gif = Decoder.decode('./gifs/shadowchanHeart.0') // 0 file gif
7174
t.is(gif.decodeFrame(gif.frames[0]).length, 3136)
7275

7376
gif = Decoder.decode('./gifs/BBoomer.gif') // Interlace Gif
7477
t.is(gif.decodeFrame(gif.frames[0]).length, 3136)
78+
79+
gif = Decoder.decode('./gifs/YESITHINKSO.gif') // 64 bit datum gif
80+
t.is(gif.decodeFrame(gif.frames[0]).length, 3136)
7581
})
7682

7783
test('sample_2_animation.gif: Frame 3: Top is 2', (t) => {

__test__/visual_preview.js

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
const { Decoder } = require('../index');
2+
const { writeFileSync, existsSync, mkdirSync } = require('fs');
3+
const { createCanvas } = require('@napi-rs/canvas');
4+
const previewDirectory = './__visual_preview__'
5+
6+
// Create preview
7+
if (!existsSync(previewDirectory)) {
8+
mkdirSync(previewDirectory);
9+
}
10+
11+
const gif = Decoder.decode('./gifs/YESITHINKSO.gif')
12+
let buffers = gif.decodeFrames()
13+
14+
const canvas = createCanvas(gif.lsd.width, gif.lsd.height)
15+
const ctx = canvas.getContext("2d");
16+
17+
for (let i = 1; i <= buffers.length; i++) {
18+
const frame = gif.frames[i]
19+
const buffer = buffers[i]
20+
const image = ctx.createImageData(frame.im.width, frame.im.height)
21+
image.data.set(buffer)
22+
ctx.putImageData(image, frame.im.left, frame.im.top)
23+
const canvasBuffer = canvas.toBuffer('image/png')
24+
writeFileSync(`${previewDirectory}/${i}.png`, canvasBuffer)
25+
}

gifs/YESITHINKSO.gif

112 KB
Loading

index.d.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,14 @@ export class Gif {
3939
globalTable: Array<Color>
4040
frames: Array<Frame>
4141
/**
42-
* This function goes through every index stream of the frames and makes a vector of buffers from them.
43-
*/
42+
* This function goes through every index stream of the frames and makes a vector of buffers from them.
43+
*/
4444
decodeFrames(): Array<Buffer>
4545
/**
46-
* This function individually decodes the frame inputted into the function
47-
*
48-
* Source: https://gist.github.com/devunwired/4479231#file-gifdecoder-java-L359
49-
*/
46+
* This function individually decodes the frame inputted into the function
47+
*
48+
* Source: https://gist.github.com/devunwired/4479231#file-gifdecoder-java-L359
49+
*/
5050
decodeFrame(frame: Frame): Buffer
5151
}
5252
export class Frame {

package-lock.json

+249
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
"@napi-rs/package-template": "^1.0.0"
7070
},
7171
"devDependencies": {
72+
"@napi-rs/canvas": "^0.1.28",
7273
"@napi-rs/cli": "^2.9.0",
7374
"@swc-node/register": "^1.5.1",
7475
"@types/node": "^18.7.6",

0 commit comments

Comments
 (0)