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