| // |
| // GTMGeometryUtils.m |
| // |
| // Copyright 2006-2008 Google Inc. |
| // |
| // 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 "GTMGeometryUtils.h" |
| |
| /// Align rectangles |
| // |
| // Args: |
| // alignee - rect to be aligned |
| // aligner - rect to be aligned to |
| // alignment - alignment to be applied to alignee based on aligner |
| |
| CGRect GTMCGAlignRectangles(CGRect alignee, CGRect aligner, GTMRectAlignment alignment) { |
| switch (alignment) { |
| case GTMRectAlignTop: |
| alignee.origin.x = aligner.origin.x + (CGRectGetWidth(aligner) * .5f - CGRectGetWidth(alignee) * .5f); |
| alignee.origin.y = aligner.origin.y + CGRectGetHeight(aligner) - CGRectGetHeight(alignee); |
| break; |
| |
| case GTMRectAlignTopLeft: |
| alignee.origin.x = aligner.origin.x; |
| alignee.origin.y = aligner.origin.y + CGRectGetHeight(aligner) - CGRectGetHeight(alignee); |
| break; |
| |
| case GTMRectAlignTopRight: |
| alignee.origin.x = aligner.origin.x + CGRectGetWidth(aligner) - CGRectGetWidth(alignee); |
| alignee.origin.y = aligner.origin.y + CGRectGetHeight(aligner) - CGRectGetHeight(alignee); |
| break; |
| |
| case GTMRectAlignLeft: |
| alignee.origin.x = aligner.origin.x; |
| alignee.origin.y = aligner.origin.y + (CGRectGetHeight(aligner) * .5f - CGRectGetHeight(alignee) * .5f); |
| break; |
| |
| case GTMRectAlignBottomLeft: |
| alignee.origin.x = aligner.origin.x; |
| alignee.origin.y = aligner.origin.y; |
| break; |
| |
| case GTMRectAlignBottom: |
| alignee.origin.x = aligner.origin.x + (CGRectGetWidth(aligner) * .5f - CGRectGetWidth(alignee) * .5f); |
| alignee.origin.y = aligner.origin.y; |
| break; |
| |
| case GTMRectAlignBottomRight: |
| alignee.origin.x = aligner.origin.x + CGRectGetWidth(aligner) - CGRectGetWidth(alignee); |
| alignee.origin.y = aligner.origin.y; |
| break; |
| |
| case GTMRectAlignRight: |
| alignee.origin.x = aligner.origin.x + CGRectGetWidth(aligner) - CGRectGetWidth(alignee); |
| alignee.origin.y = aligner.origin.y + (CGRectGetHeight(aligner) * .5f - CGRectGetHeight(alignee) * .5f); |
| break; |
| |
| default: |
| case GTMRectAlignCenter: |
| alignee.origin.x = aligner.origin.x + (CGRectGetWidth(aligner) * .5f - CGRectGetWidth(alignee) * .5f); |
| alignee.origin.y = aligner.origin.y + (CGRectGetHeight(aligner) * .5f - CGRectGetHeight(alignee) * .5f); |
| break; |
| } |
| return alignee; |
| } |
| |
| CGRect GTMCGScaleRectangleToSize(CGRect scalee, CGSize size, GTMScaling scaling) { |
| switch (scaling) { |
| |
| case GTMScaleToFillProportionally: |
| case GTMScaleProportionally: { |
| CGFloat height = CGRectGetHeight(scalee); |
| CGFloat width = CGRectGetWidth(scalee); |
| if (isnormal(height) && isnormal(width) && |
| (height > size.height || width > size.width)) { |
| CGFloat horiz = size.width / width; |
| CGFloat vert = size.height / height; |
| BOOL expand = (scaling == GTMScaleToFillProportionally); |
| // We use the smaller scale unless expand is true. In that case, larger. |
| CGFloat newScale = ((horiz < vert) ^ expand) ? horiz : vert; |
| scalee = GTMCGRectScale(scalee, newScale, newScale); |
| } |
| break; |
| } |
| |
| case GTMScaleToFit: |
| scalee.size = size; |
| break; |
| |
| case GTMScaleNone: |
| default: |
| // Do nothing |
| break; |
| } |
| return scalee; |
| } |