mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-06 15:58:39 +09:00
Port WebP decoder changes.
This breaks animated WebP for the moment, but adds QCMS color management and lexer changes. Tag #831
This commit is contained in:
parent
b504989570
commit
dfe6efae2f
2 changed files with 408 additions and 273 deletions
|
|
@ -16,7 +16,7 @@ namespace mozilla {
|
|||
namespace image {
|
||||
class RasterImage;
|
||||
|
||||
class nsWebPDecoder : public Decoder
|
||||
class nsWebPDecoder final : public Decoder
|
||||
{
|
||||
public:
|
||||
virtual ~nsWebPDecoder();
|
||||
|
|
@ -31,34 +31,28 @@ private:
|
|||
// Decoders should only be instantiated via DecoderFactory.
|
||||
explicit nsWebPDecoder(RasterImage* aImage);
|
||||
|
||||
enum class State
|
||||
{
|
||||
WEBP_DATA,
|
||||
FINISHED_WEBP_DATA
|
||||
};
|
||||
void ApplyColorProfile(const char* aProfile, size_t aLength);
|
||||
|
||||
LexerTransition<State> ReadHeader(const char* aData, size_t aLength);
|
||||
LexerTransition<State> ReadPayload(const char* aData, size_t aLength);
|
||||
LexerTransition<State> FinishedData();
|
||||
LexerResult UpdateBuffer(SourceBufferIterator& aIterator,
|
||||
SourceBufferIterator::State aState);
|
||||
LexerResult ReadData();
|
||||
LexerResult ReadHeader(WebPDemuxer* aDemuxer, bool aIsComplete);
|
||||
LexerResult ReadPayload(WebPDemuxer* aDemuxer, bool aIsComplete);
|
||||
|
||||
nsresult CreateFrame(const nsIntRect& aFrameRect);
|
||||
void EndFrame();
|
||||
|
||||
nsresult GetDataBuffer(const uint8_t*& aData, size_t& aLength);
|
||||
nsresult SaveDataBuffer(const uint8_t* aData, size_t aLength);
|
||||
LexerResult ReadSingle(const uint8_t* aData, size_t aLength,
|
||||
const IntRect& aFrameRect);
|
||||
|
||||
LexerTransition<State> ReadSingle(const uint8_t* aData, size_t aLength,
|
||||
bool aAppend, const IntRect& aFrameRect);
|
||||
|
||||
LexerTransition<State> ReadMultiple(const uint8_t* aData, size_t aLength);
|
||||
|
||||
StreamingLexer<State> mLexer;
|
||||
LexerResult ReadMultiple(WebPDemuxer* aDemuxer, bool aIsComplete);
|
||||
|
||||
/// The SurfacePipe used to write to the output surface.
|
||||
SurfacePipe mPipe;
|
||||
|
||||
/// The buffer used to accumulate data until the complete WebP header is received.
|
||||
Vector<uint8_t> mData;
|
||||
/// The buffer used to accumulate data until the complete WebP header is
|
||||
/// received, if and only if the iterator is discontiguous.
|
||||
Vector<uint8_t> mBufferedData;
|
||||
|
||||
/// The libwebp output buffer descriptor pointing to the decoded data.
|
||||
WebPDecBuffer mBuffer;
|
||||
|
|
@ -78,11 +72,35 @@ private:
|
|||
/// Surface format for the current frame.
|
||||
gfx::SurfaceFormat mFormat;
|
||||
|
||||
/// Frame rect for the current frame.
|
||||
IntRect mFrameRect;
|
||||
|
||||
/// The last row of decoded pixels written to mPipe.
|
||||
int mLastRow;
|
||||
|
||||
/// Number of decoded frames.
|
||||
uint32_t mCurrentFrame;
|
||||
|
||||
/// Pointer to the start of the contiguous encoded image data.
|
||||
const uint8_t* mData;
|
||||
|
||||
/// Length of data pointed to by mData.
|
||||
size_t mLength;
|
||||
|
||||
/// True if the iterator has reached its end.
|
||||
bool mIteratorComplete;
|
||||
|
||||
/// True if this decoding pass requires a WebPDemuxer.
|
||||
bool mNeedDemuxer;
|
||||
|
||||
/// True if we have setup the color profile for the image.
|
||||
bool mGotColorProfile;
|
||||
|
||||
/// Color management profile from the ICCP chunk in the image.
|
||||
qcms_profile* mInProfile;
|
||||
|
||||
/// Color management transform to apply to image data.
|
||||
qcms_transform* mTransform;
|
||||
};
|
||||
|
||||
} // namespace image
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue