| Index: src/images/SkImageDecoder_libwebp.cpp
|
| diff --git a/src/images/SkImageDecoder_libwebp.cpp b/src/images/SkImageDecoder_libwebp.cpp
|
| index 6fe4771d9dacfc64e35787797814cae19671113e..07ff83de9bb10c3af344cede1cb0ab5d59315d35 100644
|
| --- a/src/images/SkImageDecoder_libwebp.cpp
|
| +++ b/src/images/SkImageDecoder_libwebp.cpp
|
| @@ -103,8 +103,6 @@ public:
|
| }
|
|
|
| protected:
|
| - bool onBuildTileIndex(SkStreamRewindable *stream, int *width, int *height) override;
|
| - bool onDecodeSubset(SkBitmap* bitmap, const SkIRect& rect) override;
|
| Result onDecode(SkStream* stream, SkBitmap* bm, Mode) override;
|
|
|
| private:
|
| @@ -160,11 +158,6 @@ static void print_webp_error(const SkBitmap& bm, const char msg[]) {
|
| SkDEBUGF(("libwebp error %s [%d %d]", msg, bm.width(), bm.height()));
|
| }
|
|
|
| -static bool return_false(const SkBitmap& bm, const char msg[]) {
|
| - print_webp_error(bm, msg);
|
| - return false; // must always return false
|
| -}
|
| -
|
| static SkImageDecoder::Result return_failure(const SkBitmap& bm, const char msg[]) {
|
| print_webp_error(bm, msg);
|
| return SkImageDecoder::kFailure; // must always return kFailure
|
| @@ -265,24 +258,6 @@ static bool webp_get_config_resize(WebPDecoderConfig* config,
|
| return true;
|
| }
|
|
|
| -static bool webp_get_config_resize_crop(WebPDecoderConfig* config,
|
| - SkBitmap* decodedBitmap,
|
| - const SkIRect& region, bool premultiply) {
|
| -
|
| - if (!webp_get_config_resize(config, decodedBitmap, region.width(),
|
| - region.height(), premultiply)) {
|
| - return false;
|
| - }
|
| -
|
| - config->options.use_cropping = 1;
|
| - config->options.crop_left = region.fLeft;
|
| - config->options.crop_top = region.fTop;
|
| - config->options.crop_width = region.width();
|
| - config->options.crop_height = region.height();
|
| -
|
| - return true;
|
| -}
|
| -
|
| bool SkWEBPImageDecoder::setDecodeConfig(SkBitmap* decodedBitmap, int width, int height) {
|
| SkColorType colorType = this->getPrefColorType(k32Bit_SrcDepth, SkToBool(fHasAlpha));
|
|
|
| @@ -308,99 +283,6 @@ bool SkWEBPImageDecoder::setDecodeConfig(SkBitmap* decodedBitmap, int width, int
|
| return decodedBitmap->setInfo(SkImageInfo::Make(width, height, colorType, alphaType));
|
| }
|
|
|
| -bool SkWEBPImageDecoder::onBuildTileIndex(SkStreamRewindable* stream,
|
| - int *width, int *height) {
|
| - SkAutoTDelete<SkStreamRewindable> streamDeleter(stream);
|
| - int origWidth, origHeight, hasAlpha;
|
| - if (!webp_parse_header(stream, &origWidth, &origHeight, &hasAlpha)) {
|
| - return false;
|
| - }
|
| -
|
| - if (!stream->rewind()) {
|
| - SkDebugf("Failed to rewind webp stream!");
|
| - return false;
|
| - }
|
| -
|
| - *width = origWidth;
|
| - *height = origHeight;
|
| -
|
| - this->fInputStream.reset(streamDeleter.detach());
|
| - this->fOrigWidth = origWidth;
|
| - this->fOrigHeight = origHeight;
|
| - this->fHasAlpha = hasAlpha;
|
| -
|
| - return true;
|
| -}
|
| -
|
| -static bool is_config_compatible(const SkBitmap& bitmap) {
|
| - const SkColorType ct = bitmap.colorType();
|
| - return ct == kARGB_4444_SkColorType || ct == kRGB_565_SkColorType || ct == kN32_SkColorType;
|
| -}
|
| -
|
| -bool SkWEBPImageDecoder::onDecodeSubset(SkBitmap* decodedBitmap,
|
| - const SkIRect& region) {
|
| - SkIRect rect = SkIRect::MakeWH(fOrigWidth, fOrigHeight);
|
| -
|
| - if (!rect.intersect(region)) {
|
| - // If the requested region is entirely outsides the image, return false
|
| - return false;
|
| - }
|
| -
|
| - const int sampleSize = this->getSampleSize();
|
| - SkScaledBitmapSampler sampler(rect.width(), rect.height(), sampleSize);
|
| - const int width = sampler.scaledWidth();
|
| - const int height = sampler.scaledHeight();
|
| -
|
| - // The image can be decoded directly to decodedBitmap if
|
| - // 1. the region is within the image range
|
| - // 2. bitmap's config is compatible
|
| - // 3. bitmap's size is same as the required region (after sampled)
|
| - bool directDecode = (rect == region) &&
|
| - (decodedBitmap->isNull() ||
|
| - (is_config_compatible(*decodedBitmap) &&
|
| - (decodedBitmap->width() == width) &&
|
| - (decodedBitmap->height() == height)));
|
| -
|
| - SkBitmap tmpBitmap;
|
| - SkBitmap *bitmap = decodedBitmap;
|
| -
|
| - if (!directDecode) {
|
| - bitmap = &tmpBitmap;
|
| - }
|
| -
|
| - if (bitmap->isNull()) {
|
| - if (!setDecodeConfig(bitmap, width, height)) {
|
| - return false;
|
| - }
|
| - // alloc from native heap if it is a temp bitmap. (prevent GC)
|
| - bool allocResult = (bitmap == decodedBitmap)
|
| - ? allocPixelRef(bitmap, nullptr)
|
| - : bitmap->tryAllocPixels();
|
| - if (!allocResult) {
|
| - return return_false(*decodedBitmap, "allocPixelRef");
|
| - }
|
| - }
|
| -
|
| - SkAutoLockPixels alp(*bitmap);
|
| - WebPDecoderConfig config;
|
| - if (!webp_get_config_resize_crop(&config, bitmap, rect,
|
| - this->shouldPremultiply())) {
|
| - return false;
|
| - }
|
| -
|
| - // Decode the WebP image data stream using WebP incremental decoding for
|
| - // the specified cropped image-region.
|
| - if (!webp_idecode(this->fInputStream, &config)) {
|
| - return false;
|
| - }
|
| -
|
| - if (!directDecode) {
|
| - return cropBitmap(decodedBitmap, bitmap, sampleSize, region.x(), region.y(),
|
| - region.width(), region.height(), rect.x(), rect.y());
|
| - }
|
| - return true;
|
| -}
|
| -
|
| SkImageDecoder::Result SkWEBPImageDecoder::onDecode(SkStream* stream, SkBitmap* decodedBitmap,
|
| Mode mode) {
|
| #ifdef TIME_DECODE
|
|
|