1/*
2 * Copyright 2012-2020 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5
6#include <ControlLook.h>
7
8#include <algorithm>
9#include <binary_compatibility/Interface.h>
10
11
12namespace BPrivate {
13
14
15BControlLook::BControlLook()
16	:
17	fCachedWorkspace(-1)
18{
19}
20
21
22BControlLook::~BControlLook()
23{
24}
25
26
27float
28BControlLook::ComposeSpacing(float spacing)
29{
30	switch ((int)spacing) {
31		case B_USE_DEFAULT_SPACING:
32		case B_USE_ITEM_SPACING:
33			return be_control_look->DefaultItemSpacing();
34		case B_USE_HALF_ITEM_SPACING:
35			return ceilf(be_control_look->DefaultItemSpacing() * 0.5f);
36		case B_USE_WINDOW_SPACING:
37			return be_control_look->DefaultItemSpacing();
38		case B_USE_SMALL_SPACING:
39			return ceilf(be_control_look->DefaultItemSpacing() * 0.7f);
40		case B_USE_CORNER_SPACING:
41			return ceilf(be_control_look->DefaultItemSpacing() * 1.272f);
42		case B_USE_BIG_SPACING:
43			return ceilf(be_control_look->DefaultItemSpacing() * 1.8f);
44
45		case B_USE_BORDER_SPACING:
46			return std::max(1.0f, floorf(be_control_look->DefaultItemSpacing() / 11.0f));
47	}
48
49	return spacing;
50}
51
52
53BSize
54BControlLook::ComposeIconSize(int32 size)
55{
56	float scale = be_plain_font->Size() / 12.0f;
57	if (scale < 1.0f)
58		scale = 1.0f;
59
60	const int32 scaled = (int32)(size * scale);
61	return BSize(scaled - 1, scaled - 1);
62}
63
64
65bool
66BControlLook::ShouldDraw(BView* view, const BRect& rect, const BRect& updateRect)
67{
68	if (!rect.IsValid())
69		return false;
70
71	BPoint points[4];
72	points[0] = rect.LeftTop();
73	points[1] = rect.RightBottom();
74	points[2] = rect.LeftBottom();
75	points[3] = rect.RightTop();
76
77	view->TransformTo(B_VIEW_COORDINATES).Apply(points, 4);
78
79	BRect dest;
80	dest.left = dest.right = points[0].x;
81	dest.top = dest.bottom = points[0].y;
82	for (int i = 1; i < 4; i++) {
83		dest.left = std::min(dest.left, points[i].x);
84		dest.right = std::max(dest.right, points[i].x);
85		dest.top = std::min(dest.top, points[i].y);
86		dest.bottom = std::max(dest.bottom, points[i].y);
87	}
88	dest.left = floorf(dest.left);
89	dest.right = ceilf(dest.right);
90	dest.top = floorf(dest.top);
91	dest.bottom = ceilf(dest.bottom);
92
93	return dest.Intersects(updateRect);
94}
95
96
97void
98BControlLook::DrawLabel(BView* view, const char* label, const BBitmap* icon,
99	BRect rect, const BRect& updateRect, const rgb_color& base, uint32 flags,
100	const rgb_color* textColor)
101{
102	DrawLabel(view, label, icon, rect, updateRect, base, flags,
103		DefaultLabelAlignment(), textColor);
104}
105
106
107void
108BControlLook::GetInsets(frame_type frameType, background_type backgroundType,
109	uint32 flags, float& _left, float& _top, float& _right, float& _bottom)
110{
111	GetFrameInsets(frameType, flags, _left, _top, _right, _bottom);
112
113	float left, top, right, bottom;
114	GetBackgroundInsets(backgroundType, flags, left, top, right, bottom);
115
116	_left += left;
117	_top += top;
118	_right += right;
119	_bottom += bottom;
120}
121
122
123float
124BControlLook::GetScrollBarWidth(orientation orientation)
125{
126	return ComposeSpacing(B_USE_CORNER_SPACING);
127}
128
129
130void
131BControlLook::SetBackgroundInfo(const BMessage& backgroundInfo)
132{
133	fBackgroundInfo = backgroundInfo;
134	fCachedWorkspace = -1;
135}
136
137
138extern "C" void
139B_IF_GCC_2(_ReservedControlLook1__Q28BPrivate12BControlLook,
140		_ZN8BPrivate12BControlLook21_ReservedControlLook1Ev)(
141	BControlLook* controlLook, BView* view, BRect& rect,
142	const BRect& updateRect, const rgb_color& base, uint32 flags,
143	uint32 borders, border_style borderStyle, uint32 side)
144{
145	controlLook->DrawTabFrame(view, rect, updateRect, base, flags, borders,
146		borderStyle, side);
147}
148
149
150extern "C" void
151B_IF_GCC_2(_ReservedControlLook2__Q28BPrivate12BControlLook,
152		_ZN8BPrivate12BControlLook21_ReservedControlLook2Ev)(
153	BControlLook* controlLook, BView* view, BRect rect,
154		const BRect& updateRect, const rgb_color& base, uint32 flags,
155		int32 direction, orientation orientation, bool down)
156{
157	controlLook->DrawScrollBarButton(view, rect, updateRect, base, flags,
158		direction, orientation, down);
159}
160
161
162extern "C" void
163B_IF_GCC_2(_ReservedControlLook3__Q28BPrivate12BControlLook,
164		_ZN8BPrivate12BControlLook21_ReservedControlLook3Ev)(
165	BControlLook* controlLook, BView* view, BRect rect,
166		const BRect& updateRect, const rgb_color& base, uint32 flags,
167		int32 direction, orientation orientation, uint32 knobStyle)
168{
169	controlLook->DrawScrollBarThumb(view, rect, updateRect, base, flags,
170		orientation, knobStyle);
171}
172
173
174extern "C" void
175B_IF_GCC_2(_ReservedControlLook4__Q28BPrivate12BControlLook,
176		_ZN8BPrivate12BControlLook21_ReservedControlLook4Ev)(
177	BControlLook* controlLook, BView* view, BRect rect,
178		const BRect& updateRect, const rgb_color& base, uint32 flags,
179		orientation orientation)
180{
181	controlLook->DrawScrollBarBorder(view, rect, updateRect, base, flags,
182		orientation);
183}
184
185
186extern "C" float
187B_IF_GCC_2(_ReservedControlLook5__Q28BPrivate12BControlLook,
188		_ZN8BPrivate12BControlLook21_ReservedControlLook5Ev)(
189	BControlLook* controlLook, orientation orientation)
190{
191	return controlLook->GetScrollBarWidth(orientation);
192}
193
194
195void BControlLook::_ReservedControlLook6() {}
196void BControlLook::_ReservedControlLook7() {}
197void BControlLook::_ReservedControlLook8() {}
198void BControlLook::_ReservedControlLook9() {}
199void BControlLook::_ReservedControlLook10() {}
200
201
202// Initialized in InterfaceDefs.cpp
203BControlLook* be_control_look = NULL;
204
205} // namespace BPrivate
206