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