diff options
Diffstat (limited to 'Source/WebCore/platform/image-encoders/skia')
4 files changed, 78 insertions, 26 deletions
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<const SkPMColor*>(pixels); + for (; pixelCount-- > 0; ++input) { *output++ = SkGetPackedR32(*input); *output++ = SkGetPackedG32(*input); *output++ = SkGetPackedB32(*input); } } -bool JPEGImageEncoder::encode(const SkBitmap& bitmap, int quality, Vector<unsigned char>* 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<unsigned char>* output) +{ + IntSize imageSize(inputSize); imageSize.clampNegativeToZero(); JPEGOutputBuffer destination; destination.output = output; @@ -126,12 +134,15 @@ bool JPEGImageEncoder::encode(const SkBitmap& bitmap, int quality, Vector<unsign jpeg_set_quality(&cinfo, quality, TRUE); jpeg_start_compress(&cinfo, TRUE); - const SkPMColor* pixels = static_cast<SkPMColor*>(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<unsign return true; } +bool JPEGImageEncoder::encode(const SkBitmap& bitmap, int quality, Vector<unsigned char>* 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<unsigned char *>(bitmap.getPixels()), + true, quality, output); +} + +bool JPEGImageEncoder::encode(const ImageData& imageData, int quality, Vector<unsigned char>* 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 <wtf/Vector.h> 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<unsigned char>*); + static bool encode(const ImageData&, int quality, Vector<unsigned char>*); // 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<Vector<unsigned char>*>(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<const SkPMColor*>(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<unsigned char>* output) +static bool encodePixels(const IntSize& inputSize, unsigned char* inputPixels, + bool premultiplied, Vector<unsigned char>* 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<unsigned char> row; @@ -100,12 +99,15 @@ bool PNGImageEncoder::encode(const SkBitmap& bitmap, Vector<unsigned char>* outp 8, PNG_COLOR_TYPE_RGB_ALPHA, 0, 0, 0); png_write_info(png, info); - const SkPMColor* pixels = static_cast<SkPMColor*>(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<unsigned char>* outp return true; } +bool PNGImageEncoder::encode(const SkBitmap& bitmap, Vector<unsigned char>* 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<unsigned char*>(bitmap.getPixels()), true, output); +} + +bool PNGImageEncoder::encode(const ImageData& bitmap, Vector<unsigned char>* 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 <wtf/Vector.h> 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<unsigned char>* output); + static bool encode(const ImageData&, Vector<unsigned char>* output); }; } // namespace WebCore |