1 /***************************************************************************
2 * Copyright (c) 2024 Microsoft Corporation
3 *
4 * This program and the accompanying materials are made available under the
5 * terms of the MIT License which is available at
6 * https://opensource.org/licenses/MIT.
7 *
8 * SPDX-License-Identifier: MIT
9 **************************************************************************/
10
11
12 /**************************************************************************/
13 /**************************************************************************/
14 /** */
15 /** GUIX Component */
16 /** */
17 /** Slider Management (Slider) */
18 /** */
19 /**************************************************************************/
20
21 #define GX_SOURCE_CODE
22
23 /* Include necessary system files. */
24
25 #include "gx_api.h"
26 #include "gx_system.h"
27 #include "gx_canvas.h"
28 #include "gx_context.h"
29 #include "gx_widget.h"
30 #include "gx_utility.h"
31 #include "gx_slider.h"
32
33
34
35 /**************************************************************************/
36 /* */
37 /* FUNCTION RELEASE */
38 /* */
39 /* _gx_slider_needle_draw PORTABLE C */
40 /* 6.1 */
41 /* AUTHOR */
42 /* */
43 /* Kenneth Maxwell, Microsoft Corporation */
44 /* */
45 /* DESCRIPTION */
46 /* */
47 /* This service draws a slider needle. */
48 /* */
49 /* INPUT */
50 /* */
51 /* slider Slider widget control block */
52 /* */
53 /* OUTPUT */
54 /* */
55 /* None */
56 /* */
57 /* CALLS */
58 /* */
59 /* _gx_slider_needle_position_get Get the position of the */
60 /* slider needle */
61 /* _gx_context_line_color_set Set the line color for the */
62 /* context */
63 /* _gx_context_brush_width_set Set the brush width of the */
64 /* context */
65 /* _gx_canvas_line_draw Draw a line on the canvas */
66 /* _gx_context_brush_define Define the brush of the */
67 /* context */
68 /* _gx_canvas_rectangle_draw Draw a rectangle */
69 /* */
70 /* CALLED BY */
71 /* */
72 /* Application Code */
73 /* GUIX Internal Code */
74 /* */
75 /* RELEASE HISTORY */
76 /* */
77 /* DATE NAME DESCRIPTION */
78 /* */
79 /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */
80 /* 09-30-2020 Kenneth Maxwell Modified comment(s), */
81 /* resulting in version 6.1 */
82 /* */
83 /**************************************************************************/
_gx_slider_needle_draw(GX_SLIDER * slider)84 VOID _gx_slider_needle_draw(GX_SLIDER *slider)
85 {
86 GX_VALUE NeedleSpace;
87 GX_VALUE center;
88 GX_RECTANGLE NeedleSize;
89 GX_SLIDER_INFO *info;
90
91 /* pick up the needle width */
92 info = &slider -> gx_slider_info;
93 if (slider -> gx_widget_style & GX_STYLE_SLIDER_VERTICAL)
94 {
95 NeedleSpace = info -> gx_slider_info_needle_height;
96 }
97 else
98 {
99 NeedleSpace = info -> gx_slider_info_needle_width;
100 }
101
102 /* get needle dimensions based on current value */
103 _gx_slider_needle_position_get(slider, info, &NeedleSize);
104
105 /* pick up brush pointer */
106 _gx_context_line_color_set(GX_COLOR_ID_SLIDER_GROOVE_TOP);
107 _gx_context_brush_width_set(1);
108
109 /* draw the line on which the needle slides */
110 if (slider -> gx_widget_style & GX_STYLE_SLIDER_VERTICAL)
111 {
112 center = (GX_VALUE)(slider -> gx_widget_size.gx_rectangle_left +
113 slider -> gx_widget_size.gx_rectangle_right) / 2;
114
115 _gx_canvas_line_draw(center,
116 (GX_VALUE)(slider -> gx_widget_size.gx_rectangle_top + NeedleSpace),
117 center,
118 (GX_VALUE)(slider -> gx_widget_size.gx_rectangle_bottom - NeedleSpace));
119 _gx_context_line_color_set(GX_COLOR_ID_SLIDER_GROOVE_BOTTOM);
120 _gx_canvas_line_draw((GX_VALUE)(center + 1),
121 (GX_VALUE)(slider -> gx_widget_size.gx_rectangle_top + NeedleSpace),
122 (GX_VALUE)(center + 1),
123 (GX_VALUE)(slider -> gx_widget_size.gx_rectangle_bottom - NeedleSpace));
124 }
125 else
126 {
127 center = (GX_VALUE)(slider -> gx_widget_size.gx_rectangle_top +
128 slider -> gx_widget_size.gx_rectangle_bottom) / 2;
129
130 _gx_canvas_line_draw((GX_VALUE)(slider -> gx_widget_size.gx_rectangle_left + NeedleSpace),
131 center, (GX_VALUE)(slider -> gx_widget_size.gx_rectangle_right - NeedleSpace),
132 center);
133 _gx_context_line_color_set(GX_COLOR_ID_SLIDER_GROOVE_BOTTOM);
134 _gx_canvas_line_draw((GX_VALUE)(slider -> gx_widget_size.gx_rectangle_left + NeedleSpace),
135 (GX_VALUE)(center + 1), (GX_VALUE)(slider -> gx_widget_size.gx_rectangle_right - NeedleSpace),
136 (GX_VALUE)(center + 1));
137 }
138
139
140 /* draw the needle itself */
141 _gx_context_brush_define(GX_COLOR_ID_SLIDER_NEEDLE_OUTLINE,
142 GX_COLOR_ID_SLIDER_NEEDLE_FILL,
143 GX_BRUSH_SOLID_FILL);
144 _gx_canvas_rectangle_draw(&NeedleSize);
145
146 _gx_context_line_color_set(GX_COLOR_ID_SLIDER_NEEDLE_LINE1);
147
148 if (slider -> gx_widget_style & GX_STYLE_SLIDER_VERTICAL)
149 {
150 _gx_canvas_line_draw((GX_VALUE)(NeedleSize.gx_rectangle_left + 1),
151 (GX_VALUE)(NeedleSize.gx_rectangle_top + 2),
152 (GX_VALUE)(NeedleSize.gx_rectangle_right - 1),
153 (GX_VALUE)(NeedleSize.gx_rectangle_top + 2));
154 _gx_context_line_color_set(GX_COLOR_ID_SLIDER_NEEDLE_LINE2);
155
156 _gx_canvas_line_draw((GX_VALUE)(NeedleSize.gx_rectangle_left + 1),
157 (GX_VALUE)(NeedleSize.gx_rectangle_top + 3),
158 (GX_VALUE)(NeedleSize.gx_rectangle_right - 1),
159 (GX_VALUE)(NeedleSize.gx_rectangle_top + 3));
160 }
161 else
162 {
163 _gx_canvas_line_draw((GX_VALUE)(NeedleSize.gx_rectangle_left + 2),
164 (GX_VALUE)(NeedleSize.gx_rectangle_top + 1),
165 (GX_VALUE)(NeedleSize.gx_rectangle_left + 2),
166 (GX_VALUE)(NeedleSize.gx_rectangle_bottom - 1));
167 _gx_context_line_color_set(GX_COLOR_ID_SLIDER_NEEDLE_LINE2);
168
169 _gx_canvas_line_draw((GX_VALUE)(NeedleSize.gx_rectangle_left + 3),
170 (GX_VALUE)(NeedleSize.gx_rectangle_top + 1),
171 (GX_VALUE)(NeedleSize.gx_rectangle_left + 3),
172 (GX_VALUE)(NeedleSize.gx_rectangle_bottom - 1));
173 }
174 }
175
176