| /* |
| * 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 "include/codec/SkCodec.h" |
| #include "include/core/SkTypes.h" |
| #include "src/codec/SkSampler.h" |
| |
| #include <cstdint> |
| |
| class SkMasks; |
| struct SkImageInfo; |
| |
| /* |
| * |
| * Used to swizzle images whose pixel components are extracted by bit masks |
| * Currently only used by bmp |
| * |
| */ |
| class SkMaskSwizzler : public SkSampler { |
| public: |
| |
| /* |
| * @param masks Unowned pointer to helper class |
| */ |
| static SkMaskSwizzler* CreateMaskSwizzler(const SkImageInfo& dstInfo, |
| bool srcIsOpaque, |
| SkMasks* masks, |
| uint32_t bitsPerPixel, |
| const SkCodec::Options& options); |
| |
| /* |
| * Swizzle a row |
| */ |
| void swizzle(void* dst, const uint8_t* SK_RESTRICT src); |
| |
| int fillWidth() const override { |
| return fDstWidth; |
| } |
| |
| /** |
| * 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 |