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 */ 17class SkSampledCodec : public SkAndroidCodec { 18public: 19 explicit SkSampledCodec(SkCodec*, ExifOrientationBehavior); 20 21 ~SkSampledCodec() override {} 22 23protected: 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 32private: 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