/*
* 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 SkSampler_DEFINED
#define SkSampler_DEFINED
#include "SkCodec.h"
#include "SkCodecPriv.h"
#include "SkTypes.h"
class SkSampler : public SkNoncopyable {
public:
/**
* Update the sampler to sample every sampleX'th pixel. Returns the
* width after sampling.
*/
int setSampleX(int sampleX) {
return this->onSetSampleX(sampleX);
}
/**
* Update the sampler to sample every sampleY'th row.
*/
void setSampleY(int sampleY) {
fSampleY = sampleY;
}
/**
* Retrieve the value set for sampleY.
*/
int sampleY() const {
return fSampleY;
}
/**
* Based on fSampleY, return whether this row belongs in the output.
*
* @param row Row of the image, starting with the first row in the subset.
*/
bool rowNeeded(int row) const {
return (row - get_start_coord(fSampleY)) % fSampleY == 0;
}
/**
* Fill the remainder of the destination with a single color
*
* @param info
* Contains the color type of the rows to fill.
* Contains the width of the destination rows to fill
* Contains the number of rows that we need to fill.
*
* @param dst
* The destination row to fill from.
*
* @param rowBytes
* Stride in bytes of the destination.
*
* @param colorOrIndex
* If colorType is kF16, colorOrIndex is treated as a 64-bit color.
* If colorType is kN32, colorOrIndex is treated as a 32-bit color.
* If colorType is k565, colorOrIndex is treated as a 16-bit color.
* If colorType is kGray, colorOrIndex is treated as an 8-bit color.
* If colorType is kIndex, colorOrIndex is treated as an 8-bit index.
* Other SkColorTypes are not supported.
*
* @param zeroInit
* Indicates whether memory is already zero initialized.
*
*/
static void Fill(const SkImageInfo& info, void* dst, size_t rowBytes,
uint64_t colorOrIndex, SkCodec::ZeroInitialized zeroInit);
/**
* Allow subclasses to implement unique versions of fill().
*/
virtual void fill(const SkImageInfo& info, void* dst, size_t rowBytes,
uint64_t colorOrIndex, SkCodec::ZeroInitialized zeroInit) {}
SkSampler()
: fSampleY(1)
{}
virtual ~SkSampler() {}
private:
int fSampleY;
virtual int onSetSampleX(int) = 0;
};
#endif // SkSampler_DEFINED