| /* | |
| * Copyright 2019 Google LLC | |
| * | |
| * 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" | |
| #include "include/codec/SkEncodedOrigin.h" | |
| #include "include/core/SkScalar.h" | |
| #include "include/core/SkSize.h" | |
| #include "include/core/SkStream.h" | |
| #include "include/private/SkEncodedInfo.h" | |
| #include <algorithm> | |
| #include <memory> | |
| #include <utility> | |
| // 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) | |
| : SkCodec(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(); | |
| } | |
| }; | |
| #endif // SkScalingCodec_DEFINED |