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 | */ |
20 | int setSampleX(int sampleX) { |
21 | return this->onSetSampleX(sampleX); |
22 | } |
23 | |
24 | /** |
25 | * Update the sampler to sample every sampleY'th row. |
26 | */ |
27 | void setSampleY(int sampleY) { |
28 | fSampleY = sampleY; |
29 | } |
30 | |
31 | /** |
32 | * Retrieve the value set for sampleY. |
33 | */ |
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 | */ |
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 | |
73 | SkSampler() |
74 | : fSampleY(1) |
75 | {} |
76 | |
77 | virtual ~SkSampler() {} |
78 | private: |
79 | int fSampleY; |
80 | |
81 | virtual int onSetSampleX(int) = 0; |
82 | }; |
83 | |
84 | #endif // SkSampler_DEFINED |
85 | |