11import { ExifContent } from "./ExifContent.ts" ;
22import { ExifEntry } from "./ExifEntry.ts" ;
33import type { ExifLog } from "./ExifLog.ts" ;
4- import type { ExifMem } from "./ExifMem.ts" ;
4+ import { ExifMem } from "./ExifMem.ts" ;
55import { ExifMnoteData } from "./ExifMnoteData.ts" ;
66import { POINTER_SIZE } from "../constants.ts" ;
77import { ExifByteOrder , type ByteOrder } from "../enums/ExifByteOrder.ts" ;
@@ -66,15 +66,16 @@ class ExifData extends ExifDataStruct implements DisposableDataSegment {
6666 }
6767
6868 /**
69- * Will update all ifd's .parent correctly.
69+ * Will update all ifd's .parent correctly. Note you will need to free the
70+ * previous ifds you set yourself. This is so that someone can do something like
71+ * exifData.ifd = exifData.ifd.with(0, newContent)
7072 */
7173 set ifd ( ifd : ExifContent [ ] ) {
7274 if ( ifd . length !== ExifIfd . COUNT ) {
7375 throw new Error (
7476 `ExifData.ifd: Expected ${ ExifIfd . COUNT } IFDs, got ${ ifd . length } ` ,
7577 ) ;
7678 }
77-
7879 this . ifdPtr = ifd . map ( ( ifd ) => ifd . byteOffset ) as IfdPtr ;
7980 ifd . forEach ( ( exifContent ) => {
8081 exifContent . parent = this ;
@@ -86,10 +87,14 @@ class ExifData extends ExifDataStruct implements DisposableDataSegment {
8687 }
8788
8889 set data ( data : Uint8Array ) {
89- const dataPtr = malloc ( data . byteLength ) ;
90- HEAPU8 . set ( data , dataPtr ) ;
91- this . dataPtr = dataPtr ;
90+ const prevDataPtr = this . dataPtr ;
91+ const newDataPtr = malloc ( data . byteLength ) ;
92+ HEAPU8 . set ( data , newDataPtr ) ;
93+ this . dataPtr = newDataPtr ;
9294 this . size = data . byteLength ;
95+ if ( prevDataPtr !== 0 ) {
96+ free ( prevDataPtr ) ;
97+ }
9398 }
9499
95100 /**
@@ -198,7 +203,10 @@ class ExifData extends ExifDataStruct implements DisposableDataSegment {
198203 throw new Error ( "ExifData.saveData: Memory allocation failed" ) ;
199204 }
200205
201- return HEAPU8 . subarray ( dataPtr , dataPtr + dataSize ) ;
206+ const data = HEAPU8 . subarray ( dataPtr , dataPtr + dataSize ) ;
207+ const exifMem = new ExifMem ( dataPtr ) ;
208+ exifMem . unref ( ) ;
209+ return data ;
202210 }
203211
204212 /**
0 commit comments