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 /**   Win32 Display Management (Display)                                  */
18 /**                                                                       */
19 /**************************************************************************/
20 #ifdef WIN32
21 #include "tx_api.h"
22 #include "gx_api.h"
23 #include "gx_system.h"
24 #include "gx_display.h"
25 #include "windows.h"
26 #include "gx_win32_display_driver.h"
27 
28 /**************************************************************************/
29 /*                                                                        */
30 /*  FUNCTION                                               RELEASE        */
31 /*                                                                        */
32 /*    win32_display_driver_8bit_palette_set               PORTABLE C      */
33 /*                                                           6.1.4        */
34 /*  AUTHOR                                                                */
35 /*                                                                        */
36 /*    Kenneth Maxwell, Microsoft Corporation                              */
37 /*                                                                        */
38 /*  DESCRIPTION                                                           */
39 /*                                                                        */
40 /*    This function set bitmap palette for 8bpp.                          */
41 /*                                                                        */
42 /*  INPUT                                                                 */
43 /*                                                                        */
44 /*    display                               Pointer to GX_DISPLAY         */
45 /*    palette                               Pointer to palette table      */
46 /*    count                                 Palette table count           */
47 /*                                                                        */
48 /*  OUTPUT                                                                */
49 /*                                                                        */
50 /*    None                                                                */
51 /*                                                                        */
52 /*  CALLS                                                                 */
53 /*                                                                        */
54 /*    None                                                                */
55 /*                                                                        */
56 /*  CALLED BY                                                             */
57 /*                                                                        */
58 /*    win32_graphics_driver_setup_8bit_palette                            */
59 /*                                                                        */
60 /*  RELEASE HISTORY                                                       */
61 /*                                                                        */
62 /*    DATE              NAME                      DESCRIPTION             */
63 /*                                                                        */
64 /*  12-31-2020     Kenneth Maxwell          Initial Version 6.1.3         */
65 /*  02-02-2021     Kenneth Maxwell          Modified comment(s),          */
66 /*                                            made the function public,   */
67 /*                                            resulting in version 6.1.4  */
68 /*                                                                        */
69 /**************************************************************************/
win32_display_driver_8bit_palette_set(GX_DISPLAY * display,GX_COLOR * palette,INT count)70 VOID win32_display_driver_8bit_palette_set(GX_DISPLAY *display, GX_COLOR *palette, INT count)
71 {
72 GX_COLOR                      color;
73 int                           loop;
74 GX_WIN32_DISPLAY_DRIVER_DATA *instance;
75 
76     display -> gx_display_palette = palette;
77     display -> gx_display_palette_size = count;
78 
79     instance = (GX_WIN32_DISPLAY_DRIVER_DATA *)display -> gx_display_driver_data;
80     instance -> win32_driver_bmpinfo.gx_bmp_header.biClrUsed = count;
81     instance -> win32_driver_bmpinfo.gx_bmp_header.biClrImportant = count;
82 
83     for (loop = 0; loop < count; loop++)
84     {
85         color = *palette++;
86         instance -> win32_driver_bmpinfo.gx_bmp_colors[loop] = color;
87     }
88 }
89 
90 /**************************************************************************/
91 /*                                                                        */
92 /*  FUNCTION                                               RELEASE        */
93 /*                                                                        */
94 /*    win32_8bit_palette_bitmap_header_create             PORTABLE C      */
95 /*                                                           6.1.3        */
96 /*  AUTHOR                                                                */
97 /*                                                                        */
98 /*    Kenneth Maxwell, Microsoft Corporation                              */
99 /*                                                                        */
100 /*  DESCRIPTION                                                           */
101 /*                                                                        */
102 /*    This function creates bitmap header for 8bpp driver.                */
103 /*                                                                        */
104 /*  INPUT                                                                 */
105 /*                                                                        */
106 /*    display                               Pointer to GX_DISPLAY         */
107 /*                                                                        */
108 /*  OUTPUT                                                                */
109 /*                                                                        */
110 /*    None                                                                */
111 /*                                                                        */
112 /*  CALLS                                                                 */
113 /*                                                                        */
114 /*    None                                                                */
115 /*                                                                        */
116 /*  CALLED BY                                                             */
117 /*                                                                        */
118 /*    win32_graphics_driver_setup_8bit_palette                            */
119 /*                                                                        */
120 /*  RELEASE HISTORY                                                       */
121 /*                                                                        */
122 /*    DATE              NAME                      DESCRIPTION             */
123 /*                                                                        */
124 /*  12-31-2020     Kenneth Maxwell          Initial Version 6.1.3         */
125 /*                                                                        */
126 /**************************************************************************/
win32_8bit_palette_bitmap_header_create(GX_DISPLAY * display)127 VOID win32_8bit_palette_bitmap_header_create(GX_DISPLAY *display)
128 {
129 
130 GX_WIN32_DISPLAY_DRIVER_DATA *instance = (GX_WIN32_DISPLAY_DRIVER_DATA *)display -> gx_display_driver_data;
131 
132     instance -> win32_driver_bmpinfo.gx_bmp_header.biSize = sizeof(BITMAPINFOHEADER);
133     instance -> win32_driver_bmpinfo.gx_bmp_header.biWidth = display -> gx_display_width;
134     instance -> win32_driver_bmpinfo.gx_bmp_header.biHeight = display -> gx_display_height;
135 
136     instance -> win32_driver_bmpinfo.gx_bmp_header.biPlanes = 1;
137     instance -> win32_driver_bmpinfo.gx_bmp_header.biBitCount = 8;
138     instance -> win32_driver_bmpinfo.gx_bmp_header.biSizeImage = display -> gx_display_width * display -> gx_display_height;
139     instance -> win32_driver_bmpinfo.gx_bmp_header.biClrUsed = 0;
140     instance -> win32_driver_bmpinfo.gx_bmp_header.biClrImportant = 0;
141     instance -> win32_driver_bmpinfo.gx_bmp_header.biCompression = BI_RGB;
142 }
143 
144 /**************************************************************************/
145 /*                                                                        */
146 /*  FUNCTION                                               RELEASE        */
147 /*                                                                        */
148 /*    win32_graphics_driver_setup_8bit_palette            PORTABLE C      */
149 /*                                                           6.1.10       */
150 /*  AUTHOR                                                                */
151 /*                                                                        */
152 /*    Kenneth Maxwell, Microsoft Corporation                              */
153 /*                                                                        */
154 /*  DESCRIPTION                                                           */
155 /*                                                                        */
156 /*    This function creates a Windows specific 8bpp display driver.       */
157 /*                                                                        */
158 /*  INPUT                                                                 */
159 /*                                                                        */
160 /*    display                               Pointer to GX_DISPLAY         */
161 /*                                                                        */
162 /*  OUTPUT                                                                */
163 /*                                                                        */
164 /*    status                                Completion status             */
165 /*                                                                        */
166 /*  CALLS                                                                 */
167 /*                                                                        */
168 /*    _gx_display_driver_8bit_palette_setup guix display setup funciton.  */
169 /*    win32_8bit_palette_bitmap_header_create                             */
170 /*                                          Create bitmap header info     */
171 /*    gx_win32_get_free_data_instance       Get display data instance     */
172 /*    [gx_display_driver_palette_set]       Set palette table for 8bpp    */
173 /*    GX_WIN32_EVENT_THREAD_CREATE          Create event thread           */
174 /*                                                                        */
175 /*  CALLED BY                                                             */
176 /*                                                                        */
177 /*    Application Code                                                    */
178 /*                                                                        */
179 /*  RELEASE HISTORY                                                       */
180 /*                                                                        */
181 /*    DATE              NAME                      DESCRIPTION             */
182 /*                                                                        */
183 /*  12-31-2020     Kenneth Maxwell          Initial Version 6.1.3         */
184 /*  01-31-2022     Ting Zhu                 Modified comment(s),          */
185 /*                                            improved logic,             */
186 /*                                            resulting in version 6.1.10 */
187 /*                                                                        */
188 /**************************************************************************/
win32_graphics_driver_setup_8bit_palette(GX_DISPLAY * display)189 UINT win32_graphics_driver_setup_8bit_palette(GX_DISPLAY *display)
190 {
191 GX_WIN32_DISPLAY_DRIVER_DATA *data;
192 
193     /* Initialize the low-level drawing function pointers.
194 
195        For windows, these are always just the generic funcions,
196        but for some hardware, these will be customized,
197        optimized functions specific to that hardware. */
198 
199     data = gx_win32_get_free_data_instance();
200     if (!data)
201     {
202         /* We don't have any free display data instance. */
203         return(GX_FAILURE);
204     }
205 
206     /* Save off the format of display driver. */
207     data -> win32_driver_type = GX_COLOR_FORMAT_8BIT_PALETTE;
208 
209     _gx_display_driver_8bit_palette_setup(display, data, gx_win32_display_buffer_toggle);
210     display -> gx_display_driver_palette_set = win32_display_driver_8bit_palette_set;
211 
212     /* Create bitmap header for 8bit palette driver. */
213     win32_8bit_palette_bitmap_header_create(display);
214 
215     /* Create the GUIX / Windows event thread
216        This thread is a substitute for a touch display
217        or keyboard driver thread that would be running
218        on embedded hardware. */
219     GX_WIN32_EVENT_THREAD_CREATE(data, "GUI-WIN32-8bit-palette");
220 
221     return(GX_SUCCESS);
222 }
223 #endif /* WIN32 */
224 
225