xref: /haiku/src/apps/icon-o-matic/generic/support/support.h (revision 3ec18e87d6cfa48715a6ed10bcd03858d832093b)
1128277c9SStephan Aßmus /*
2128277c9SStephan Aßmus  * Copyright 2006, Haiku.
3128277c9SStephan Aßmus  * Distributed under the terms of the MIT License.
4128277c9SStephan Aßmus  *
5128277c9SStephan Aßmus  * Authors:
6128277c9SStephan Aßmus  *		Stephan Aßmus <superstippi@gmx.de>
7128277c9SStephan Aßmus  */
8128277c9SStephan Aßmus 
9128277c9SStephan Aßmus #ifndef SUPPORT_H
10128277c9SStephan Aßmus #define SUPPORT_H
11128277c9SStephan Aßmus 
12128277c9SStephan Aßmus #include <Rect.h>
13128277c9SStephan Aßmus 
14128277c9SStephan Aßmus class BPositionIO;
15128277c9SStephan Aßmus class BString;
16128277c9SStephan Aßmus 
17128277c9SStephan Aßmus // constrain
18128277c9SStephan Aßmus inline void
constrain(float & value,float min,float max)19128277c9SStephan Aßmus constrain(float& value, float min, float max)
20128277c9SStephan Aßmus {
21128277c9SStephan Aßmus 	if (value < min)
22128277c9SStephan Aßmus 		value = min;
23128277c9SStephan Aßmus 	if (value > max)
24128277c9SStephan Aßmus 		value = max;
25128277c9SStephan Aßmus }
26128277c9SStephan Aßmus 
27128277c9SStephan Aßmus // constrain_int32_0_255_asm
28128277c9SStephan Aßmus inline int32
constrain_int32_0_255_asm(int32 value)29128277c9SStephan Aßmus constrain_int32_0_255_asm(int32 value) {
30*3ec18e87SMarcus Overhagen     asm("movl  $0,    %%ecx;\n"
31*3ec18e87SMarcus Overhagen         "movl  $255,  %%edx;\n"
32*3ec18e87SMarcus Overhagen         "cmpl  %%ecx, %%eax;\n"
33*3ec18e87SMarcus Overhagen         "cmovl %%ecx, %%eax;\n"
34*3ec18e87SMarcus Overhagen         "cmpl  %%edx, %%eax;\n"
35*3ec18e87SMarcus Overhagen         "cmovg %%edx, %%eax"
36128277c9SStephan Aßmus        : "=a" (value)
37128277c9SStephan Aßmus        : "a" (value)
38128277c9SStephan Aßmus        : "%ecx", "%edx" );
39128277c9SStephan Aßmus     return value;
40128277c9SStephan Aßmus }
41128277c9SStephan Aßmus 
42128277c9SStephan Aßmus inline int32
constrain_int32_0_255_c(int32 value)43128277c9SStephan Aßmus constrain_int32_0_255_c(int32 value) {
44128277c9SStephan Aßmus     return max_c(0, min_c(255, value));
45128277c9SStephan Aßmus }
46128277c9SStephan Aßmus 
47128277c9SStephan Aßmus #define constrain_int32_0_255 constrain_int32_0_255_asm
48128277c9SStephan Aßmus 
49128277c9SStephan Aßmus // rect_to_int
50128277c9SStephan Aßmus inline void
rect_to_int(BRect r,int32 & left,int32 & top,int32 & right,int32 & bottom)51128277c9SStephan Aßmus rect_to_int(BRect r,
52128277c9SStephan Aßmus 			int32& left, int32& top, int32& right, int32& bottom)
53128277c9SStephan Aßmus {
54128277c9SStephan Aßmus 	left = (int32)floorf(r.left);
55128277c9SStephan Aßmus 	top = (int32)floorf(r.top);
56128277c9SStephan Aßmus 	right = (int32)ceilf(r.right);
57128277c9SStephan Aßmus 	bottom = (int32)ceilf(r.bottom);
58128277c9SStephan Aßmus }
59128277c9SStephan Aßmus 
60128277c9SStephan Aßmus // point_point_distance
61128277c9SStephan Aßmus inline float
point_point_distance(BPoint a,BPoint b)62128277c9SStephan Aßmus point_point_distance(BPoint a, BPoint b)
63128277c9SStephan Aßmus {
64128277c9SStephan Aßmus 	float xDiff = b.x - a.x;
65128277c9SStephan Aßmus 	float yDiff = b.y - a.y;
66128277c9SStephan Aßmus 	return sqrtf(xDiff * xDiff + yDiff * yDiff);
67128277c9SStephan Aßmus }
68128277c9SStephan Aßmus 
69128277c9SStephan Aßmus // point_line_distance
70128277c9SStephan Aßmus double
71128277c9SStephan Aßmus point_line_distance(double x1, double y1,
72128277c9SStephan Aßmus 					double x2, double y2,
73128277c9SStephan Aßmus 					double x,  double y);
74128277c9SStephan Aßmus 
75128277c9SStephan Aßmus // point_line_distance
76128277c9SStephan Aßmus double
77128277c9SStephan Aßmus point_line_distance(BPoint point, BPoint a, BPoint b);
78128277c9SStephan Aßmus 
79128277c9SStephan Aßmus // calc_angle
80128277c9SStephan Aßmus double
81128277c9SStephan Aßmus calc_angle(BPoint origin, BPoint from, BPoint to, bool degree = true);
82128277c9SStephan Aßmus 
83128277c9SStephan Aßmus /*
84128277c9SStephan Aßmus template <class T>
85128277c9SStephan Aßmus T min4(const T a, const T b, const T c, const T d)
86128277c9SStephan Aßmus {
87128277c9SStephan Aßmus 	T e = a < b ? a : b;
88128277c9SStephan Aßmus 	T f = c < d ? c : d;
89128277c9SStephan Aßmus 	return e < f ? e : f;
90128277c9SStephan Aßmus }
91128277c9SStephan Aßmus template <class T>
92128277c9SStephan Aßmus T max4(const T a, const T b, const T c, const T d)
93128277c9SStephan Aßmus {
94128277c9SStephan Aßmus 	T e = a > b ? a : b;
95128277c9SStephan Aßmus 	T f = c > d ? c : d;
96128277c9SStephan Aßmus 	return e > f ? e : f;
97128277c9SStephan Aßmus }
98128277c9SStephan Aßmus */
99128277c9SStephan Aßmus inline float
min4(float a,float b,float c,float d)100128277c9SStephan Aßmus min4(float a, float b, float c, float d)
101128277c9SStephan Aßmus {
102128277c9SStephan Aßmus 	return min_c(a, min_c(b, min_c(c, d)));
103128277c9SStephan Aßmus }
104128277c9SStephan Aßmus 
105128277c9SStephan Aßmus inline float
max4(float a,float b,float c,float d)106128277c9SStephan Aßmus max4(float a, float b, float c, float d)
107128277c9SStephan Aßmus {
108128277c9SStephan Aßmus 	return max_c(a, max_c(b, max_c(c, d)));
109128277c9SStephan Aßmus }
110128277c9SStephan Aßmus 
111128277c9SStephan Aßmus inline float
min5(float v1,float v2,float v3,float v4,float v5)112128277c9SStephan Aßmus min5(float v1, float v2, float v3, float v4, float v5)
113128277c9SStephan Aßmus {
114128277c9SStephan Aßmus 	return min_c(min4(v1, v2, v3, v4), v5);
115128277c9SStephan Aßmus }
116128277c9SStephan Aßmus 
117128277c9SStephan Aßmus inline float
max5(float v1,float v2,float v3,float v4,float v5)118128277c9SStephan Aßmus max5(float v1, float v2, float v3, float v4, float v5)
119128277c9SStephan Aßmus {
120128277c9SStephan Aßmus 	return max_c(max4(v1, v2, v3, v4), v5);
121128277c9SStephan Aßmus }
122128277c9SStephan Aßmus 
123128277c9SStephan Aßmus inline float
roundf(float v)124128277c9SStephan Aßmus roundf(float v)
125128277c9SStephan Aßmus {
126128277c9SStephan Aßmus 	if (v >= 0.0)
127128277c9SStephan Aßmus 		return floorf(v + 0.5);
128128277c9SStephan Aßmus 	return ceilf(v - 0.5);
129128277c9SStephan Aßmus }
130128277c9SStephan Aßmus 
131128277c9SStephan Aßmus status_t write_string(BPositionIO* stream, BString& string);
132128277c9SStephan Aßmus void append_float(BString& string, float n, int32 maxDigits = 4);
133128277c9SStephan Aßmus 
1340e1ba39fSStephan Aßmus //double gauss(double f);
135128277c9SStephan Aßmus 
136128277c9SStephan Aßmus 
137128277c9SStephan Aßmus # endif // SUPPORT_H
138