Skip to content

Commit 2150192

Browse files
authored
Merge pull request scratchfoundation#4557 from paulkaplan/hotfix/gif-frames
Fix loading single frame gifs by removing onDone in favor of indices
2 parents 0b557ab + 40a5ff7 commit 2150192

File tree

2 files changed

+9
-14
lines changed

2 files changed

+9
-14
lines changed

src/lib/file-uploader.js

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -118,15 +118,14 @@ const costumeUpload = function (fileData, fileType, storage, handleCostume, hand
118118
}
119119
case 'image/gif': {
120120
let costumes = [];
121-
const onFrame = (frameNumber, dataUrl) => {
121+
gifDecoder(fileData, (frameNumber, dataUrl, numFrames) => {
122122
costumeUpload(dataUrl, 'image/png', storage, costumes_ => {
123123
costumes = costumes.concat(costumes_);
124+
if (frameNumber === numFrames - 1) {
125+
handleCostume(costumes);
126+
}
124127
}, handleError);
125-
};
126-
const onDone = () => {
127-
handleCostume(costumes);
128-
};
129-
gifDecoder(fileData, {onFrame, onDone});
128+
});
130129
return; // Abandon this load, do not try to load gif itself
131130
}
132131
default:

src/lib/gif-decoder.js

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import {GifReader} from 'omggif';
22

3-
export default (arrayBuffer, {onFrame, onDone}) => {
3+
export default (arrayBuffer, onFrame) => {
44
const canvas = document.createElement('canvas');
55
const ctx = canvas.getContext('2d');
66
const gifReader = new GifReader(new Uint8Array(arrayBuffer));
7+
const numFrames = gifReader.numFrames();
78
canvas.width = gifReader.width;
89
canvas.height = gifReader.height;
910

@@ -14,7 +15,6 @@ export default (arrayBuffer, {onFrame, onDone}) => {
1415
const framePixels = [];
1516
gifReader.decodeAndBlitFrameRGBA(i, framePixels);
1617
const {x, y, width, height, disposal} = gifReader.frameInfo(i);
17-
1818
for (let row = 0; row < height; row++) {
1919
for (let column = 0; column < width; column++) {
2020
const indexOffset = 4 * (x + (y * canvas.width));
@@ -47,16 +47,12 @@ export default (arrayBuffer, {onFrame, onDone}) => {
4747
break;
4848

4949
}
50-
onFrame(i, dataUrl);
50+
onFrame(i, dataUrl, numFrames);
5151

52-
if (i < gifReader.numFrames() - 1) {
52+
if (i < numFrames - 1) {
5353
setTimeout(() => {
5454
loadFrame(i + 1);
5555
});
56-
} else {
57-
setTimeout(() => {
58-
onDone();
59-
});
6056
}
6157
};
6258

0 commit comments

Comments
 (0)