| Index: third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp
|
| diff --git a/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp b/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp
|
| index 874b7d06e12a3f288ac7c7d56ac845b6f1a6bcfa..edf80d2fbbe5c151122cfbd9b8d4e7d5e5a82c46 100644
|
| --- a/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp
|
| +++ b/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp
|
| @@ -23,6 +23,7 @@
|
| #include "platform/PlatformInstrumentation.h"
|
| #include "platform/RuntimeEnabledFeatures.h"
|
| #include "platform/graphics/BitmapImageMetrics.h"
|
| +#include "platform/image-decoders/FastSharedBufferReader.h"
|
| #include "platform/image-decoders/bmp/BMPImageDecoder.h"
|
| #include "platform/image-decoders/gif/GIFImageDecoder.h"
|
| #include "platform/image-decoders/ico/ICOImageDecoder.h"
|
| @@ -107,12 +108,16 @@ std::unique_ptr<ImageDecoder> ImageDecoder::create(SniffResult sniffResult, Alph
|
| return nullptr;
|
| }
|
|
|
| +namespace {
|
| +
|
| +// This needs to be updated if we ever add a matches*Signature() which requires more characters.
|
| +constexpr size_t kLongestSignatureLength = sizeof("RIFF????WEBPVP") - 1;
|
| +
|
| +} // anonymous ns
|
| +
|
| ImageDecoder::SniffResult ImageDecoder::determineImageType(const char* contents, size_t length)
|
| {
|
| - const size_t longestSignatureLength = sizeof("RIFF????WEBPVP") - 1;
|
| - DCHECK_EQ(14u, longestSignatureLength);
|
| -
|
| - if (length < longestSignatureLength)
|
| + if (length < kLongestSignatureLength)
|
| return SniffResult::InsufficientData;
|
| if (matchesJPEGSignature(contents))
|
| return SniffResult::JPEG;
|
| @@ -131,16 +136,20 @@ ImageDecoder::SniffResult ImageDecoder::determineImageType(const char* contents,
|
|
|
| ImageDecoder::SniffResult ImageDecoder::determineImageType(const SharedBuffer& data)
|
| {
|
| - const char* contents;
|
| - const size_t length = data.getSomeData<size_t>(contents);
|
| - return determineImageType(contents, length);
|
| + // TODO(fmalita): refactor the method signature to avoid casting.
|
| + RefPtr<SegmentReader> reader = SegmentReader::createFromSharedBuffer(const_cast<SharedBuffer*>(&data));
|
| +
|
| + return determineImageType(*reader);
|
| }
|
|
|
| ImageDecoder::SniffResult ImageDecoder::determineImageType(const SegmentReader& data)
|
| {
|
| - const char* contents;
|
| - const size_t length = data.getSomeData(contents, 0);
|
| - return determineImageType(contents, length);
|
| + // TODO(fmalita): refactor the method signature to avoid casting.
|
| + const FastSharedBufferReader fastReader(const_cast<SegmentReader*>(&data));
|
| + char buffer[kLongestSignatureLength];
|
| + const size_t len = std::min(kLongestSignatureLength, data.size());
|
| +
|
| + return determineImageType(fastReader.getConsecutiveData(0, len, buffer), len);
|
| }
|
|
|
| size_t ImageDecoder::frameCount()
|
|
|