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 SkSampledCodec_DEFINED
8 #define SkSampledCodec_DEFINED
9 
10 #include "SkAndroidCodec.h"
11 #include "SkCodec.h"
12 
13 /**
14  *  This class implements the functionality of SkAndroidCodec.  Scaling will
15  *  be provided by sampling if it cannot be provided by fCodec.
16  */
17 class SkSampledCodec : public SkAndroidCodec {
18 public:
19     explicit SkSampledCodec(SkCodec*, ExifOrientationBehavior);
20 
21     ~SkSampledCodec() override {}
22 
23 protected:
24 
25     SkISize onGetSampledDimensions(int sampleSize) const override;
26 
27     bool onGetSupportedSubset(SkIRect* desiredSubset) const override { return true; }
28 
29     SkCodec::Result onGetAndroidPixels(const SkImageInfo& info, void* pixels, size_t rowBytes,
30             const AndroidOptions& options) override;
31 
32 private:
33     /**
34      *  Find the best way to account for native scaling.
35      *
36      *  Return a size that fCodec can scale to, and adjust sampleSize to finish scaling.
37      *
38      *  @param sampleSize As an input, the requested sample size.
39      *                    As an output, sampling needed after letting fCodec
40      *                    scale to the returned dimensions.
41      *  @param nativeSampleSize Optional output parameter. Will be set to the
42      *                          effective sample size done by fCodec.
43      *  @return SkISize The size that fCodec should scale to.
44      */
45     SkISize accountForNativeScaling(int* sampleSize, int* nativeSampleSize = nullptr) const;
46 
47     /**
48      *  This fulfills the same contract as onGetAndroidPixels().
49      *
50      *  We call this function from onGetAndroidPixels() if we have determined
51      *  that fCodec does not support the requested scale, and we need to
52      *  provide the scale by sampling.
53      */
54     SkCodec::Result sampledDecode(const SkImageInfo& info, void* pixels, size_t rowBytes,
55             const AndroidOptions& options);
56 
57     typedef SkAndroidCodec INHERITED;
58 };
59 #endif // SkSampledCodec_DEFINED
60