| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2012 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 | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * | 7 * |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. 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 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| (...skipping 13 matching lines...) Expand all Loading... |
| 24 */ | 24 */ |
| 25 | 25 |
| 26 #include "config.h" | 26 #include "config.h" |
| 27 | 27 |
| 28 #include "core/platform/graphics/chromium/ImageFrameGenerator.h" | 28 #include "core/platform/graphics/chromium/ImageFrameGenerator.h" |
| 29 | 29 |
| 30 #include <gtest/gtest.h> | 30 #include <gtest/gtest.h> |
| 31 #include "MockImageDecoder.h" | 31 #include "MockImageDecoder.h" |
| 32 #include "core/platform/SharedBuffer.h" | 32 #include "core/platform/SharedBuffer.h" |
| 33 #include "core/platform/graphics/chromium/ImageDecodingStore.h" | 33 #include "core/platform/graphics/chromium/ImageDecodingStore.h" |
| 34 #include <wtf/Threading.h> | |
| 35 | 34 |
| 36 using namespace WebCore; | 35 using namespace WebCore; |
| 37 | 36 |
| 38 namespace { | 37 namespace { |
| 39 | 38 |
| 40 class ImageFrameGeneratorTest; | 39 class ImageFrameGeneratorTest; |
| 41 | 40 |
| 42 // Helper methods to generate standard sizes. | 41 // Helper methods to generate standard sizes. |
| 43 SkISize fullSize() { return SkISize::Make(100, 100); } | 42 SkISize fullSize() { return SkISize::Make(100, 100); } |
| 44 SkISize scaledSize() { return SkISize::Make(50, 50); } | 43 SkISize scaledSize() { return SkISize::Make(50, 50); } |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 311 | 310 |
| 312 static void decodeThreadMain(void* arg) | 311 static void decodeThreadMain(void* arg) |
| 313 { | 312 { |
| 314 ImageFrameGenerator* generator = reinterpret_cast<ImageFrameGenerator*>(arg)
; | 313 ImageFrameGenerator* generator = reinterpret_cast<ImageFrameGenerator*>(arg)
; |
| 315 const ScaledImageFragment* tempImage = generator->decodeAndScale(fullSize())
; | 314 const ScaledImageFragment* tempImage = generator->decodeAndScale(fullSize())
; |
| 316 ImageDecodingStore::instance()->unlockCache(generator, tempImage); | 315 ImageDecodingStore::instance()->unlockCache(generator, tempImage); |
| 317 } | 316 } |
| 318 | 317 |
| 319 TEST_F(ImageFrameGeneratorTest, incompleteDecodeBecomesCompleteMultiThreaded) | 318 TEST_F(ImageFrameGeneratorTest, incompleteDecodeBecomesCompleteMultiThreaded) |
| 320 { | 319 { |
| 321 WTF::initializeThreading(); | |
| 322 setFrameStatus(ImageFrame::FramePartial); | 320 setFrameStatus(ImageFrame::FramePartial); |
| 323 | 321 |
| 324 const ScaledImageFragment* tempImage = m_generator->decodeAndScale(fullSize(
)); | 322 const ScaledImageFragment* tempImage = m_generator->decodeAndScale(fullSize(
)); |
| 325 EXPECT_FALSE(tempImage->isComplete()); | 323 EXPECT_FALSE(tempImage->isComplete()); |
| 326 EXPECT_EQ(1, m_frameBufferRequestCount); | 324 EXPECT_EQ(1, m_frameBufferRequestCount); |
| 327 EXPECT_EQ(0, m_decodersDestroyed); | 325 EXPECT_EQ(0, m_decodersDestroyed); |
| 328 ImageDecodingStore::instance()->unlockCache(m_generator.get(), tempImage); | 326 ImageDecodingStore::instance()->unlockCache(m_generator.get(), tempImage); |
| 329 EXPECT_EQ(1u, ImageDecodingStore::instance()->cacheEntries()); | 327 EXPECT_EQ(1u, ImageDecodingStore::instance()->cacheEntries()); |
| 330 | 328 |
| 331 // Frame can now be decoded completely. | 329 // Frame can now be decoded completely. |
| 332 setFrameStatus(ImageFrame::FrameComplete); | 330 setFrameStatus(ImageFrame::FrameComplete); |
| 333 addNewData(); | 331 addNewData(); |
| 334 ThreadIdentifier threadID = createThread(&decodeThreadMain, m_generator.get(
), "DecodeThread"); | 332 ThreadIdentifier threadID = createThread(&decodeThreadMain, m_generator.get(
), "DecodeThread"); |
| 335 waitForThreadCompletion(threadID); | 333 waitForThreadCompletion(threadID); |
| 336 | 334 |
| 337 EXPECT_EQ(2, m_frameBufferRequestCount); | 335 EXPECT_EQ(2, m_frameBufferRequestCount); |
| 338 EXPECT_EQ(1, m_decodersDestroyed); | 336 EXPECT_EQ(1, m_decodersDestroyed); |
| 339 EXPECT_EQ(1u, ImageDecodingStore::instance()->cacheEntries()); | 337 EXPECT_EQ(1u, ImageDecodingStore::instance()->cacheEntries()); |
| 340 | 338 |
| 341 tempImage = m_generator->decodeAndScale(fullSize()); | 339 tempImage = m_generator->decodeAndScale(fullSize()); |
| 342 EXPECT_TRUE(tempImage->isComplete()); | 340 EXPECT_TRUE(tempImage->isComplete()); |
| 343 EXPECT_EQ(2, m_frameBufferRequestCount); | 341 EXPECT_EQ(2, m_frameBufferRequestCount); |
| 344 ImageDecodingStore::instance()->unlockCache(m_generator.get(), tempImage); | 342 ImageDecodingStore::instance()->unlockCache(m_generator.get(), tempImage); |
| 345 } | 343 } |
| 346 | 344 |
| 347 } // namespace | 345 } // namespace |
| OLD | NEW |