@@ -120,12 +120,14 @@ pub struct Image {
120120 file_content : Option < Vec < u8 > > ,
121121 // take ownership of avif image, let it be dropped when image is dropped
122122 _avif_image_ref : Option < AvifImage > ,
123+ // Bytes accounted to V8 via adjust_external_memory for this image
124+ accounted_bytes : i64 ,
123125}
124126
125127impl ObjectFinalize for Image {
126128 fn finalize ( self , env : Env ) -> Result < ( ) > {
127- if let Some ( bitmap ) = self . bitmap {
128- env. adjust_external_memory ( -( bitmap . 0 . width as i64 ) * ( bitmap . 0 . height as i64 ) * 4 ) ?;
129+ if self . accounted_bytes != 0 {
130+ env. adjust_external_memory ( -self . accounted_bytes ) ?;
129131 }
130132 Ok ( ( ) )
131133 }
@@ -152,6 +154,7 @@ impl Image {
152154 src : None ,
153155 file_content : None ,
154156 _avif_image_ref : None ,
157+ accounted_bytes : 0 ,
155158 } )
156159 }
157160
@@ -266,7 +269,7 @@ impl Image {
266269 Ok ( ( ) )
267270 }
268271
269- pub ( crate ) fn regenerate_bitmap_if_need ( & mut self ) -> Result < ( ) > {
272+ pub ( crate ) fn regenerate_bitmap_if_need ( & mut self , env : & Env ) -> Result < ( ) > {
270273 if !self . need_regenerate_bitmap || !self . is_svg || self . src . is_none ( ) {
271274 return Ok ( ( ) ) ;
272275 }
@@ -281,6 +284,11 @@ impl Image {
281284 self . color_space ,
282285 & font,
283286 ) ;
287+ if let Some ( bmp) = & self . bitmap {
288+ let new_bytes = ( bmp. 0 . width as i64 ) * ( bmp. 0 . height as i64 ) * 4 ;
289+ self . adjust_external_memory_if_need ( env, new_bytes) ?;
290+ }
291+ self . need_regenerate_bitmap = false ;
284292 return Ok ( ( ) ) ;
285293 }
286294 if let Some ( data) = self . src . as_ref ( ) {
@@ -293,6 +301,20 @@ impl Image {
293301 self . color_space ,
294302 & font,
295303 ) ;
304+ if let Some ( bmp) = & self . bitmap {
305+ let new_bytes = ( bmp. 0 . width as i64 ) * ( bmp. 0 . height as i64 ) * 4 ;
306+ self . adjust_external_memory_if_need ( env, new_bytes) ?;
307+ }
308+ self . need_regenerate_bitmap = false ;
309+ }
310+ Ok ( ( ) )
311+ }
312+
313+ fn adjust_external_memory_if_need ( & mut self , env : & Env , new_bytes : i64 ) -> Result < ( ) > {
314+ let delta = new_bytes - self . accounted_bytes ;
315+ if delta != 0 {
316+ env. adjust_external_memory ( delta) ?;
317+ self . accounted_bytes = new_bytes;
296318 }
297319 Ok ( ( ) )
298320 }
@@ -518,7 +540,12 @@ impl Task for BitmapDecoder {
518540 self_mut. is_svg = bitmap. is_svg ;
519541 self_mut. bitmap = Some ( bitmap. data ) ;
520542 self_mut. _avif_image_ref = bitmap. decoded_image ;
521- env. adjust_external_memory ( ( output. width as i64 ) * ( output. height as i64 ) * 4 ) ?;
543+ let new_bytes = ( output. width as i64 ) * ( output. height as i64 ) * 4 ;
544+ let delta = new_bytes - self_mut. accounted_bytes ;
545+ if delta != 0 {
546+ env. adjust_external_memory ( delta) ?;
547+ self_mut. accounted_bytes = new_bytes;
548+ }
522549 }
523550 DecodeStatus :: Empty => { }
524551 DecodeStatus :: InvalidSvg => {
0 commit comments