@@ -120,12 +120,14 @@ pub struct Image {
120
120
file_content : Option < Vec < u8 > > ,
121
121
// take ownership of avif image, let it be dropped when image is dropped
122
122
_avif_image_ref : Option < AvifImage > ,
123
+ // Bytes accounted to V8 via adjust_external_memory for this image
124
+ accounted_bytes : i64 ,
123
125
}
124
126
125
127
impl ObjectFinalize for Image {
126
128
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 ) ?;
129
131
}
130
132
Ok ( ( ) )
131
133
}
@@ -152,6 +154,7 @@ impl Image {
152
154
src : None ,
153
155
file_content : None ,
154
156
_avif_image_ref : None ,
157
+ accounted_bytes : 0 ,
155
158
} )
156
159
}
157
160
@@ -266,7 +269,7 @@ impl Image {
266
269
Ok ( ( ) )
267
270
}
268
271
269
- pub ( crate ) fn regenerate_bitmap_if_need ( & mut self ) -> Result < ( ) > {
272
+ pub ( crate ) fn regenerate_bitmap_if_need ( & mut self , env : & Env ) -> Result < ( ) > {
270
273
if !self . need_regenerate_bitmap || !self . is_svg || self . src . is_none ( ) {
271
274
return Ok ( ( ) ) ;
272
275
}
@@ -281,6 +284,11 @@ impl Image {
281
284
self . color_space ,
282
285
& font,
283
286
) ;
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 ;
284
292
return Ok ( ( ) ) ;
285
293
}
286
294
if let Some ( data) = self . src . as_ref ( ) {
@@ -293,6 +301,20 @@ impl Image {
293
301
self . color_space ,
294
302
& font,
295
303
) ;
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;
296
318
}
297
319
Ok ( ( ) )
298
320
}
@@ -518,7 +540,12 @@ impl Task for BitmapDecoder {
518
540
self_mut. is_svg = bitmap. is_svg ;
519
541
self_mut. bitmap = Some ( bitmap. data ) ;
520
542
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
+ }
522
549
}
523
550
DecodeStatus :: Empty => { }
524
551
DecodeStatus :: InvalidSvg => {
0 commit comments