| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 hashBitmap(testFrame->bitmap())); | 356 hashBitmap(testFrame->bitmap())); |
| 357 } | 357 } |
| 358 | 358 |
| 359 TEST(GIFImageDecoderTest, updateRequiredPreviousFrameAfterFirstDecode) { | 359 TEST(GIFImageDecoderTest, updateRequiredPreviousFrameAfterFirstDecode) { |
| 360 std::unique_ptr<ImageDecoder> decoder = createDecoder(); | 360 std::unique_ptr<ImageDecoder> decoder = createDecoder(); |
| 361 | 361 |
| 362 RefPtr<SharedBuffer> fullData = | 362 RefPtr<SharedBuffer> fullData = |
| 363 readFile(layoutTestResourcesDir, "animated-10color.gif"); | 363 readFile(layoutTestResourcesDir, "animated-10color.gif"); |
| 364 ASSERT_TRUE(fullData.get()); | 364 ASSERT_TRUE(fullData.get()); |
| 365 | 365 |
| 366 // Give it data that is enough to parse but not decode in order to check the s
tatus | 366 // Give it data that is enough to parse but not decode in order to check the |
| 367 // status. |
| 367 // of requiredPreviousFrameIndex before decoding. | 368 // of requiredPreviousFrameIndex before decoding. |
| 368 size_t partialSize = 1; | 369 size_t partialSize = 1; |
| 369 do { | 370 do { |
| 370 RefPtr<SharedBuffer> data = | 371 RefPtr<SharedBuffer> data = |
| 371 SharedBuffer::create(fullData->data(), partialSize); | 372 SharedBuffer::create(fullData->data(), partialSize); |
| 372 decoder->setData(data.get(), false); | 373 decoder->setData(data.get(), false); |
| 373 ++partialSize; | 374 ++partialSize; |
| 374 } while (!decoder->frameCount() || | 375 } while (!decoder->frameCount() || |
| 375 decoder->frameBufferAtIndex(0)->getStatus() == | 376 decoder->frameBufferAtIndex(0)->getStatus() == |
| 376 ImageFrame::FrameEmpty); | 377 ImageFrame::FrameEmpty); |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 435 EXPECT_EQ(baselineHashes[frameCount - 1], hashBitmap(lastFrame->bitmap())); | 436 EXPECT_EQ(baselineHashes[frameCount - 1], hashBitmap(lastFrame->bitmap())); |
| 436 decoder->clearCacheExceptFrame(kNotFound); | 437 decoder->clearCacheExceptFrame(kNotFound); |
| 437 | 438 |
| 438 // Resume decoding of the first frame. | 439 // Resume decoding of the first frame. |
| 439 ImageFrame* firstFrame = decoder->frameBufferAtIndex(0); | 440 ImageFrame* firstFrame = decoder->frameBufferAtIndex(0); |
| 440 EXPECT_EQ(ImageFrame::FrameComplete, firstFrame->getStatus()); | 441 EXPECT_EQ(ImageFrame::FrameComplete, firstFrame->getStatus()); |
| 441 EXPECT_EQ(baselineHashes[0], hashBitmap(firstFrame->bitmap())); | 442 EXPECT_EQ(baselineHashes[0], hashBitmap(firstFrame->bitmap())); |
| 442 } | 443 } |
| 443 | 444 |
| 444 // The first LZW codes in the image are invalid values that try to create a loop | 445 // The first LZW codes in the image are invalid values that try to create a loop |
| 445 // in the dictionary. Decoding should fail, but not infinitely loop or corrupt m
emory. | 446 // in the dictionary. Decoding should fail, but not infinitely loop or corrupt |
| 447 // memory. |
| 446 TEST(GIFImageDecoderTest, badInitialCode) { | 448 TEST(GIFImageDecoderTest, badInitialCode) { |
| 447 RefPtr<SharedBuffer> testData = | 449 RefPtr<SharedBuffer> testData = |
| 448 readFile(decodersTestingDir, "bad-initial-code.gif"); | 450 readFile(decodersTestingDir, "bad-initial-code.gif"); |
| 449 ASSERT_TRUE(testData.get()); | 451 ASSERT_TRUE(testData.get()); |
| 450 | 452 |
| 451 std::unique_ptr<ImageDecoder> testDecoder = createDecoder(); | 453 std::unique_ptr<ImageDecoder> testDecoder = createDecoder(); |
| 452 testDecoder->setData(testData.get(), true); | 454 testDecoder->setData(testData.get(), true); |
| 453 EXPECT_EQ(1u, testDecoder->frameCount()); | 455 EXPECT_EQ(1u, testDecoder->frameCount()); |
| 454 ASSERT_TRUE(testDecoder->frameBufferAtIndex(0)); | 456 ASSERT_TRUE(testDecoder->frameBufferAtIndex(0)); |
| 455 EXPECT_TRUE(testDecoder->failed()); | 457 EXPECT_TRUE(testDecoder->failed()); |
| 456 } | 458 } |
| 457 | 459 |
| 458 // The image has an invalid LZW code that exceeds dictionary size. Decoding shou
ld fail. | 460 // The image has an invalid LZW code that exceeds dictionary size. Decoding |
| 461 // should fail. |
| 459 TEST(GIFImageDecoderTest, badCode) { | 462 TEST(GIFImageDecoderTest, badCode) { |
| 460 RefPtr<SharedBuffer> testData = readFile(decodersTestingDir, "bad-code.gif"); | 463 RefPtr<SharedBuffer> testData = readFile(decodersTestingDir, "bad-code.gif"); |
| 461 ASSERT_TRUE(testData.get()); | 464 ASSERT_TRUE(testData.get()); |
| 462 | 465 |
| 463 std::unique_ptr<ImageDecoder> testDecoder = createDecoder(); | 466 std::unique_ptr<ImageDecoder> testDecoder = createDecoder(); |
| 464 testDecoder->setData(testData.get(), true); | 467 testDecoder->setData(testData.get(), true); |
| 465 EXPECT_EQ(1u, testDecoder->frameCount()); | 468 EXPECT_EQ(1u, testDecoder->frameCount()); |
| 466 ASSERT_TRUE(testDecoder->frameBufferAtIndex(0)); | 469 ASSERT_TRUE(testDecoder->frameBufferAtIndex(0)); |
| 467 EXPECT_TRUE(testDecoder->failed()); | 470 EXPECT_TRUE(testDecoder->failed()); |
| 468 } | 471 } |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 542 | 545 |
| 543 std::unique_ptr<ImageDecoder> premulDecoder = | 546 std::unique_ptr<ImageDecoder> premulDecoder = |
| 544 wrapUnique(new GIFImageDecoder(ImageDecoder::AlphaPremultiplied, | 547 wrapUnique(new GIFImageDecoder(ImageDecoder::AlphaPremultiplied, |
| 545 ImageDecoder::GammaAndColorProfileApplied, | 548 ImageDecoder::GammaAndColorProfileApplied, |
| 546 ImageDecoder::noDecodedImageByteLimit)); | 549 ImageDecoder::noDecodedImageByteLimit)); |
| 547 std::unique_ptr<ImageDecoder> unpremulDecoder = | 550 std::unique_ptr<ImageDecoder> unpremulDecoder = |
| 548 wrapUnique(new GIFImageDecoder(ImageDecoder::AlphaNotPremultiplied, | 551 wrapUnique(new GIFImageDecoder(ImageDecoder::AlphaNotPremultiplied, |
| 549 ImageDecoder::GammaAndColorProfileApplied, | 552 ImageDecoder::GammaAndColorProfileApplied, |
| 550 ImageDecoder::noDecodedImageByteLimit)); | 553 ImageDecoder::noDecodedImageByteLimit)); |
| 551 | 554 |
| 552 // Partially decoded frame => the frame alpha type is unknown and should refle
ct the requested format. | 555 // Partially decoded frame => the frame alpha type is unknown and should |
| 556 // reflect the requested format. |
| 553 premulDecoder->setData(partialData.get(), false); | 557 premulDecoder->setData(partialData.get(), false); |
| 554 ASSERT_TRUE(premulDecoder->frameCount()); | 558 ASSERT_TRUE(premulDecoder->frameCount()); |
| 555 unpremulDecoder->setData(partialData.get(), false); | 559 unpremulDecoder->setData(partialData.get(), false); |
| 556 ASSERT_TRUE(unpremulDecoder->frameCount()); | 560 ASSERT_TRUE(unpremulDecoder->frameCount()); |
| 557 ImageFrame* premulFrame = premulDecoder->frameBufferAtIndex(0); | 561 ImageFrame* premulFrame = premulDecoder->frameBufferAtIndex(0); |
| 558 EXPECT_TRUE(premulFrame && | 562 EXPECT_TRUE(premulFrame && |
| 559 premulFrame->getStatus() != ImageFrame::FrameComplete); | 563 premulFrame->getStatus() != ImageFrame::FrameComplete); |
| 560 EXPECT_EQ(premulFrame->bitmap().alphaType(), kPremul_SkAlphaType); | 564 EXPECT_EQ(premulFrame->bitmap().alphaType(), kPremul_SkAlphaType); |
| 561 ImageFrame* unpremulFrame = unpremulDecoder->frameBufferAtIndex(0); | 565 ImageFrame* unpremulFrame = unpremulDecoder->frameBufferAtIndex(0); |
| 562 EXPECT_TRUE(unpremulFrame && | 566 EXPECT_TRUE(unpremulFrame && |
| 563 unpremulFrame->getStatus() != ImageFrame::FrameComplete); | 567 unpremulFrame->getStatus() != ImageFrame::FrameComplete); |
| 564 EXPECT_EQ(unpremulFrame->bitmap().alphaType(), kUnpremul_SkAlphaType); | 568 EXPECT_EQ(unpremulFrame->bitmap().alphaType(), kUnpremul_SkAlphaType); |
| 565 | 569 |
| 566 // Fully decoded frame => the frame alpha type is known (opaque). | 570 // Fully decoded frame => the frame alpha type is known (opaque). |
| 567 premulDecoder->setData(fullData.get(), true); | 571 premulDecoder->setData(fullData.get(), true); |
| 568 ASSERT_TRUE(premulDecoder->frameCount()); | 572 ASSERT_TRUE(premulDecoder->frameCount()); |
| 569 unpremulDecoder->setData(fullData.get(), true); | 573 unpremulDecoder->setData(fullData.get(), true); |
| 570 ASSERT_TRUE(unpremulDecoder->frameCount()); | 574 ASSERT_TRUE(unpremulDecoder->frameCount()); |
| 571 premulFrame = premulDecoder->frameBufferAtIndex(0); | 575 premulFrame = premulDecoder->frameBufferAtIndex(0); |
| 572 EXPECT_TRUE(premulFrame && | 576 EXPECT_TRUE(premulFrame && |
| 573 premulFrame->getStatus() == ImageFrame::FrameComplete); | 577 premulFrame->getStatus() == ImageFrame::FrameComplete); |
| 574 EXPECT_EQ(premulFrame->bitmap().alphaType(), kOpaque_SkAlphaType); | 578 EXPECT_EQ(premulFrame->bitmap().alphaType(), kOpaque_SkAlphaType); |
| 575 unpremulFrame = unpremulDecoder->frameBufferAtIndex(0); | 579 unpremulFrame = unpremulDecoder->frameBufferAtIndex(0); |
| 576 EXPECT_TRUE(unpremulFrame && | 580 EXPECT_TRUE(unpremulFrame && |
| 577 unpremulFrame->getStatus() == ImageFrame::FrameComplete); | 581 unpremulFrame->getStatus() == ImageFrame::FrameComplete); |
| 578 EXPECT_EQ(unpremulFrame->bitmap().alphaType(), kOpaque_SkAlphaType); | 582 EXPECT_EQ(unpremulFrame->bitmap().alphaType(), kOpaque_SkAlphaType); |
| 579 } | 583 } |
| 580 | 584 |
| 581 } // namespace blink | 585 } // namespace blink |
| OLD | NEW |