4b9d9dbdc4700f6b67519cd1d8c5d9309aa39e66
[dosdemo] / src / tinyfps.c
1 #include <stdlib.h>
2
3 #include "tinyfps.h"
4 #include "demo.h"
5
6 // TinyFPS, just a minimal fraps like font to show FPS during the demo and not just after.
7 // I'll be using it in my effects for my performance test purposes, just adding it here.
8 // Maybe it would be nice if initFpsFonts would be called in demo.c once but I avoided touching that code.
9
10 /*
11 1110 0010 1110 1110 1010 1110 1110 1110 1110 1110
12 1010 0010 0010 0010 1010 1000 1000 0010 1010 1010
13 1010 0010 1110 0110 1110 1110 1110 0010 1110 1110
14 1010 0010 1000 0010 0010 0010 1010 0010 1010 0010
15 1110 0010 1110 1110 0010 1110 1110 0010 1110 1110
16 */
17
18 const unsigned char miniDecimalData[] = { 0xE2, 0xEE, 0xAE, 0xEE, 0xEE,
19 0xA2, 0x22, 0xA8, 0x82, 0xAA,
20 0xA2, 0xE6, 0xEE, 0xE2, 0xEE,
21 0xA2, 0x82, 0x22, 0xA2, 0xA2,
22 0xE2, 0xEE, 0x2E, 0xE2, 0xEE };
23
24 unsigned short miniDecimalFonts[FPS_FONT_NUM_PIXELS];
25
26 unsigned long startingFpsTime = 0;
27 int fpsFontsInit = 0;
28 int nFrames = 0;
29
30 void initFpsFonts()
31 {
32         if (fpsFontsInit == 0)
33         {
34                 unsigned char miniDecimalPixels[FPS_FONT_NUM_PIXELS];
35
36                 int k = 0;
37                 for (int i = 0; i < FPS_FONT_NUM_PIXELS / 8; i++)
38                 {
39                         unsigned char d = miniDecimalData[i];
40                         for (int j = 0; j < 8; j++)
41                         {
42                                 unsigned char c = (d & 0x80) >> 7;
43                                 miniDecimalPixels[k++] = c;
44                                 d <<= 1;
45                         }
46                 }
47
48                 int i = 0;
49                 for (int n = 0; n < FPS_FONTS_NUM; n++)
50                 {
51                         for (int y = 0; y < FPS_FONT_HEIGHT; y++)
52                         {
53                                 for (int x = 0; x < FPS_FONT_WIDTH; x++)
54                                 {
55                                         miniDecimalFonts[i++] = miniDecimalPixels[n * FPS_FONT_WIDTH + x + y * FPS_FONT_WIDTH * FPS_FONTS_NUM] * 0xFFFF;
56                                 }
57                         }
58                 }
59
60                 fpsFontsInit = 1;
61         }
62 }
63
64 void drawFont(unsigned char decimal, int posX, int posY, unsigned char zoom, unsigned short *vram)
65 {
66         int x, y, j, k;
67         unsigned short c;
68
69     unsigned short *fontData = (unsigned short*)&miniDecimalFonts[decimal * FPS_FONT_WIDTH * FPS_FONT_HEIGHT];
70
71         vram += posY * fb_width + posX;
72
73         if (zoom < 1) zoom = 1;
74         if (zoom > 4) zoom = 4;
75
76     for (y = 0; y<FPS_FONT_HEIGHT; y++)
77     {
78                 for (x = 0; x<FPS_FONT_WIDTH; x++)
79         {
80                         c = *fontData++;
81
82             if (c!=0)
83             {
84                 for (j=0; j<zoom; j++)
85                 {
86                     for (k=0; k<zoom; k++)
87                     {
88                         *(vram + j * fb_width + k) ^= c;
89                     }
90                 }
91             }
92             vram += zoom;
93         }
94         vram += (-FPS_FONT_WIDTH * zoom + fb_width * zoom);
95     }
96 }
97
98 void drawDecimal(unsigned int number, int posX, int posY, unsigned char zoom, unsigned short *vram)
99 {
100         int i = 0;
101     char buffer[8];
102
103     itoa(number, buffer, 10);
104
105         while(i < 8 && buffer[i] != 0)
106     {
107         drawFont(buffer[i] - 48, posX + i * zoom * FPS_FONT_WIDTH, posY, zoom, vram);
108                 i++;
109     }
110 }
111
112 void drawFps(unsigned short *vram)
113 {
114         unsigned long dt = time_msec - startingFpsTime;
115         static int fps = 0;
116
117         nFrames++;
118         if (dt >= 1000)
119         {
120                 fps = (nFrames * 1000) / dt;
121                 startingFpsTime = time_msec;
122                 nFrames = 0;
123         }
124         drawDecimal(fps, 4, 4, 2, vram);
125 }