summaryrefslogtreecommitdiff
path: root/jeu-test/tetris_lan_src/font.c
diff options
context:
space:
mode:
Diffstat (limited to 'jeu-test/tetris_lan_src/font.c')
-rw-r--r--jeu-test/tetris_lan_src/font.c148
1 files changed, 148 insertions, 0 deletions
diff --git a/jeu-test/tetris_lan_src/font.c b/jeu-test/tetris_lan_src/font.c
new file mode 100644
index 0000000..24ad3b7
--- /dev/null
+++ b/jeu-test/tetris_lan_src/font.c
@@ -0,0 +1,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);
+
+}
+