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