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 "include/codec/SkCodec.h"
11 #include "include/core/SkTypes.h"
12 #include "src/codec/SkCodecPriv.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 0.
49      *
50      * 0 has a different meaning depending on the SkColorType. For color types
51      * with transparency, this means transparent. For k565 and kGray, 0 is
52      * black.
53      *
54      * @param info
55      * Contains the color type of the rows to fill.
56      * Contains the pixel width of the destination rows to fill
57      * Contains the number of rows that we need to fill.
58      *
59      * @param dst
60      * The destination row to fill.
61      *
62      * @param rowBytes
63      * Stride in bytes of the destination.
64      *
65      * @param zeroInit
66      * Indicates whether memory is already zero initialized.
67      */
68     static void Fill(const SkImageInfo& info, void* dst, size_t rowBytes,
69                      SkCodec::ZeroInitialized zeroInit);
70 
71     virtual int fillWidth() const = 0;
72 
SkSampler()73     SkSampler()
74         : fSampleY(1)
75     {}
76 
~SkSampler()77     virtual ~SkSampler() {}
78 private:
79     int fSampleY;
80 
81     virtual int onSetSampleX(int) = 0;
82 };
83 
84 #endif // SkSampler_DEFINED
85