summaryrefslogtreecommitdiff
path: root/jeu-test/tetris_lan_src/font.c
blob: 24ad3b7a1ff29f1d32c21b63811b11a2bcf111fc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include "includes.h"


// itoa.
void MyItoa(u32 nNb, char *pDst)
{
	char	*pPtr;
	u32	nTmp;

	pPtr = pDst + strlen(pDst) - 1;
	nTmp = nNb;
	do
	{
		*pPtr-- = (char)((nTmp % 10) + '0');
	} while (pPtr >= pDst && (nTmp /= 10) > 0);

}


// Affichage avec une fonte 16x16.
// !!! Attention, ce n'est pas pr�vu pour afficher en dehors de l'�cran !!!
void FontPrint(u32 nOffset, char *pStr)
{
	u32	nOffTmp;
	u32	nOffFnt;
	u32	y;
	char	cChr;
	u8	*pScr, *pFnt;

	pScr = (u8 *)gVar.pScreen->pixels;
	pFnt = (u8 *)gVar.pFont1616->pixels;

	SDL_LockSurface(gVar.pScreen);

	nOffTmp = nOffset;
	while (*pStr)
	{
		cChr = *pStr++;
		if (cChr != ' ')
		{
			nOffFnt = (((u32)cChr) - ' ') << 4;
			for (y = 0; y < 16; y++)
			{
				// On fait un OR + la fonte est en couleur 255 : Transparence.
				*(u32 *)(pScr + nOffTmp + (y * SCR_Width)) |= *(u32 *)(pFnt + nOffFnt + (y * 1024));
				*(u32 *)(pScr + nOffTmp + (y * SCR_Width) + 4) |= *(u32 *)(pFnt + nOffFnt + (y * 1024) + 4);
				*(u32 *)(pScr + nOffTmp + (y * SCR_Width) + 8) |= *(u32 *)(pFnt + nOffFnt + (y * 1024) + 8);
				*(u32 *)(pScr + nOffTmp + (y * SCR_Width) + 12) |= *(u32 *)(pFnt + nOffFnt + (y * 1024) + 12);
			}
		}
		nOffTmp += 16;
	}

	SDL_UnlockSurface(gVar.pScreen);

}

// Affichage avec une fonte 16x16.
// !!! Attention, ce n'est pas pr�vu pour afficher en dehors de l'�cran !!!
// Pareil qu'au dessus, mais fait un trou pour voir la couleur 0 au lieu du OR pour afficher la 255.
void FontPrintClr(u32 nOffset, char *pStr, u32 nClr)
{
	u32	nOffTmp;
	u32	nOffFnt;
	u32	y, nMask;
	char	cChr;
	u8	*pScr, *pFnt;

	pScr = (u8 *)gVar.pScreen->pixels;
	pFnt = (u8 *)gVar.pFont1616->pixels;

	// Recopie l'index de la couleur sur les 4 bytes du u32.
	nClr &= 0xFF;
	nClr |= (nClr << 8) | (nClr << 16) | (nClr << 24);

	SDL_LockSurface(gVar.pScreen);

	nOffTmp = nOffset;
	while (*pStr)
	{
		cChr = *pStr++;
		if (cChr != ' ')
		{
			nOffFnt = (((u32)cChr) - ' ') << 4;
			for (y = 0; y < 16; y++)
			{
				// La fonte est en couleur 255.
				nMask = *(u32 *)(pFnt + nOffFnt + (y * 1024));
				*(u32 *)(pScr + nOffTmp + (y * SCR_Width)) &= ~nMask;
				*(u32 *)(pScr + nOffTmp + (y * SCR_Width)) |= (nClr & nMask);

				nMask = *(u32 *)(pFnt + nOffFnt + (y * 1024) + 4);
				*(u32 *)(pScr + nOffTmp + (y * SCR_Width) + 4) &= ~nMask;
				*(u32 *)(pScr + nOffTmp + (y * SCR_Width) + 4) |= (nClr & nMask);

				nMask = *(u32 *)(pFnt + nOffFnt + (y * 1024) + 8);
				*(u32 *)(pScr + nOffTmp + (y * SCR_Width) + 8) &= ~nMask;
				*(u32 *)(pScr + nOffTmp + (y * SCR_Width) + 8) |= (nClr & nMask);

				nMask = *(u32 *)(pFnt + nOffFnt + (y * 1024) + 12);
				*(u32 *)(pScr + nOffTmp + (y * SCR_Width) + 12) &= ~nMask;
				*(u32 *)(pScr + nOffTmp + (y * SCR_Width) + 12) |= (nClr & nMask);
			}
		}
		nOffTmp += 16;
	}

	SDL_UnlockSurface(gVar.pScreen);

}

// Affichage avec une fonte 8x8.
// !!! Attention, ce n'est pas pr�vu pour afficher en dehors de l'�cran !!!
void Font8Print(u32 nOffset, char *pStr)
{
	u32	nOffTmp;
	u32	nOffFnt;
	u32	y;
	char	cChr;
	u8	*pScr, *pFnt;

	pScr = (u8 *)gVar.pScreen->pixels;
	pFnt = (u8 *)gVar.pFont88->pixels;

	SDL_LockSurface(gVar.pScreen);

	nOffTmp = nOffset;
	while (*pStr)
	{
		cChr = *pStr++;
		if (cChr != ' ')
		{
			nOffFnt = (((u32)cChr) - ' ') << 3;
			for (y = 0; y < 8; y++)
			{
				// On fait un OR + la fonte est en couleur 255 : Transparence.
				*(u32 *)(pScr + nOffTmp + (y * SCR_Width)) |= *(u32 *)(pFnt + nOffFnt + (y * 512));
				*(u32 *)(pScr + nOffTmp + (y * SCR_Width) + 4) |= *(u32 *)(pFnt + nOffFnt + (y * 512) + 4);
			}
		}
		nOffTmp += 8;
	}

	SDL_UnlockSurface(gVar.pScreen);

}