Home | History | Annotate | Download | only in codec
      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