void CheckGeneratedImage(Decoder* aDecoder, const IntRect& aRect, uint8_t aFuzz /* = 0 */) { RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); RefPtr<SourceSurface> surface = currentFrame->GetSourceSurface(); const IntSize surfaceSize = surface->GetSize(); // This diagram shows how the surface is divided into regions that the code // below tests for the correct content. The output rect is the bounds of the // region labeled 'C'. // // +---------------------------+ // | A | // +---------+--------+--------+ // | B | C | D | // +---------+--------+--------+ // | E | // +---------------------------+ // Check that the output rect itself is green. (Region 'C'.) EXPECT_TRUE(RectIsSolidColor(surface, aRect, BGRAColor::Green(), aFuzz)); // Check that the area above the output rect is transparent. (Region 'A'.) EXPECT_TRUE(RectIsSolidColor(surface, IntRect(0, 0, surfaceSize.width, aRect.y), BGRAColor::Transparent(), aFuzz)); // Check that the area to the left of the output rect is transparent. (Region 'B'.) EXPECT_TRUE(RectIsSolidColor(surface, IntRect(0, aRect.y, aRect.x, aRect.YMost()), BGRAColor::Transparent(), aFuzz)); // Check that the area to the right of the output rect is transparent. (Region 'D'.) const int32_t widthOnRight = surfaceSize.width - aRect.XMost(); EXPECT_TRUE(RectIsSolidColor(surface, IntRect(aRect.XMost(), aRect.y, widthOnRight, aRect.YMost()), BGRAColor::Transparent(), aFuzz)); // Check that the area below the output rect is transparent. (Region 'E'.) const int32_t heightBelow = surfaceSize.height - aRect.YMost(); EXPECT_TRUE(RectIsSolidColor(surface, IntRect(0, aRect.YMost(), surfaceSize.width, heightBelow), BGRAColor::Transparent(), aFuzz)); }
static already_AddRefed<SourceSurface> CheckDecoderState(const ImageTestCase& aTestCase, Decoder* aDecoder) { EXPECT_TRUE(aDecoder->GetDecodeDone()); EXPECT_EQ(bool(aTestCase.mFlags & TEST_CASE_HAS_ERROR), aDecoder->HasError()); // Verify that the decoder made the expected progress. Progress progress = aDecoder->TakeProgress(); EXPECT_EQ(bool(aTestCase.mFlags & TEST_CASE_HAS_ERROR), bool(progress & FLAG_HAS_ERROR)); if (aTestCase.mFlags & TEST_CASE_HAS_ERROR) { return nullptr; // That's all we can check for bad images. } EXPECT_TRUE(bool(progress & FLAG_SIZE_AVAILABLE)); EXPECT_TRUE(bool(progress & FLAG_DECODE_COMPLETE)); EXPECT_TRUE(bool(progress & FLAG_FRAME_COMPLETE)); EXPECT_EQ(bool(aTestCase.mFlags & TEST_CASE_IS_TRANSPARENT), bool(progress & FLAG_HAS_TRANSPARENCY)); EXPECT_EQ(bool(aTestCase.mFlags & TEST_CASE_IS_ANIMATED), bool(progress & FLAG_IS_ANIMATED)); // The decoder should get the correct size. IntSize size = aDecoder->Size(); EXPECT_EQ(aTestCase.mSize.width, size.width); EXPECT_EQ(aTestCase.mSize.height, size.height); // Get the current frame, which is always the first frame of the image // because CreateAnonymousDecoder() forces a first-frame-only decode. RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); RefPtr<SourceSurface> surface = currentFrame->GetSourceSurface(); // Verify that the resulting surfaces matches our expectations. EXPECT_TRUE(surface->IsDataSourceSurface()); EXPECT_TRUE(surface->GetFormat() == SurfaceFormat::B8G8R8X8 || surface->GetFormat() == SurfaceFormat::B8G8R8A8); EXPECT_EQ(aTestCase.mOutputSize, surface->GetSize()); return surface.forget(); }