mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-28 15:23:51 +00:00
Bug 1208935 - Move Deinterlacer to a standalone file. r=seth
--HG-- extra : rebase_source : 0c5a189769dd741953cab667127ffdef39a60aa7
This commit is contained in:
parent
240ad955ab
commit
9156f29954
45
image/Deinterlacer.cpp
Normal file
45
image/Deinterlacer.cpp
Normal file
@ -0,0 +1,45 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* 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 "Downscaler.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace image {
|
||||
|
||||
Deinterlacer::Deinterlacer(const nsIntSize& aImageSize)
|
||||
: mImageSize(aImageSize)
|
||||
, mBuffer(MakeUnique<uint8_t[]>(mImageSize.width *
|
||||
mImageSize.height *
|
||||
sizeof(uint32_t)))
|
||||
{ }
|
||||
|
||||
uint32_t
|
||||
Deinterlacer::RowSize() const
|
||||
{
|
||||
return mImageSize.width * sizeof(uint32_t);
|
||||
}
|
||||
|
||||
uint8_t*
|
||||
Deinterlacer::RowBuffer(uint32_t aRow)
|
||||
{
|
||||
uint32_t offset = aRow * RowSize();
|
||||
MOZ_ASSERT(offset < mImageSize.width * mImageSize.height * sizeof(uint32_t),
|
||||
"Row is outside of image");
|
||||
return mBuffer.get() + offset;
|
||||
}
|
||||
|
||||
void
|
||||
Deinterlacer::PropagatePassToDownscaler(Downscaler& aDownscaler)
|
||||
{
|
||||
for (int32_t row = 0 ; row < mImageSize.height ; ++row) {
|
||||
memcpy(aDownscaler.RowBuffer(), RowBuffer(row), RowSize());
|
||||
aDownscaler.CommitRow();
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace image
|
||||
} // namespace mozilla
|
50
image/Deinterlacer.h
Normal file
50
image/Deinterlacer.h
Normal file
@ -0,0 +1,50 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* 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/. */
|
||||
|
||||
|
||||
/**
|
||||
* Deinterlacer is a utility class to allow Downscaler to work with interlaced
|
||||
* images.
|
||||
|
||||
* Since Downscaler needs to receive rows in top-to-bottom or
|
||||
* bottom-to-top order, it can't natively handle interlaced images, in which the
|
||||
* rows arrive in an interleaved order. Deinterlacer solves this problem by
|
||||
* acting as an intermediate buffer that records decoded rows. Unlike
|
||||
* Downscaler, it allows the rows to be written in arbitrary order. After each
|
||||
* pass, calling PropagatePassToDownscaler() will downscale every buffered row
|
||||
* in a single operation. The rows remain in the buffer, so rows that were
|
||||
* written in one pass will be included in subsequent passes.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef mozilla_image_Deinterlacer_h
|
||||
#define mozilla_image_Deinterlacer_h
|
||||
|
||||
#include "Downscaler.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace image {
|
||||
|
||||
class Deinterlacer
|
||||
{
|
||||
public:
|
||||
explicit Deinterlacer(const nsIntSize& aImageSize);
|
||||
|
||||
uint8_t* RowBuffer(uint32_t aRow);
|
||||
void PropagatePassToDownscaler(Downscaler& aDownscaler);
|
||||
|
||||
private:
|
||||
uint32_t RowSize() const;
|
||||
|
||||
nsIntSize mImageSize;
|
||||
UniquePtr<uint8_t[]> mBuffer;
|
||||
};
|
||||
|
||||
|
||||
} // namespace image
|
||||
} // namespace mozilla
|
||||
|
||||
#endif // mozilla_image_Deinterlacer_h
|
@ -314,36 +314,7 @@ Downscaler::DownscaleInputLine()
|
||||
}
|
||||
}
|
||||
|
||||
Deinterlacer::Deinterlacer(const nsIntSize& aImageSize)
|
||||
: mImageSize(aImageSize)
|
||||
, mBuffer(MakeUnique<uint8_t[]>(mImageSize.width *
|
||||
mImageSize.height *
|
||||
sizeof(uint32_t)))
|
||||
{ }
|
||||
|
||||
uint32_t
|
||||
Deinterlacer::RowSize() const
|
||||
{
|
||||
return mImageSize.width * sizeof(uint32_t);
|
||||
}
|
||||
|
||||
uint8_t*
|
||||
Deinterlacer::RowBuffer(uint32_t aRow)
|
||||
{
|
||||
uint32_t offset = aRow * RowSize();
|
||||
MOZ_ASSERT(offset < mImageSize.width * mImageSize.height * sizeof(uint32_t),
|
||||
"Row is outside of image");
|
||||
return mBuffer.get() + offset;
|
||||
}
|
||||
|
||||
void
|
||||
Deinterlacer::PropagatePassToDownscaler(Downscaler& aDownscaler)
|
||||
{
|
||||
for (int32_t row = 0 ; row < mImageSize.height ; ++row) {
|
||||
memcpy(aDownscaler.RowBuffer(), RowBuffer(row), RowSize());
|
||||
aDownscaler.CommitRow();
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace image
|
||||
} // namespace mozilla
|
||||
|
@ -162,7 +162,7 @@ public:
|
||||
}
|
||||
|
||||
uint8_t* RowBuffer() { return nullptr; }
|
||||
void ClearRow(uint32_t = 0);
|
||||
void ClearRow(uint32_t = 0) { }
|
||||
void CommitRow() { }
|
||||
bool HasInvalidation() const { return false; }
|
||||
DownscalerInvalidRect TakeInvalidRect() { return DownscalerInvalidRect(); }
|
||||
@ -171,33 +171,7 @@ public:
|
||||
|
||||
#endif // MOZ_ENABLE_SKIA
|
||||
|
||||
/**
|
||||
* Deinterlacer is a utility class to allow Downscaler to work with interlaced
|
||||
* images.
|
||||
|
||||
* Since Downscaler needs to receive rows in top-to-bottom or
|
||||
* bottom-to-top order, it can't natively handle interlaced images, in which the
|
||||
* rows arrive in an interleaved order. Deinterlacer solves this problem by
|
||||
* acting as an intermediate buffer that records decoded rows. Unlike
|
||||
* Downscaler, it allows the rows to be written in arbitrary order. After each
|
||||
* pass, calling PropagatePassToDownscaler() will downscale every buffered row
|
||||
* in a single operation. The rows remain in the buffer, so rows that were
|
||||
* written in one pass will be included in subsequent passes.
|
||||
*/
|
||||
class Deinterlacer
|
||||
{
|
||||
public:
|
||||
explicit Deinterlacer(const nsIntSize& aImageSize);
|
||||
|
||||
uint8_t* RowBuffer(uint32_t aRow);
|
||||
void PropagatePassToDownscaler(Downscaler& aDownscaler);
|
||||
|
||||
private:
|
||||
uint32_t RowSize() const;
|
||||
|
||||
nsIntSize mImageSize;
|
||||
UniquePtr<uint8_t[]> mBuffer;
|
||||
};
|
||||
|
||||
} // namespace image
|
||||
} // namespace mozilla
|
||||
|
@ -8,7 +8,7 @@
|
||||
#define mozilla_image_decoders_nsGIFDecoder2_h
|
||||
|
||||
#include "Decoder.h"
|
||||
|
||||
#include "Deinterlacer.h"
|
||||
#include "GIF2.h"
|
||||
#include "nsCOMPtr.h"
|
||||
|
||||
|
@ -54,6 +54,7 @@ UNIFIED_SOURCES += [
|
||||
'DecodePool.cpp',
|
||||
'Decoder.cpp',
|
||||
'DecoderFactory.cpp',
|
||||
'Deinterlacer.cpp',
|
||||
'DynamicImage.cpp',
|
||||
'FrameAnimator.cpp',
|
||||
'FrozenImage.cpp',
|
||||
|
Loading…
Reference in New Issue
Block a user