Skip to content

Commit dfdcadc

Browse files
committed
api: support disposal modes
(cherry picked from commit 3f09bcf)
1 parent 50a2d0a commit dfdcadc

1 file changed

Lines changed: 33 additions & 6 deletions

File tree

‎ImageScript.js‎

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -953,7 +953,7 @@ export class Image {
953953
this.bitmap = image.bitmap;
954954

955955
if (image instanceof Frame)
956-
return Frame.from(this, image.duration);
956+
return Frame.from(this, image.duration, image.xOffset, image.yOffset, image.disposalMode);
957957

958958
return this;
959959
}
@@ -1280,23 +1280,49 @@ export class Image {
12801280
* @extends Image
12811281
*/
12821282
export class Frame extends Image {
1283+
/**
1284+
* GIF frame disposal mode KEEP. For use with {@link Frame}
1285+
* @returns {number}
1286+
*/
1287+
static get DISPOSAL_KEEP() {
1288+
return 1;
1289+
}
1290+
1291+
/**
1292+
* GIF frame disposal mode PREVIOUS. For use with {@link Frame}
1293+
* @returns {number}
1294+
*/
1295+
static get DISPOSAL_PREVIOUS() {
1296+
return 2;
1297+
}
1298+
1299+
/**
1300+
* GIF frame disposal mode BACKGROUND. For use with {@link Frame}
1301+
* @returns {number}
1302+
*/
1303+
static get DISPOSAL_BACKGROUND() {
1304+
return 3;
1305+
}
1306+
12831307
/**
12841308
* Creates a new, blank frame
12851309
* @param {number} width
12861310
* @param {number} height
12871311
* @param {number} [duration = 100] The frames duration (in ms)
12881312
* @param {number} [xOffset=0] The frames offset on the x-axis
12891313
* @param {number} [yOffset=0] The frames offset on the y-axis
1314+
* @param {number} [disposalMode=Frame.DISPOSAL_KEEP] The frames disposal mode
12901315
* @return {Frame}
12911316
*/
1292-
constructor(width, height, duration = 100, xOffset = 0, yOffset = 0) {
1317+
constructor(width, height, duration = 100, xOffset = 0, yOffset = 0, disposalMode = Frame.DISPOSAL_KEEP) {
12931318
if (isNaN(duration) || duration < 0)
12941319
throw new RangeError('Invalid frame duration');
12951320

12961321
super(width, height);
12971322
this.duration = duration;
12981323
this.xOffset = xOffset;
12991324
this.yOffset = yOffset;
1325+
this.disposalMode = disposalMode;
13001326
}
13011327

13021328
toString() {
@@ -1309,12 +1335,13 @@ export class Frame extends Image {
13091335
* @param {number} [duration = 100] The frames duration (in ms)
13101336
* @param {number} [xOffset=0] The frames offset on the x-axis
13111337
* @param {number} [yOffset=0] The frames offset on the y-axis
1338+
* @param {number} [disposalMode=Frame.DISPOSAL_KEEP] The frames disposal mode
13121339
* @return {Frame}
13131340
*/
1314-
static from(image, duration, xOffset, yOffset) {
1341+
static from(image, duration, xOffset, yOffset, disposalMode = Frame.DISPOSAL_KEEP) {
13151342
if (!(image instanceof Image))
13161343
throw new TypeError('Invalid image passed');
1317-
const frame = new Frame(image.width, image.height, duration, xOffset, yOffset);
1344+
const frame = new Frame(image.width, image.height, duration, xOffset, yOffset, disposalMode);
13181345
frame.bitmap.set(image.bitmap);
13191346

13201347
return frame;
@@ -1406,7 +1433,7 @@ export class GIF extends Array {
14061433

14071434
for (const frame of this) {
14081435
if (!(frame instanceof Frame)) throw new Error('GIF contains invalid frames');
1409-
encoder.add(frame.xOffset, frame.yOffset, ~~(frame.duration / 10), frame.width, frame.height, frame.bitmap, 1, quality);
1436+
encoder.add(frame.xOffset, frame.yOffset, ~~(frame.duration / 10), frame.width, frame.height, frame.bitmap, frame.disposalMode, quality);
14101437
}
14111438

14121439
return encoder.u8();
@@ -1434,7 +1461,7 @@ export class GIF extends Array {
14341461
const decoder = new giflib.Decoder(data);
14351462
let frames = [];
14361463
for (const frameData of decoder.frames()) {
1437-
const frame = new Frame(frameData.width, frameData.height, frameData.delay * 10, frameData.x, frameData.y);
1464+
const frame = new Frame(frameData.width, frameData.height, frameData.delay * 10, frameData.x, frameData.y, frameData.dispose);
14381465
frame.bitmap.set(frameData.buffer);
14391466
frames.push(frame);
14401467

0 commit comments

Comments
 (0)