ImageBufferEfl.cpp [plain text]
#include "config.h"
#include "ImageBuffer.h"
#include "MIMETypeRegistry.h"
#include "image-encoders/JPEGImageEncoder.h"
#include <cairo.h>
#include <wtf/text/Base64.h>
namespace WebCore {
static cairo_status_t writeFunction(void* output, const unsigned char* data, unsigned length)
{
if (!reinterpret_cast<Vector<unsigned char>*>(output)->tryAppend(data, length))
return CAIRO_STATUS_WRITE_ERROR;
return CAIRO_STATUS_SUCCESS;
}
static bool encodeImagePNG(cairo_surface_t* image, Vector<char>* output)
{
return cairo_surface_write_to_png_stream(image, writeFunction, output) == CAIRO_STATUS_SUCCESS;
}
static bool encodeImageJPEG(unsigned char* data, IntSize size, Vector<char>* output, const double* quality)
{
return compressRGBABigEndianToJPEG(data, size, *output, quality);
}
String ImageBuffer::toDataURL(const String& mimeType, const double* quality, CoordinateSystem) const
{
ASSERT(MIMETypeRegistry::isSupportedImageMIMETypeForEncoding(mimeType));
cairo_surface_t* image = cairo_get_target(context()->platformContext()->cr());
Vector<char> encodedImage;
if (!image)
return "data:,";
if (mimeType == "image/png") {
if (!encodeImagePNG(image, &encodedImage))
return "data:,";
}
if (mimeType == "image/jpeg") {
int width = cairo_image_surface_get_width(image);
int height = cairo_image_surface_get_height(image);
IntSize size(width, height);
IntRect dataRect(IntPoint(), size);
RefPtr<Uint8ClampedArray> myData = getPremultipliedImageData(dataRect);
if (!encodeImageJPEG(myData->data(), size, &encodedImage, quality))
return "data:,";
}
Vector<char> base64Data;
base64Encode(encodedImage, base64Data);
return "data:" + mimeType + ";base64," + base64Data;
}
}