@@ -5299,15 +5299,14 @@ index 892d8de6d345d91fda80cfa5334c4aa68b757da3..a22497d801a349487be10b15139e9c76
5299
5299
5300
5300
#if PLATFORM(IOS_FAMILY)
5301
5301
diff --git a/Source/WebCore/platform/graphics/cairo/ImageBufferUtilitiesCairo.cpp b/Source/WebCore/platform/graphics/cairo/ImageBufferUtilitiesCairo.cpp
5302
- index d79728555b7db9b59cb615c55a7a7a6851cb57c8..6a6bfcd87074be69790a9d4b7993d427953129f5 100644
5302
+ index d79728555b7db9b59cb615c55a7a7a6851cb57c8..6c05bfbcc1056e5fb906bf019cc52472d1b02882 100644
5303
5303
--- a/Source/WebCore/platform/graphics/cairo/ImageBufferUtilitiesCairo.cpp
5304
5304
+++ b/Source/WebCore/platform/graphics/cairo/ImageBufferUtilitiesCairo.cpp
5305
- @@ -48,6 +48,14 @@
5305
+ @@ -48,6 +48,13 @@
5306
5306
#include <wtf/glib/GUniquePtr.h>
5307
5307
#endif
5308
5308
5309
- +#if PLATFORM(WPE)
5310
- +#include <wtf/glib/GUniquePtr.h>
5309
+ +#if PLATFORM(WPE) || PLATFORM(WIN)
5311
5310
+#include <stdio.h> // Needed by jpeglib.h for FILE.
5312
5311
+extern "C" {
5313
5312
+#include "jpeglib.h"
@@ -5317,24 +5316,13 @@ index d79728555b7db9b59cb615c55a7a7a6851cb57c8..6a6bfcd87074be69790a9d4b7993d427
5317
5316
namespace WebCore {
5318
5317
5319
5318
#if !PLATFORM(GTK)
5320
- @@ -65,8 +73,71 @@ static bool encodeImage(cairo_surface_t* image, const String& mimeType, Vector<u
5319
+ @@ -65,8 +72,75 @@ static bool encodeImage(cairo_surface_t* image, const String& mimeType, Vector<u
5321
5320
return cairo_surface_write_to_png_stream(image, writeFunction, output) == CAIRO_STATUS_SUCCESS;
5322
5321
}
5323
5322
5324
5323
-Vector<uint8_t> data(cairo_surface_t* image, const String& mimeType, Optional<double>)
5325
5324
+static Vector<uint8_t> encodeJpeg(cairo_surface_t* image, int quality)
5326
- {
5327
- + struct jpeg_compress_struct info;
5328
- + struct jpeg_error_mgr error;
5329
- + info.err = jpeg_std_error(&error);
5330
- + jpeg_create_compress(&info);
5331
- +
5332
- + GUniqueOutPtr<guchar> buffer;
5333
- + gsize bufferSize;
5334
- + jpeg_mem_dest(&info, &buffer.outPtr(), &bufferSize);
5335
- + info.image_width = cairo_image_surface_get_width(image);
5336
- + info.image_height = cairo_image_surface_get_height(image);
5337
- +
5325
+ +{
5338
5326
+ if (cairo_surface_get_type(image) != CAIRO_SURFACE_TYPE_IMAGE) {
5339
5327
+ fprintf(stderr, "Unexpected cairo surface type: %d\n", cairo_surface_get_type(image));
5340
5328
+ return { };
@@ -5344,6 +5332,18 @@ index d79728555b7db9b59cb615c55a7a7a6851cb57c8..6a6bfcd87074be69790a9d4b7993d427
5344
5332
+ fprintf(stderr, "Unexpected surface image format: %d\n", cairo_image_surface_get_format(image));
5345
5333
+ return { };
5346
5334
+ }
5335
+ +
5336
+ + struct jpeg_compress_struct info;
5337
+ + struct jpeg_error_mgr error;
5338
+ + info.err = jpeg_std_error(&error);
5339
+ + jpeg_create_compress(&info);
5340
+ +
5341
+ + unsigned char* bufferPtr = nullptr;
5342
+ + size_t bufferSize;
5343
+ + jpeg_mem_dest(&info, &bufferPtr, &bufferSize);
5344
+ + info.image_width = cairo_image_surface_get_width(image);
5345
+ + info.image_height = cairo_image_surface_get_height(image);
5346
+ +
5347
5347
+#ifndef LIBJPEG_TURBO_VERSION
5348
5348
+ COMPILE_ASSERT(false, only_libjpeg_turbo_is_supported);
5349
5349
+#endif
@@ -5366,20 +5366,23 @@ index d79728555b7db9b59cb615c55a7a7a6851cb57c8..6a6bfcd87074be69790a9d4b7993d427
5366
5366
+ JSAMPROW row = cairo_image_surface_get_data(image) + (info.next_scanline * cairo_image_surface_get_stride(image));
5367
5367
+ if (jpeg_write_scanlines(&info, &row, 1) != 1) {
5368
5368
+ fprintf(stderr, "JPEG library failed to encode line\n");
5369
- + return { } ;
5369
+ + break ;
5370
5370
+ }
5371
5371
+ }
5372
5372
+
5373
5373
+ jpeg_finish_compress(&info);
5374
5374
+ jpeg_destroy_compress(&info);
5375
5375
+
5376
5376
+ Vector<uint8_t> output;
5377
- + output.append(buffer.get(), bufferSize);
5377
+ + output.append(bufferPtr, bufferSize);
5378
+ + // Cannot use unique_ptr as bufferPtr changes during compression. GUniquePtr would work
5379
+ + // but it's under GLib and won't work on Windows.
5380
+ + free(bufferPtr);
5378
5381
+ return output;
5379
5382
+}
5380
5383
+
5381
5384
+Vector<uint8_t> data(cairo_surface_t* image, const String& mimeType, Optional<double> quality)
5382
- + {
5385
+ {
5383
5386
+ if (mimeType == "image/jpeg") {
5384
5387
+ int qualityPercent = 100;
5385
5388
+ if (quality)
0 commit comments