| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "platform/image-decoders/ImageDecoderTestHelpers.h" | 5 #include "platform/image-decoders/ImageDecoderTestHelpers.h" |
| 6 | 6 |
| 7 #include "platform/SharedBuffer.h" | 7 #include "platform/SharedBuffer.h" |
| 8 #include "platform/image-decoders/ImageDecoder.h" | 8 #include "platform/image-decoders/ImageDecoder.h" |
| 9 #include "platform/image-decoders/ImageFrame.h" | 9 #include "platform/image-decoders/ImageFrame.h" |
| 10 #include "platform/testing/UnitTestHelpers.h" | 10 #include "platform/testing/UnitTestHelpers.h" |
| 11 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
| 12 #include "wtf/OwnPtr.h" | |
| 13 #include "wtf/StringHasher.h" | 12 #include "wtf/StringHasher.h" |
| 13 #include <memory> |
| 14 | 14 |
| 15 namespace blink { | 15 namespace blink { |
| 16 | 16 |
| 17 PassRefPtr<SharedBuffer> readFile(const char* fileName) | 17 PassRefPtr<SharedBuffer> readFile(const char* fileName) |
| 18 { | 18 { |
| 19 String filePath = testing::blinkRootDir(); | 19 String filePath = testing::blinkRootDir(); |
| 20 filePath.append(fileName); | 20 filePath.append(fileName); |
| 21 return testing::readFromFile(filePath); | 21 return testing::readFromFile(filePath); |
| 22 } | 22 } |
| 23 | 23 |
| 24 PassRefPtr<SharedBuffer> readFile(const char* dir, const char* fileName) | 24 PassRefPtr<SharedBuffer> readFile(const char* dir, const char* fileName) |
| 25 { | 25 { |
| 26 String filePath = testing::blinkRootDir(); | 26 String filePath = testing::blinkRootDir(); |
| 27 filePath.append("/"); | 27 filePath.append("/"); |
| 28 filePath.append(dir); | 28 filePath.append(dir); |
| 29 filePath.append("/"); | 29 filePath.append("/"); |
| 30 filePath.append(fileName); | 30 filePath.append(fileName); |
| 31 | 31 |
| 32 return testing::readFromFile(filePath); | 32 return testing::readFromFile(filePath); |
| 33 } | 33 } |
| 34 | 34 |
| 35 unsigned hashBitmap(const SkBitmap& bitmap) | 35 unsigned hashBitmap(const SkBitmap& bitmap) |
| 36 { | 36 { |
| 37 return StringHasher::hashMemory(bitmap.getPixels(), bitmap.getSize()); | 37 return StringHasher::hashMemory(bitmap.getPixels(), bitmap.getSize()); |
| 38 } | 38 } |
| 39 | 39 |
| 40 static unsigned createDecodingBaseline(DecoderCreator createDecoder, SharedBuffe
r* data) | 40 static unsigned createDecodingBaseline(DecoderCreator createDecoder, SharedBuffe
r* data) |
| 41 { | 41 { |
| 42 OwnPtr<ImageDecoder> decoder = createDecoder(); | 42 std::unique_ptr<ImageDecoder> decoder = createDecoder(); |
| 43 decoder->setData(data, true); | 43 decoder->setData(data, true); |
| 44 ImageFrame* frame = decoder->frameBufferAtIndex(0); | 44 ImageFrame* frame = decoder->frameBufferAtIndex(0); |
| 45 return hashBitmap(frame->bitmap()); | 45 return hashBitmap(frame->bitmap()); |
| 46 } | 46 } |
| 47 | 47 |
| 48 void createDecodingBaseline(DecoderCreator createDecoder, SharedBuffer* data, Ve
ctor<unsigned>* baselineHashes) | 48 void createDecodingBaseline(DecoderCreator createDecoder, SharedBuffer* data, Ve
ctor<unsigned>* baselineHashes) |
| 49 { | 49 { |
| 50 OwnPtr<ImageDecoder> decoder = createDecoder(); | 50 std::unique_ptr<ImageDecoder> decoder = createDecoder(); |
| 51 decoder->setData(data, true); | 51 decoder->setData(data, true); |
| 52 size_t frameCount = decoder->frameCount(); | 52 size_t frameCount = decoder->frameCount(); |
| 53 for (size_t i = 0; i < frameCount; ++i) { | 53 for (size_t i = 0; i < frameCount; ++i) { |
| 54 ImageFrame* frame = decoder->frameBufferAtIndex(i); | 54 ImageFrame* frame = decoder->frameBufferAtIndex(i); |
| 55 baselineHashes->append(hashBitmap(frame->bitmap())); | 55 baselineHashes->append(hashBitmap(frame->bitmap())); |
| 56 } | 56 } |
| 57 } | 57 } |
| 58 | 58 |
| 59 void testByteByByteDecode(DecoderCreator createDecoder, const char* file, size_t
expectedFrameCount, int expectedRepetitionCount) | 59 void testByteByByteDecode(DecoderCreator createDecoder, const char* file, size_t
expectedFrameCount, int expectedRepetitionCount) |
| 60 { | 60 { |
| 61 RefPtr<SharedBuffer> data = readFile(file); | 61 RefPtr<SharedBuffer> data = readFile(file); |
| 62 ASSERT_TRUE(data.get()); | 62 ASSERT_TRUE(data.get()); |
| 63 ASSERT_TRUE(data->data()); | 63 ASSERT_TRUE(data->data()); |
| 64 | 64 |
| 65 Vector<unsigned> baselineHashes; | 65 Vector<unsigned> baselineHashes; |
| 66 createDecodingBaseline(createDecoder, data.get(), &baselineHashes); | 66 createDecodingBaseline(createDecoder, data.get(), &baselineHashes); |
| 67 | 67 |
| 68 OwnPtr<ImageDecoder> decoder = createDecoder(); | 68 std::unique_ptr<ImageDecoder> decoder = createDecoder(); |
| 69 | 69 |
| 70 size_t frameCount = 0; | 70 size_t frameCount = 0; |
| 71 size_t framesDecoded = 0; | 71 size_t framesDecoded = 0; |
| 72 | 72 |
| 73 // Pass data to decoder byte by byte. | 73 // Pass data to decoder byte by byte. |
| 74 RefPtr<SharedBuffer> sourceData[2] = { SharedBuffer::create(), SharedBuffer:
:create() }; | 74 RefPtr<SharedBuffer> sourceData[2] = { SharedBuffer::create(), SharedBuffer:
:create() }; |
| 75 const char* source = data->data(); | 75 const char* source = data->data(); |
| 76 | 76 |
| 77 for (size_t length = 1; length <= data->size() && !decoder->failed(); ++leng
th) { | 77 for (size_t length = 1; length <= data->size() && !decoder->failed(); ++leng
th) { |
| 78 sourceData[0]->append(source, 1u); | 78 sourceData[0]->append(source, 1u); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 const unsigned hash = createDecodingBaseline(createDecoder, data.get()); | 122 const unsigned hash = createDecodingBaseline(createDecoder, data.get()); |
| 123 | 123 |
| 124 // In order to do any verification, this test needs to move the data owned | 124 // In order to do any verification, this test needs to move the data owned |
| 125 // by the SharedBuffer. A way to guarantee that is to create a new one, and | 125 // by the SharedBuffer. A way to guarantee that is to create a new one, and |
| 126 // then append a string of characters greater than kSegmentSize. This | 126 // then append a string of characters greater than kSegmentSize. This |
| 127 // results in writing the data into a segment, skipping the internal | 127 // results in writing the data into a segment, skipping the internal |
| 128 // contiguous buffer. | 128 // contiguous buffer. |
| 129 RefPtr<SharedBuffer> segmentedData = SharedBuffer::create(); | 129 RefPtr<SharedBuffer> segmentedData = SharedBuffer::create(); |
| 130 segmentedData->append(data->data(), data->size()); | 130 segmentedData->append(data->data(), data->size()); |
| 131 | 131 |
| 132 OwnPtr<ImageDecoder> decoder = createDecoder(); | 132 std::unique_ptr<ImageDecoder> decoder = createDecoder(); |
| 133 decoder->setData(segmentedData.get(), true); | 133 decoder->setData(segmentedData.get(), true); |
| 134 | 134 |
| 135 ASSERT_TRUE(decoder->isSizeAvailable()); | 135 ASSERT_TRUE(decoder->isSizeAvailable()); |
| 136 | 136 |
| 137 // This will call SharedBuffer::mergeSegmentsIntoBuffer, copying all | 137 // This will call SharedBuffer::mergeSegmentsIntoBuffer, copying all |
| 138 // segments into the contiguous buffer. If the ImageDecoder was pointing to | 138 // segments into the contiguous buffer. If the ImageDecoder was pointing to |
| 139 // data in a segment, its pointer would no longer be valid. | 139 // data in a segment, its pointer would no longer be valid. |
| 140 segmentedData->data(); | 140 segmentedData->data(); |
| 141 | 141 |
| 142 ImageFrame* frame = decoder->frameBufferAtIndex(0); | 142 ImageFrame* frame = decoder->frameBufferAtIndex(0); |
| 143 ASSERT_FALSE(decoder->failed()); | 143 ASSERT_FALSE(decoder->failed()); |
| 144 EXPECT_EQ(frame->getStatus(), ImageFrame::FrameComplete); | 144 EXPECT_EQ(frame->getStatus(), ImageFrame::FrameComplete); |
| 145 EXPECT_EQ(hashBitmap(frame->bitmap()), hash); | 145 EXPECT_EQ(hashBitmap(frame->bitmap()), hash); |
| 146 } | 146 } |
| 147 | 147 |
| 148 } // namespace blink | 148 } // namespace blink |
| OLD | NEW |