Index: src/codec/SkSwizzler.h |
diff --git a/src/codec/SkSwizzler.h b/src/codec/SkSwizzler.h |
index 691dc77aa6a99f20cc676f7b3f854b8655a060f1..7f5bbc6209b459ceb38fe217319d3759777c2f9a 100644 |
--- a/src/codec/SkSwizzler.h |
+++ b/src/codec/SkSwizzler.h |
@@ -126,11 +126,19 @@ public: |
* @param options Indicates if dst is zero-initialized. The |
* implementation may choose to skip writing zeroes |
* if set to kYes_ZeroInitialized. |
- * Contains subset information. |
+ * Contains partial scanline information. |
+ * @param frame Is non-NULL if the source pixels are part of an image |
+ * frame that is a subset of the full image. |
+ * |
+ * Note that a deeper discussion of partial scanline subsets and image frame |
+ * subsets is below. Currently, we do not support both simultaneously. If |
+ * options->fSubset is non-NULL, frame must be NULL. |
+ * |
* @return A new SkSwizzler or nullptr on failure. |
*/ |
static SkSwizzler* CreateSwizzler(SrcConfig, const SkPMColor* ctable, |
- const SkImageInfo& dstInfo, const SkCodec::Options&); |
+ const SkImageInfo& dstInfo, const SkCodec::Options&, |
+ const SkIRect* frame = nullptr); |
/** |
* Swizzle a line. Generally this will be called height times, once |
@@ -151,7 +159,7 @@ public: |
*/ |
void fill(const SkImageInfo& info, void* dst, size_t rowBytes, uint32_t colorOrIndex, |
SkCodec::ZeroInitialized zeroInit) override { |
- const SkImageInfo fillInfo = info.makeWH(fDstWidth, info.height()); |
+ const SkImageInfo fillInfo = info.makeWH(fAllocatedWidth, info.height()); |
SkSampler::Fill(fillInfo, dst, rowBytes, colorOrIndex, zeroInit); |
} |
@@ -176,19 +184,93 @@ private: |
const RowProc fRowProc; |
const SkPMColor* fColorTable; // Unowned pointer |
- const int fSrcOffset; // Offset of the src in pixels, allows for partial |
- // scanline decodes. |
- int fX0; // Start coordinate for the src, may be different than |
- // fSrcOffset if we are sampling. |
- const int fSubsetWidth; // Width of the subset of the source before any sampling. |
- int fDstWidth; // Width of dst, which may differ with sampling. |
- int fSampleX; // step between X samples |
- const int fBPP; // if bitsPerPixel % 8 == 0 |
+ |
+ // Subset Swizzles |
+ // There are two types of subset swizzles that we support. We do not |
+ // support both at the same time. |
+ // TODO: If we want to support partial scanlines for gifs (which may |
+ // use frame subsets), we will need to support both subsetting |
+ // modes at the same time. |
+ // (1) Partial Scanlines |
+ // The client only wants to write a subset of the source pixels |
+ // to the destination. This subset is specified to CreateSwizzler |
+ // using options->fSubset. We will store subset information in |
+ // the following fields. |
+ // |
+ // fSrcOffset: The starting pixel of the source. |
+ // fSrcOffsetUnits: Derived from fSrcOffset with two key |
+ // differences: |
+ // (1) This takes the size of source pixels into |
+ // account by multiplying by fSrcBPP. This may |
+ // be measured in bits or bytes depending on |
+ // which is natural for the SrcConfig. |
+ // (2) If we are sampling, this will be larger |
+ // than fSrcOffset * fSrcBPP, since sampling |
+ // implies that we will skip some pixels. |
+ // fDstOffset: Will be zero. There is no destination offset |
+ // for this type of subset. |
+ // fDstOffsetBytes: Will be zero. |
+ // fSrcWidth: The width of the desired subset of source |
+ // pixels, before any sampling is performed. |
+ // fDstWidth: Will be equal to fSrcWidth, since this is also |
+ // calculated before any sampling is performed. |
+ // For this type of subset, the destination width |
+ // matches the desired subset of the source. |
+ // fSwizzleWidth: The actual number of pixels that will be |
+ // written by the RowProc. This is a scaled |
+ // version of fSrcWidth/fDstWidth. |
+ // fAllocatedWidth: Will be equal to fSwizzleWidth. For this type |
+ // of subset, the number of pixels written is the |
+ // same as the actual width of the destination. |
+ // (2) Frame Subset |
+ // The client will decode the entire width of the source into a |
+ // subset of destination memory. This subset is specified to |
+ // CreateSwizzler in the "frame" parameter. We store subset |
+ // information in the following fields. |
+ // |
+ // fSrcOffset: Will be zero. The starting pixel of the source. |
+ // fSrcOffsetUnits: Will only be non-zero if we are sampling, |
+ // since sampling implies that we will skip some |
+ // pixels. Note that this is measured in bits |
+ // or bytes depending on which is natural for |
+ // SrcConfig. |
+ // fDstOffset: First pixel to write in destination. |
+ // fDstOffsetBytes: fDstOffset * fDstBPP. |
+ // fSrcWidth: The entire width of the source pixels, before |
+ // any sampling is performed. |
+ // fDstWidth: The entire width of the destination memory, |
+ // before any sampling is performed. |
+ // fSwizzleWidth: The actual number of pixels that will be |
+ // written by the RowProc. This is a scaled |
+ // version of fSrcWidth. |
+ // fAllocatedWidth: The actual number of pixels in destination |
+ // memory. This is a scaled version of |
+ // fDstWidth. |
+ // |
+ // If we are not subsetting, these fields are more straightforward. |
+ // fSrcOffset = fDstOffet = fDstOffsetBytes = 0 |
+ // fSrcOffsetUnits may be non-zero (we will skip the first few pixels when sampling) |
+ // fSrcWidth = fDstWidth = Full original width |
+ // fSwizzleWidth = fAllcoatedWidth = Scaled width (if we are sampling) |
+ const int fSrcOffset; |
+ const int fDstOffset; |
+ int fSrcOffsetUnits; |
+ int fDstOffsetBytes; |
+ const int fSrcWidth; |
+ const int fDstWidth; |
+ int fSwizzleWidth; |
+ int fAllocatedWidth; |
+ |
+ int fSampleX; // Step between X samples |
+ const int fSrcBPP; // Bits/bytes per pixel for the SrcConfig |
+ // if bitsPerPixel % 8 == 0 |
// fBPP is bytesPerPixel |
// else |
// fBPP is bitsPerPixel |
+ const int fDstBPP; // Bytes per pixel for the destination color type |
- SkSwizzler(RowProc proc, const SkPMColor* ctable, int srcOffset, int subsetWidth, int bpp); |
+ SkSwizzler(RowProc proc, const SkPMColor* ctable, int srcOffset, int srcWidth, int dstOffset, |
+ int dstWidth, int srcBPP, int dstBPP); |
int onSetSampleX(int) override; |