Double font size, re-align it all

This commit is contained in:
stevenhowes
2021-04-01 22:01:39 +01:00
parent 28b9175835
commit 1e6266077c
7 changed files with 86 additions and 12 deletions
+71 -7
View File
@@ -7,6 +7,7 @@ extern _kernel_swi_regs inreg;
extern _kernel_swi_regs outreg;
extern unsigned char *buffer;
extern unsigned char *fontbuffer;
int screen = 1;
// Loads sprite file into buffer
@@ -59,6 +60,56 @@ void load_sprites(char* filename)
_kernel_swi(OS_SpriteOp,&inreg,&outreg);
}
// Loads sprite file into buffer
void load_font(char* filename)
{
int length;
// Attempt to get file info
inreg.r[0] = 13;
inreg.r[1] = (int) filename;
_kernel_swi(OS_File,&inreg,&outreg);
// Length will be in R4 if it exists
length = outreg.r[4];
// If it's <1 it's fil not found
if(outreg.r[0] < 1)
{
printf("Sprite file %s not found",filename);
exit(0);
}
// Stops us trying to mallocsomething mad if file is too big.
if(length > 200000)
{
printf("Sprite file %s seems unreasonably large at %i bytes",filename, length);
exit(0);
}
// Attempt malloc, die if we cant
fontbuffer = (unsigned char *) malloc(length + 4);
if(fontbuffer==NULL)
{
printf("Couldn't malloc %i bytes for sprite buffer",length);
exit(0);
}
// Store size and other info as required for SpriteOp 9 to init sprite area
*(unsigned int *)fontbuffer = length + 4;
*(unsigned int *)(fontbuffer + 4) = 16;
inreg.r[0] = 256+9;
inreg.r[1] = (unsigned int) fontbuffer;
_kernel_swi(OS_SpriteOp,&inreg,&outreg);
// Load sprite file into buffer
inreg.r[0] = 256+10;
inreg.r[1] = (int) fontbuffer;
inreg.r[2] = (int) filename;
_kernel_swi(OS_SpriteOp,&inreg,&outreg);
}
void display_mode(int mode)
{
int pitch;
@@ -131,6 +182,19 @@ void draw_sprite(char* spritename,int x, int y)
_kernel_swi(OS_SpriteOp,&inreg,&outreg);
}
void draw_letter(char* spritename,int x, int y)
{
// SpriteOp 34 to put sprite at a location
inreg.r[0] = 256+34;
inreg.r[1] = (int) fontbuffer;
inreg.r[2] = (int) spritename;
inreg.r[3] = x;
inreg.r[4] = y;
inreg.r[5] = 8; // GCOL dest=source and sprite mask
_kernel_swi(OS_SpriteOp,&inreg,&outreg);
}
void draw_spritetext(char* text, int x, int y)
{
int currentx;
@@ -144,7 +208,7 @@ void draw_spritetext(char* text, int x, int y)
str[0] = text[i];
if((text[i] != ' ') && (text[i] != '\n') && (text[i] != '~'))
draw_sprite(str,currentx,currenty);
draw_letter(str,currentx,currenty);
switch (text[i])
{
@@ -153,20 +217,20 @@ void draw_spritetext(char* text, int x, int y)
case 'y':
case '.':
case ',':
currentx += 6 + 2;
currentx += 12 + 4;
break;
case '\'':
currentx += 4 + 2;
currentx += 8 + 4;
break;
case 'm':
currentx += 14 + 2;
currentx += 28 + 4;
break;
case 'q':
case 'w':
currentx += 10 + 2;
currentx += 20 + 4;
break;
case ' ':
currentx += 6 + 2;
currentx += 8 + 4;
break;
case '=':
currentx += 22 + 2;
@@ -179,7 +243,7 @@ void draw_spritetext(char* text, int x, int y)
currentx -= 2;
break;
default:
currentx += 8 + 2;
currentx += 16 + 4;
}
if(text[i] == '\n')