aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/images/SkWEBPImageEncoder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/images/SkWEBPImageEncoder.cpp')
-rw-r--r--src/images/SkWEBPImageEncoder.cpp57
1 files changed, 19 insertions, 38 deletions
diff --git a/src/images/SkWEBPImageEncoder.cpp b/src/images/SkWEBPImageEncoder.cpp
index 27c984ac1b..aad06ac1d3 100644
--- a/src/images/SkWEBPImageEncoder.cpp
+++ b/src/images/SkWEBPImageEncoder.cpp
@@ -14,11 +14,15 @@
* limitations under the License.
*/
-#include "SkBitmap.h"
#include "SkImageEncoderPriv.h"
+
+#ifdef SK_HAS_WEBP_LIBRARY
+
+#include "SkBitmap.h"
#include "SkColorPriv.h"
#include "SkStream.h"
#include "SkTemplates.h"
+#include "SkUnPreMultiply.h"
#include "SkUtils.h"
// A WebP decoder only, on top of (subset of) libwebp
@@ -34,8 +38,6 @@ extern "C" {
#include "webp/encode.h"
}
-#include "SkUnPreMultiply.h"
-
typedef void (*ScanlineImporter)(const uint8_t* in, uint8_t* out, int width,
const SkPMColor* SK_RESTRICT ctable);
@@ -172,19 +174,10 @@ static int stream_writer(const uint8_t* data, size_t data_size,
return stream->write(data, data_size) ? 1 : 0;
}
-class SkWEBPImageEncoder : public SkImageEncoder {
-protected:
- bool onEncode(SkWStream* stream, const SkBitmap& bm, int quality) override;
-
-private:
- typedef SkImageEncoder INHERITED;
-};
-
-bool SkWEBPImageEncoder::onEncode(SkWStream* stream, const SkBitmap& bm,
- int quality) {
- const bool hasAlpha = !bm.isOpaque();
+bool SkEncodeImageAsWEBP(SkWStream* stream, const SkPixmap& pixmap, int quality) {
+ const bool hasAlpha = !pixmap.isOpaque();
int bpp = -1;
- const ScanlineImporter scanline_import = ChooseImporter(bm.colorType(), hasAlpha, &bpp);
+ const ScanlineImporter scanline_import = ChooseImporter(pixmap.colorType(), hasAlpha, &bpp);
if (nullptr == scanline_import) {
return false;
}
@@ -192,8 +185,7 @@ bool SkWEBPImageEncoder::onEncode(SkWStream* stream, const SkBitmap& bm,
return false;
}
- SkAutoLockPixels alp(bm);
- if (nullptr == bm.getPixels()) {
+ if (nullptr == pixmap.addr()) {
return false;
}
@@ -204,44 +196,33 @@ bool SkWEBPImageEncoder::onEncode(SkWStream* stream, const SkBitmap& bm,
WebPPicture pic;
WebPPictureInit(&pic);
- pic.width = bm.width();
- pic.height = bm.height();
+ pic.width = pixmap.width();
+ pic.height = pixmap.height();
pic.writer = stream_writer;
pic.custom_ptr = (void*)stream;
- const SkPMColor* colors = bm.getColorTable() ? bm.getColorTable()->readColors() : nullptr;
- const uint8_t* src = (uint8_t*)bm.getPixels();
+ const SkPMColor* colors = pixmap.ctable() ? pixmap.ctable()->readColors() : nullptr;
+ const uint8_t* src = (uint8_t*)pixmap.addr();
const int rgbStride = pic.width * bpp;
+ const size_t rowBytes = pixmap.rowBytes();
// Import (for each scanline) the bit-map image (in appropriate color-space)
// to RGB color space.
- uint8_t* rgb = new uint8_t[rgbStride * pic.height];
+ std::unique_ptr<uint8_t[]> rgb(new uint8_t[rgbStride * pic.height]);
for (int y = 0; y < pic.height; ++y) {
- scanline_import(src + y * bm.rowBytes(), rgb + y * rgbStride,
- pic.width, colors);
+ scanline_import(src + y * rowBytes, &rgb[y * rgbStride], pic.width, colors);
}
bool ok;
if (bpp == 3) {
- ok = SkToBool(WebPPictureImportRGB(&pic, rgb, rgbStride));
+ ok = SkToBool(WebPPictureImportRGB(&pic, &rgb[0], rgbStride));
} else {
- ok = SkToBool(WebPPictureImportRGBA(&pic, rgb, rgbStride));
+ ok = SkToBool(WebPPictureImportRGBA(&pic, &rgb[0], rgbStride));
}
- delete[] rgb;
ok = ok && WebPEncode(&webp_config, &pic);
WebPPictureFree(&pic);
return ok;
}
-
-
-///////////////////////////////////////////////////////////////////////////////
-DEFINE_ENCODER_CREATOR(WEBPImageEncoder);
-///////////////////////////////////////////////////////////////////////////////
-
-static SkImageEncoder* sk_libwebp_efactory(SkImageEncoder::Type t) {
- return (SkEncodedImageFormat::kWEBP == (SkEncodedImageFormat)t) ? new SkWEBPImageEncoder : nullptr;
-}
-
-static SkImageEncoder_EncodeReg gEReg(sk_libwebp_efactory);
+#endif