xref: /freebsd/lib/libvgl/text.c (revision d3d381b2b194b4d24853e92eecef55f262688d1a)
1 /*-
2  * SPDX-License-Identifier: BSD-3-Clause
3  *
4  * Copyright (c) 1991-1997 Søren Schmidt
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer
12  *    in this position and unchanged.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. The name of the author may not be used to endorse or promote products
17  *    derived from this software without specific prior written permission
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30 
31 #include <sys/cdefs.h>
32 __FBSDID("$FreeBSD$");
33 
34 #include <stdio.h>
35 #include <sys/fbio.h>
36 #include "vgl.h"
37 
38 static VGLText		*VGLTextFont;
39 
40 extern byte VGLFont[];
41 
42 int
43 VGLTextSetFontFile(char *filename)
44 {
45 FILE *fd;
46 
47   if (VGLTextFont) {
48     if (VGLTextFont->BitmapArray != VGLFont)
49       free (VGLTextFont->BitmapArray);
50     free(VGLTextFont);
51   }
52 
53   if ((VGLTextFont=(VGLText*)malloc(sizeof(VGLText))) == (VGLText*)0)
54 	return 1;
55 
56   if (filename==NULL) {
57     VGLTextFont->Width = 8;
58     VGLTextFont->Height = 8;
59     VGLTextFont->BitmapArray = VGLFont;
60   }
61   else {
62     if ((fd=fopen(filename, "r"))==(FILE*)0)
63       return 1;
64     fread(&VGLTextFont->Width, 1 , 1, fd);
65     fread(&VGLTextFont->Height, 1 , 1, fd);
66     VGLTextFont->BitmapArray =
67       (byte*)malloc(256*((VGLTextFont->Width + 7)/8)*VGLTextFont->Height);
68     fread(VGLTextFont->BitmapArray, 1,
69       (256*VGLTextFont->Width* VGLTextFont->Height), fd);
70     fclose(fd);
71   }
72   return 0;
73 }
74 
75 void
76 VGLBitmapPutChar(VGLBitmap *Object, int x, int y, byte ch,
77 		 byte fgcol, byte bgcol, int fill, int dir)
78 {
79   int lin, bit;
80 
81   for(lin = 0; lin < VGLTextFont->Height; lin++) {
82     for(bit = 0; bit < VGLTextFont->Width; bit++) {
83       if (VGLTextFont->BitmapArray[((ch*VGLTextFont->Height)+lin)]&(1<<bit))
84         switch (dir) {
85           case 0:
86             VGLSetXY(Object, (x+7-bit), (y+lin), fgcol);
87 	    break;
88           case 1:
89             VGLSetXY(Object, (x+lin), (y-7+bit), fgcol);
90 	    break;
91           case 2:
92             VGLSetXY(Object, (x-7+bit), (y-lin), fgcol);
93 	    break;
94           case 3:
95             VGLSetXY(Object, (x-lin), (y+7-bit), fgcol);
96 	    break;
97           case 4:
98             VGLSetXY(Object, (x+lin+7-bit), (y+lin+bit), fgcol);
99 	    break;
100         }
101       else if (fill)
102         switch (dir) {
103           case 0:
104             VGLSetXY(Object, (x+7-bit), (y+lin), bgcol);
105 	    break;
106           case 1:
107             VGLSetXY(Object, (x+lin), (y-7+bit), bgcol);
108 	    break;
109           case 2:
110             VGLSetXY(Object, (x-7+bit), (y-lin), bgcol);
111 	    break;
112           case 3:
113             VGLSetXY(Object, (x-lin), (y+7-bit), bgcol);
114 	    break;
115           case 4:
116             VGLSetXY(Object, (x+lin+7-bit), (y+lin+bit), bgcol);
117 	    break;
118         }
119     }
120   }
121 }
122 
123 void
124 VGLBitmapString(VGLBitmap *Object, int x, int y, char *str,
125 		byte fgcol, byte bgcol, int fill, int dir)
126 {
127   int pos;
128 
129   for (pos=0; pos<strlen(str); pos++) {
130     switch (dir) {
131       case 0:
132         VGLBitmapPutChar(Object, x+(pos*VGLTextFont->Width), y,
133                          str[pos], fgcol, bgcol, fill, dir);
134 	break;
135       case 1:
136         VGLBitmapPutChar(Object, x, y-(pos*VGLTextFont->Width),
137 		         str[pos], fgcol, bgcol, fill, dir);
138 	break;
139       case 2:
140         VGLBitmapPutChar(Object, x-(pos*VGLTextFont->Width), y,
141 		         str[pos], fgcol, bgcol, fill, dir);
142 	break;
143       case 3:
144         VGLBitmapPutChar(Object, x, y+(pos*VGLTextFont->Width),
145 		         str[pos], fgcol, bgcol, fill, dir);
146 	break;
147       case 4:
148         VGLBitmapPutChar(Object, x+(pos*VGLTextFont->Width),
149                          y-(pos*VGLTextFont->Width),
150 		         str[pos], fgcol, bgcol, fill, dir);
151 	break;
152     }
153   }
154 }
155 
156 byte VGLFont[] = {
157 0,0,0,0,0,0,0,0,126,129,165,129,189,153,129,126,126,255,219,255,195,231,
158 255,126,108,254,254,254,124,56,16,0,16,56,124,254,124,56,16,0,56,124,56,
159 254,254,124,56,124,16,16,56,124,254,124,56,124,0,0,24,60,60,24,0,0,255,
160 255,231,195,195,231,255,255,0,60,102,66,66,102,60,0,255,195,153,189,189,
161 153,195,255,15,7,15,125,204,204,204,120,60,102,102,102,60,24,126,24,63,
162 51,63,48,48,112,240,224,127,99,127,99,99,103,230,192,153,90,60,231,231,
163 60,90,153,128,224,248,254,248,224,128,0,2,14,62,254,62,14,2,0,24,60,126,
164 24,24,126,60,24,102,102,102,102,102,0,102,0,127,219,219,123,27,27,27,0,
165 62,99,56,108,108,56,204,120,0,0,0,0,126,126,126,0,24,60,126,24,126,60,24,
166 255,24,60,126,24,24,24,24,0,24,24,24,24,126,60,24,0,0,24,12,254,12,24,0,
167 0,0,48,96,254,96,48,0,0,0,0,192,192,192,254,0,0,0,36,102,255,102,36,0,0,
168 0,24,60,126,255,255,0,0,0,255,255,126,60,24,0,0,0,0,0,0,0,0,0,0,48,120,
169 120,48,48,0,48,0,108,108,108,0,0,0,0,0,108,108,254,108,254,108,108,0,48,
170 124,192,120,12,248,48,0,0,198,204,24,48,102,198,0,56,108,56,118,220,204,
171 118,0,96,96,192,0,0,0,0,0,24,48,96,96,96,48,24,0,96,48,24,24,24,48,96,0,
172 0,102,60,255,60,102,0,0,0,48,48,252,48,48,0,0,0,0,0,0,0,48,48,96,0,0,0,
173 252,0,0,0,0,0,0,0,0,0,48,48,0,6,12,24,48,96,192,128,0,124,198,206,222,246,
174 230,124,0,48,112,48,48,48,48,252,0,120,204,12,56,96,204,252,0,120,204,12,
175 56,12,204,120,0,28,60,108,204,254,12,30,0,252,192,248,12,12,204,120,0,56,
176 96,192,248,204,204,120,0,252,204,12,24,48,48,48,0,120,204,204,120,204,204,
177 120,0,120,204,204,124,12,24,112,0,0,48,48,0,0,48,48,0,0,48,48,0,0,48,48,
178 96,24,48,96,192,96,48,24,0,0,0,252,0,0,252,0,0,96,48,24,12,24,48,96,0,120,
179 204,12,24,48,0,48,0,124,198,222,222,222,192,120,0,48,120,204,204,252,204,
180 204,0,252,102,102,124,102,102,252,0,60,102,192,192,192,102,60,0,248,108,
181 102,102,102,108,248,0,254,98,104,120,104,98,254,0,254,98,104,120,104,96,
182 240,0,60,102,192,192,206,102,62,0,204,204,204,252,204,204,204,0,120,48,
183 48,48,48,48,120,0,30,12,12,12,204,204,120,0,230,102,108,120,108,102,230,
184 0,240,96,96,96,98,102,254,0,198,238,254,254,214,198,198,0,198,230,246,222,
185 206,198,198,0,56,108,198,198,198,108,56,0,252,102,102,124,96,96,240,0,120,
186 204,204,204,220,120,28,0,252,102,102,124,108,102,230,0,120,204,224,112,
187 28,204,120,0,252,180,48,48,48,48,120,0,204,204,204,204,204,204,252,0,204,
188 204,204,204,204,120,48,0,198,198,198,214,254,238,198,0,198,198,108,56,56,
189 108,198,0,204,204,204,120,48,48,120,0,254,198,140,24,50,102,254,0,120,96,
190 96,96,96,96,120,0,192,96,48,24,12,6,2,0,120,24,24,24,24,24,120,0,16,56,
191 108,198,0,0,0,0,0,0,0,0,0,0,0,255,48,48,24,0,0,0,0,0,0,0,120,12,124,204,
192 118,0,224,96,96,124,102,102,220,0,0,0,120,204,192,204,120,0,28,12,12,124,
193 204,204,118,0,0,0,120,204,252,192,120,0,56,108,96,240,96,96,240,0,0,0,118,
194 204,204,124,12,248,224,96,108,118,102,102,230,0,48,0,112,48,48,48,120,0,
195 12,0,12,12,12,204,204,120,224,96,102,108,120,108,230,0,112,48,48,48,48,
196 48,120,0,0,0,204,254,254,214,198,0,0,0,248,204,204,204,204,0,0,0,120,204,
197 204,204,120,0,0,0,220,102,102,124,96,240,0,0,118,204,204,124,12,30,0,0,
198 220,118,102,96,240,0,0,0,124,192,120,12,248,0,16,48,124,48,48,52,24,0,0,
199 0,204,204,204,204,118,0,0,0,204,204,204,120,48,0,0,0,198,214,254,254,108,
200 0,0,0,198,108,56,108,198,0,0,0,204,204,204,124,12,248,0,0,252,152,48,100,
201 252,0,28,48,48,224,48,48,28,0,24,24,24,0,24,24,24,0,224,48,48,28,48,48,
202 224,0,118,220,0,0,0,0,0,0,0,16,56,108,198,198,254,0,0,0,0,0,0,0,0,0,0,0,
203 60,126,255,126,24,0,170,85,85,170,170,85,85,170,68,68,68,68,31,4,4,4,124,
204 64,64,64,31,16,16,16,56,68,68,56,30,17,20,19,64,64,64,124,31,16,16,16,56,
205 108,56,0,0,0,0,0,0,0,24,24,24,24,126,0,68,100,76,68,16,16,16,31,68,68,40,
206 16,31,4,4,4,24,24,24,24,248,0,0,0,0,0,0,0,248,24,24,24,0,0,0,0,31,24,24,
207 24,24,24,24,24,31,0,0,0,24,24,24,24,255,24,24,24,0,0,0,0,0,0,0,0,0,0,0,
208 0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,24,24,24,
209 24,31,24,24,24,24,24,24,24,248,24,24,24,24,24,24,24,255,0,0,0,0,0,0,0,255,
210 24,24,24,24,24,24,24,24,24,24,24,0,12,48,96,24,12,126,0,0,48,12,6,24,48,
211 126,0,0,0,3,62,54,54,108,0,0,0,4,126,16,126,64,0,0,28,48,48,48,48,126,0,
212 0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,0,48,0,48,48,120,120,48,0,0,0,16,124,192,
213 192,124,16,0,56,96,96,240,96,252,0,0,195,60,102,102,60,195,0,0,204,204,
214 120,48,252,48,0,24,24,24,0,24,24,24,0,126,192,124,198,124,6,252,0,198,0,
215 0,0,0,0,0,0,124,130,186,162,186,130,124,0,28,6,30,34,31,63,0,0,0,51,102,
216 204,102,51,0,0,0,254,6,0,0,0,0,0,0,0,0,0,0,0,0,0,124,130,186,178,170,130,
217 124,0,254,0,0,0,0,0,0,0,56,108,56,0,0,0,0,0,0,16,124,16,0,124,0,0,28,54,
218 6,24,62,0,0,0,30,2,14,2,30,0,0,0,24,48,0,0,0,0,0,0,0,0,204,204,204,204,
219 118,192,126,202,202,126,10,10,10,0,0,0,0,24,0,0,0,0,0,0,0,0,0,0,24,48,6,
220 14,6,6,6,0,0,0,14,17,17,17,14,31,0,0,0,204,102,51,102,204,0,0,96,224,102,
221 108,51,103,15,3,96,224,102,108,54,106,4,14,240,32,150,108,51,103,15,3,48,
222 0,48,96,192,204,120,0,24,12,48,120,204,252,204,0,96,192,48,120,204,252,
223 204,0,120,132,48,120,204,252,204,0,102,152,48,120,204,252,204,0,204,0,48,
224 120,204,252,204,0,48,72,48,120,204,252,204,0,62,120,152,156,248,152,158,
225 0,60,102,192,192,192,102,28,48,48,24,254,98,120,98,254,0,24,48,254,98,120,
226 98,254,0,56,68,254,98,120,98,254,0,102,0,254,98,120,98,254,0,96,48,120,
227 48,48,48,120,0,24,48,120,48,48,48,120,0,120,132,120,48,48,48,120,0,204,
228 0,120,48,48,48,120,0,120,108,102,246,102,108,120,0,102,152,230,246,222,
229 206,198,0,48,24,124,198,198,198,124,0,24,48,124,198,198,198,124,0,56,68,
230 124,198,198,198,124,0,102,152,124,198,198,198,124,0,198,0,124,198,198,198,
231 124,0,0,198,108,56,56,108,198,0,6,124,206,154,178,230,120,192,96,48,204,
232 204,204,204,252,0,24,48,204,204,204,204,252,0,120,132,204,204,204,204,252,
233 0,204,0,204,204,204,204,252,0,24,48,204,204,120,48,120,0,96,120,108,120,
234 96,96,96,0,120,204,196,220,198,198,220,192,48,24,120,12,124,204,118,0,24,
235 48,120,12,124,204,118,0,120,132,120,12,124,204,118,0,102,152,120,12,124,
236 204,118,0,204,0,120,12,124,204,118,0,48,72,56,12,124,204,118,0,0,0,236,
237 50,126,176,110,0,0,0,60,102,192,102,28,48,48,24,120,204,252,192,120,0,24,
238 48,120,204,252,192,120,0,120,132,120,204,252,192,120,0,204,0,120,204,252,
239 192,120,0,96,48,0,112,48,48,120,0,24,48,0,112,48,48,120,0,112,136,0,112,
240 48,48,120,0,204,0,0,112,48,48,120,0,108,56,108,12,108,204,120,0,102,152,
241 248,204,204,204,204,0,96,48,0,124,198,198,124,0,24,48,0,124,198,198,124,
242 0,56,68,0,124,198,198,124,0,102,152,0,124,198,198,124,0,198,0,0,124,198,
243 198,124,0,0,0,24,0,126,0,24,0,0,0,6,124,222,246,124,192,96,48,0,204,204,
244 204,118,0,24,48,0,204,204,204,118,0,48,72,0,204,204,204,118,0,204,0,0,204,
245 204,204,118,0,24,48,204,204,204,124,12,248,224,120,108,102,108,120,224,
246 0,204,0,204,204,204,124,12,248
247 };
248