text.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  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. #include <sys/cdefs.h>
  31. #include <stdio.h>
  32. #include <sys/fbio.h>
  33. #include "vgl.h"
  34. static VGLText *VGLTextFont;
  35. extern byte VGLFont[];
  36. int
  37. VGLTextSetFontFile(char *filename)
  38. {
  39. FILE *fd;
  40. if (VGLTextFont) {
  41. if (VGLTextFont->BitmapArray != VGLFont)
  42. free (VGLTextFont->BitmapArray);
  43. free(VGLTextFont);
  44. }
  45. if ((VGLTextFont=(VGLText*)malloc(sizeof(VGLText))) == (VGLText*)0)
  46. return 1;
  47. if (filename==NULL) {
  48. VGLTextFont->Width = 8;
  49. VGLTextFont->Height = 8;
  50. VGLTextFont->BitmapArray = VGLFont;
  51. }
  52. else {
  53. if ((fd=fopen(filename, "r"))==(FILE*)0)
  54. return 1;
  55. fread(&VGLTextFont->Width, 1 , 1, fd);
  56. fread(&VGLTextFont->Height, 1 , 1, fd);
  57. VGLTextFont->BitmapArray =
  58. (byte*)malloc(256*((VGLTextFont->Width + 7)/8)*VGLTextFont->Height);
  59. fread(VGLTextFont->BitmapArray, 1,
  60. (256*((VGLTextFont->Width + 7)/8)*VGLTextFont->Height), fd);
  61. fclose(fd);
  62. }
  63. return 0;
  64. }
  65. void
  66. VGLBitmapPutChar(VGLBitmap *Object, int x, int y, byte ch,
  67. u_long fgcol, u_long bgcol, int fill, int dir)
  68. {
  69. int b, Bpc, Bpl, lin, bit, topbit;
  70. Bpl = (VGLTextFont->Width + 7) / 8;
  71. Bpc = Bpl * VGLTextFont->Height;
  72. topbit = VGLTextFont->Width - 1;
  73. for(lin = 0; lin < VGLTextFont->Height; lin++) {
  74. for(bit = 0; bit < VGLTextFont->Width; bit++) {
  75. b = bit + (-VGLTextFont->Width & 7);
  76. if (VGLTextFont->BitmapArray[(ch*Bpc)+(lin*Bpl)+(b/8)]&(1<<(b%8)))
  77. switch (dir) {
  78. case 0:
  79. VGLSetXY(Object, (x+topbit-bit), (y+lin), fgcol);
  80. break;
  81. case 1:
  82. VGLSetXY(Object, (x+lin), (y-topbit+bit), fgcol);
  83. break;
  84. case 2:
  85. VGLSetXY(Object, (x-topbit+bit), (y-lin), fgcol);
  86. break;
  87. case 3:
  88. VGLSetXY(Object, (x-lin), (y+topbit-bit), fgcol);
  89. break;
  90. case 4:
  91. VGLSetXY(Object, (x+lin+topbit-bit), (y+lin+bit), fgcol);
  92. break;
  93. }
  94. else if (fill)
  95. switch (dir) {
  96. case 0:
  97. VGLSetXY(Object, (x+topbit-bit), (y+lin), bgcol);
  98. break;
  99. case 1:
  100. VGLSetXY(Object, (x+lin), (y-topbit+bit), bgcol);
  101. break;
  102. case 2:
  103. VGLSetXY(Object, (x-topbit+bit), (y-lin), bgcol);
  104. break;
  105. case 3:
  106. VGLSetXY(Object, (x-lin), (y+topbit-bit), bgcol);
  107. break;
  108. case 4:
  109. VGLSetXY(Object, (x+lin+topbit-bit), (y+lin+bit), bgcol);
  110. break;
  111. }
  112. }
  113. }
  114. }
  115. void
  116. VGLBitmapString(VGLBitmap *Object, int x, int y, char *str,
  117. u_long fgcol, u_long bgcol, int fill, int dir)
  118. {
  119. int pos;
  120. for (pos=0; pos<strlen(str); pos++) {
  121. switch (dir) {
  122. case 0:
  123. VGLBitmapPutChar(Object, x+(pos*VGLTextFont->Width), y,
  124. str[pos], fgcol, bgcol, fill, dir);
  125. break;
  126. case 1:
  127. VGLBitmapPutChar(Object, x, y-(pos*VGLTextFont->Width),
  128. str[pos], fgcol, bgcol, fill, dir);
  129. break;
  130. case 2:
  131. VGLBitmapPutChar(Object, x-(pos*VGLTextFont->Width), y,
  132. str[pos], fgcol, bgcol, fill, dir);
  133. break;
  134. case 3:
  135. VGLBitmapPutChar(Object, x, y+(pos*VGLTextFont->Width),
  136. str[pos], fgcol, bgcol, fill, dir);
  137. break;
  138. case 4:
  139. VGLBitmapPutChar(Object, x+(pos*VGLTextFont->Width),
  140. y-(pos*VGLTextFont->Width),
  141. str[pos], fgcol, bgcol, fill, dir);
  142. break;
  143. }
  144. }
  145. }
  146. byte VGLFont[] = {
  147. 0,0,0,0,0,0,0,0,126,129,165,129,189,153,129,126,126,255,219,255,195,231,
  148. 255,126,108,254,254,254,124,56,16,0,16,56,124,254,124,56,16,0,56,124,56,
  149. 254,254,124,56,124,16,16,56,124,254,124,56,124,0,0,24,60,60,24,0,0,255,
  150. 255,231,195,195,231,255,255,0,60,102,66,66,102,60,0,255,195,153,189,189,
  151. 153,195,255,15,7,15,125,204,204,204,120,60,102,102,102,60,24,126,24,63,
  152. 51,63,48,48,112,240,224,127,99,127,99,99,103,230,192,153,90,60,231,231,
  153. 60,90,153,128,224,248,254,248,224,128,0,2,14,62,254,62,14,2,0,24,60,126,
  154. 24,24,126,60,24,102,102,102,102,102,0,102,0,127,219,219,123,27,27,27,0,
  155. 62,99,56,108,108,56,204,120,0,0,0,0,126,126,126,0,24,60,126,24,126,60,24,
  156. 255,24,60,126,24,24,24,24,0,24,24,24,24,126,60,24,0,0,24,12,254,12,24,0,
  157. 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,
  158. 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,
  159. 120,48,48,0,48,0,108,108,108,0,0,0,0,0,108,108,254,108,254,108,108,0,48,
  160. 124,192,120,12,248,48,0,0,198,204,24,48,102,198,0,56,108,56,118,220,204,
  161. 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,
  162. 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,
  163. 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,
  164. 230,124,0,48,112,48,48,48,48,252,0,120,204,12,56,96,204,252,0,120,204,12,
  165. 56,12,204,120,0,28,60,108,204,254,12,30,0,252,192,248,12,12,204,120,0,56,
  166. 96,192,248,204,204,120,0,252,204,12,24,48,48,48,0,120,204,204,120,204,204,
  167. 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,
  168. 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,
  169. 204,12,24,48,0,48,0,124,198,222,222,222,192,120,0,48,120,204,204,252,204,
  170. 204,0,252,102,102,124,102,102,252,0,60,102,192,192,192,102,60,0,248,108,
  171. 102,102,102,108,248,0,254,98,104,120,104,98,254,0,254,98,104,120,104,96,
  172. 240,0,60,102,192,192,206,102,62,0,204,204,204,252,204,204,204,0,120,48,
  173. 48,48,48,48,120,0,30,12,12,12,204,204,120,0,230,102,108,120,108,102,230,
  174. 0,240,96,96,96,98,102,254,0,198,238,254,254,214,198,198,0,198,230,246,222,
  175. 206,198,198,0,56,108,198,198,198,108,56,0,252,102,102,124,96,96,240,0,120,
  176. 204,204,204,220,120,28,0,252,102,102,124,108,102,230,0,120,204,224,112,
  177. 28,204,120,0,252,180,48,48,48,48,120,0,204,204,204,204,204,204,252,0,204,
  178. 204,204,204,204,120,48,0,198,198,198,214,254,238,198,0,198,198,108,56,56,
  179. 108,198,0,204,204,204,120,48,48,120,0,254,198,140,24,50,102,254,0,120,96,
  180. 96,96,96,96,120,0,192,96,48,24,12,6,2,0,120,24,24,24,24,24,120,0,16,56,
  181. 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,
  182. 118,0,224,96,96,124,102,102,220,0,0,0,120,204,192,204,120,0,28,12,12,124,
  183. 204,204,118,0,0,0,120,204,252,192,120,0,56,108,96,240,96,96,240,0,0,0,118,
  184. 204,204,124,12,248,224,96,108,118,102,102,230,0,48,0,112,48,48,48,120,0,
  185. 12,0,12,12,12,204,204,120,224,96,102,108,120,108,230,0,112,48,48,48,48,
  186. 48,120,0,0,0,204,254,254,214,198,0,0,0,248,204,204,204,204,0,0,0,120,204,
  187. 204,204,120,0,0,0,220,102,102,124,96,240,0,0,118,204,204,124,12,30,0,0,
  188. 220,118,102,96,240,0,0,0,124,192,120,12,248,0,16,48,124,48,48,52,24,0,0,
  189. 0,204,204,204,204,118,0,0,0,204,204,204,120,48,0,0,0,198,214,254,254,108,
  190. 0,0,0,198,108,56,108,198,0,0,0,204,204,204,124,12,248,0,0,252,152,48,100,
  191. 252,0,28,48,48,224,48,48,28,0,24,24,24,0,24,24,24,0,224,48,48,28,48,48,
  192. 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,
  193. 60,126,255,126,24,0,170,85,85,170,170,85,85,170,68,68,68,68,31,4,4,4,124,
  194. 64,64,64,31,16,16,16,56,68,68,56,30,17,20,19,64,64,64,124,31,16,16,16,56,
  195. 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,
  196. 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,
  197. 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,
  198. 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,
  199. 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,
  200. 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,
  201. 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,
  202. 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,
  203. 192,124,16,0,56,96,96,240,96,252,0,0,195,60,102,102,60,195,0,0,204,204,
  204. 120,48,252,48,0,24,24,24,0,24,24,24,0,126,192,124,198,124,6,252,0,198,0,
  205. 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,
  206. 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,
  207. 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,
  208. 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,
  209. 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,
  210. 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,
  211. 108,51,103,15,3,96,224,102,108,54,106,4,14,240,32,150,108,51,103,15,3,48,
  212. 0,48,96,192,204,120,0,24,12,48,120,204,252,204,0,96,192,48,120,204,252,
  213. 204,0,120,132,48,120,204,252,204,0,102,152,48,120,204,252,204,0,204,0,48,
  214. 120,204,252,204,0,48,72,48,120,204,252,204,0,62,120,152,156,248,152,158,
  215. 0,60,102,192,192,192,102,28,48,48,24,254,98,120,98,254,0,24,48,254,98,120,
  216. 98,254,0,56,68,254,98,120,98,254,0,102,0,254,98,120,98,254,0,96,48,120,
  217. 48,48,48,120,0,24,48,120,48,48,48,120,0,120,132,120,48,48,48,120,0,204,
  218. 0,120,48,48,48,120,0,120,108,102,246,102,108,120,0,102,152,230,246,222,
  219. 206,198,0,48,24,124,198,198,198,124,0,24,48,124,198,198,198,124,0,56,68,
  220. 124,198,198,198,124,0,102,152,124,198,198,198,124,0,198,0,124,198,198,198,
  221. 124,0,0,198,108,56,56,108,198,0,6,124,206,154,178,230,120,192,96,48,204,
  222. 204,204,204,252,0,24,48,204,204,204,204,252,0,120,132,204,204,204,204,252,
  223. 0,204,0,204,204,204,204,252,0,24,48,204,204,120,48,120,0,96,120,108,120,
  224. 96,96,96,0,120,204,196,220,198,198,220,192,48,24,120,12,124,204,118,0,24,
  225. 48,120,12,124,204,118,0,120,132,120,12,124,204,118,0,102,152,120,12,124,
  226. 204,118,0,204,0,120,12,124,204,118,0,48,72,56,12,124,204,118,0,0,0,236,
  227. 50,126,176,110,0,0,0,60,102,192,102,28,48,48,24,120,204,252,192,120,0,24,
  228. 48,120,204,252,192,120,0,120,132,120,204,252,192,120,0,204,0,120,204,252,
  229. 192,120,0,96,48,0,112,48,48,120,0,24,48,0,112,48,48,120,0,112,136,0,112,
  230. 48,48,120,0,204,0,0,112,48,48,120,0,108,56,108,12,108,204,120,0,102,152,
  231. 248,204,204,204,204,0,96,48,0,124,198,198,124,0,24,48,0,124,198,198,124,
  232. 0,56,68,0,124,198,198,124,0,102,152,0,124,198,198,124,0,198,0,0,124,198,
  233. 198,124,0,0,0,24,0,126,0,24,0,0,0,6,124,222,246,124,192,96,48,0,204,204,
  234. 204,118,0,24,48,0,204,204,204,118,0,48,72,0,204,204,204,118,0,204,0,0,204,
  235. 204,204,118,0,24,48,204,204,204,124,12,248,224,120,108,102,108,120,224,
  236. 0,204,0,204,204,204,124,12,248
  237. };