mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 14:18:48 +00:00
13934d9866
- 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)
120 lines
3.6 KiB
C++
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);
|
|
}
|