removed clang-format and clang_complete files from the repo
[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
8  * just after.  I'll be using it in my effects for my performance test
9  * purposes, just adding it here.  Maybe it would be nice if initFpsFonts would
10  * be called in demo.c once but I avoided touching that code.
11  */
12
13 /*
14 1110 0010 1110 1110 1010 1110 1110 1110 1110 1110
15 1010 0010 0010 0010 1010 1000 1000 0010 1010 1010
16 1010 0010 1110 0110 1110 1110 1110 0010 1110 1110
17 1010 0010 1000 0010 0010 0010 1010 0010 1010 0010
18 1110 0010 1110 1110 0010 1110 1110 0010 1110 1110
19 */
20
21 static const unsigned char miniDecimalData[] = { 0xE2, 0xEE, 0xAE, 0xEE, 0xEE,
22 0xA2, 0x22, 0xA8, 0x82, 0xAA,
23 0xA2, 0xE6, 0xEE, 0xE2, 0xEE,
24 0xA2, 0x82, 0x22, 0xA2, 0xA2,
25 0xE2, 0xEE, 0x2E, 0xE2, 0xEE };
26
27 static unsigned short miniDecimalFonts[FPS_FONT_NUM_PIXELS];
28
29 static unsigned long startingFpsTime = 0;
30 static int fpsFontsInit = 0;
31 static int nFrames = 0;
32
33 void initFpsFonts()
34 {
35         if (fpsFontsInit == 0)
36         {
37                 unsigned char miniDecimalPixels[FPS_FONT_NUM_PIXELS];
38                 int i, j, k = 0;
39                 int x, y, n;
40
41                 for (i = 0; i < FPS_FONT_NUM_PIXELS / 8; i++)
42                 {
43                         unsigned char d = miniDecimalData[i];
44                         for (j = 0; j < 8; j++)
45                         {
46                                 unsigned char c = (d & 0x80) >> 7;
47                                 miniDecimalPixels[k++] = c;
48                                 d <<= 1;
49                         }
50                 }
51
52                 i = 0;
53                 for (n = 0; n < FPS_FONTS_NUM; n++)
54                 {
55                         for (y = 0; y < FPS_FONT_HEIGHT; y++)
56                         {
57                                 for (x = 0; x < FPS_FONT_WIDTH; x++)
58                                 {
59                                         miniDecimalFonts[i++] = miniDecimalPixels[n * FPS_FONT_WIDTH + x + y * FPS_FONT_WIDTH * FPS_FONTS_NUM] * 0xFFFF;
60                                 }
61                         }
62                 }
63
64                 fpsFontsInit = 1;
65         }
66 }
67
68 static void drawFont(unsigned char decimal, int posX, int posY, unsigned char zoom, unsigned short *vram)
69 {
70         int x, y, j, k;
71         unsigned short c;
72
73     unsigned short *fontData = (unsigned short*)&miniDecimalFonts[decimal * FPS_FONT_WIDTH * FPS_FONT_HEIGHT];
74
75         vram += posY * FB_WIDTH + posX;
76
77         if (zoom < 1) zoom = 1;
78         if (zoom > 4) zoom = 4;
79
80     for (y = 0; y<FPS_FONT_HEIGHT; y++)
81     {
82                 for (x = 0; x<FPS_FONT_WIDTH; x++)
83         {
84                         c = *fontData++;
85
86             if (c!=0)
87             {
88                 for (j=0; j<zoom; j++)
89                 {
90                     for (k=0; k<zoom; k++)
91                     {
92                         *(vram + j * FB_WIDTH + k) ^= c;
93                     }
94                 }
95             }
96             vram += zoom;
97         }
98         vram += (-FPS_FONT_WIDTH * zoom + FB_WIDTH * zoom);
99     }
100 }
101
102 static void drawDecimal(unsigned int number, int posX, int posY, unsigned char zoom, unsigned short *vram)
103 {
104         int i = 0;
105     char buffer[8];
106
107         sprintf(buffer, "%d", number);
108
109         while(i < 8 && buffer[i] != 0)
110     {
111         drawFont(buffer[i] - 48, posX + i * zoom * FPS_FONT_WIDTH, posY, zoom, vram);
112                 i++;
113     }
114 }
115
116 void drawFps(unsigned short *vram)
117 {
118         unsigned long dt = time_msec - startingFpsTime;
119         static int fps = 0;
120
121         nFrames++;
122         if (dt >= 1000)
123         {
124                 fps = (nFrames * 1000) / dt;
125                 startingFpsTime = time_msec;
126                 nFrames = 0;
127         }
128         /*drawDecimal(fps, 4, 4, 2, vram);*/
129         /* Moving this on the lower left side of screen for now, since the lack of double buffering generates flickering for this atm */
130         drawDecimal(fps, 4, FB_HEIGHT - 12, 2, vram);
131 }