diff options
Diffstat (limited to 'jeu-test/tetris_lan_src/font.c')
-rw-r--r-- | jeu-test/tetris_lan_src/font.c | 148 |
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);
+
+}
+ |