aboutsummaryrefslogtreecommitdiff
path: root/AppKit/GTMGeometryUtils.m
diff options
context:
space:
mode:
Diffstat (limited to 'AppKit/GTMGeometryUtils.m')
-rw-r--r--AppKit/GTMGeometryUtils.m152
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;
+}