summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/platform/image-encoders/skia
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/platform/image-encoders/skia')
-rw-r--r--Source/WebCore/platform/image-encoders/skia/JPEGImageEncoder.cpp49
-rw-r--r--Source/WebCore/platform/image-encoders/skia/JPEGImageEncoder.h7
-rw-r--r--Source/WebCore/platform/image-encoders/skia/PNGImageEncoder.cpp43
-rw-r--r--Source/WebCore/platform/image-encoders/skia/PNGImageEncoder.h5
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