+2012-04-10 Noel Gordon <noel.gordon@gmail.com>
+
+ [GTK] Separate image encoding from dataURL construction
+ https://bugs.webkit.org/show_bug.cgi?id=83152
+
+ Reviewed by Martin Robinson.
+
+ Remove the implicit assumption that a dataURL is the only desired output format
+ of the image encoding phase.
+
+ No new tests, refactoring only, covered by existing canvas tests.
+
+ * platform/graphics/gtk/ImageBufferGtk.cpp:
+ (WebCore::encodeImage): Output the encoded image to the provided GOwnPtr<gchar>&
+ buffer. Update GTK document reference to a valid URL. Round the quality argument
+ to an int like the toDataURL() implementations of other ports. Ditch the success
+ variable; instead test the GError* error return to indicate success.
+ (WebCore):
+ (WebCore::ImageBuffer::toDataURL): Format the dataURL encoding of the mimeType
+ encoded image data buffer herein.
+
2012-04-09 James Robinson <jamesr@chromium.org>
[chromium] Defer texture id allocation for copies until the actual copy executes
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-
#include "config.h"
#include "ImageBuffer.h"
namespace WebCore {
-String ImageBuffer::toDataURL(const String& mimeType, const double* quality) const
+static bool encodeImage(cairo_surface_t* surface, const String& mimeType, const double* quality, GOwnPtr<gchar>& buffer, gsize& bufferSize)
{
- ASSERT(MIMETypeRegistry::isSupportedImageMIMETypeForEncoding(mimeType));
-
- if (!mimeType.startsWith("image/"))
- return "data:,";
+ // List of supported image encoding types comes from the GdkPixbuf documentation.
+ // http://developer.gnome.org/gdk-pixbuf/stable/gdk-pixbuf-File-saving.html#gdk-pixbuf-save-to-bufferv
- // List of supported image types comes from the GdkPixbuf documentation.
- // http://library.gnome.org/devel/gdk-pixbuf/stable/gdk-pixbuf-file-saving.html#gdk-pixbuf-save-to-bufferv
String type = mimeType.substring(sizeof "image");
if (type != "jpeg" && type != "png" && type != "tiff" && type != "ico" && type != "bmp")
- return "data:,";
+ return false;
- GRefPtr<GdkPixbuf> pixbuf = cairoImageSurfaceToGdkPixbuf(m_data.m_surface);
+ GRefPtr<GdkPixbuf> pixbuf = cairoImageSurfaceToGdkPixbuf(surface);
if (!pixbuf)
- return "data:,";
+ return false;
- GOwnPtr<gchar> buffer(0);
- gsize bufferSize;
GError* error = 0;
- gboolean success = FALSE;
if (type == "jpeg" && quality && *quality >= 0.0 && *quality <= 1.0) {
- String qualityString = String::format("%f", *quality * 100.0);
- success = gdk_pixbuf_save_to_buffer(pixbuf.get(), &buffer.outPtr(), &bufferSize,
- type.utf8().data(), &error, "quality", qualityString.utf8().data(), NULL);
- } else {
- success = gdk_pixbuf_save_to_buffer(pixbuf.get(), &buffer.outPtr(), &bufferSize, type.utf8().data(), &error, NULL);
- }
+ String qualityString = String::format("%d", static_cast<int>(*quality * 100.0 + 0.5));
+ gdk_pixbuf_save_to_buffer(pixbuf.get(), &buffer.outPtr(), &bufferSize, type.utf8().data(), &error, "quality", qualityString.utf8().data(), NULL);
+ } else
+ gdk_pixbuf_save_to_buffer(pixbuf.get(), &buffer.outPtr(), &bufferSize, type.utf8().data(), &error, NULL);
- if (!success)
+ return !error;
+}
+
+String ImageBuffer::toDataURL(const String& mimeType, const double* quality) const
+{
+ ASSERT(MIMETypeRegistry::isSupportedImageMIMETypeForEncoding(mimeType));
+
+ if (!mimeType.startsWith("image/"))
+ return "data:,";
+
+ GOwnPtr<gchar> buffer(0);
+ gsize bufferSize;
+ if (!encodeImage(m_data.m_surface, mimeType, quality, buffer, bufferSize))
return "data:,";
- Vector<char> out;
- base64Encode(reinterpret_cast<const char*>(buffer.get()), bufferSize, out);
+ Vector<char> base64Data;
+ base64Encode(buffer.get(), bufferSize, base64Data);
- return "data:" + mimeType + ";base64," + out;
+ return "data:" + mimeType + ";base64," + base64Data;
}
}