Files
palemoon27/image/test/gtest/TestDecodeToSurface.cpp
T
roytam1 13934d9866 import changes from `dev' branch of rmottola/Arctic-Fox:
- Bug 1184996 (Part 1) - Create decoders with a DecoderFactory. r=tn (dacf21ed2)
- Bug 1184996 (Part 2) - Clean up RasterImage's decoding API. r=tn (c127af0b3)
- Bug 1184996 (Part 3) - Replace all remaining references to 'size decodes' with 'metadata decodes'. r=tn (3744e5df4)
- Bug 1184996 (Part 4) - Forbid instantiation of decoders except via DecoderFactory. r=tn (588d56d84)
- No bug - Remove extra printf left over from bug 1127618. r=smaug (b02f7bfe1)
- Bug 1187386 (Part 1) - Make most decoder state private. r=tn (328dbc605)
- Bug 1187386 (Part 2) - Rework decoder code to avoid calling Decode::GetImage(). r=tn (9a94096f9)
- Bug 1187386 (Part 3) - Don't destroy Decoder::mImage if Decoder::mImage is null. r=tn (cbb6738cd)
- Bug 1187386 (Part 4) - Make imgFrame::SetOptimizable() callable from off-main-thread. r=tn (f03478b28)
- Bug 1187386 (Part 5) - Merge Decoder::SetSizeOnImage() into ImageMetadata::SetOnImage(). r=tn (8afb5d4a3)
- Bug 1033090 - Truncate a large URI in the user message about it. r=seth (7bd4b447b)
- Bug 1187386 (Part 6) - Merge Decoder::Finish() and RasterImage::OnDecodingComplete() into RasterImage::FinalizeDecoder(). r=tn (f342dd5db)
- Bug 1181863 (Part 1) - Add support for reading from nsIInputStreams directly to SourceBuffer. r=tn (74748dad9)
- Bug 1181863 (Part 2) - Add ImageOps::DecodeToSurface() to allow image decoding without involving any main-thread-only objects. r=tn (25b86eb50)
- Bug 1181863 (Part 3) - Add tests for DecodeToSurface(). r=tn (9506eb2f6)
-  Bug 1181863 - Part 4: Fix the build bustage (aee05bdc9)
- Bug 1187546 - Make it possible to ask image decoders to only decode the first frame. r=tn (1beeeefb6)
- Bug 1191100 - Remove XPIDL signature comments in .cpp files. r=ehsan (ee75fe3b5)
2021-09-09 09:51:21 +08:00

120 lines
3.6 KiB
C++

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "gtest/gtest.h"
#include "Common.h"
#include "imgIContainer.h"
#include "imgITools.h"
#include "ImageOps.h"
#include "mozilla/gfx/2D.h"
#include "nsComponentManagerUtils.h"
#include "nsCOMPtr.h"
#include "nsIInputStream.h"
#include "nsIRunnable.h"
#include "nsIThread.h"
#include "mozilla/nsRefPtr.h"
#include "nsString.h"
#include "nsThreadUtils.h"
using namespace mozilla;
using namespace mozilla::gfx;
using namespace mozilla::image;
TEST(ImageDecodeToSurface, ImageModuleAvailable)
{
// We can run into problems if XPCOM modules get initialized in the wrong
// order. It's important that this test run first, both as a sanity check and
// to ensure we get the module initialization order we want.
nsCOMPtr<imgITools> imgTools =
do_CreateInstance("@mozilla.org/image/tools;1");
EXPECT_TRUE(imgTools != nullptr);
}
class DecodeToSurfaceRunnable : public nsRunnable
{
public:
DecodeToSurfaceRunnable(nsIInputStream* aInputStream,
const ImageTestCase& aTestCase)
: mInputStream(aInputStream)
, mTestCase(aTestCase)
{ }
NS_IMETHOD Run()
{
Go();
return NS_OK;
}
void Go()
{
nsRefPtr<SourceSurface> surface =
ImageOps::DecodeToSurface(mInputStream,
nsAutoCString(mTestCase.mMimeType),
imgIContainer::DECODE_FLAGS_DEFAULT);
ASSERT_TRUE(surface != nullptr);
EXPECT_EQ(SurfaceType::DATA, surface->GetType());
EXPECT_TRUE(surface->GetFormat() == SurfaceFormat::B8G8R8X8 ||
surface->GetFormat() == SurfaceFormat::B8G8R8A8);
EXPECT_EQ(mTestCase.mSize, surface->GetSize());
EXPECT_TRUE(IsSolidColor(surface, BGRAColor::Green(), mTestCase.mFuzzy));
}
private:
nsCOMPtr<nsIInputStream> mInputStream;
ImageTestCase mTestCase;
};
static void
RunDecodeToSurface(const ImageTestCase& aTestCase)
{
nsCOMPtr<nsIInputStream> inputStream = LoadFile(aTestCase.mPath);
ASSERT_TRUE(inputStream != nullptr);
nsCOMPtr<nsIThread> thread;
nsresult rv = NS_NewThread(getter_AddRefs(thread), nullptr);
ASSERT_TRUE(NS_SUCCEEDED(rv));
// We run the DecodeToSurface tests off-main-thread to ensure that
// DecodeToSurface doesn't require any main-thread-only code.
nsCOMPtr<nsIRunnable> runnable =
new DecodeToSurfaceRunnable(inputStream, aTestCase);
thread->Dispatch(runnable, nsIThread::DISPATCH_SYNC);
thread->Shutdown();
}
TEST(ImageDecodeToSurface, PNG) { RunDecodeToSurface(GreenPNGTestCase()); }
TEST(ImageDecodeToSurface, GIF) { RunDecodeToSurface(GreenGIFTestCase()); }
TEST(ImageDecodeToSurface, JPG) { RunDecodeToSurface(GreenJPGTestCase()); }
TEST(ImageDecodeToSurface, BMP) { RunDecodeToSurface(GreenBMPTestCase()); }
TEST(ImageDecodeToSurface, ICO) { RunDecodeToSurface(GreenICOTestCase()); }
TEST(ImageDecodeToSurface, AnimatedGIF)
{
RunDecodeToSurface(GreenFirstFrameAnimatedGIFTestCase());
}
TEST(ImageDecodeToSurface, AnimatedPNG)
{
RunDecodeToSurface(GreenFirstFrameAnimatedPNGTestCase());
}
TEST(ImageDecodeToSurface, Corrupt)
{
ImageTestCase testCase = CorruptTestCase();
nsCOMPtr<nsIInputStream> inputStream = LoadFile(testCase.mPath);
ASSERT_TRUE(inputStream != nullptr);
nsRefPtr<SourceSurface> surface =
ImageOps::DecodeToSurface(inputStream,
nsAutoCString(testCase.mMimeType),
imgIContainer::DECODE_FLAGS_DEFAULT);
EXPECT_TRUE(surface == nullptr);
}