| /* |
| * Copyright 2015 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| #ifndef SkMaskSwizzler_DEFINED |
| #define SkMaskSwizzler_DEFINED |
| |
| #include "SkMasks.h" |
| #include "SkSampler.h" |
| #include "SkSwizzler.h" |
| #include "SkTypes.h" |
| |
| /* |
| * |
| * Used to swizzle images whose pixel components are extracted by bit masks |
| * Currently only used by bmp |
| * |
| */ |
| class SkMaskSwizzler : public SkSampler { |
| public: |
| |
| /* |
| * Create a new swizzler |
| * @param masks Unowned pointer to helper class |
| */ |
| static SkMaskSwizzler* CreateMaskSwizzler(const SkImageInfo& dstInfo, |
| const SkImageInfo& srcInfo, |
| SkMasks* masks, |
| uint32_t bitsPerPixel, |
| const SkCodec::Options& options); |
| |
| /* |
| * Swizzle a row |
| */ |
| void swizzle(void* dst, const uint8_t* SK_RESTRICT src); |
| |
| /** |
| * Implement fill using a custom width. |
| */ |
| void fill(const SkImageInfo& info, void* dst, size_t rowBytes, uint64_t colorOrIndex, |
| SkCodec::ZeroInitialized zeroInit) override { |
| const SkImageInfo fillInfo = info.makeWH(fDstWidth, info.height()); |
| SkSampler::Fill(fillInfo, dst, rowBytes, colorOrIndex, zeroInit); |
| } |
| |
| /** |
| * Returns the byte offset at which we write to destination memory, taking |
| * scaling, subsetting, and partial frames into account. |
| * A similar function exists on SkSwizzler. |
| */ |
| int swizzleWidth() const { return fDstWidth; } |
| |
| private: |
| |
| /* |
| * Row procedure used for swizzle |
| */ |
| typedef void (*RowProc)(void* dstRow, const uint8_t* srcRow, int width, |
| SkMasks* masks, uint32_t startX, uint32_t sampleX); |
| |
| SkMaskSwizzler(SkMasks* masks, RowProc proc, int subsetWidth, int srcOffset); |
| |
| int onSetSampleX(int) override; |
| |
| SkMasks* fMasks; // unowned |
| const RowProc fRowProc; |
| |
| // FIXME: Can this class share more with SkSwizzler? These variables are all the same. |
| const int fSubsetWidth; // Width of the subset of source before any sampling. |
| int fDstWidth; // Width of dst, which may differ with sampling. |
| int fSampleX; |
| int fSrcOffset; |
| int fX0; |
| }; |
| |
| #endif |