mirror of
https://github.com/AntonioND/palib.git
synced 2025-06-18 14:45:43 -04:00
204 lines
7.2 KiB
C
204 lines
7.2 KiB
C
#include <PA9.h>
|
|
|
|
#include "PA_BmpFont0_Tiles_bin.h"
|
|
#include "PA_BmpFont1_Tiles_bin.h"
|
|
#include "PA_BmpFont2_Tiles_bin.h"
|
|
#include "PA_BmpFont3_Tiles_bin.h"
|
|
#include "PA_BmpFont4_Tiles_bin.h"
|
|
|
|
u8* bit8_tiles[10] = {
|
|
// This list can be modified by the user
|
|
(u8 *)PA_BmpFont0_Tiles_bin,
|
|
(u8 *)PA_BmpFont1_Tiles_bin,
|
|
(u8 *)PA_BmpFont2_Tiles_bin,
|
|
(u8 *)PA_BmpFont3_Tiles_bin,
|
|
(u8 *)PA_BmpFont4_Tiles_bin
|
|
};
|
|
|
|
void Letter(u8 size, u8 screen, u16 x, u16 y, char letter, u8 color);
|
|
void TranspLetter(u8 size, u8 screen, u16 x, u16 y, char letter, u8 color);
|
|
void NoLetter(u8 size, u8 screen, u16 x, u16 y, char letter, u8 color);
|
|
void RotLetter(u8 size, u8 screen, u16 x, u16 y, char letter, u8 color);
|
|
void RotLetter2(u8 size, u8 screen, u16 x, u16 y, char letter, u8 color);
|
|
|
|
letterfp letters[5] = {(letterfp)&Letter, (letterfp)&TranspLetter, (letterfp)&NoLetter, (letterfp)&RotLetter, (letterfp)&RotLetter2};
|
|
|
|
static inline void PA_8bitDrawTile(u8 screen, u16 x, u16 y, s8 lx, s8 ly, u8 *data, u8 color) {
|
|
u16 i, j;
|
|
|
|
for (j = 0; j < ly; j++) {
|
|
for (i = 0; i < lx; i++) {
|
|
PA_Put8bitPixel(screen, x + i, y + j, data[i+(j<<3)]*color);
|
|
}
|
|
}
|
|
}
|
|
|
|
static inline void PA_8bitDrawTileTransp(u8 screen, u16 x, u16 y, s8 lx, s8 ly, u8 *data, u8 color) {
|
|
u16 i, j;
|
|
|
|
for (j = 0; j < ly; j++) {
|
|
for (i = 0; i < lx; i++) {
|
|
u8 decal = (((x + i) & 1) << 3);
|
|
u16 pixel = (data[i+(j<<3)] * color) << decal;
|
|
|
|
if (pixel) {
|
|
PA_DrawBg[screen][((y+j) <<7) + ((x+i)>>1)] &= 255 << (8 - decal);
|
|
PA_DrawBg[screen][((y+j) <<7) + ((x+i)>>1)] |= pixel;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
static inline void PA_8bitDrawTileRot(u8 screen, u16 x, u16 y, s8 lx, s8 ly, u8 *data, u8 color) {
|
|
u16 i, j;
|
|
s16 temp = x;
|
|
x = 255 - y;
|
|
y = temp;
|
|
|
|
for (j = 0; j < ly; j++) {
|
|
for (i = 0; i < lx; i++) {
|
|
PA_Put8bitPixel(screen, x - j, y + i, data[i+(j<<3)]*color);
|
|
}
|
|
}
|
|
}
|
|
|
|
static inline void PA_8bitDrawTileRot2(u8 screen, u16 x, u16 y, s8 lx, s8 ly, u8 *data, u8 color) {
|
|
u16 i, j;
|
|
s16 temp = 192 - x;
|
|
x = y;
|
|
y = temp;
|
|
|
|
for (j = 0; j < ly; j++) {
|
|
for (i = 0; i < lx; i++) {
|
|
PA_Put8bitPixel(screen, x + j, y - i, data[i+(j<<3)]*color);
|
|
}
|
|
}
|
|
}
|
|
|
|
void NoLetter(u8 size, u8 screen, u16 x, u16 y, char letter, u8 color) {
|
|
}
|
|
|
|
void RotLetter(u8 size, u8 screen, u16 x, u16 y, char letter, u8 color) {
|
|
u8 lx = pa_bittextdefaultsize[size][(u8)letter];
|
|
u8 ly = pa_bittextpoliceheight[size];
|
|
u8 *data;
|
|
|
|
if (ly > 8) {
|
|
ly--;
|
|
u16 firstpos = ((letter & 31) << 1) + ((letter >> 5) << 7);
|
|
data = (u8*)(bit8_tiles[size] + (bittext_maps[size][firstpos] << 6));
|
|
PA_8bitDrawTileRot(screen, x, y, 8, 8, data, color);
|
|
data = (u8*)(bit8_tiles[size] + (bittext_maps[size][firstpos+64] << 6));
|
|
PA_8bitDrawTileRot(screen, x, y + 8, 8, ly - 8, data, color);
|
|
firstpos ++;
|
|
data = (u8*)(bit8_tiles[size] + (bittext_maps[size][firstpos] << 6));
|
|
PA_8bitDrawTileRot(screen, x + 8, y, lx - 8, 8, data, color);
|
|
data = (u8*)(bit8_tiles[size] + (bittext_maps[size][firstpos+64] << 6));
|
|
PA_8bitDrawTileRot(screen, x + 8, y + 8, lx - 8, ly - 8, data, color);
|
|
} else {
|
|
data = (u8*)(bit8_tiles[size] + (bittext_maps[size][(u8)letter] << 6));
|
|
PA_8bitDrawTileRot(screen, x, y, lx, ly, data, color);
|
|
}
|
|
}
|
|
|
|
void RotLetter2(u8 size, u8 screen, u16 x, u16 y, char letter, u8 color) {
|
|
u8 lx = pa_bittextdefaultsize[size][(u8)letter];
|
|
u8 ly = pa_bittextpoliceheight[size];
|
|
u8 *data;
|
|
|
|
if (ly > 8) {
|
|
ly--;
|
|
u16 firstpos = ((letter & 31) << 1) + ((letter >> 5) << 7);
|
|
data = (u8*)(bit8_tiles[size] + (bittext_maps[size][firstpos] << 6));
|
|
PA_8bitDrawTileRot2(screen, x, y, 8, 8, data, color);
|
|
data = (u8*)(bit8_tiles[size] + (bittext_maps[size][firstpos+64] << 6));
|
|
PA_8bitDrawTileRot2(screen, x, y + 8, 8, ly - 8, data, color);
|
|
firstpos ++;
|
|
data = (u8*)(bit8_tiles[size] + (bittext_maps[size][firstpos] << 6));
|
|
PA_8bitDrawTileRot2(screen, x + 8, y, lx - 8, 8, data, color);
|
|
data = (u8*)(bit8_tiles[size] + (bittext_maps[size][firstpos+64] << 6));
|
|
PA_8bitDrawTileRot2(screen, x + 8, y + 8, lx - 8, ly - 8, data, color);
|
|
} else {
|
|
data = (u8*)(bit8_tiles[size] + (bittext_maps[size][(u8)letter] << 6));
|
|
PA_8bitDrawTileRot2(screen, x, y, lx, ly, data, color);
|
|
}
|
|
}
|
|
|
|
void Letter(u8 size, u8 screen, u16 x, u16 y, char letter, u8 color) {
|
|
u8 lx = pa_bittextdefaultsize[size][(u8)letter];
|
|
u8 ly = pa_bittextpoliceheight[size];
|
|
u8 *data;
|
|
|
|
if (ly > 8) {
|
|
u16 firstpos = ((letter & 31) << 1) + ((letter >> 5) << 7);
|
|
data = (u8*)(bit8_tiles[size] + (bittext_maps[size][firstpos] << 6));
|
|
PA_8bitDrawTile(screen, x, y, 8, 8, data, color);
|
|
data = (u8*)(bit8_tiles[size] + (bittext_maps[size][firstpos+64] << 6));
|
|
PA_8bitDrawTile(screen, x, y + 8, 8, ly - 8, data, color);
|
|
firstpos ++;
|
|
data = (u8*)(bit8_tiles[size] + (bittext_maps[size][firstpos] << 6));
|
|
PA_8bitDrawTile(screen, x + 8, y, lx - 8, 8, data, color);
|
|
data = (u8*)(bit8_tiles[size] + (bittext_maps[size][firstpos+64] << 6));
|
|
PA_8bitDrawTile(screen, x + 8, y + 8, lx - 8, ly - 8, data, color);
|
|
} else {
|
|
data = (u8*)(bit8_tiles[size] + (bittext_maps[size][(u8)letter] << 6));
|
|
PA_8bitDrawTile(screen, x, y, lx, ly, data, color);
|
|
}
|
|
}
|
|
|
|
void TranspLetter(u8 size, u8 screen, u16 x, u16 y, char letter, u8 color) {
|
|
u8 lx = pa_bittextdefaultsize[size][(u8)letter];
|
|
u8 ly = pa_bittextpoliceheight[size];
|
|
u8 *data;
|
|
|
|
if (ly > 8) {
|
|
u16 firstpos = ((letter & 31) << 1) + ((letter >> 5) << 7);
|
|
data = (u8*)(bit8_tiles[size] + (bittext_maps[size][firstpos] << 6));
|
|
PA_8bitDrawTileTransp(screen, x, y, 8, 8, data, color);
|
|
data = (u8*)(bit8_tiles[size] + (bittext_maps[size][firstpos+64] << 6));
|
|
PA_8bitDrawTileTransp(screen, x, y + 8, 8, ly - 8, data, color);
|
|
firstpos ++;
|
|
data = (u8*)(bit8_tiles[size] + (bittext_maps[size][firstpos] << 6));
|
|
PA_8bitDrawTileTransp(screen, x + 8, y, lx - 8, 8, data, color);
|
|
data = (u8*)(bit8_tiles[size] + (bittext_maps[size][firstpos+64] << 6));
|
|
PA_8bitDrawTileTransp(screen, x + 8, y + 8, lx - 8, ly - 8, data, color);
|
|
} else {
|
|
data = (u8*)(bit8_tiles[size] + (bittext_maps[size][(u8)letter] << 6));
|
|
PA_8bitDrawTileTransp(screen, x, y, lx, ly, data, color);
|
|
}
|
|
}
|
|
|
|
void pa_8bitTextDecompress(u8 size) {
|
|
s16 i;
|
|
|
|
if ((size < 5) && (((void*)bittext_tiles_blank[size]) == ((void*)bit8_tiles[size]))) { // Using default font and still compressed
|
|
u32 tilesize = pa_bittextsizes[size] << 3;
|
|
bit8_tiles[size] = (u8*)malloc(tilesize);
|
|
|
|
for (i = 0; i < tilesize; i++) {
|
|
bit8_tiles[size][i] = (bittext_tiles_blank[size][i>>3] >> (i & 7)) & 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
s16 PA_8bitText(u8 screen, s16 basex, s16 basey, s16 maxx, s16 maxy, const char* text, u8 color, u8 size, u8 transp, s32 limit) {
|
|
s32 i;
|
|
pa_8bitTextDecompress(size);
|
|
PA_DoLetterPos(basex, basey, maxx, maxy, text, color, size, limit);
|
|
|
|
if (limit > PA_LetterPos.NLetters) limit = PA_LetterPos.NLetters; // Plus short que prévu
|
|
|
|
for (i = 0; i < limit; i++) letters[transp](PA_LetterPos.Letter[i].Size, screen, PA_LetterPos.Letter[i].X, PA_LetterPos.Letter[i].Y,
|
|
PA_LetterPos.Letter[i].Letter, PA_LetterPos.Letter[i].Color);
|
|
|
|
return limit;
|
|
}
|
|
|
|
s16 PA_CenterSmartText(u8 screen, s16 basex, s16 basey, s16 maxx, s16 maxy, const char* text, u8 color, u8 size, u8 transp) {
|
|
u8 align = textinfo.align;
|
|
textinfo.align = ALIGN_CENTER;
|
|
u16 temp = PA_8bitText(screen, basex, basey, maxx, maxy, text, color, size, transp, 100000);
|
|
textinfo.align = align;
|
|
return temp;
|
|
}
|