1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2019 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkScalingCodec_DEFINED 8*c8dee2aaSAndroid Build Coastguard Worker #define SkScalingCodec_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/codec/SkCodec.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/codec/SkEncodedOrigin.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkStream.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/SkEncodedInfo.h" 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker #include <algorithm> 18*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 19*c8dee2aaSAndroid Build Coastguard Worker #include <utility> 20*c8dee2aaSAndroid Build Coastguard Worker 21*c8dee2aaSAndroid Build Coastguard Worker // Helper class for an SkCodec that supports arbitrary downscaling. 22*c8dee2aaSAndroid Build Coastguard Worker class SkScalingCodec : public SkCodec { 23*c8dee2aaSAndroid Build Coastguard Worker protected: 24*c8dee2aaSAndroid Build Coastguard Worker SkScalingCodec(SkEncodedInfo&& info, XformFormat srcFormat, std::unique_ptr<SkStream> stream, 25*c8dee2aaSAndroid Build Coastguard Worker SkEncodedOrigin origin = kTopLeft_SkEncodedOrigin) SkCodec(std::move (info),srcFormat,std::move (stream),origin)26*c8dee2aaSAndroid Build Coastguard Worker : SkCodec(std::move(info), srcFormat, std::move(stream), origin) {} 27*c8dee2aaSAndroid Build Coastguard Worker onGetScaledDimensions(float desiredScale)28*c8dee2aaSAndroid Build Coastguard Worker SkISize onGetScaledDimensions(float desiredScale) const override { 29*c8dee2aaSAndroid Build Coastguard Worker SkISize dim = this->dimensions(); 30*c8dee2aaSAndroid Build Coastguard Worker // SkCodec treats zero dimensional images as errors, so the minimum size 31*c8dee2aaSAndroid Build Coastguard Worker // that we will recommend is 1x1. 32*c8dee2aaSAndroid Build Coastguard Worker dim.fWidth = std::max(1, SkScalarRoundToInt(desiredScale * dim.fWidth)); 33*c8dee2aaSAndroid Build Coastguard Worker dim.fHeight = std::max(1, SkScalarRoundToInt(desiredScale * dim.fHeight)); 34*c8dee2aaSAndroid Build Coastguard Worker return dim; 35*c8dee2aaSAndroid Build Coastguard Worker } 36*c8dee2aaSAndroid Build Coastguard Worker onDimensionsSupported(const SkISize & requested)37*c8dee2aaSAndroid Build Coastguard Worker bool onDimensionsSupported(const SkISize& requested) override { 38*c8dee2aaSAndroid Build Coastguard Worker SkISize dim = this->dimensions(); 39*c8dee2aaSAndroid Build Coastguard Worker int w = requested.width(); 40*c8dee2aaSAndroid Build Coastguard Worker int h = requested.height(); 41*c8dee2aaSAndroid Build Coastguard Worker return 1 <= w && w <= dim.width() && 1 <= h && h <= dim.height(); 42*c8dee2aaSAndroid Build Coastguard Worker } 43*c8dee2aaSAndroid Build Coastguard Worker }; 44*c8dee2aaSAndroid Build Coastguard Worker 45*c8dee2aaSAndroid Build Coastguard Worker #endif // SkScalingCodec_DEFINED 46