1df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin/* 2df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Copyright (C) 2014 The Android Open Source Project 3df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * 4df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Licensed under the Apache License, Version 2.0 (the "License"); 5df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * you may not use this file except in compliance with the License. 6df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * You may obtain a copy of the License at 7df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * 8df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * http://www.apache.org/licenses/LICENSE-2.0 9df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * 10df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Unless required by applicable law or agreed to in writing, software 11df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * distributed under the License is distributed on an "AS IS" BASIS, 12df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * See the License for the specific language governing permissions and 14df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * limitations under the License. 15df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 16df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 17df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinpackage android.hardware.camera2.utils; 18df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 19df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport android.util.Size; 20df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 21df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport java.util.Collections; 22df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport java.util.Comparator; 23df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport java.util.List; 24df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 25df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport static com.android.internal.util.Preconditions.*; 26df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 27df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin/** 28df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Comparator for {@link Size} objects by the area. 29df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * 30df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * <p>This comparator totally orders by rectangle area. Tie-breaks on width.</p> 31df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 32df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinpublic class SizeAreaComparator implements Comparator<Size> { 33df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /** 34df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * {@inheritDoc} 35df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 36df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin @Override 37df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin public int compare(Size size, Size size2) { 38df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin checkNotNull(size, "size must not be null"); 39df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin checkNotNull(size2, "size2 must not be null"); 40df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 41df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin if (size.equals(size2)) { 42df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin return 0; 43df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 44df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 45df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin long width = size.getWidth(); 46df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin long width2 = size2.getWidth(); 47df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin long area = width * size.getHeight(); 48df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin long area2 = width2 * size2.getHeight(); 49df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 50df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin if (area == area2) { 51df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin return (width > width2) ? 1 : -1; 52df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 53df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 54df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin return (area > area2) ? 1 : -1; 55df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 56df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 57df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /** 58df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Get the largest {@code Size} from the list by comparing each size's area 59df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * by each other using {@link SizeAreaComparator}. 60df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * 61df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * @param sizes a non-{@code null} list of non-{@code null} sizes 62df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * @return a non-{@code null} size 63df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * 64df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * @throws NullPointerException if {@code sizes} or any elements in it were {@code null} 65df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 66df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin public static Size findLargestByArea(List<Size> sizes) { 67df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin checkNotNull(sizes, "sizes must not be null"); 68df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 69df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin return Collections.max(sizes, new SizeAreaComparator()); 70df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 71df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin}