#pragma once
#include "ImageFrame.h"
#include "ImageFrameCache.h"
#include "ImageOrientation.h"
#include "IntPoint.h"
#include "NativeImage.h"
#include "TextStream.h"
#include <wtf/Forward.h>
#include <wtf/Noncopyable.h>
#include <wtf/Optional.h>
namespace WebCore {
class GraphicsContext;
class ImageDecoder;
class ImageOrientation;
class IntPoint;
class IntSize;
class SharedBuffer;
class ImageSource {
WTF_MAKE_NONCOPYABLE(ImageSource);
friend class BitmapImage;
public:
ImageSource(NativeImagePtr&&);
ImageSource(Image*, AlphaOption = AlphaOption::Premultiplied, GammaAndColorProfileOption = GammaAndColorProfileOption::Applied);
~ImageSource();
void destroyAllDecodedData() { m_frameCache->destroyAllDecodedData(); }
void destroyAllDecodedDataExcludeFrame(size_t excludeFrame) { m_frameCache->destroyAllDecodedDataExcludeFrame(excludeFrame); }
void destroyDecodedDataBeforeFrame(size_t beforeFrame) { m_frameCache->destroyDecodedDataBeforeFrame(beforeFrame); }
void clearFrameBufferCache(size_t);
void clear(SharedBuffer* data);
bool ensureDecoderAvailable(SharedBuffer*);
bool isDecoderAvailable() const { return m_decoder.get(); }
void setData(SharedBuffer* data, bool allDataReceived);
bool dataChanged(SharedBuffer* data, bool allDataReceived);
unsigned decodedSize() const { return m_frameCache->decodedSize(); }
bool isAllDataReceived();
bool isAsyncDecodingRequired();
bool requestFrameAsyncDecodingAtIndex(size_t index, SubsamplingLevel subsamplingLevel) { return m_frameCache->requestFrameAsyncDecodingAtIndex(index, subsamplingLevel); }
bool hasDecodingQueue() { return m_frameCache->hasDecodingQueue(); }
void stopAsyncDecodingQueue() { m_frameCache->stopAsyncDecodingQueue(); }
bool isSizeAvailable() { return m_frameCache->isSizeAvailable(); }
size_t frameCount() { return m_frameCache->frameCount(); }
RepetitionCount repetitionCount() { return m_frameCache->repetitionCount(); }
String filenameExtension() { return m_frameCache->filenameExtension(); }
std::optional<IntPoint> hotSpot() { return m_frameCache->hotSpot(); }
IntSize size() { return m_frameCache->size(); }
IntSize sizeRespectingOrientation() { return m_frameCache->sizeRespectingOrientation(); }
Color singlePixelSolidColor() { return m_frameCache->singlePixelSolidColor(); }
bool frameIsBeingDecodedAtIndex(size_t index) { return m_frameCache->frameIsBeingDecodedAtIndex(index); }
bool frameIsCompleteAtIndex(size_t index) { return m_frameCache->frameIsCompleteAtIndex(index); }
bool frameHasAlphaAtIndex(size_t index) { return m_frameCache->frameHasAlphaAtIndex(index); }
bool frameHasImageAtIndex(size_t index) { return m_frameCache->frameHasImageAtIndex(index); }
bool frameHasValidNativeImageAtIndex(size_t index, SubsamplingLevel subsamplingLevel) { return m_frameCache->frameHasValidNativeImageAtIndex(index, subsamplingLevel); }
SubsamplingLevel frameSubsamplingLevelAtIndex(size_t index) { return m_frameCache->frameSubsamplingLevelAtIndex(index); }
IntSize frameSizeAtIndex(size_t index, SubsamplingLevel subsamplingLevel = SubsamplingLevel::Default) { return m_frameCache->frameSizeAtIndex(index, subsamplingLevel); }
unsigned frameBytesAtIndex(size_t index, SubsamplingLevel subsamplingLevel = SubsamplingLevel::Default) { return m_frameCache->frameBytesAtIndex(index, subsamplingLevel); }
float frameDurationAtIndex(size_t index) { return m_frameCache->frameDurationAtIndex(index); }
ImageOrientation frameOrientationAtIndex(size_t index) { return m_frameCache->frameOrientationAtIndex(index); }
NativeImagePtr frameImageAtIndex(size_t index, SubsamplingLevel = SubsamplingLevel::Default, const GraphicsContext* targetContext = nullptr);
SubsamplingLevel maximumSubsamplingLevel();
SubsamplingLevel subsamplingLevelForScale(float);
NativeImagePtr createFrameImageAtIndex(size_t, SubsamplingLevel = SubsamplingLevel::Default);
private:
void dump(TextStream&);
void setDecoderTargetContext(const GraphicsContext*);
Ref<ImageFrameCache> m_frameCache;
std::unique_ptr<ImageDecoder> m_decoder;
std::optional<SubsamplingLevel> m_maximumSubsamplingLevel;
#if PLATFORM(IOS)
double m_progressiveLoadChunkTime { 0 };
uint16_t m_progressiveLoadChunkCount { 0 };
#endif
AlphaOption m_alphaOption { AlphaOption::Premultiplied };
GammaAndColorProfileOption m_gammaAndColorProfileOption { GammaAndColorProfileOption::Applied };
};
}