GA::kit v0.3
G&A's in-house C++ application framework
Loading...
Searching...
No Matches
layout.h
Go to the documentation of this file.
1#pragma once
2#include "ga/math.h"
3
4namespace ga {
5enum class HorzAlign
6{
7 LEFT,
8 CENTER,
10};
11enum class VertAlign
12{
13 TOP,
14 MIDDLE,
15 BOTTOM
16};
17
18// helper for alignment, returns anchor in percent
19inline vec2 anchor( HorzAlign h, VertAlign v )
20{
21 ga::vec2 p { 0, 0 };
22 switch ( h ) {
24 p.x = .5;
25 break;
27 p.x = 1.;
28 break;
29 }
30 switch ( v ) {
32 p.y = .5;
33 break;
35 p.y = 1.;
36 break;
37 }
38 return p;
39}
40
41/*
42 FitMode - describes how to scale an object to fit a container object
43 */
44enum class FitMode
45{
46 NONE, // no auto scaling
47 FIT, // scale proportionally to fit entirely within container
48 STRETCH, // match width and height to container
49 COVER, // scale to cover container
50 FIT_WIDTH, // fit width, scale height accordingly
52 FIT_DEPTH // for 3D
53};
54
55inline vec3 calcScaleToFit( const vec3& sourceSize, const vec3& containerSize, const FitMode& fitMode )
56{
57 vec3 scale = vec3( 1.f );
58
59 // calculate sizing based on fit mode
60 switch ( fitMode ) {
61
62 case FitMode::FIT: {
63 vec3 s = containerSize / sourceSize;
64 float s0 = std::min( std::min( s.x, s.y ), s.z );
65 scale = vec3( s0 );
66 break;
67 }
68
69 case FitMode::STRETCH: {
70 scale = containerSize / sourceSize;
71 break;
72 }
73
74 case FitMode::COVER: {
75 vec3 s = containerSize / sourceSize;
76 float s1 = std::max( std::max( s.x, s.y ), s.z );
77 scale = vec3( s1 );
78 break;
79 }
80
81 case FitMode::FIT_WIDTH: {
82 float sx = containerSize.x / sourceSize.x;
83 scale = vec3( sx );
84 break;
85 }
86
88 float sy = containerSize.y / sourceSize.y;
89 scale = vec3( sy );
90 break;
91 }
92
93 case FitMode::FIT_DEPTH: {
94 float sz = containerSize.z / sourceSize.z;
95 scale = vec3( sz );
96 break;
97 }
98
99 case FitMode::NONE:
100 default:
101 break;
102 }
103
104 return scale;
105}
106
107inline vec2 calcScaleToFit( const vec2& sourceSize, const vec2& containerSize, const FitMode& fitMode )
108{
109 vec2 scale = vec2( 1.f );
110
111 // calculate sizing based on fit mode
112 switch ( fitMode ) {
113
114 case FitMode::FIT: {
115 vec2 s = containerSize / sourceSize;
116 float s0 = std::min( s.x, s.y );
117 scale = vec2( s0 );
118 break;
119 }
120
121 case FitMode::STRETCH: {
122 scale = containerSize / sourceSize;
123 break;
124 }
125
126 case FitMode::COVER: {
127 vec2 s = containerSize / sourceSize;
128 float s1 = std::max( s.x, s.y );
129 scale = vec2( s1 );
130 break;
131 }
132
133 case FitMode::FIT_WIDTH: {
134 float sx = containerSize.x / sourceSize.x;
135 scale = vec2( sx );
136 break;
137 }
138
139 case FitMode::FIT_HEIGHT: {
140 float sy = containerSize.y / sourceSize.y;
141 scale = vec2( sy );
142 break;
143 }
144
146 case FitMode::NONE:
147 default:
148 break;
149 }
150
151 return scale;
152}
153
154} // namespace ga
Definition: color.h:9
vec3 calcScaleToFit(const vec3 &sourceSize, const vec3 &containerSize, const FitMode &fitMode)
Definition: layout.h:55
FitMode
Definition: layout.h:45
VertAlign
Definition: layout.h:12
HorzAlign
Definition: layout.h:6
vec2 anchor(HorzAlign h, VertAlign v)
Definition: layout.h:19