Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Public Member Functions | Static Public Member Functions | Private Member Functions | List of all members
SkPngInterlacedDecoder Class Reference
Inheritance diagram for SkPngInterlacedDecoder:
SkPngCodec SkCodec SkNoncopyable

Public Member Functions

 SkPngInterlacedDecoder (SkEncodedInfo &&info, std::unique_ptr< SkStream > stream, SkPngChunkReader *reader, png_structp png_ptr, png_infop info_ptr, int bitDepth, int numberPasses)
 
- Public Member Functions inherited from SkPngCodec
void setIdatLength (size_t len)
 
 ~SkPngCodec () override
 
- Public Member Functions inherited from SkCodec
virtual ~SkCodec ()
 
SkImageInfo getInfo () const
 
SkISize dimensions () const
 
SkIRect bounds () const
 
const skcms_ICCProfilegetICCProfile () const
 
SkEncodedOrigin getOrigin () const
 
SkISize getScaledDimensions (float desiredScale) const
 
bool getValidSubset (SkIRect *desiredSubset) const
 
SkEncodedImageFormat getEncodedFormat () const
 
virtual std::unique_ptr< SkStreamgetEncodedData () const
 
Result getPixels (const SkImageInfo &info, void *pixels, size_t rowBytes, const Options *)
 
Result getPixels (const SkImageInfo &info, void *pixels, size_t rowBytes)
 
Result getPixels (const SkPixmap &pm, const Options *opts=nullptr)
 
std::tuple< sk_sp< SkImage >, SkCodec::ResultgetImage (const SkImageInfo &info, const Options *opts=nullptr)
 
std::tuple< sk_sp< SkImage >, SkCodec::ResultgetImage ()
 
bool queryYUVAInfo (const SkYUVAPixmapInfo::SupportedDataTypes &supportedDataTypes, SkYUVAPixmapInfo *yuvaPixmapInfo) const
 
Result getYUVAPlanes (const SkYUVAPixmaps &yuvaPixmaps)
 
Result startIncrementalDecode (const SkImageInfo &dstInfo, void *dst, size_t rowBytes, const Options *)
 
Result startIncrementalDecode (const SkImageInfo &dstInfo, void *dst, size_t rowBytes)
 
Result incrementalDecode (int *rowsDecoded=nullptr)
 
Result startScanlineDecode (const SkImageInfo &dstInfo, const Options *options)
 
Result startScanlineDecode (const SkImageInfo &dstInfo)
 
int getScanlines (void *dst, int countLines, size_t rowBytes)
 
bool skipScanlines (int countLines)
 
SkScanlineOrder getScanlineOrder () const
 
int nextScanline () const
 
int outputScanline (int inputScanline) const
 
int getFrameCount ()
 
bool getFrameInfo (int index, FrameInfo *info) const
 
std::vector< FrameInfogetFrameInfo ()
 
int getRepetitionCount ()
 

Static Public Member Functions

static void InterlacedRowCallback (png_structp png_ptr, png_bytep row, png_uint_32 rowNum, int pass)
 
- Static Public Member Functions inherited from SkPngCodec
static bool IsPng (const void *, size_t)
 
static std::unique_ptr< SkCodecMakeFromStream (std::unique_ptr< SkStream >, Result *, SkPngChunkReader *=nullptr)
 
- Static Public Member Functions inherited from SkCodec
static constexpr size_t MinBufferedBytesNeeded ()
 
static const char * ResultToString (Result)
 
static std::unique_ptr< SkCodecMakeFromStream (std::unique_ptr< SkStream >, SkSpan< const SkCodecs::Decoder > decoders, Result *=nullptr, SkPngChunkReader *=nullptr, SelectionPolicy selectionPolicy=SelectionPolicy::kPreferStillImage)
 
static std::unique_ptr< SkCodecMakeFromStream (std::unique_ptr< SkStream >, Result *=nullptr, SkPngChunkReader *=nullptr, SelectionPolicy selectionPolicy=SelectionPolicy::kPreferStillImage)
 
static std::unique_ptr< SkCodecMakeFromData (sk_sp< SkData >, SkSpan< const SkCodecs::Decoder > decoders, SkPngChunkReader *=nullptr)
 
static std::unique_ptr< SkCodecMakeFromData (sk_sp< SkData >, SkPngChunkReader *=nullptr)
 
static void Register (bool(*peek)(const void *, size_t), std::unique_ptr< SkCodec >(*make)(std::unique_ptr< SkStream >, SkCodec::Result *))
 

Private Member Functions

Result decodeAllRows (void *dst, size_t rowBytes, int *rowsDecoded) override
 
void setRange (int firstRow, int lastRow, void *dst, size_t rowBytes) override
 
Result decode (int *rowsDecoded) override
 

Additional Inherited Members

- Public Types inherited from SkCodec
enum  Result {
  kSuccess , kIncompleteInput , kErrorInInput , kInvalidConversion ,
  kInvalidScale , kInvalidParameters , kInvalidInput , kCouldNotRewind ,
  kInternalError , kUnimplemented
}
 
enum class  SelectionPolicy { kPreferStillImage , kPreferAnimation }
 
enum  ZeroInitialized { kYes_ZeroInitialized , kNo_ZeroInitialized }
 
enum  SkScanlineOrder { kTopDown_SkScanlineOrder , kBottomUp_SkScanlineOrder }
 
- Static Public Attributes inherited from SkCodec
static constexpr int kNoFrame = -1
 
static constexpr int kRepetitionCountInfinite = -1
 
- Protected Types inherited from SkCodec
using XformFormat = skcms_PixelFormat
 
- Protected Member Functions inherited from SkPngCodec
 SkPngCodec (SkEncodedInfo &&, std::unique_ptr< SkStream >, SkPngChunkReader *, void *png_ptr, void *info_ptr, int bitDepth)
 
Result onGetPixels (const SkImageInfo &, void *, size_t, const Options &, int *) override
 
SkEncodedImageFormat onGetEncodedFormat () const override
 
bool onRewind () override
 
SkSamplergetSampler (bool createIfNecessary) override
 
void applyXformRow (void *dst, const void *src)
 
voidp png_ptr ()
 
voidp info_ptr ()
 
SkSwizzlerswizzler ()
 
void initializeXformParams ()
 
bool processData ()
 
Result onStartIncrementalDecode (const SkImageInfo &dstInfo, void *pixels, size_t rowBytes, const SkCodec::Options &) override
 
Result onIncrementalDecode (int *) override
 
- Protected Member Functions inherited from SkCodec
const SkEncodedInfogetEncodedInfo () const
 
 SkCodec (SkEncodedInfo &&, XformFormat srcFormat, std::unique_ptr< SkStream >, SkEncodedOrigin=kTopLeft_SkEncodedOrigin)
 
void setSrcXformFormat (XformFormat pixelFormat)
 
XformFormat getSrcXformFormat () const
 
virtual bool onGetGainmapInfo (SkGainmapInfo *, std::unique_ptr< SkStream > *)
 
virtual SkISize onGetScaledDimensions (float) const
 
virtual bool onDimensionsSupported (const SkISize &)
 
virtual bool onQueryYUVAInfo (const SkYUVAPixmapInfo::SupportedDataTypes &, SkYUVAPixmapInfo *) const
 
virtual Result onGetYUVAPlanes (const SkYUVAPixmaps &)
 
virtual bool onGetValidSubset (SkIRect *) const
 
bool rewindIfNeeded ()
 
SkStreamstream ()
 
virtual SkScanlineOrder onGetScanlineOrder () const
 
const SkImageInfodstInfo () const
 
const Optionsoptions () const
 
int currScanline () const
 
virtual int onOutputScanline (int inputScanline) const
 
virtual bool conversionSupported (const SkImageInfo &dst, bool srcIsOpaque, bool needsColorXform)
 
virtual bool usesColorXform () const
 
void applyColorXform (void *dst, const void *src, int count) const
 
bool colorXform () const
 
bool xformOnDecode () const
 
virtual int onGetFrameCount ()
 
virtual bool onGetFrameInfo (int, FrameInfo *) const
 
virtual int onGetRepetitionCount ()
 
- Protected Attributes inherited from SkPngCodec
sk_sp< SkPngChunkReaderfPngChunkReader
 
voidp fPng_ptr
 
voidp fInfo_ptr
 
sk_sp< SkColorPalettefColorTable
 
std::unique_ptr< SkSwizzlerfSwizzler
 
skia_private::AutoTMalloc< uint8_t > fStorage
 
void * fColorXformSrcRow
 
const int fBitDepth
 

Detailed Description

Definition at line 625 of file SkPngCodec.cpp.

Constructor & Destructor Documentation

◆ SkPngInterlacedDecoder()

SkPngInterlacedDecoder::SkPngInterlacedDecoder ( SkEncodedInfo &&  info,
std::unique_ptr< SkStream stream,
SkPngChunkReader reader,
png_structp  png_ptr,
png_infop  info_ptr,
int  bitDepth,
int  numberPasses 
)
inline

Definition at line 627 of file SkPngCodec.cpp.

630 : INHERITED(std::move(info), std::move(stream), reader, png_ptr, info_ptr, bitDepth)
631 , fNumberPasses(numberPasses)
632 , fFirstRow(0)
633 , fLastRow(0)
634 , fLinesDecoded(0)
635 , fInterlacedComplete(false)
636 , fPng_rowbytes(0)
637 {}
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
Definition DM.cpp:213
SkStream * stream()
Definition SkCodec.h:865
voidp info_ptr()
Definition SkPngCodec.h:66
voidp png_ptr()
Definition SkPngCodec.h:65

Member Function Documentation

◆ decode()

Result SkPngInterlacedDecoder::decode ( int rowsDecoded)
inlineoverrideprivatevirtual

Implements SkPngCodec.

Definition at line 731 of file SkPngCodec.cpp.

731 {
732 const bool success = this->processData();
733
734 // Now apply Xforms on all the rows that were decoded.
735 if (!fLinesDecoded) {
736 if (rowsDecoded) {
737 *rowsDecoded = 0;
738 }
739 return log_and_return_error(success);
740 }
741
742 const int sampleY = this->swizzler() ? this->swizzler()->sampleY() : 1;
743 const int rowsNeeded = get_scaled_dimension(fLastRow - fFirstRow + 1, sampleY);
744
745 // FIXME: For resuming interlace, we may swizzle a row that hasn't changed. But it
746 // may be too tricky/expensive to handle that correctly.
747
748 // Offset srcRow by get_start_coord rows. We do not need to account for fFirstRow,
749 // since the first row in fInterlaceBuffer corresponds to fFirstRow.
750 int srcRow = get_start_coord(sampleY);
751 void* dst = fDst;
752 int rowsWrittenToOutput = 0;
753 while (rowsWrittenToOutput < rowsNeeded && srcRow < fLinesDecoded) {
754 png_bytep src = SkTAddOffset<png_byte>(fInterlaceBuffer.get(), fPng_rowbytes * srcRow);
755 this->applyXformRow(dst, src);
756 dst = SkTAddOffset<void>(dst, fRowBytes);
757
758 rowsWrittenToOutput++;
759 srcRow += sampleY;
760 }
761
762 if (success && fInterlacedComplete) {
763 return kSuccess;
764 }
765
766 if (rowsDecoded) {
767 *rowsDecoded = rowsWrittenToOutput;
768 }
769 return log_and_return_error(success);
770 }
static int get_scaled_dimension(int srcDimension, int sampleSize)
Definition SkCodecPriv.h:44
static int get_start_coord(int sampleFactor)
Definition SkCodecPriv.h:57
static SkCodec::Result log_and_return_error(bool success)
@ kSuccess
Definition SkCodec.h:80
void applyXformRow(void *dst, const void *src)
SkSwizzler * swizzler()
Definition SkPngCodec.h:68
bool processData()
int sampleY() const
Definition SkSampler.h:39
dst
Definition cp.py:12

◆ decodeAllRows()

Result SkPngInterlacedDecoder::decodeAllRows ( void *  dst,
size_t  rowBytes,
int rowsDecoded 
)
inlineoverrideprivatevirtual

Implements SkPngCodec.

Definition at line 691 of file SkPngCodec.cpp.

691 {
692 const int height = this->dimensions().height();
693 this->setUpInterlaceBuffer(height);
694 png_set_progressive_read_fn(this->png_ptr(), this, nullptr, InterlacedRowCallback,
695 nullptr);
696
697 fFirstRow = 0;
698 fLastRow = height - 1;
699 fLinesDecoded = 0;
700
701 const bool success = this->processData();
702 png_bytep srcRow = fInterlaceBuffer.get();
703 // FIXME: When resuming, this may rewrite rows that did not change.
704 for (int rowNum = 0; rowNum < fLinesDecoded; rowNum++) {
705 this->applyXformRow(dst, srcRow);
706 dst = SkTAddOffset<void>(dst, rowBytes);
707 srcRow = SkTAddOffset<png_byte>(srcRow, fPng_rowbytes);
708 }
709 if (success && fInterlacedComplete) {
710 return kSuccess;
711 }
712
713 if (rowsDecoded) {
714 *rowsDecoded = fLinesDecoded;
715 }
716
717 return log_and_return_error(success);
718 }
SkISize dimensions() const
Definition SkCodec.h:230
static void InterlacedRowCallback(png_structp png_ptr, png_bytep row, png_uint_32 rowNum, int pass)
int32_t height
constexpr int32_t height() const
Definition SkSize.h:37

◆ InterlacedRowCallback()

static void SkPngInterlacedDecoder::InterlacedRowCallback ( png_structp  png_ptr,
png_bytep  row,
png_uint_32  rowNum,
int  pass 
)
inlinestatic

Definition at line 639 of file SkPngCodec.cpp.

639 {
640 auto decoder = static_cast<SkPngInterlacedDecoder*>(png_get_progressive_ptr(png_ptr));
641 decoder->interlacedRowCallback(row, rowNum, pass);
642 }

◆ setRange()

void SkPngInterlacedDecoder::setRange ( int  firstRow,
int  lastRow,
void *  dst,
size_t  rowBytes 
)
inlineoverrideprivatevirtual

Implements SkPngCodec.

Definition at line 720 of file SkPngCodec.cpp.

720 {
721 // FIXME: We could skip rows in the interlace buffer that we won't put in the output.
722 this->setUpInterlaceBuffer(lastRow - firstRow + 1);
723 png_set_progressive_read_fn(this->png_ptr(), this, nullptr, InterlacedRowCallback, nullptr);
724 fFirstRow = firstRow;
725 fLastRow = lastRow;
726 fDst = dst;
727 fRowBytes = rowBytes;
728 fLinesDecoded = 0;
729 }

The documentation for this class was generated from the following file: