xref: /aosp_15_r20/external/skia/src/codec/SkSampler.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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 "include/private/base/SkNoncopyable.h"
13 #include "src/codec/SkCodecPriv.h"
14 
15 #include <cstddef>
16 
17 struct SkImageInfo;
18 
19 class SkSampler : public SkNoncopyable {
20 public:
21     /**
22      *  Update the sampler to sample every sampleX'th pixel. Returns the
23      *  width after sampling.
24      */
setSampleX(int sampleX)25     int setSampleX(int sampleX) {
26         return this->onSetSampleX(sampleX);
27     }
28 
29     /**
30      *  Update the sampler to sample every sampleY'th row.
31      */
setSampleY(int sampleY)32     void setSampleY(int sampleY) {
33         fSampleY = sampleY;
34     }
35 
36     /**
37      *  Retrieve the value set for sampleY.
38      */
sampleY()39     int sampleY() const {
40         return fSampleY;
41     }
42 
43     /**
44      *  Based on fSampleY, return whether this row belongs in the output.
45      *
46      *  @param row Row of the image, starting with the first row in the subset.
47      */
rowNeeded(int row)48     bool rowNeeded(int row) const {
49         return (row - get_start_coord(fSampleY)) % fSampleY == 0;
50     }
51 
52     /**
53      * Fill the remainder of the destination with 0.
54      *
55      * 0 has a different meaning depending on the SkColorType. For color types
56      * with transparency, this means transparent. For k565 and kGray, 0 is
57      * black.
58      *
59      * @param info
60      * Contains the color type of the rows to fill.
61      * Contains the pixel width of the destination rows to fill
62      * Contains the number of rows that we need to fill.
63      *
64      * @param dst
65      * The destination row to fill.
66      *
67      * @param rowBytes
68      * Stride in bytes of the destination.
69      *
70      * @param zeroInit
71      * Indicates whether memory is already zero initialized.
72      */
73     static void Fill(const SkImageInfo& info, void* dst, size_t rowBytes,
74                      SkCodec::ZeroInitialized zeroInit);
75 
76     virtual int fillWidth() const = 0;
77 
SkSampler()78     SkSampler()
79         : fSampleY(1)
80     {}
81 
~SkSampler()82     virtual ~SkSampler() {}
83 private:
84     int fSampleY;
85 
86     virtual int onSetSampleX(int) = 0;
87 };
88 
89 #endif // SkSampler_DEFINED
90