| /* | |
| * Copyright 2019 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #ifndef SkScalingCodec_DEFINED | |
| #define SkScalingCodec_DEFINED | |
| #include "include/codec/SkCodec.h" | |
| // Helper class for an SkCodec that supports arbitrary downscaling. | |
| class SkScalingCodec : public SkCodec { | |
| protected: | |
| SkScalingCodec(SkEncodedInfo&& info, XformFormat srcFormat, std::unique_ptr<SkStream> stream, | |
| SkEncodedOrigin origin = kTopLeft_SkEncodedOrigin) | |
| : INHERITED(std::move(info), srcFormat, std::move(stream), origin) {} | |
| SkISize onGetScaledDimensions(float desiredScale) const override { | |
| SkISize dim = this->dimensions(); | |
| // SkCodec treats zero dimensional images as errors, so the minimum size | |
| // that we will recommend is 1x1. | |
| dim.fWidth = std::max(1, SkScalarRoundToInt(desiredScale * dim.fWidth)); | |
| dim.fHeight = std::max(1, SkScalarRoundToInt(desiredScale * dim.fHeight)); | |
| return dim; | |
| } | |
| bool onDimensionsSupported(const SkISize& requested) override { | |
| SkISize dim = this->dimensions(); | |
| int w = requested.width(); | |
| int h = requested.height(); | |
| return 1 <= w && w <= dim.width() && 1 <= h && h <= dim.height(); | |
| } | |
| private: | |
| using INHERITED = SkCodec; | |
| }; | |
| #endif // SkScalingCodec_DEFINED |