Modified: trunk/Tools/ChangeLog (96722 => 96723)
--- trunk/Tools/ChangeLog 2011-10-05 17:44:26 UTC (rev 96722)
+++ trunk/Tools/ChangeLog 2011-10-05 17:51:24 UTC (rev 96723)
@@ -1,3 +1,20 @@
+2011-10-05 Raphael Kubo da Costa <k...@profusion.mobi>
+
+ [EFL] Fix Evas_Object_Image reference counts and file descriptor leakage in ImageDiff.
+ https://bugs.webkit.org/show_bug.cgi?id=68449
+
+ Reviewed by Antonio Gomes.
+
+ evas_render() must be called to close up temporary files and unmap unused
+ resources. evas_object_image_data_set() must be called after an
+ evas_object_image_data_get() to balance an internal reference count.
+
+ * DumpRenderTree/efl/ImageDiff.cpp:
+ (differenceImageFromDifferenceBuffer):
+ (calculateDifference):
+ (printImage):
+ (printImageDifferences):
+
2011-10-05 Balazs Kelemen <kbal...@webkit.org>
[Qt][WK2] Unreviewed build fix.
Modified: trunk/Tools/DumpRenderTree/efl/ImageDiff.cpp (96722 => 96723)
--- trunk/Tools/DumpRenderTree/efl/ImageDiff.cpp 2011-10-05 17:44:26 UTC (rev 96722)
+++ trunk/Tools/DumpRenderTree/efl/ImageDiff.cpp 2011-10-05 17:51:24 UTC (rev 96723)
@@ -82,6 +82,8 @@
}
}
+ evas_object_image_data_set(image, diffPixels);
+
return image;
}
@@ -104,7 +106,7 @@
return sqrtf(red * red + green * green + blue * blue + alpha * alpha) / 2.0f;
}
-static float calculateDifference(const Evas_Object* baselineImage, const Evas_Object* actualImage, OwnPtr<Evas_Object>& differenceImage)
+static float calculateDifference(Evas_Object* baselineImage, Evas_Object* actualImage, OwnPtr<Evas_Object>& differenceImage)
{
int width, height, baselineWidth, baselineHeight;
evas_object_image_size_get(actualImage, &width, &height);
@@ -144,6 +146,11 @@
}
}
+ // When using evas_object_image_data_get(), a complementary evas_object_data_set() must be
+ // issued to balance the reference count, even if the image hasn't been changed.
+ evas_object_image_data_set(baselineImage, basePixels);
+ evas_object_image_data_set(actualImage, actualPixels);
+
// Compute the difference as a percentage combining both the number of
// different pixels and their difference amount i.e. the average distance
// over the entire image
@@ -192,6 +199,8 @@
if (tempImageFd == -1)
abortWithErrorMessage("could not create temporary file");
+ evas_render(evas_object_evas_get(image));
+
if (evas_object_image_save(image, fileName, 0, 0)) {
struct stat fileInfo;
if (!stat(fileName, &fileInfo)) {
@@ -208,7 +217,7 @@
unlink(fileName);
}
-static void printImageDifferences(const Evas_Object* baselineImage, Evas_Object* actualImage)
+static void printImageDifferences(Evas_Object* baselineImage, Evas_Object* actualImage)
{
OwnPtr<Evas_Object> differenceImage;
const float difference = calculateDifference(baselineImage, actualImage, differenceImage);