Fix memory leak when saving OpenEXR files

It is not a good idea to:

1. Duplicate metadata to self
2. Ignore the fact that something might have had metadata already.

Also moved metadata copy to a preparation function, so it is
never lost.
This commit is contained in:
Sergey Sharybin
2017-05-16 15:34:43 +02:00
parent 8be9d68dd4
commit 26b2323189
3 changed files with 6 additions and 1 deletions

View File

@@ -1890,7 +1890,6 @@ static bool save_image_doit(bContext *C, SpaceImage *sima, wmOperator *op, SaveI
} }
else { else {
colormanaged_ibuf = IMB_colormanagement_imbuf_for_write(ibuf, save_as_render, true, &imf->view_settings, &imf->display_settings, imf); colormanaged_ibuf = IMB_colormanagement_imbuf_for_write(ibuf, save_as_render, true, &imf->view_settings, &imf->display_settings, imf);
IMB_metadata_copy(colormanaged_ibuf, ibuf);
ok = BKE_imbuf_write_as(colormanaged_ibuf, simopts->filepath, imf, save_copy); ok = BKE_imbuf_write_as(colormanaged_ibuf, simopts->filepath, imf, save_copy);
save_imbuf_post(ibuf, colormanaged_ibuf); save_imbuf_post(ibuf, colormanaged_ibuf);
} }

View File

@@ -2065,6 +2065,10 @@ ImBuf *IMB_colormanagement_imbuf_for_write(ImBuf *ibuf, bool save_as_render, boo
} }
} }
if (colormanaged_ibuf != ibuf) {
IMB_metadata_copy(colormanaged_ibuf, ibuf);
}
return colormanaged_ibuf; return colormanaged_ibuf;
} }

View File

@@ -81,7 +81,9 @@ bool IMB_metadata_get_field(struct ImBuf *img, const char *key, char *field, con
void IMB_metadata_copy(struct ImBuf *dimb, struct ImBuf *simb) void IMB_metadata_copy(struct ImBuf *dimb, struct ImBuf *simb)
{ {
BLI_assert(dimb != simb);
if (simb->metadata) { if (simb->metadata) {
IDP_FreeProperty(dimb->metadata);
dimb->metadata = IDP_CopyProperty(simb->metadata); dimb->metadata = IDP_CopyProperty(simb->metadata);
} }
} }