4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
28 * Copyright 2019 Toomas Soome <tsoome@me.com>
32 * Generic font related data and functions shared by early boot console
33 * in dboot, kernel startup and full kernel.
35 #include <sys/types.h>
36 #include <sys/systm.h>
38 #include <sys/sysmacros.h>
41 * Fonts are statically linked with this module. At some point an
42 * RFE might be desireable to allow dynamic font loading. The
43 * original intention to facilitate dynamic fonts can be seen
44 * by examining the data structures and set_font(). As much of
45 * the original code is retained but modified to be suited for
46 * traversing a list of static fonts.
50 * Must be sorted by font size in descending order
52 struct fontlist fonts
[] = {
53 { &font_data_12x22
, NULL
},
54 { &font_data_8x16
, NULL
},
55 { &font_data_7x14
, NULL
},
56 { &font_data_6x10
, NULL
},
61 set_font(struct font
*f
, short *rows
, short *cols
, short height
, short width
)
63 bitmap_data_t
*default_font
= NULL
, *font_selected
= NULL
;
68 * Find best font for these dimensions, or use default
70 * A 1 pixel border is the absolute minimum we could have
71 * as a border around the text window (BORDER_PIXELS = 2),
72 * however a slightly larger border not only looks better
73 * but for the fonts currently statically built into the
74 * emulator causes much better font selection for the
75 * normal range of screen resolutions.
77 for (fl
= fonts
; fl
->data
; fl
++) {
78 if ((((*rows
* fl
->data
->height
) + BORDER_PIXELS
) <= height
) &&
79 (((*cols
* fl
->data
->width
) + BORDER_PIXELS
) <= width
)) {
80 font_selected
= fl
->data
;
81 *rows
= (height
- BORDER_PIXELS
) /
82 font_selected
->height
;
83 *cols
= (width
- BORDER_PIXELS
) /
87 default_font
= fl
->data
;
90 * The minus 2 is to make sure we have at least a 1 pixel
91 * border around the entire screen.
93 if (font_selected
== NULL
) {
94 if (default_font
== NULL
)
95 default_font
= &DEFAULT_FONT_DATA
;
97 if (((*rows
* default_font
->height
) > height
) ||
98 ((*cols
* default_font
->width
) > width
)) {
99 *rows
= (height
- 2) / default_font
->height
;
100 *cols
= (width
- 2) / default_font
->width
;
102 font_selected
= default_font
;
105 f
->width
= font_selected
->width
;
106 f
->height
= font_selected
->height
;
108 for (i
= 0; i
< ENCODED_CHARS
; i
++)
109 f
->char_ptr
[i
] = font_selected
->encoding
[i
];
111 f
->image_data
= font_selected
->image
;
116 * bit_to_pix4 is for 4-bit frame buffers. It will write one output byte
117 * for each 2 bits of input bitmap. It inverts the input bits before
118 * doing the output translation, for reverse video.
120 * Assuming foreground is 0001 and background is 0000...
121 * An input data byte of 0x53 will output the bit pattern
122 * 00000001 00000001 00000000 00010001.
141 if (c
>= ENCODED_CHARS
)
145 bytes_wide
= (f
->width
+ 7) / 8;
147 for (row
= 0; row
< f
->height
; row
++) {
148 for (byte
= 0; byte
< bytes_wide
; byte
++) {
150 for (i
= 0; i
< 4; i
++) {
151 nibblett
= (data
>> ((3-i
) * 2)) & 0x3;
154 *dest
++ = bg_color
<< 4 | bg_color
;
157 *dest
++ = bg_color
<< 4 | fg_color
;
160 *dest
++ = fg_color
<< 4 | bg_color
;
163 *dest
++ = fg_color
<< 4 | fg_color
;
172 * bit_to_pix8 is for 8-bit frame buffers. It will write one output byte
173 * for each bit of input bitmap. It inverts the input bits before
174 * doing the output translation, for reverse video.
176 * Assuming foreground is 00000001 and background is 00000000...
177 * An input data byte of 0x53 will output the bit pattern
178 * 0000000 000000001 00000000 00000001 00000000 00000000 00000001 00000001.
198 if (c
>= ENCODED_CHARS
)
202 bytes_wide
= (f
->width
+ 7) / 8;
204 for (row
= 0; row
< f
->height
; row
++) {
206 for (byte
= 0; byte
< bytes_wide
; byte
++) {
209 nbits
= MIN(8, bitsleft
);
211 for (i
= 0; i
< nbits
; i
++) {
212 *dest
++ = (data
& mask
? fg_color
: bg_color
);
220 * bit_to_pix16 is for 16-bit frame buffers. It will write two output bytes
221 * for each bit of input bitmap. It inverts the input bits before
222 * doing the output translation, for reverse video.
224 * Assuming foreground is 11111111 11111111
225 * and background is 00000000 00000000
226 * An input data byte of 0x53 will output the bit pattern
255 if (c
>= ENCODED_CHARS
)
259 bytes_wide
= (f
->width
+ 7) / 8;
261 for (row
= 0; row
< f
->height
; row
++) {
263 for (byte
= 0; byte
< bytes_wide
; byte
++) {
265 nbits
= MIN(8, bitsleft
);
267 for (i
= 0; i
< nbits
; i
++) {
268 d
= ((data
<< i
) & 0x80 ?
269 fg_color16
: bg_color16
);
277 * bit_to_pix24 is for 24-bit frame buffers. It will write three output bytes
278 * for each bit of input bitmap. It inverts the input bits before
279 * doing the output translation, for reverse video.
281 * Assuming foreground is 11111111 11111111 11111111
282 * and background is 00000000 00000000 00000000
283 * An input data byte of 0x53 will output the bit pattern
285 * 00000000 00000000 00000000
286 * 11111111 11111111 11111111
287 * 00000000 00000000 00000000
288 * 11111111 11111111 11111111
289 * 00000000 00000000 00000000
290 * 00000000 00000000 00000000
291 * 11111111 11111111 11111111
292 * 11111111 11111111 11111111
312 if (c
>= ENCODED_CHARS
)
316 bytes_wide
= (f
->width
+ 7) / 8;
318 for (row
= 0; row
< f
->height
; row
++) {
320 for (byte
= 0; byte
< bytes_wide
; byte
++) {
322 nbits
= MIN(8, bitsleft
);
324 for (i
= 0; i
< nbits
; i
++) {
325 d
= ((data
<< i
) & 0x80 ?
326 fg_color32
: bg_color32
);
328 *dest
++ = (d
>> 8) & 0xff;
329 *dest
++ = (d
>> 16) & 0xff;
336 * bit_to_pix32 is for 32-bit frame buffers. It will write four output bytes
337 * for each bit of input bitmap. It inverts the input bits before
338 * doing the output translation, for reverse video. Note that each
339 * 24-bit RGB value is finally stored in a 32-bit unsigned int, with the
340 * high-order byte set to zero.
342 * Assuming foreground is 00000000 11111111 11111111 11111111
343 * and background is 00000000 00000000 00000000 00000000
344 * An input data byte of 0x53 will output the bit pattern
346 * 00000000 00000000 00000000 00000000
347 * 00000000 11111111 11111111 11111111
348 * 00000000 00000000 00000000 00000000
349 * 00000000 11111111 11111111 11111111
350 * 00000000 00000000 00000000 00000000
351 * 00000000 00000000 00000000 00000000
352 * 00000000 11111111 11111111 11111111
353 * 00000000 11111111 11111111 11111111
373 if (c
>= ENCODED_CHARS
)
377 bytes_wide
= (f
->width
+ 7) / 8;
379 for (row
= 0; row
< f
->height
; row
++) {
381 for (byte
= 0; byte
< bytes_wide
; byte
++) {
383 nbits
= MIN(8, bitsleft
);
385 for (i
= 0; i
< nbits
; i
++) {
386 *dest
++ = ((data
<< i
) & 0x80 ?
387 fg_color32
: bg_color32
);