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 2017 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
*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
;
85 * The minus 2 is to make sure we have at least a 1 pixel
86 * border around the entire screen.
88 if (font_selected
== NULL
) {
89 if (((*rows
* DEFAULT_FONT_DATA
.height
) > height
) ||
90 ((*cols
* DEFAULT_FONT_DATA
.width
) > width
)) {
91 *rows
= (height
- 2) / DEFAULT_FONT_DATA
.height
;
92 *cols
= (width
- 2) / DEFAULT_FONT_DATA
.width
;
94 font_selected
= &DEFAULT_FONT_DATA
;
97 f
->width
= font_selected
->width
;
98 f
->height
= font_selected
->height
;
100 for (i
= 0; i
< ENCODED_CHARS
; i
++)
101 f
->char_ptr
[i
] = font_selected
->encoding
[i
];
103 f
->image_data
= font_selected
->image
;
108 * bit_to_pix4 is for 4-bit frame buffers. It will write one output byte
109 * for each 2 bits of input bitmap. It inverts the input bits before
110 * doing the output translation, for reverse video.
112 * Assuming foreground is 0001 and background is 0000...
113 * An input data byte of 0x53 will output the bit pattern
114 * 00000001 00000001 00000000 00010001.
134 bytes_wide
= (f
->width
+ 7) / 8;
136 for (row
= 0; row
< f
->height
; row
++) {
137 for (byte
= 0; byte
< bytes_wide
; byte
++) {
139 for (i
= 0; i
< 4; i
++) {
140 nibblett
= (data
>> ((3-i
) * 2)) & 0x3;
143 *dest
++ = bg_color
<< 4 | bg_color
;
146 *dest
++ = bg_color
<< 4 | fg_color
;
149 *dest
++ = fg_color
<< 4 | bg_color
;
152 *dest
++ = fg_color
<< 4 | fg_color
;
161 * bit_to_pix8 is for 8-bit frame buffers. It will write one output byte
162 * for each bit of input bitmap. It inverts the input bits before
163 * doing the output translation, for reverse video.
165 * Assuming foreground is 00000001 and background is 00000000...
166 * An input data byte of 0x53 will output the bit pattern
167 * 0000000 000000001 00000000 00000001 00000000 00000000 00000001 00000001.
188 bytes_wide
= (f
->width
+ 7) / 8;
190 for (row
= 0; row
< f
->height
; row
++) {
192 for (byte
= 0; byte
< bytes_wide
; byte
++) {
195 nbits
= MIN(8, bitsleft
);
197 for (i
= 0; i
< nbits
; i
++) {
198 *dest
++ = (data
& mask
? fg_color
: bg_color
);
206 * bit_to_pix24 is for 24-bit frame buffers. It will write four output bytes
207 * for each bit of input bitmap. It inverts the input bits before
208 * doing the output translation, for reverse video. Note that each
209 * 24-bit RGB value is finally stored in a 32-bit unsigned int, with the
210 * high-order byte set to zero.
212 * Assuming foreground is 00000000 11111111 11111111 11111111
213 * and background is 00000000 00000000 00000000 00000000
214 * An input data byte of 0x53 will output the bit pattern
216 * 00000000 00000000 00000000 00000000
217 * 00000000 11111111 11111111 11111111
218 * 00000000 00000000 00000000 00000000
219 * 00000000 11111111 11111111 11111111
220 * 00000000 00000000 00000000 00000000
221 * 00000000 00000000 00000000 00000000
222 * 00000000 11111111 11111111 11111111
223 * 00000000 11111111 11111111 11111111
244 bytes_wide
= (f
->width
+ 7) / 8;
246 for (row
= 0; row
< f
->height
; row
++) {
248 for (byte
= 0; byte
< bytes_wide
; byte
++) {
250 nbits
= MIN(8, bitsleft
);
252 for (i
= 0; i
< nbits
; i
++) {
253 *dest
++ = ((data
<< i
) & 0x80 ?
254 fg_color32
: bg_color32
);