1 /* 2 * Copyright 2015 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 #ifndef SkSampler_DEFINED 8 #define SkSampler_DEFINED 9 10 #include "SkCodec.h" 11 #include "SkCodecPriv.h" 12 #include "SkTypes.h" 13 14 class SkSampler : public SkNoncopyable { 15 public: 16 /** 17 * Update the sampler to sample every sampleX'th pixel. Returns the 18 * width after sampling. 19 */ setSampleX(int sampleX)20 int setSampleX(int sampleX) { 21 return this->onSetSampleX(sampleX); 22 } 23 24 /** 25 * Update the sampler to sample every sampleY'th row. 26 */ setSampleY(int sampleY)27 void setSampleY(int sampleY) { 28 fSampleY = sampleY; 29 } 30 31 /** 32 * Retrieve the value set for sampleY. 33 */ sampleY()34 int sampleY() const { 35 return fSampleY; 36 } 37 38 /** 39 * Based on fSampleY, return whether this row belongs in the output. 40 * 41 * @param row Row of the image, starting with the first row in the subset. 42 */ rowNeeded(int row)43 bool rowNeeded(int row) const { 44 return (row - get_start_coord(fSampleY)) % fSampleY == 0; 45 } 46 47 /** 48 * Fill the remainder of the destination with a single color 49 * 50 * @param info 51 * Contains the color type of the rows to fill. 52 * Contains the width of the destination rows to fill 53 * Contains the number of rows that we need to fill. 54 * 55 * @param dst 56 * The destination row to fill from. 57 * 58 * @param rowBytes 59 * Stride in bytes of the destination. 60 * 61 * @param colorOrIndex 62 * If colorType is kF16, colorOrIndex is treated as a 64-bit color. 63 * If colorType is kN32, colorOrIndex is treated as a 32-bit color. 64 * If colorType is k565, colorOrIndex is treated as a 16-bit color. 65 * If colorType is kGray, colorOrIndex is treated as an 8-bit color. 66 * If colorType is kIndex, colorOrIndex is treated as an 8-bit index. 67 * Other SkColorTypes are not supported. 68 * 69 * @param zeroInit 70 * Indicates whether memory is already zero initialized. 71 * 72 */ 73 static void Fill(const SkImageInfo& info, void* dst, size_t rowBytes, 74 uint64_t colorOrIndex, SkCodec::ZeroInitialized zeroInit); 75 76 /** 77 * Allow subclasses to implement unique versions of fill(). 78 */ fill(const SkImageInfo & info,void * dst,size_t rowBytes,uint64_t colorOrIndex,SkCodec::ZeroInitialized zeroInit)79 virtual void fill(const SkImageInfo& info, void* dst, size_t rowBytes, 80 uint64_t colorOrIndex, SkCodec::ZeroInitialized zeroInit) {} 81 SkSampler()82 SkSampler() 83 : fSampleY(1) 84 {} 85 ~SkSampler()86 virtual ~SkSampler() {} 87 private: 88 int fSampleY; 89 90 virtual int onSetSampleX(int) = 0; 91 }; 92 93 #endif // SkSampler_DEFINED 94