Spaces:
Sleeping
Sleeping
// Copyright 2019 The TensorFlow Authors. All Rights Reserved. | |
// | |
// Licensed under the Apache License, Version 2.0 (the "License"); | |
// you may not use this file except in compliance with the License. | |
// You may obtain a copy of the License at | |
// | |
// http://www.apache.org/licenses/LICENSE-2.0 | |
// | |
// Unless required by applicable law or agreed to in writing, software | |
// distributed under the License is distributed on an "AS IS" BASIS, | |
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
// See the License for the specific language governing permissions and | |
// limitations under the License. | |
// ============================================================================= | |
import Accelerate | |
import Foundation | |
extension CGSize { | |
/// Returns `CGAfineTransform` to resize `self` to fit in destination size, keeping aspect ratio | |
/// of `self`. `self` image is resized to be inscribe to destination size and located in center of | |
/// destination. | |
/// | |
/// - Parameter toFitIn: destination size to be filled. | |
/// - Returns: `CGAffineTransform` to transform `self` image to `dest` image. | |
func transformKeepAspect(toFitIn dest: CGSize) -> CGAffineTransform { | |
let sourceRatio = self.height / self.width | |
let destRatio = dest.height / dest.width | |
// Calculates ratio `self` to `dest`. | |
var ratio: CGFloat | |
var x: CGFloat = 0 | |
var y: CGFloat = 0 | |
if sourceRatio > destRatio { | |
// Source size is taller than destination. Resized to fit in destination height, and find | |
// horizontal starting point to be centered. | |
ratio = dest.height / self.height | |
x = (dest.width - self.width * ratio) / 2 | |
} else { | |
ratio = dest.width / self.width | |
y = (dest.height - self.height * ratio) / 2 | |
} | |
return CGAffineTransform(a: ratio, b: 0, c: 0, d: ratio, tx: x, ty: y) | |
} | |
} | |