diff options
Diffstat (limited to 'AppKit/GTMGeometryUtils.m')
-rw-r--r-- | AppKit/GTMGeometryUtils.m | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/AppKit/GTMGeometryUtils.m b/AppKit/GTMGeometryUtils.m new file mode 100644 index 0000000..efc543e --- /dev/null +++ b/AppKit/GTMGeometryUtils.m @@ -0,0 +1,152 @@ +// +// 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" + +float GTMGetMainDisplayHeight(void) { + float height = 0; + NSArray *screens = [NSScreen screens]; + // We may have a headless machine without any screens. In this case we + // return 0. + if ([screens count] > 0) { + height = NSHeight([(NSScreen*)[screens objectAtIndex: 0] frame]); + } + return height; +} + + +// Rect conversion routines. +HIRect GTMGlobalNSRectToHIRect(NSRect inRect) { + HIRect theRect; + theRect.origin = GTMGlobalNSPointToHIPoint(inRect.origin); + theRect.origin.y -= inRect.size.height; + theRect.size = CGSizeMake(inRect.size.width, inRect.size.height); + return theRect; +} + + +HIRect GTMRectToHIRect(Rect inRect) { + HIRect theRect; + theRect.origin = CGPointMake(inRect.left,inRect.top); + theRect.size = CGSizeMake(inRect.right - inRect.left, inRect.bottom - inRect.top); + return theRect; +} + + +NSRect GTMGlobalHIRectToNSRect(HIRect inRect) { + NSRect theRect; + theRect.origin = GTMGlobalHIPointToNSPoint(inRect.origin); + theRect.origin.y -= inRect.size.height; + theRect.size = NSMakeSize(inRect.size.width, inRect.size.height); + return theRect; +} + + +Rect GTMHIRectToRect(HIRect inRect) { + Rect theRect; + theRect.left = inRect.origin.x; + theRect.right = ceilf(inRect.origin.x + inRect.size.width); + theRect.top = inRect.origin.y; + theRect.bottom = ceilf(inRect.origin.y + inRect.size.height); + return theRect; +} + +/// Align rectangles +// +// Args: +// alignee - rect to be aligned +// aligner - rect to be aligned to +// alignment - alignment to be applied to alignee based on aligner + +NSRect GTMAlignRectangles(NSRect alignee, NSRect aligner, NSImageAlignment alignment) { + switch (alignment) { + case NSImageAlignTop: + alignee.origin.x = aligner.origin.x + (NSWidth(aligner) * .5f - NSWidth(alignee) * .5f); + alignee.origin.y = aligner.origin.y + NSHeight(aligner) - NSHeight(alignee); + break; + + case NSImageAlignTopLeft: + alignee.origin.x = aligner.origin.x; + alignee.origin.y = aligner.origin.y + NSHeight(aligner) - NSHeight(alignee); + break; + + case NSImageAlignTopRight: + alignee.origin.x = aligner.origin.x + NSWidth(aligner) - NSWidth(alignee); + alignee.origin.y = aligner.origin.y + NSHeight(aligner) - NSHeight(alignee); + break; + + case NSImageAlignLeft: + alignee.origin.x = aligner.origin.x; + alignee.origin.y = aligner.origin.y + (NSHeight(aligner) * .5f - NSHeight(alignee) * .5f); + break; + + case NSImageAlignBottomLeft: + alignee.origin.x = aligner.origin.x; + alignee.origin.y = aligner.origin.y; + break; + + case NSImageAlignBottom: + alignee.origin.x = aligner.origin.x + (NSWidth(aligner) * .5f - NSWidth(alignee) * .5f); + alignee.origin.y = aligner.origin.y; + break; + + case NSImageAlignBottomRight: + alignee.origin.x = aligner.origin.x + NSWidth(aligner) - NSWidth(alignee); + alignee.origin.y = aligner.origin.y; + break; + + case NSImageAlignRight: + alignee.origin.x = aligner.origin.x + NSWidth(aligner) - NSWidth(alignee); + alignee.origin.y = aligner.origin.y + (NSHeight(aligner) * .5f - NSHeight(alignee) * .5f); + break; + + default: + case NSImageAlignCenter: + alignee.origin.x = aligner.origin.x + (NSWidth(aligner) * .5f - NSWidth(alignee) * .5f); + alignee.origin.y = aligner.origin.y + (NSHeight(aligner) * .5f - NSHeight(alignee) * .5f); + break; + } + return alignee; +} + +NSRect GTMScaleRectangleToSize(NSRect scalee, NSSize size, NSImageScaling scaling) { + switch (scaling) { + case NSScaleProportionally: { + float height = NSHeight(scalee); + float width = NSWidth(scalee); + if (isnormal(height) && isnormal(width) && + (height > size.height || width > size.width)) { + float horiz = size.width / width; + float vert = size.height / height; + float newScale = horiz < vert ? horiz : vert; + scalee = GTMNSRectScale(scalee, newScale, newScale); + } + break; + } + + case NSScaleToFit: + scalee.size = size; + break; + + case NSScaleNone: + default: + // Do nothing + break; + } + return scalee; +} |