From 2bde8e466a4451c7319e3a072d118917957d6554 Mon Sep 17 00:00:00 2001 From: Steve Block Date: Wed, 25 May 2011 19:08:45 +0100 Subject: Merge WebKit at r82507: Initial merge by git Change-Id: I60ce9d780725b58b45e54165733a8ffee23b683e --- .../image-encoders/skia/JPEGImageEncoder.cpp | 49 +++++++++++++++++----- .../image-encoders/skia/JPEGImageEncoder.h | 7 +++- .../image-encoders/skia/PNGImageEncoder.cpp | 43 +++++++++++++------ .../platform/image-encoders/skia/PNGImageEncoder.h | 5 ++- 4 files changed, 78 insertions(+), 26 deletions(-) (limited to 'Source/WebCore/platform/image-encoders') diff --git a/Source/WebCore/platform/image-encoders/skia/JPEGImageEncoder.cpp b/Source/WebCore/platform/image-encoders/skia/JPEGImageEncoder.cpp index be3c92a..f0ac601 100644 --- a/Source/WebCore/platform/image-encoders/skia/JPEGImageEncoder.cpp +++ b/Source/WebCore/platform/image-encoders/skia/JPEGImageEncoder.cpp @@ -31,6 +31,7 @@ #include "config.h" #include "JPEGImageEncoder.h" +#include "ImageData.h" #include "IntSize.h" #include "SkBitmap.h" #include "SkColorPriv.h" @@ -79,22 +80,29 @@ static void handleError(j_common_ptr common) longjmp(*jumpBufferPtr, -1); } -static void preMultipliedBGRAtoRGB(const SkPMColor* input, unsigned int pixels, unsigned char* output) +static void preMultipliedBGRAtoRGB(const void* pixels, unsigned int pixelCount, unsigned char* output) { - for (; pixels-- > 0; ++input) { + const SkPMColor* input = static_cast(pixels); + for (; pixelCount-- > 0; ++input) { *output++ = SkGetPackedR32(*input); *output++ = SkGetPackedG32(*input); *output++ = SkGetPackedB32(*input); } } -bool JPEGImageEncoder::encode(const SkBitmap& bitmap, int quality, Vector* output) +static void RGBAtoRGB(const unsigned char* input, unsigned int pixels, unsigned char* output) { - if (bitmap.config() != SkBitmap::kARGB_8888_Config) - return false; // Only support ARGB 32 bpp skia bitmaps. + for (; pixels-- > 0; input += 4) { + *output++ = input[0]; + *output++ = input[1]; + *output++ = input[2]; + } +} - SkAutoLockPixels bitmapLock(bitmap); - IntSize imageSize(bitmap.width(), bitmap.height()); +static bool encodePixels(const IntSize& inputSize, unsigned char* inputPixels, + bool premultiplied, int quality, Vector* output) +{ + IntSize imageSize(inputSize); imageSize.clampNegativeToZero(); JPEGOutputBuffer destination; destination.output = output; @@ -126,12 +134,15 @@ bool JPEGImageEncoder::encode(const SkBitmap& bitmap, int quality, Vector(bitmap.getPixels()); + unsigned char* pixels = inputPixels; row.resize(cinfo.image_width * cinfo.input_components); while (cinfo.next_scanline < cinfo.image_height) { - preMultipliedBGRAtoRGB(pixels, cinfo.image_width, row.data()); + if (premultiplied) + preMultipliedBGRAtoRGB(pixels, cinfo.image_width, row.data()); + else + RGBAtoRGB(pixels, cinfo.image_width, row.data()); jpeg_write_scanlines(&cinfo, row.dataSlot(), 1); - pixels += cinfo.image_width; + pixels += cinfo.image_width * 4; } jpeg_finish_compress(&cinfo); @@ -139,4 +150,22 @@ bool JPEGImageEncoder::encode(const SkBitmap& bitmap, int quality, Vector* output) +{ + if (bitmap.config() != SkBitmap::kARGB_8888_Config) + return false; // Only support ARGB 32 bpp skia bitmaps. + + SkAutoLockPixels bitmapLock(bitmap); + IntSize imageSize(bitmap.width(), bitmap.height()); + + return encodePixels(imageSize, static_cast(bitmap.getPixels()), + true, quality, output); +} + +bool JPEGImageEncoder::encode(const ImageData& imageData, int quality, Vector* output) +{ + return encodePixels(imageData.size(), imageData.data()->data()->data(), + false, quality, output); +} + } // namespace WebCore diff --git a/Source/WebCore/platform/image-encoders/skia/JPEGImageEncoder.h b/Source/WebCore/platform/image-encoders/skia/JPEGImageEncoder.h index f2ac52d..122725d 100644 --- a/Source/WebCore/platform/image-encoders/skia/JPEGImageEncoder.h +++ b/Source/WebCore/platform/image-encoders/skia/JPEGImageEncoder.h @@ -31,16 +31,19 @@ #ifndef JPEGImageEncoder_h #define JPEGImageEncoder_h -#include "Vector.h" +#include class SkBitmap; namespace WebCore { +class ImageData; + class JPEGImageEncoder { public: - // Encode the input bitmap with a compression quality in [0-100]. + // Encode the input data with a compression quality in [0-100]. static bool encode(const SkBitmap&, int quality, Vector*); + static bool encode(const ImageData&, int quality, Vector*); // For callers: provide a reasonable compression quality default. enum Quality { DefaultCompressionQuality = 92 }; diff --git a/Source/WebCore/platform/image-encoders/skia/PNGImageEncoder.cpp b/Source/WebCore/platform/image-encoders/skia/PNGImageEncoder.cpp index 78f737e..2fc758e 100644 --- a/Source/WebCore/platform/image-encoders/skia/PNGImageEncoder.cpp +++ b/Source/WebCore/platform/image-encoders/skia/PNGImageEncoder.cpp @@ -31,6 +31,7 @@ #include "config.h" #include "PNGImageEncoder.h" +#include "ImageData.h" #include "IntSize.h" #include "SkBitmap.h" #include "SkColorPriv.h" @@ -46,11 +47,12 @@ static void writeOutput(png_structp png, png_bytep data, png_size_t size) static_cast*>(png->io_ptr)->append(data, size); } -static void preMultipliedBGRAtoRGBA(const SkPMColor* input, int pixels, unsigned char* output) +static void preMultipliedBGRAtoRGBA(const void* pixels, int pixelCount, unsigned char* output) { static const SkUnPreMultiply::Scale* scale = SkUnPreMultiply::GetScaleTable(); + const SkPMColor* input = static_cast(pixels); - for (; pixels-- > 0; ++input) { + for (; pixelCount-- > 0; ++input) { const unsigned alpha = SkGetPackedA32(*input); if ((alpha != 0) && (alpha != 255)) { *output++ = SkUnPreMultiply::ApplyScale(scale[alpha], SkGetPackedR32(*input)); @@ -66,13 +68,10 @@ static void preMultipliedBGRAtoRGBA(const SkPMColor* input, int pixels, unsigned } } -bool PNGImageEncoder::encode(const SkBitmap& bitmap, Vector* output) +static bool encodePixels(const IntSize& inputSize, unsigned char* inputPixels, + bool premultiplied, Vector* output) { - if (bitmap.config() != SkBitmap::kARGB_8888_Config) - return false; // Only support ARGB 32 bpp skia bitmaps. - - SkAutoLockPixels bitmapLock(bitmap); - IntSize imageSize(bitmap.width(), bitmap.height()); + IntSize imageSize(inputSize); imageSize.clampNegativeToZero(); Vector row; @@ -100,12 +99,15 @@ bool PNGImageEncoder::encode(const SkBitmap& bitmap, Vector* outp 8, PNG_COLOR_TYPE_RGB_ALPHA, 0, 0, 0); png_write_info(png, info); - const SkPMColor* pixels = static_cast(bitmap.getPixels()); - row.resize(imageSize.width() * bitmap.bytesPerPixel()); + unsigned char* pixels = inputPixels; + row.resize(imageSize.width() * sizeof(SkPMColor)); for (int y = 0; y < imageSize.height(); ++y) { - preMultipliedBGRAtoRGBA(pixels, imageSize.width(), row.data()); - png_write_row(png, row.data()); - pixels += imageSize.width(); + if (premultiplied) { + preMultipliedBGRAtoRGBA(pixels, imageSize.width(), row.data()); + png_write_row(png, row.data()); + } else + png_write_row(png, pixels); + pixels += imageSize.width() * 4; } png_write_end(png, info); @@ -113,4 +115,19 @@ bool PNGImageEncoder::encode(const SkBitmap& bitmap, Vector* outp return true; } +bool PNGImageEncoder::encode(const SkBitmap& bitmap, Vector* output) +{ + if (bitmap.config() != SkBitmap::kARGB_8888_Config) + return false; // Only support ARGB 32 bpp skia bitmaps. + + SkAutoLockPixels bitmapLock(bitmap); + IntSize imageSize(bitmap.width(), bitmap.height()); + return encodePixels(imageSize, static_cast(bitmap.getPixels()), true, output); +} + +bool PNGImageEncoder::encode(const ImageData& bitmap, Vector* output) +{ + return encodePixels(bitmap.size(), bitmap.data()->data()->data(), false, output); +} + } // namespace WebCore diff --git a/Source/WebCore/platform/image-encoders/skia/PNGImageEncoder.h b/Source/WebCore/platform/image-encoders/skia/PNGImageEncoder.h index b8dfec3..31edad3 100644 --- a/Source/WebCore/platform/image-encoders/skia/PNGImageEncoder.h +++ b/Source/WebCore/platform/image-encoders/skia/PNGImageEncoder.h @@ -31,16 +31,19 @@ #ifndef PNGImageEncoder_h #define PNGImageEncoder_h -#include "Vector.h" +#include class SkBitmap; namespace WebCore { +class ImageData; + // Interface for encoding PNG data. This is a wrapper around libpng. class PNGImageEncoder { public: static bool encode(const SkBitmap&, Vector* output); + static bool encode(const ImageData&, Vector* output); }; } // namespace WebCore -- cgit v1.1