Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Public Member Functions | Protected Member Functions | Private Member Functions | List of all members
SkBmpStandardCodec Class Reference

#include <SkBmpStandardCodec.h>

Inheritance diagram for SkBmpStandardCodec:
SkBmpBaseCodec SkBmpCodec SkCodec SkNoncopyable

Public Member Functions

 SkBmpStandardCodec (SkEncodedInfo &&info, std::unique_ptr< SkStream > stream, uint16_t bitsPerPixel, uint32_t numColors, uint32_t bytesPerColor, uint32_t offset, SkCodec::SkScanlineOrder rowOrder, bool isOpaque, bool inIco)
 
- Public Member Functions inherited from SkBmpBaseCodec
 ~SkBmpBaseCodec () override
 
bool didCreateSrcBuffer () const
 
- 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 ()
 

Protected Member Functions

Result onGetPixels (const SkImageInfo &dstInfo, void *dst, size_t dstRowBytes, const Options &, int *) override
 
bool onInIco () const override
 
SkCodec::Result onPrepareToDecode (const SkImageInfo &dstInfo, const SkCodec::Options &options) override
 
SkSamplergetSampler (bool createIfNecessary) override
 
- Protected Member Functions inherited from SkBmpBaseCodec
 SkBmpBaseCodec (SkEncodedInfo &&info, std::unique_ptr< SkStream >, uint16_t bitsPerPixel, SkCodec::SkScanlineOrder rowOrder)
 
uint8_t * srcBuffer ()
 
- Protected Member Functions inherited from SkBmpCodec
 SkBmpCodec (SkEncodedInfo &&info, std::unique_ptr< SkStream >, uint16_t bitsPerPixel, SkCodec::SkScanlineOrder rowOrder)
 
SkEncodedImageFormat onGetEncodedFormat () const override
 
bool onRewind () override
 
bool inIco () const
 
int32_t getDstRow (int32_t y, int32_t height) const
 
uint16_t bitsPerPixel () const
 
SkScanlineOrder onGetScanlineOrder () const override
 
size_t srcRowBytes () const
 
SkCodec::Result prepareToDecode (const SkImageInfo &dstInfo, const SkCodec::Options &options)
 
uint32_t * xformBuffer () const
 
void resetXformBuffer (int count)
 
- 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 ()
 
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 ()
 

Private Member Functions

int decodeRows (const SkImageInfo &dstInfo, void *dst, size_t dstRowBytes, const Options &opts) 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 Member Functions inherited from SkBmpCodec
static bool IsBmp (const void *, size_t)
 
static std::unique_ptr< SkCodecMakeFromStream (std::unique_ptr< SkStream >, Result *)
 
static std::unique_ptr< SkCodecMakeFromIco (std::unique_ptr< SkStream >, Result *)
 
- 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 *))
 
- 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
 
- Static Protected Member Functions inherited from SkBmpCodec
static Result ReadHeader (SkStream *, bool inIco, std::unique_ptr< SkCodec > *codecOut)
 
- Static Protected Attributes inherited from SkBmpCodec
static constexpr SkColorType kXformSrcColorType = kBGRA_8888_SkColorType
 
static constexpr auto kXformSrcColorFormat = skcms_PixelFormat_BGRA_8888
 

Detailed Description

Definition at line 32 of file SkBmpStandardCodec.h.

Constructor & Destructor Documentation

◆ SkBmpStandardCodec()

SkBmpStandardCodec::SkBmpStandardCodec ( SkEncodedInfo &&  info,
std::unique_ptr< SkStream stream,
uint16_t  bitsPerPixel,
uint32_t  numColors,
uint32_t  bytesPerColor,
uint32_t  offset,
SkCodec::SkScanlineOrder  rowOrder,
bool  isOpaque,
bool  inIco 
)

Definition at line 29 of file SkBmpStandardCodec.cpp.

34 : INHERITED(std::move(info), std::move(stream), bitsPerPixel, rowOrder)
35 , fColorTable(nullptr)
36 , fNumColors(numColors)
37 , fBytesPerColor(bytesPerColor)
38 , fOffset(offset)
39 , fSwizzler(nullptr)
40 , fIsOpaque(isOpaque)
41 , fInIco(inIco)
42 , fAndMaskRowBytes(fInIco ? SkAlign4(compute_row_bytes(this->dimensions().width(), 1)) : 0)
43{}
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
Definition DM.cpp:213
static constexpr T SkAlign4(T x)
Definition SkAlign.h:16
static size_t compute_row_bytes(int width, uint32_t bitsPerPixel)
uint16_t bitsPerPixel() const
Definition SkBmpCodec.h:87
bool inIco() const
Definition SkBmpCodec.h:63
SkISize dimensions() const
Definition SkCodec.h:230
SkStream * stream()
Definition SkCodec.h:865
int32_t width
Point offset

Member Function Documentation

◆ decodeRows()

int SkBmpStandardCodec::decodeRows ( const SkImageInfo dstInfo,
void *  dst,
size_t  dstRowBytes,
const Options opts 
)
overrideprivatevirtual

Implements SkBmpCodec.

Definition at line 228 of file SkBmpStandardCodec.cpp.

229 {
230 // Iterate over rows of the image
231 const int height = dstInfo.height();
232 for (int y = 0; y < height; y++) {
233 // Read a row of the input
234 if (this->stream()->read(this->srcBuffer(), this->srcRowBytes()) != this->srcRowBytes()) {
235 SkCodecPrintf("Warning: incomplete input stream.\n");
236 return y;
237 }
238
239 // Decode the row in destination format
240 uint32_t row = this->getDstRow(y, dstInfo.height());
241
242 void* dstRow = SkTAddOffset<void>(dst, row * dstRowBytes);
243
244 if (this->xformOnDecode()) {
245 SkASSERT(this->colorXform());
246 fSwizzler->swizzle(this->xformBuffer(), this->srcBuffer());
247 this->applyColorXform(dstRow, this->xformBuffer(), fSwizzler->swizzleWidth());
248 } else {
249 fSwizzler->swizzle(dstRow, this->srcBuffer());
250 }
251 }
252
253 if (fInIco && fIsOpaque) {
254 const int startScanline = this->currScanline();
255 if (startScanline < 0) {
256 // We are not performing a scanline decode.
257 // Just decode the entire ICO mask and return.
258 decodeIcoMask(this->stream(), dstInfo, dst, dstRowBytes);
259 return height;
260 }
261
262 // In order to perform a scanline ICO decode, we must be able
263 // to skip ahead in the stream in order to apply the AND mask
264 // to the requested scanlines.
265 // We will do this by taking advantage of the fact that
266 // SkIcoCodec always uses a SkMemoryStream as its underlying
267 // representation of the stream.
268 const void* memoryBase = this->stream()->getMemoryBase();
269 SkASSERT(nullptr != memoryBase);
270 SkASSERT(this->stream()->hasLength());
271 SkASSERT(this->stream()->hasPosition());
272
273 const size_t length = this->stream()->getLength();
274 const size_t currPosition = this->stream()->getPosition();
275
276 // Calculate how many bytes we must skip to reach the AND mask.
277 const int remainingScanlines = this->dimensions().height() - startScanline - height;
278 const size_t bytesToSkip = remainingScanlines * this->srcRowBytes() +
279 startScanline * fAndMaskRowBytes;
280 const size_t subStreamStartPosition = currPosition + bytesToSkip;
281 if (subStreamStartPosition >= length) {
282 // FIXME: How can we indicate that this decode was actually incomplete?
283 return height;
284 }
285
286 // Create a subStream to pass to decodeIcoMask(). It is useful to encapsulate
287 // the memory base into a stream in order to safely handle incomplete images
288 // without reading out of bounds memory.
289 const void* subStreamMemoryBase = SkTAddOffset<const void>(memoryBase,
290 subStreamStartPosition);
291 const size_t subStreamLength = length - subStreamStartPosition;
292 // This call does not transfer ownership of the subStreamMemoryBase.
293 SkMemoryStream subStream(subStreamMemoryBase, subStreamLength, false);
294
295 // FIXME: If decodeIcoMask does not succeed, is there a way that we can
296 // indicate the decode was incomplete?
297 decodeIcoMask(&subStream, dstInfo, dst, dstRowBytes);
298 }
299
300 return height;
301}
#define SkASSERT(cond)
Definition SkAssert.h:116
#define SkCodecPrintf(...)
Definition SkCodecPriv.h:23
static bool read(SkStream *stream, void *buffer, size_t amount)
uint8_t * srcBuffer()
int32_t getDstRow(int32_t y, int32_t height) const
size_t srcRowBytes() const
Definition SkBmpCodec.h:89
uint32_t * xformBuffer() const
Definition SkBmpCodec.h:104
const SkImageInfo & dstInfo() const
Definition SkCodec.h:878
bool xformOnDecode() const
Definition SkCodec.h:907
void applyColorXform(void *dst, const void *src, int count) const
Definition SkCodec.cpp:853
int currScanline() const
Definition SkCodec.h:888
bool colorXform() const
Definition SkCodec.h:906
virtual size_t getPosition() const
Definition SkStream.h:119
virtual size_t getLength() const
Definition SkStream.h:137
virtual const void * getMemoryBase()
Definition SkStream.h:141
size_t length
double y
int32_t height
constexpr int32_t height() const
Definition SkSize.h:37
int height() const

◆ getSampler()

SkSampler * SkBmpStandardCodec::getSampler ( bool  )
inlineoverrideprotectedvirtual

Return an object which will allow forcing scanline decodes to sample in X.

May create a sampler, if one is not currently being used. Otherwise, does not affect ownership.

Only valid during scanline decoding or incremental decoding.

Reimplemented from SkCodec.

Definition at line 72 of file SkBmpStandardCodec.h.

72 {
73 SkASSERT(fSwizzler);
74 return fSwizzler.get();
75 }

◆ onGetPixels()

SkCodec::Result SkBmpStandardCodec::onGetPixels ( const SkImageInfo info,
void *  pixels,
size_t  rowBytes,
const Options ,
int rowsDecoded 
)
overrideprotectedvirtual
Parameters
rowsDecodedWhen the encoded image stream is incomplete, this function will return kIncompleteInput and rowsDecoded will be set to the number of scanlines that were successfully decoded. This will allow getPixels() to fill the uninitialized memory.

Implements SkCodec.

Definition at line 48 of file SkBmpStandardCodec.cpp.

51 {
52 if (opts.fSubset) {
53 // Subsets are not supported.
54 return kUnimplemented;
55 }
56 if (dstInfo.dimensions() != this->dimensions()) {
57 SkCodecPrintf("Error: scaling not supported.\n");
58 return kInvalidScale;
59 }
60
61 Result result = this->prepareToDecode(dstInfo, opts);
62 if (kSuccess != result) {
63 return result;
64 }
65 int rows = this->decodeRows(dstInfo, dst, dstRowBytes, opts);
66 if (rows != dstInfo.height()) {
67 *rowsDecoded = rows;
68 return kIncompleteInput;
69 }
70 return kSuccess;
71}
SkCodec::Result prepareToDecode(const SkImageInfo &dstInfo, const SkCodec::Options &options)
int decodeRows(const SkImageInfo &dstInfo, void *dst, size_t dstRowBytes, const Options &opts) override
@ kInvalidScale
Definition SkCodec.h:100
@ kIncompleteInput
Definition SkCodec.h:84
@ kUnimplemented
Definition SkCodec.h:123
@ kSuccess
Definition SkCodec.h:80
GAsyncResult * result
SkISize dimensions() const

◆ onInIco()

bool SkBmpStandardCodec::onInIco ( ) const
inlineoverrideprotectedvirtual

Reimplemented from SkBmpCodec.

Definition at line 65 of file SkBmpStandardCodec.h.

65 {
66 return fInIco;
67 }

◆ onPrepareToDecode()

SkCodec::Result SkBmpStandardCodec::onPrepareToDecode ( const SkImageInfo dstInfo,
const SkCodec::Options options 
)
overrideprotectedvirtual

Implements SkBmpCodec.

Definition at line 207 of file SkBmpStandardCodec.cpp.

208 {
209 if (this->xformOnDecode()) {
210 this->resetXformBuffer(dstInfo.width());
211 }
212
213 // Create the color table if necessary and prepare the stream for decode
214 // Note that if it is non-NULL, inputColorCount will be modified
215 if (!this->createColorTable(dstInfo.colorType(), dstInfo.alphaType())) {
216 SkCodecPrintf("Error: could not create color table.\n");
218 }
219
220 // Initialize a swizzler
221 this->initializeSwizzler(dstInfo, options);
222 return SkCodec::kSuccess;
223}
void resetXformBuffer(int count)
Definition SkBmpCodec.h:105
@ kInvalidInput
Definition SkCodec.h:109
const Options & options() const
Definition SkCodec.h:880
int width() const
SkAlphaType alphaType() const
SkColorType colorType() const

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