@@ -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 */
12821282export 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